find_all() returns no devices for a FreeWili 2 running FW2 v07 firmware (macOS)
Repo: https://github.com/freewili/freewili-finder
Version: pyfwfinder 0.5.0 (via freewili 0.0.51)
Environment: macOS 26.5.2 (arm64), Python 3.14.7
Hardware: FreeWili 2, firmware reports FW2 v07
Summary
A connected, fully working FreeWili 2 is not detected. find_all() returns an
empty list and the CLI reports:
$ fwi-serial -l
Found 0 FreeWili(s)
$ python -c "import pyfwfinder; print(pyfwfinder.find_all())"
[]
The board itself is fine — talking to its CDC port directly works, including
file transfers in both directions:
[? 0D25C4CD41597940 2 FW2 v07 1]
This appears to be a device-model assumption rather than an enumeration failure:
FW2 v07 exposes a single CDC interface, where the FreeWili 2 layout
expects separate main and display serial interfaces.
What the device actually presents
An internal hub (093c:2059) with four children:
| Device |
VID:PID |
Class |
Notes |
FW2 v07 |
093c:205a |
CDC (bDeviceClass 239/2, IAD) |
the console — one CDC ACM interface only |
FW2 |
0403:6014 |
FTDI FT232H |
|
FW Ultra Fast Media |
093c:205f |
Mass storage (8/6/80) |
presents no media unless the SD card is switched to the USB reader |
FreeWili Debug Probe (CMSIS-DAP) |
2e8a:000c |
CDC |
onboard probe, 2 interfaces |
The FW2 v07 device binds exactly one TTY on macOS:
AppleUSBCDCCompositeDevice
bInterfaceNumber = 0, bInterfaceClass = 2 (ACM control)
bInterfaceNumber = 1, bInterfaceClass = 10 (ACM data) -> IOTTYDevice "usbmodemXXXXXXX"
so there is no second serial interface for a display CPU to match against.
Relevant hub port layout, in case detection keys off position:
port 1 093c:205a FW2 v07 (CDC console)
port 2 093c:205f FW Ultra Fast Media (mass storage)
port 3 0403:6014 FW2 (FTDI)
port 4 2e8a:000c FreeWili Debug Probe (CMSIS-DAP)
Note this ordering differs from the constants in freewili/fw.py, which expect
main at hub index 0, display at 1 and FTDI at 2:
FTDI_HUB_LOC_INDEX = 2
DISPLAY_HUB_LOC_INDEX = 1
MAIN_HUB_LOC_INDEX = 0
Reproduce
Attach a FreeWili 2 whose firmware banner is FW2 v07 and run fwi-serial -l.
Workaround
Locate the port by VID/PID and construct FreeWiliSerial directly, bypassing
the finder entirely:
import serial.tools.list_ports
from freewili.fw_serial import FreeWiliSerial
port = next(p.device for p in serial.tools.list_ports.comports()
if (p.vid, p.pid) == (0x093C, 0x205A))
fw = FreeWiliSerial(port, stay_open=True)
This works, so the underlying communication path is sound — only discovery is
affected.
Suggested fix
Recognise 093c:205a as a FreeWili2, and allow a device whose main and
display share a single CDC interface. If get_main_usb_device() /
get_display_usb_device() are expected to return distinct devices, they will
need a defined behaviour for this layout — returning the same interface for both
seems the least surprising, but that is a design call for the maintainers.
Happy to run any additional enumeration output against this board if it helps.
find_all()returns no devices for a FreeWili 2 runningFW2 v07firmware (macOS)Repo: https://github.com/freewili/freewili-finder
Version: pyfwfinder 0.5.0 (via freewili 0.0.51)
Environment: macOS 26.5.2 (arm64), Python 3.14.7
Hardware: FreeWili 2, firmware reports
FW2 v07Summary
A connected, fully working FreeWili 2 is not detected.
find_all()returns anempty list and the CLI reports:
The board itself is fine — talking to its CDC port directly works, including
file transfers in both directions:
This appears to be a device-model assumption rather than an enumeration failure:
FW2 v07exposes a single CDC interface, where the FreeWili 2 layoutexpects separate main and display serial interfaces.
What the device actually presents
An internal hub (
093c:2059) with four children:FW2 v07093c:205abDeviceClass239/2, IAD)FW20403:6014FW Ultra Fast Media093c:205fFreeWili Debug Probe (CMSIS-DAP)2e8a:000cThe
FW2 v07device binds exactly one TTY on macOS:so there is no second serial interface for a display CPU to match against.
Relevant hub port layout, in case detection keys off position:
Note this ordering differs from the constants in
freewili/fw.py, which expectmain at hub index 0, display at 1 and FTDI at 2:
Reproduce
Attach a FreeWili 2 whose firmware banner is
FW2 v07and runfwi-serial -l.Workaround
Locate the port by VID/PID and construct
FreeWiliSerialdirectly, bypassingthe finder entirely:
This works, so the underlying communication path is sound — only discovery is
affected.
Suggested fix
Recognise
093c:205aas aFreeWili2, and allow a device whose main anddisplay share a single CDC interface. If
get_main_usb_device()/get_display_usb_device()are expected to return distinct devices, they willneed a defined behaviour for this layout — returning the same interface for both
seems the least surprising, but that is a design call for the maintainers.
Happy to run any additional enumeration output against this board if it helps.