Jak powiązać urządzenie USB pod nazwą statyczną?


43

Mam Arduino, do którego czasami się przywiązuję, /dev/ttyUSB0a innym razem do /dev/ttyUSB1, przez co mój skrypt nie działa.

Nie chcę wyliczać wszystkich możliwości miejsca, w którym mogłoby znajdować się moje urządzenie, ale wolę, aby było ono związane gdzieś statycznie, np /dev/arduino.

Jak to osiągnąć?


4
Wystarczy napisać prostą regułę udev, która przypisze dowiązanie symboliczne / dev / arduino do właściwego urządzenia przez jego VID i PID.
Eddy_Em


Odpowiedzi:


41

Zgodnie z sugestią możesz dodać kilka reguł udev. Zredagowałem, /etc/udev/rules.d/10-local.rulesaby zawierał:

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

Możesz sprawdzić zmienne swojego urządzenia, uruchamiając

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

Bardziej szczegółowy przewodnik można przeczytać na stronie http://www.reactivated.net/writing_udev_rules.html


Działa jak urok. Jedno pytanie: jak wyjść udevam? I ważne jest, aby pamiętać, że my_uarttworzy dowiązanie symboliczne pod /dev/my_uart. Pierwszy raz napisałem /dev/arduinopo raz pierwszy i nie udało się, dopóki arduinojest wystarczające.
k0pernikus

udevadmpowinien zakończyć się sam po zakończeniu.
Kotte

Następnie z nieznanego powodu zawiesił sesję terminalu na moim Raspberry Pi podczas generowania raportu.
k0pernikus

35

Powyższa składnia reguły może działać w niektórych dystrybucjach, ale nie działała w mojej (Raspbian). Ponieważ nigdy nie znalazłem ani jednego dokumentu wyjaśniającego wszystkie tajniki, napisałem swój własny, który można znaleźć tutaj . Do tego się sprowadza.
1. dowiedz się, co jest na ttyUSB:

dmesg | grep ttyUSB  

2. wypisz wszystkie atrybuty urządzenia:

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

(oczywiście z numerami urządzeń zamiast x). Wybierz unikalny zestaw identyfikatorów, np. IdVendor + idProduct. Możesz także potrzebować SerialNumber, jeśli masz więcej niż jedno urządzenie z tym samym idVendor i idProduct. Numery seryjne powinny być unikalne dla każdego urządzenia.
3. Utwórz plik /etc/udev/rules.d/99-usb-serial.ruleszawierający coś takiego jak ten wiersz:

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

(zakładając, że nie potrzebujesz tam numeru seryjnego i oczywiście z numerami idVendor i idProduct, które znalazłeś w kroku 2.
4. Załaduj nową regułę:

sudo udevadm trigger

5. Sprawdź, co się stało:

ls -l /dev/your_device_name  

pokaże, na jaki numer ttyUSB poszedł dowiązanie symboliczne. Jeśli tak /dev/ttyUSB1, sprawdź, kto jest jego właścicielem i do której grupy należy:

ls -l /dev/ttyUSB1   

Więc dla zabawy:

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

Czy jest więc jakieś rozwiązanie, jeśli idVendori idProductsą dokładnie takie same? (dwa czujniki podłączone do identycznych modeli modułów USB i UART)
Steven Lu

@StevenLu Tak, patrz krok 2, wykonaj udevadm info --name=/dev/ttyUSB1 --attribute-walkdla obu urządzeń i poszukaj numerów seryjnych, powinny być one unikalne dla każdego urządzenia. Jeśli twoje czujniki nie mają numeru seryjnego, czy możesz podać, jakie są?
RolfBly,

to niesamowite, poinformuję o tym, kiedy to wypróbuję
Steven Lu

Moje klucze USB-UART za 2 USD mają numer seryjny 0001. Nie mogę powiedzieć, że jestem zaskoczony. Wygląda na to, że muszę zidentyfikować czujniki na podstawie protokołu wyjściowego.
Steven Lu

@StevenLu Pech. Konwertery FTDI USB-UART mają unikalny numer seryjny, AFAIK. Kilka dodatkowych dolarów, ale mniej czasu na rozwój.
RolfBly,

9

Problem z wieloma identycznymi urządzeniami USB

Mam Rasperry Pi z czterema kamerami. Biorę pix z fswebcamktórym identyfikuje kamery jak /dev/video0.. video3. Czasami kamera jest video0, vide02, video4a video6jednak możemy zapomnieć o tym teraz.

Potrzebuję stałego identyfikatora, aby zidentyfikować numer kamery, aby np. video0Zawsze był tym samym aparatem, ponieważ podpisuję zdjęcia. Niestety nie dzieje się to niezawodnie - przy starcie kamery są wyliczane jako video0... video3ale nie zawsze w ten sam sposób.

Wszystkie kamery mają ten sam identyfikator i numer seryjny.

Rozwiązaniem tego problemu są reguły udev, ale jest tam również wiele haczyków na ryby.

Jeśli wydasz polecenie

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

dostajesz wyrzutek wyjściowy, ale najważniejsze są

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

Bit KERNELS jest portem koncentratora USB. Przy czterech kamerach są cztery z nich - nie zmieniają się przy ponownym uruchomieniu, ale video{x}powiązanie z portem może się zmienić.

Potrzebujemy więc reguły udev, aby powiązać numer wideo z portem koncentratora USB - coś takiego:

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

Wygląda prosto - dostęp do kamery za pomocą

fswebcam –d  $realpath /dev/camera0

Tyle że to nie działa - jeśli umieścisz to w regule udev, a system przydzieli wideo0 (podczas rozruchu) do innego portu, reguła udev zostanie zignorowana. Symlink do w /dev/camera0zasadzie mówi no such device. Punkt wyjścia.

Chcemy powiązać dowiązanie symboliczne z adresem koncentratora USB, a nie video{x}liczbą. Zajęło to program w języku Python.

Pierwszym krokiem było biec

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

dla xmiędzy 1 i 8. Istnienie tst.jpgpo każdej rozmowie Określa, czy tam jest kamera wideo na ten numer. Z tego stwórz listę aktywnych numerów wideo. Moje doświadczenie jest takie, że jest to albo 0,1,2,3lub 0,2,4,6kamer użyłem.

Inni mogą oczywiście zbudować tę listę przy użyciu innego procesu.

Następnie dla każdego numeru wideo na liście uruchom

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

i wyodrębnij KERNELS= linez dd. Z tego procesu powstaje lista adresów portów USB kamer. Posortuj tę listę, aby w następnym kroku zawsze przetwarzać ją w tej samej kolejności. Nazwij to „listą adresów”.

Uruchom program udevadm … > ddponownie i stwórz listę, która wygląda

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

Teraz przejdź przez listę adresów - dla każdego wpisu znajdź odpowiedni wpis z listy filmów. Utwórz nową listę, która wygląda jak zbiór linii takich jak

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

X (numer dowiązania symbolicznego) zostaje zastąpiony numerem kolejnym na liście adresów.

Teraz masz regułę udev, która działa. Dowiązanie symboliczne powiązane z adresem koncentratora USB bez względu na numer wideo przypisany do tego portu podczas uruchamiania.

Napisz ostateczną listę do pliku /etc/udev/rules.d/cam.rules. Uruchom, udevadm triggeraby go aktywować, a zadanie zostanie wykonane. /dev/camera2będzie tą samą kamerą (port USB) niezależnie od numeru wideo.


Witamy w Unix Stackexchange. Sformatuj swoją odpowiedź przy użyciu Markdown. Właśnie to dla ciebie zrobiłem. Pamiętaj również, że chcemy, aby odpowiedzi były na temat. To brzmi bardziej jak wpis na blogu (co nie jest całkiem złe), ale nie jest tak pomocne, aby najpierw przeczytać o podejściach, które nie działały. Możesz złomować tę część.
k0pernikus

Przepraszam. Jestem tu nowy. Problem ten badałem od miesięcy. Znalazłem innych, którzy borykają się z tym samym problemem i nie znalazłem odpowiedzi, która zadziałałaby dla mnie. Wiem tylko, gdzie doradziłbyś, żebym zamieścił coś takiego? Powściągnąłem się i nie uwzględniłem źródła Python :-)
Ian Boag,

1

Udało mi się także znaleźć unikalne urządzenie /dev/serial/by-id. Nie próbowałem jeszcze restartu, ale pliki w tym katalogu były tylko linkami do odpowiedniego pliku urządzenia ( ttyACM[0-9]) .`

Korzystam z arch. Linuxa na Raspberry Pi, ale natknąłem się na nie, wykonując a finddla nazw plików zawierających „Arduino”. Moje programy w Pythonie działają poprawnie, używając tych plików jako urządzeń do odczytu / zapisu danych do / z moich Arduinos (jak dotąd dwa na jednym Pi).


0

Wystarczy powiedzieć, że powyższe działało dla mnie, a także automatycznie zamontowało urządzenie dla mnie po tym, jak umieściłem wpis w / etc / fstab (a także wywołuje umount po usunięciu pendrive)

to znaczy

/ etc / fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

cat /etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

Po włożeniu pamięci USB otrzymuję:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.