Toto je starší verze dokumentu!
Obsah
Převodník USB na I²C USBI2C01A
I²C je velmi rozšířená sběrnice vhodná pro připojování nejrůznějších čidel na krátké vzdálenosti. Avšak není obvyklé, aby byla vyvedena na běžných počítačích a dostupná tak k přímému použití. 1)
Modul se proto snaží řešit tento problém použitím obvodu Silicon Labs CP2112, který je přímým převodníkem mezi USB a SMBus resp. I2C.
Použití modulu
Modul se po připojení k USB chová, jako standardní HID zařízení. Toto chování má výhodu, že teoreticky nepotřebuje žádné speciální ovladače. A s modulem lze komunikovat přímo přes standardní USB HID rozhraní. Některé operační systémy však obsahují programové vybavení pro použití sběrnice I2C/SMBus. V takových případech je výhodné nahradit generický USB HID ovladač speciálním driverem, který tento modul zapojí do systémové sběrnice I2C.
HIDAPI
HIDAPI je platforma, přes kterou se dá k převodníku přistupovat z Linuxu, Windows nebo MAC OS na různých procesorových platformách. Podmínkou je, že na dané platformě je nainstalováno libusb-1.0.
Ubuntu 14.04
Na počítač, ke kterému převodník připojíme, musíme nejdříve nainstalovat hidapi a některé další balíky. Od Ubuntu 14.04 to jde jednoduše pomocí:
sudo apt-get install libudev-dev libusb-1.0-0-dev libhidapi-dev python-setuptools python-pip python-smbus cython
Dále pak potřebujeme pouze balík Pymlab, jak je zmíněno na stránce i2c.
sudo pip install pymlab
Příklad blikání LEDkami na USBI2C01A pomocí Pythonu:
import hid import time try: print "Opening device" h = hid.device() h.open(0x10C4, 0xEA90) print "Manufacturer: %s" % h.get_manufacturer_string() print "Product: %s" % h.get_product_string() print "Serial No: %s" % h.get_serial_number_string() h.write([0x02, 0xFF, 0x00, 0x00, 0x00]) # nastaveni vystupu v rezimu open-drain time.sleep(0.1) for k in range(10): h.write([0x04, 0xFF, 0xFF]) # zapise 1 na vsech 8 vystupnich IO pinu time.sleep(0.1) h.write([0x04, 0x00, 0xFF]) # zapise 0 na vsech 8 vystupnich IO pinu time.sleep(0.1) print "Closing device" h.close() except IOError, ex: print ex print "Done"
Příklad je nutné spustit s oprávněním správce.
Podrobnosti k ovládání IO portů přes HID API najdete v tomto dokumentu
Nastavení přístupových práv k USB
Aby se skript nemusel spouštět s právy roota, je třeba vytvořit v adresáři /etc/udev/rules.d soubor SiliconLabs.rules s obsahem:
SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", MODE="0666" SUBSYSTEM=="usb_device", ATTRS{idVendor}=="10c4", MODE="0666"
Linux Kernel
Linux je případem operačního systému, kde existuje systémové řešení komunikace se sběrnicí I2C, takže je výhodné generický HID ovladač vyměnit za jiný. Zatím ale neexistuje vhodný ovladač integrovaný v jádře, ale vyvíjí se mimo něj. Podle současného vývoje by driver měl být stabilně integrován v jádře 3.15. Je proto třeba jej doplnit zavedením softwarového modulu hid-cp2112.
To lze udělat buď kompilací nového modulu do aktuálního jádra které používáme, nebo kompilací celého kernelu s aplikovaným patchem po kterém nový kernel bude ovladač rovnou obsahovat.
Kompilace samostatného modulu
Tato metoda použití modulu zatím nefunguje úplně správně. Zatím však není ale ani dokončen driver do jádra linuxu. Zde popisovaný návod funguje správně až od verze kernelu 3.15. Používejte poroto zatím rozhraní HIDAPI popsané výše.
Nejdříve zkompilujeme modul hid-cp2112
git clone https://github.com/MLAB-project/hid-cp2112.git cd hid-cp2112 make
Kdyby jsme se v této chvíli pokusili modul vložit do jádra pomocí insmod, tak se modul sice do jádra vloží. Ale nic se nestane, neboť k modulu USBI2C01A se mezitím přilepí generický driver usbhid. Následně musíme zjistit USB identifikaci zařízení na USB. To je možné například příkazem dmesg spuštěným po zapojení modulu USBI2C01A do USB.
[34842.853142] usb 3-4: new full-speed USB device number 3 using xhci_hcd [34842.870424] usb 3-4: New USB device found, idVendor=10c4, idProduct=ea90 [34842.870427] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [34842.870428] usb 3-4: Product: CP2112 HID USB-to-SMBus Bridge [34842.870429] usb 3-4: Manufacturer: Silicon Laboratories [34842.870430] usb 3-4: SerialNumber: 00338B73 [34842.874171] hid-generic 0003:10C4:EA90.0003: hiddev0,hidraw1: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:00:14.0-4/input0
Na poslední řádce vidíme, že přidělený identifikátor je v tomto případě 0003:10C4:EA90.0003. Následně tuto identifikaci použijeme k „odpojení“ generického ovladače od USBI2C01A:
sudo su echo -n "0003:10C4:EA90.0003" > /sys/bus/hid/drivers/hid-generic/unbind
A připojíme na něj náš nově přeložený ovladač:
insmod ./hid-cp2112.ko echo -n "0003:10C4:EA90.0003" > /sys/bus/hid/drivers/cp2112/bind
Následně ověříme, že v systému vidíme novou sběrnici I²C.
i2cdetect -l i2c-0 i2c i915 gmbus ssc I2C adapter i2c-1 i2c i915 gmbus vga I2C adapter i2c-2 i2c i915 gmbus panel I2C adapter i2c-3 i2c i915 gmbus dpc I2C adapter i2c-4 i2c i915 gmbus dpb I2C adapter i2c-5 i2c i915 gmbus dpd I2C adapter i2c-6 i2c DPDDC-C I2C adapter i2c-7 i2c DPDDC-D I2C adapter i2c-8 smbus CP2112 SMBus Bridge on hiddev0 SMBus adapter
root@UST-vyvoj:/home/kaklik/git/hid-cp2112# i2cdetect -y -r 7 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- root@UST-vyvoj:/home/kaklik/git/hid-cp2112#
Kompilace celého jádra v Ubuntu
V terminálu se přepneme do složky ve které chceme kernel zkompilovat. Následně stáhneme zdrojový balíček aktuálně běžícího kernelu:
apt-get source linux-image-$(uname -r)
Následně nainstalujeme nástroje potřebné pro kompilaci.
sudo apt-get install kernel-package libncurses5 libncurses5-dev sudo apt-get build-dep linux-image-$(uname -r)
V této fázi by již měl být k dispozici nový adresář obsahující zdrojové kódy jádra. V našem případě linux-3.11.0. Přepneme se do něj a vytvoříme konfiguraci jádra identickou s aktuálně běžícím jádrem.
cd linux-3.11.0 make oldconfig
Následně aplikujeme patch který do kernelu přidá nový modul pro CP2112.
patch -Np1 --ignore-whitespace < hid-cp2112.patch
Pravděpodobně se stane, že některé soubory nebude možné automaticky upravit. Proto je potřeba to udělat ručně Takto najdeme odmítnuté změny.
find . -name "*.rej"
A postupně je upravíme ručně. A násdne spustíme menuconfig ve kterém nový modul zapneme. Na cestě: > Device Drivers > HID support > Special HID drivers;Silicon Labs CP2112 HID USB-to-SMBus Bridge support
make menuconfig
Ukončíme menuconfig a zapneme kompilaci kernelu
sudo make-kpkg -j 8 --initrd --append-to-version=i2c-test kernel-image
Ta bude chvíli trvat a spotřebuje cca 10 GB místa pro vytvoření objektových souborů.. Po skončení operace by se v nadřazeném adresáři měl objevit .deb balíček, který můžeme naistalovat pomocí:
sudo dpkg -i linux-image-3.11.10i2c-test_3.11.10i2c-test-10.00.Custom_amd64.deb sudo reboot
Pokud k převodníku máme připojené nějaké I²C zařízení, tak můžeme jednoduše otestovat komunikaci:
kaklik@popelnice:~$ sudo i2cdetect -y -r 8 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- 55 -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- kaklik@popelnice:~$
V tomto případě je k modulu USBI2C01A připojen modul CLKGEN01B s adresou 0x55.