Uživatelské nástroje

Nástroje pro tento web

Tento překlad je starší než originální stránka a nejspíše i zastaralý. Zobrazit změny.
Překlady této stránky?:

cs:usbi2c

Toto je starší verze dokumentu!


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)

USBI2C01A

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-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])    
    time.sleep(0.1)
    for k in range(10):
        h.write([0x04, 0xFF, 0xFF])
        time.sleep(0.1)
        h.write([0x04, 0x00, 0xFF])
        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.

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.

Ukázky připojených I²C modulů

CLKGEN01B

Ukázka použití modulu CLKGEN a USBI2C01A

MAG01A

Modul USBI2C01A s připojeným magnetometrem MAG01A

Související stránky

Reference

cs/usbi2c.1406848824.txt.gz · Poslední úprava: 2014/07/31 23:20 (upraveno mimo DokuWiki)