ODZ-UJF-AV-CR / CRREAT_cars

Scripts for parsing data from measurement devices mounted on cars for thunderstorm chasing.
GNU General Public License v3.0
0 stars 0 forks source link

Připojení anemometru do Turris MOX na střeše auta #1

Closed kaklik closed 3 years ago

kaklik commented 4 years ago

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

$ sudo python windgauge03a_example.py 0
{'device': 'hid', 'port': 0}
(u'00AC3AB8', <type 'unicode'>)
ID: 0x3010384 - sensor: SDP33
Magnetometer calibrated.

Traceback (most recent call last):
  File "windgauge03a_example.py", line 174, in <module>
    mag_hdg_comp = windgauge.get_mag_hdg()
  File "/home/kaklik/repos/MLAB/pymlab/src/pymlab/sensors/windgauge.py", line 405, in get_mag_hdg
    mag_raw = list(self.get_mag())
  File "/home/kaklik/repos/MLAB/pymlab/src/pymlab/sensors/windgauge.py", line 261, in get_mag
    mag_raw_data = self.read_icm20948_reg_data(self.ICM20948_EXT_SLV_SENS_DATA_00 + 9, 0, 9)
  File "/home/kaklik/repos/MLAB/pymlab/src/pymlab/sensors/windgauge.py", line 117, in read_icm20948_reg_data
    return(self.bus.read_i2c_block_data(self.address, reg_address, num_of_bytes))
  File "/home/kaklik/repos/MLAB/pymlab/src/pymlab/sensors/__init__.py", line 253, in read_i2c_block_data
    data = self.driver.read_i2c_block_data(address, register, length)
  File "/home/kaklik/repos/MLAB/pymlab/src/pymlab/sensors/iic.py", line 442, in read_i2c_block_data
    raise NotImplementedError()
NotImplementedError

Ř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).

kaklik commented 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.

kaklik commented 3 years ago

Vyřešeno implementací read_i2c_block_data do knihovny pymlab.

kaklik commented 3 years ago

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.

kaklik commented 3 years ago

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ě.