GNU/Linux >> Znalost Linux >  >> Linux

Jak svázat USB zařízení pod statickým názvem?

Jak bylo navrženo, můžete přidat některá pravidla udev. Upravil jsem /etc/udev/rules.d/10-local.rules obsahovat:

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

Proměnné svého zařízení můžete zkontrolovat spuštěním

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

Existuje podrobnější průvodce, který si můžete přečíst na http://www.reactivated.net/writing_udev_rules.html


Výše uvedená syntaxe pravidla může fungovat na některých distribucích, ale nefungovala na mé (Raspbian). Protože jsem nikdy nenašel jediný dokument, který by vysvětloval všechny detaily, napsal jsem svůj vlastní, který najdete zde. To je to, co se scvrkává.
1. zjistěte, co je na ttyUSB:

dmesg | grep ttyUSB  

2. vypište všechny atributy zařízení:

udevadm info --name=/dev/ttyUSBx --attribute-walk

(samozřejmě s číslem vašeho zařízení místo x). Vyberte sadu jedinečných identifikátorů, např. idVendor + idProduct. Sériové číslo můžete potřebovat také v případě, že máte více než jedno zařízení se stejným idVendor a idProduct. Sériová čísla by měla být pro každé zařízení jedinečná.
3. Vytvořte soubor /etc/udev/rules.d/99-usb-serial.rules s něčím jako je tento řádek:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(za předpokladu, že tam nepotřebujete sériové číslo, a samozřejmě s čísly pro idVendor a idProduct, které jste našli v kroku 2.
4. Načtěte nové pravidlo:

sudo udevadm trigger

5. Ověřte, co se stalo:

ls -l /dev/your_device_name  

zobrazí, na jaké číslo ttyUSB symbolický odkaz šel. Pokud je to /dev/ttyUSB1 , poté ověřte, kdo to vlastní a do které skupiny patří:

ls -l /dev/ttyUSB1   

Pak jen pro zajímavost:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)

Problém s více identickými USB zařízeními

Mám Rasperry Pi se čtyřmi kamerami. Fotím pix s fswebcam který identifikuje kamery jako /dev/video0 .. video3 . Někdy je kamera video0 , vide02 , video4 a video6 ale na to můžeme prozatím zapomenout.

Potřebuji trvalé ID k identifikaci čísla kamery, abych např. video0 je vždy stejný fotoaparát, protože obrázky popisuji. Bohužel se to neděje spolehlivě – při startu jsou kamery označeny jako video0 ..video3 ale ne vždy stejným způsobem.

Všechny kamery mají stejné ID a sériové číslo.

Řešení tohoto problému zahrnuje pravidla udev, ale je zde také mnoho háčků.

Pokud vydáte příkaz

udevadm info –attribute-walk –path=/dev/video0

získáte stěrku výstupu, ale nejvýraznější kousky jsou

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

Bit KERNELS je port USB hubu. Se čtyřmi kamerami jsou tyto čtyři - při restartu se nemění, ale video{x} spojený s portem může změnit.

Potřebujeme tedy pravidlo udev, které spojí číslo videa s portem rozbočovače USB – něco jako:

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

Vypadá to jednoduše – přístup k fotoaparátu pomocí

fswebcam –d  $realpath /dev/camera0

Až na to, že to nefunguje – pokud to vložíte do pravidla udev a systém přidělí video0 (při bootování) jinému portu, bude pravidlo udev ignorováno. Symbolický odkaz na /dev/camera0 v podstatě říká no such device . Čtverec jedna.

Chceme svázat symbolický odkaz s adresou rozbočovače USB, nikoli s video{x} číslo. Chtělo to program Python.

Prvním krokem bylo spuštění

fswebcam –d /dev/video${x}  tst.jpg

pro x mezi 1 a 8. Existence tst.jpg po každém hovoru identifikuje, zda je na tomto čísle videa kamera. Z toho vytvořte seznam aktivních čísel videa. Moje zkušenost je, že je to buď 0,1,2,3 nebo 0,2,4,6 pro fotoaparáty, které jsem použil.

Ostatní mohou samozřejmě tento seznam vytvořit pomocí jiného procesu.

Poté pro každé číslo videa v seznamu spusťte

udevadm info –attribute-walk –path=/dev/videox > dd

a extrahujte KERNELS= line z dd . Z tohoto procesu skončíte se seznamem adres USB portů pro kamery. Seřaďte tento seznam tak, abyste jej v dalším kroku zpracovávali vždy ve stejném pořadí. Nazvěte to "seznam adres".

Spusťte udevadm … > dd věc znovu a vytvořte seznam, který vypadá jako

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

Nyní projděte seznam adres - pro každý záznam najděte odpovídající záznam ze seznamu videí. Vytvořte nový seznam, který vypadá jako sbírka řádků jako

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

X (číslo symbolického odkazu) je v seznamu adres nahrazeno pořadovým číslem.

Nyní máte pravidlo udev, které funguje. Symbolický odkaz, který je svázán s adresou rozbočovače USB bez ohledu na to, jaké číslo videa je tomuto portu přiděleno při spouštění.

Zapište konečný seznam do souboru /etc/udev/rules.d/cam.rules . Spusťte udevadm trigger aktivovat a práce je hotová. /dev/camera2 bude stejná kamera (USB port) bez ohledu na její číslo videa.


Linux
  1. 4 Užitečný způsob, jak zjistit název připojeného zařízení USB v systému Linux

  2. Jak si mohu být jistý, že jsem zapojil zařízení do portu USB 3?

  3. Jak řeknu v servisním souboru systemd, když je USB připraveno?

  1. Jak spouštět vlastní skripty na zásuvném modulu USB zařízení?

  2. Linux – Jak znovu připojit logicky odpojené USB zařízení?

  3. Jak zjistit USB verze 1.1 nebo 2.0

  1. Jak můžete identifikovat čipovou sadu USB zařízení v Linuxu?

  2. Jak programově získat informace o dodavateli USB a produktu v systému Linux?

  3. Jak vybrat statické číslo portu pro vlastní aplikaci?