Closed kaklik closed 3 years ago
Samotné OpenWRT má zřejmě velmi minimální podporu I²C. Z USB zařízení umožňujících vytvoření I2C sběrnice tak obsahuje zřejmě pouze I2c-tiny-usb.
Vyřešeno implementací read_i2c_block_data do knihovny pymlab.
V mezičase se chování této chyby změnilo a teď kontejner v moxu i s nezměněným kódem z prvního postu tohoto issue vypisuje jinou chybu:
kaklik@strecha:~/repos/pymlab/examples$ sudo python windgauge03a_example.py 0
{'device': 'hid', 'port': 0}
(u'00AC3AB8', <type 'unicode'>)
No handlers could be found for logger "pymlab.sensors.iic"
Traceback (most recent call last):
File "windgauge03a_example.py", line 55, in <module>
windgauge.reset()
File "/home/kaklik/repos/pymlab/src/pymlab/sensors/windgauge.py", line 122, in reset
self.write_icm20948_reg_data(self.ICM20948_PWR_MGMT_1, 0, 0x01 | 1 << 7) # ICM20948 - reset device and register values
File "/home/kaklik/repos/pymlab/src/pymlab/sensors/windgauge.py", line 111, in write_icm20948_reg_data
self.usr_bank_sel(reg_usr_bank)
File "/home/kaklik/repos/pymlab/src/pymlab/sensors/windgauge.py", line 108, in usr_bank_sel
self.bus.write_byte_data(self.address, self.ICM20948_REG_BANK_SEL, usr_bank_reg << 4)
File "/home/kaklik/repos/pymlab/src/pymlab/sensors/__init__.py", line 223, in write_byte_data
return self.driver.write_byte_data(address, register, value)
File "/home/kaklik/repos/pymlab/src/pymlab/sensors/__init__.py", line 201, in driver
self._driver = iic.load_driver(**self._driver_config)
File "/home/kaklik/repos/pymlab/src/pymlab/sensors/iic.py", line 641, in load_driver
raise RuntimeError("Failed to load I2C driver. Enable logging for more details.")
RuntimeError: Failed to load I2C driver. Enable logging for more details.
kaklik@strecha:~/repos/pymlab/examples$
V dmesg se pak objevuje tato chyba:
[ 36.379858] new mount options do not match the existing superblock, will be ignored
[ 300.030374] usbhid 2-1.3:1.0: can't add hid device: -32
[ 300.035913] usbhid: probe of 2-1.3:1.0 failed with error -32
[ 300.193419] usb 2-1.3: USB disconnect, device number 5
[ 300.498269] usb 2-1.3: new full-speed USB device number 7 using xhci_hcd
[ 300.652733] hid-generic 0003:10C4:EA90.0002: hiddev96,hidraw0: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:03:00.0-1.3/input0
[ 486.792943] usbhid 2-1.3:1.0: can't add hid device: -32
[ 486.798616] usbhid: probe of 2-1.3:1.0 failed with error -32
[ 486.834597] usb 2-1.3: USB disconnect, device number 7
[ 487.141585] usb 2-1.3: new full-speed USB device number 8 using xhci_hcd
[ 487.295326] hid-generic 0003:10C4:EA90.0003: hiddev96,hidraw0: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:03:00.0-1.3/input0
[ 515.484453] usbhid 2-1.3:1.0: can't add hid device: -32
[ 515.490221] usbhid: probe of 2-1.3:1.0 failed with error -32
[ 515.508781] usb 2-1.3: USB disconnect, device number 8
[ 515.815978] usb 2-1.3: new full-speed USB device number 9 using xhci_hcd
[ 515.975086] hid-generic 0003:10C4:EA90.0004: hiddev96,hidraw0: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:03:00.0-1.3/input0
[ 532.878692] usbhid 2-1.3:1.0: can't add hid device: -32
[ 532.884403] usbhid: probe of 2-1.3:1.0 failed with error -32
[ 532.918834] usb 2-1.3: USB disconnect, device number 9
[ 533.223018] usb 2-1.3: new full-speed USB device number 10 using xhci_hcd
[ 533.374022] hid-generic 0003:10C4:EA90.0005: hiddev96,hidraw0: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:03:00.0-1.3/input0
[ 540.932798] usbhid 2-1.3:1.0: can't add hid device: -32
[ 540.938452] usbhid: probe of 2-1.3:1.0 failed with error -32
[ 541.111712] usb 2-1.3: USB disconnect, device number 10
[ 541.420440] usb 2-1.3: new full-speed USB device number 11 using xhci_hcd
[ 541.580303] hid-generic 0003:10C4:EA90.0006: hiddev96,hidraw0: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:03:00.0-1.3/input0
kaklik@strecha:~/repos/pymlab/examples$
Vyskytuje se čistě v reakci na situaci, kdy se s modulem vyvolá komunikace přes HIDAPI.
Problém vznikl tím, že aktuální implementace usbhid v openwrt se nedovede vypořádat s nečekaným odpojením CP2112. Tato situace nastane v zápětí po odeslání příkazu reset.
Situace byla zatím vyřešena vypnutím softwarového resetování USBI2C v pymlab knihovně.
K Turris MOX, který je namontován na střeše auta, je připojen anemometr, který je zapojen přes rozhraní USB. Efektivně je však připojení anemometru realizováno přes I²C, které vytváří modul USBI2C01A, který je integrován v anemometru.
Důsledkem je, že je potřeba, aby OpenWrt, které je host systémem Ubuntu běžícího virtuálně v MOXu mělo kernel driver pro vytvoření I2C systémového rozhraní z čipu CP2112. To však nemá. Druhá možnost tak je použít standardní USB HID rozhraní, které kernelovské drivery nepotřebuje. V tomto režimu se I2C transakce řídí přímo z uživatelské aplikace.
Konkrétně jde o metodu
read_i2c_block_data
Řešením tak zřejmě je tuto metodu doimplementovat do pymlabu. Do té doby musí být anemometr zřejmě připojen k nevirtualizovanému stroji s úplným Linuxovým kernelem (který kernel modul pro CP2112 obsahuje).