Files

64 lines
2.8 KiB
Markdown

# 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 `libusb` Python package** — pyusb needs a backend DLL on Windows. The `pip install libusb` package 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 wraps `is_kernel_driver_active()` / `detach_kernel_driver()` in `try/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:**
1. Options → List All Devices
2. Select "LEGO READER V2.10"
3. Target driver: WinUSB
4. 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.py` with 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: 000981b09d078e1777229b7d8f748d3a6da8762b)
- Diagnostic script used: `test_connect.py` (created during session, not committed)