Skip to content

V2 PCB: move PWR_HOLD to IO3 so it holds through USB uploads - #101

Merged
thePunderWoman merged 1 commit into
mainfrom
pcb-v2-pwr-hold-io3
Nov 1, 2026
Merged

thePunderWoman merged 1 commit into
mainfrom
pcb-v2-pwr-hold-io3

Conversation

@thePunderWoman

Copy link
Copy Markdown
Owner

Fixes the blocker called out in #100. The V2 board on main would lose power during a USB upload.

Bench result

Tested on V1 hardware with a firmware build that holds a pin high and logs whether the hold survives each reset.

Reset IO42 (digital pad, #100) IO3 (RTC pad)
Software reset (0x0c) Survived Survived
USB reset (0x15) Lost Survived
Full USB upload Lost Survived, pin still high

Changes

  • PWR_HOLD moves from IO42 (pad 38) to IO3 (pad 7), and IO42 becomes unconnected. XBEE_RESET stays on RXD0.
  • The F.Cu run to pad 38 is replaced by about 5.8 mm from pad 7 to the existing via at (142.0, 107.3). PWR_HOLD goes from 55.9 mm to 46.0 mm, with no new vias and no parts moved.
  • Docs are updated, and production is regenerated.

Why IO3

ESP32-S3 datasheet v2.2:

  • Table 2-1: no pull at or after reset, so the power-off protection from V2 PCB: move PWR_HOLD to IO42 and apply review fixes #100 stays.
  • Tables 3-1 and 3-5: the strap defaults to floating and only selects the JTAG source, which is ignored at default eFuses.
  • Table 2-2: the power-up glitch is low-level only, and D_OR2 blocks a low.

Firmware impact

V2 firmware must call gpio_hold_en on IO3 and gpio_hold_dis before powering off. lightSleepFor() must not release the hold, unlike V1's version.

Verification

  • DRC: 0 violations, 0 unconnected. All 279 netlist nodes match the pads, and sync is clean.
  • bom_check: 43 lines, 0 problems. The BOM is unchanged.
  • The production netlist shows PWR_HOLD on pad 7, and the JLC zip matches the gerbers on the 6 layers compared.
  • latch_sim.py passes, and latch_v2_sim.py passes all 33 checks. V2 PCB: move PWR_HOLD to IO42 and apply review fixes #100 said 32, which was a miscount. Neither runs in CI.

Not covered

IO3 was unconnected on V1, so it was tested with no load. On V2 it drives D_OR2 and the latch gate, which draw very little current. The first USB upload at bring-up confirms it, because the board either stays on or it does not. If it fails, the fallback is swapping PWR_HOLD to RXD0.

🤖 Generated with Claude Code

A bench test on V1 hardware showed that IO42's digital-pad hold does not
survive the USB reset that ends every upload, so the board would lose
power mid-upload. IO3 is an RTC pad, and its hold lasted through a full
upload with the pin still high.

IO3 has no reset pull, so the power-off protection stays, its strap is
ignored at default eFuses, and its power-up glitch is low only, which
D_OR2 blocks. XBEE_RESET stays on RXD0. The route to pad 7 is shorter and
adds no vias. Regenerate the production files.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@thePunderWoman
thePunderWoman merged commit 8fce7dc into main Nov 1, 2026
3 checks passed
@thePunderWoman
thePunderWoman deleted the pcb-v2-pwr-hold-io3 branch November 1, 2026 19:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant