Skip to content

find_all() returns no devices for a FreeWili 2 running FW2 v07 firmware (macOS) #37

Description

@bobsyourmom

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions