Żadna to nowość, że wszelkiej maści przelotki-konwertery USB/RS232 oparte na kostkach PL2303 firmy Prolific czy FT232R od FTDI niezmiernie ułatwiają nam życie gdy potrzeba zrealizować klasyczną komunikację szeregową z właśnie budowanym urządzonkiem.
Od strony systemu uP mamy wtenczas zwykły UART z liniami TxD, RxD od strony komputera osobistego - wirtualny port szeregowy, z poziomu naszej aplikacji obsługiwany na takich samych zasadach co wbudowane trwale w maszynę peryferia.
Z przelotkami USB jest tylko jeden, niewielki kłopot - nie za bardzo wiadomo, jaką nazwę świeżo wetkniętemu konwerterowi przydzieli system operacyjny, a istotne jest to niezmiernie, ponieważ nazwę portu szeregowego podajemy przecież w konfiguracji naszej aplikacji: COM1, albo COM2, albo /dev/ttyUSB3 albo... no właśnie, co?
Smaczku sprawie dodaje fakt, że często posługujemy się różnej maści hubami USB, czy jak tam nazwać te replikatory portów, koncentratory lub inne rozgałęziacze. System przydziela nazwy w/g swoich zasad, myślę, że warto chwilę czasu poświęcić na odcyfrowanie jakimi prawidłami rządzi się nasz 'ekosystem USB'.
Wyobraźmy sobie plątaninę jak na zdjęciu poniżej.
To zakupiony dziś na naszym lokalnym bazarku hubik USB renomowanej firmy Manta z fajnym ledzikiem i czterema portami, jak za piątak to jest całkiem w porządku.
W dwa gniazda wetknięte konwertery-kabelki na bazie PL2303 oraz w kaskadę - kolejny hub (śliczny gifcik) Connec'style, a do niego kolejna przelotka USB/RS232.
I tu powstaje pytanie - jakie nazwy urządzeń przypisane są do poszczególnych 'wtyczek'.
Zaczynamy od wylistowania dostępnych portów szeregowych, ale tylko tych emulowanych przez USB, typowo są to `ttyUSBnnn`, zatem popatrzmy na wynik polecenia:
ls /dev/ttyUSB* pisze:Kod: Zaznacz cały
otoja@icequeen:~ > ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2
otoja@icequeen:~ >
Jak można się było spodziewać - dostaliśmy trzy nazwy portów szeregowych, no super wręcz, ale wciąż nie wiemy, który jest który.
Zatem teraz spróbujemy sobie wylistować wszystko, co mamy zapięte na USB w naszym komputerze.
Płaska lista - taki inwentarz jakby, pokazuje na sztuki:
lsusb pisze:Kod: Zaznacz cały
otoja@icequeen:~ > lsusb
Bus 001 Device 038: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 035: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 037: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 036: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 010: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 034: ID 1908:2311 GEMBIRD
Bus 001 Device 005: ID 1bcf:0007 Sunplus Innovation Technology Inc. Optical Mouse
Bus 001 Device 008: ID 049f:0051 Compaq Computer Corp. KU-0133 Easy Access Interner Keyboard
Bus 001 Device 007: ID 0b97:7732 O2 Micro, Inc. Smart Card Reader
Bus 001 Device 006: ID 0b97:7731 O2 Micro, Inc.
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
otoja@icequeen:~ >
Tu widoczna jest struktura instalacji, w szczególności pokazane są zależności pomiędzy urządzeniami:
lsusb --tree pisze:
No wiem, na bogato wyszło, więc już wyjaśniam co do czego, bo komplikacja jest tu celowa.
Moja maszyna ma na zadku cztery wolne gniazda USB do wykorzystania. Jedno jest na stałe przeznaczone na kamerkę USB, ze względu na wymagany transfer przejście przez hub było nie do przyjęcia. Do kolejnego gniazdka zapięta została ta plątanina z testowej fotografii powyżej. Na kolejnym gniazdku wisi siedmioportowy hub f-my Belkin, do którego podłączona jest mysza oraz klawiatura z czytnikiem kart chipowych i kilka kabelków do wykorzystania a-hoc (aparat, programator isp, etc)
Tu dygresja odnośnie >4 portowych hubów z kolorowym ledzikiem. Ten mój niebieskoświecący Belkin to tak naprawdę wewnątrz zapięte w kaskadę dwa czteroportowe układy. Z pierwszego układu dostępne dla mnie są trzy porty USB, czwarty pracuje jako master/host dla kolejnego (wewnętrznego) huba, który już udostępnia wszystkie swoje 4 porty.
Ograniczmy pole widzenia to plataniny z szeregowymi przelotkami.
Kod: Zaznacz cały
|__ Port 8: Dev 10, If 0, Class=Hub, Driver=hub/4p, 480M <----- to jest rozgałęziacz Manta
|__ Port 1: Dev 36, If 0, Class=Hub, Driver=hub/4p, 480M <----- to jest rozgałęziacz Connec'style
|__ Port 2: Dev 37, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M <-- to jest gruby RS232 zapięt w hub Connec-a
|__ Port 2: Dev 35, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M <-- to jest pierwszy kabelek szeregowy z Manty
|__ Port 3: Dev 38, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M <-- a to drugi tez z Manty
Fajnie, ale dalej nie znamy nazw systemowych przydzielonych dla kolejnych wtyczek. Tu z pomocą przyjdzie nam programik udevadm.
Zawołamy go dla każdej z pozyskanych poleceniem ls nazw urządzeń szeregowych, przekierowując wyniki do plików, czyli tak:
Kod: Zaznacz cały
otoja@icequeen:~ >
otoja@icequeen:~ > udevadm info -a -n /dev/ttyUSB0 > usb0.txt
otoja@icequeen:~ > udevadm info -a -n /dev/ttyUSB1 > usb1.txt
otoja@icequeen:~ > udevadm info -a -n /dev/ttyUSB2 > usb2.txt
otoja@icequeen:~ >
Pliczki w załączniku, a teraz zobaczmy czym one sie od siebie różnią, ot usb0 od usb1 na przykład...
Widać spore różnice przy w pełni rozwiniętej nazwie urządzenia, ale tymi robaczkami nie będziemy się zajmować, bo wygadają zbyt skomplikowanie. Za to zwróćmy uwagę na wartości kluczy "ATTRS{devpath}". Wylistujmy sobie owe atrybuty urządzeń, najlepiej hurtem, dla wszystkich przelotek USB co je mamy w systemie:
Kod: Zaznacz cały
for wtyczka in `ls /dev/ttyUSB*`; do echo $wtyczka; udevadm info -a -n $wtyczka | grep "devpath"; done;
Dostaniemy coś takiego:
w bash to co powyżej pisze:Kod: Zaznacz cały
otoja@icequeen:~ > for wtyczka in `ls /dev/ttyUSB*`; do echo $wtyczka; udevadm info -a -n $wtyczka | grep "devpath"; done;
/dev/ttyUSB0
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="8.2"
ATTRS{devpath}=="8"
ATTRS{devpath}=="0"
/dev/ttyUSB1
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="8.1.2"
ATTRS{devpath}=="8.1"
ATTRS{devpath}=="8"
ATTRS{devpath}=="0"
/dev/ttyUSB2
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="8.3"
ATTRS{devpath}=="8"
ATTRS{devpath}=="0"
otoja@icequeen:~ >
Jeżeli dostrzeżemy korelację pomiędzy powyższym wynikiem a tym co pokazało nam `lsusb --tree` to mamy:
/dev/ttyUSB0 jest przypisane do wtyczki na pierwszym hubie (Port 8), do gniazdka numer 2 (Port 2)
/dev/ttyUSB1 jest przypisane do wtyczki na drugim hubie, wpięto ją w gniazdo 2 (Port 2), a hub pośredniczący (Connec) w gniazdo 1 (Port 1) tego głównego (Manta)
/dev/ttyUSB2 jest przypisane do wtyczki na pierwszym hubie (Port 8), do gniazdka numer 3 (Port 3)
Tu dobrze zauważyć, że pomimo wielkiej dynamiki numeracji urządzeń i przypisywanych im nazw każdy koncentrator ma gniazdka na stałe identyfikowalne w systemie. Włączając i wyłączając kolejne przelotki usb i sprawdzając poleceniem dmesg co system przypisał urządzeniu, można łatwo dojść do prawdy objawionej, że numeracja dla np. Manty z warzywnego bazarku jest jak poniżej:
Mając na uwadze tę trwałą numerację możemy skonfrontować wyniki naszych przemyśleń z pierwszą fotografią wystawki - zgadza się.
Kolejny krok, to napisanie jakiegoś skryptu czy gadgetu na desktop, który pokaże nam 'po ludzku' co gdzie mamy wetknięte.
No, ale to już temat na później...