2.8 KiB
2.8 KiB
Windows 11 USB Driver Troubleshooting for LEGO Portal
Date: 2026-09-23 Project: lego-dimensions-reader Status: resolved Tags: windows, usb, pyusb, libusb, drivers, zadig
Context
The LEGO Dimensions WiiU portal was not being detected on Windows 11 when running the lego_dimensions_reader.py module. Initial error was "Portal not found" despite the device being connected, followed by "Operation not supported or unimplemented on this platform" errors.
Key Decisions
- Install
libusbPython package — pyusb needs a backend DLL on Windows. Thepip install libusbpackage bundles the DLL in a Python-accessible location, avoiding manual DLL placement. - Use Zadig to install WinUSB driver — The portal ships with HID drivers which don't support raw USB access. WinUSB (via Zadig) enables pyusb communication.
- Keep existing kernel driver detach code — The
connect()method already wrapsis_kernel_driver_active()/detach_kernel_driver()intry/except (AttributeError, usb.core.USBError): pass, making it Windows-safe. No code change needed.
Technical Details
Portal USB identifiers:
- VID:
0x0E6F - PID:
0x0241 - Product string: "LEGO READER V2.10"
- Manufacturer: "PDP LIMITED"
- Interface: HID (Class 0x03)
- Endpoints: 0x81 (IN), 0x01 (OUT) — 32-byte interrupt packets
Required packages:
pip install pyusb libusb
Zadig setup:
- Options → List All Devices
- Select "LEGO READER V2.10"
- Target driver: WinUSB
- Click "Replace Driver"
USB operations verified working:
set_configuration()✓get_interface()✓claim_interface()✓write(1, data)✓read(0x81, 32, timeout=100)✓ — returned init response with "(c) LEGO 2014" signature
Tag event parsing (from _poll_events):
- Packet byte 0:
0x56= NFC tag event - Packet byte 2: pad number (1=CENTER, 2=LEFT, 3=RIGHT)
- Packet byte 5: action (0=INSERTED, 1=REMOVED)
- Packet bytes 6-12: 7-byte UID
Code Changes
No code changes required. The existing lego_dimensions_reader.py already handles Windows gracefully:
connect()lines 248-252: kernel driver detach wrapped in try/except- All USB operations use standard pyusb calls compatible with WinUSB backend
Open Questions / Next Steps
- Test full tag reading — Run
python lego_dimensions_reader.pywith a character disc to verify end-to-end tag detection - Character ID decryption — May need to implement tag memory read commands (0xB2) to read pages 0x24-0x25 for TEA-encrypted character ID
- Integration testing — Connect to Moonlight Drive-In video player system
Artifacts
- Repository: https://gitea.hideawaygaming.com.au/jessikitty/lego-dimensions-reader
- File:
lego_dimensions_reader.py(SHA:000981b09d) - Diagnostic script used:
test_connect.py(created during session, not committed)