Skip to content

shared/usb: correctly report the SD LUN as removable media#10967

Open
mikeysklar wants to merge 1 commit intoadafruit:mainfrom
mikeysklar:pr-msc-prevent-allow
Open

shared/usb: correctly report the SD LUN as removable media#10967
mikeysklar wants to merge 1 commit intoadafruit:mainfrom
mikeysklar:pr-msc-prevent-allow

Conversation

@mikeysklar
Copy link
Copy Markdown

@mikeysklar mikeysklar commented Apr 22, 2026

What was wrong

The SD card exposed as a USB MSC LUN doesn't mount on macOS. ioreg shows the SCSI nub appears but never progresses to publishing an IOMedia. Linux handles the same firmware fine.

Why: CircuitPython was telling the host "this LUN's medium is always present" for every LUN, including the SD card. On macOS that means "skip TEST_UNIT_READY polling" — so if the SD wasn't ready at the one-shot enumeration probe, macOS never re-checked and gave up on the LUN. Linux ignored the hint and kept polling, which is why it worked there.

@hathach documented this exact macOS behavior back in #6555; the per-LUN distinction wasn't applied at the time.

What changed

Report the SD LUN as removable media, report internal flash and SAVES as non-removable. macOS now keeps polling TUR on the SD LUN and correctly picks up card insertion and removal.

~10 lines in supervisor/shared/usb/usb_msc_flash.c — per-LUN branch on the existing PREVENT_ALLOW_MEDIUM_REMOVAL handler. No RAM or flash cost.

Tested on

Board Result
Feather RP2040 Adalogger (with SD pin defines from #10968) SD mounts first try on macOS 26.x
Metro RP2040 (with SD pin defines from #10968) SD mounts
Metro RP2350 SD mounts, no regression
Fruit Jam (3-LUN: flash + CPSAVES + SD) All three mount; CPSAVES correctly stays non-removable
Linux (Ubuntu 24.04) /dev/sdc + /dev/sdd correct sizes, no regression

Windows not tested.

Related

Credit to @dhalbert for pointing at #6555 and @hathach for the original analysis.

Respond with "unsupported" for the SD LUN (removable media) and OK for
internal flash / SAVES LUNs (non-removable). Responding OK for a
removable LUN tells macOS the medium is always present, and macOS then
skips TEST_UNIT_READY polling. If the SD isn't ready at the single
enumeration probe, macOS never re-checks and LUN 1 fails to publish an
IOMedia node.

Hathach documented this behavior back in adafruit#6555; the SD case wasn't
differentiated at the time.

Fixes adafruit#10965.
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.

Metro RP2040: SD card LUN never probed by macOS via USB MSC (works on RP2350)

1 participant