Як зв’язати USB-пристрій під статичним іменем?


43

У мене є Arduino, який іноді зав'язується /dev/ttyUSB0і в інший час /dev/ttyUSB1, через що мій сценарій не працює.

Я не хочу перераховувати всі можливості, де мій пристрій міг би бути, але я вважаю за краще, щоб він був пов'язаний десь статичним, наприклад /dev/arduino.

Як я цього досягти?


4
Просто напишіть просте правило-udev, яке призначить symlink / dev / arduino правильним розробкою за його VID & PID.
Eddy_Em


Відповіді:


41

Як пропонується, ви можете додати деякі правила udev. Я редагував, /etc/udev/rules.d/10-local.rulesщоб містити:

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

Ви можете перевірити змінні свого пристрою, запустивши

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

Існує більш поглиблений посібник, який ви можете прочитати на http://www.reactivate.net/writing_udev_rules.html


Працював як шарм. Одне питання: Як вийти udevam? І важливо відзначити, що my_uartстворюється символьне посилання під /dev/my_uart. Я вперше написав /dev/arduinoперший раз, і це не вдалося, хоча arduinoце достатньо.
k0pernikus

udevadmповинен вийти сам, коли це зроблено.
Котте

Потім з незрозумілої причини він заморозив термінальний сеанс для мого Raspberry Pi під час створення звіту.
k0pernikus

35

Синтаксис правил вище може працювати в деяких дистрибутивах, але не працює на моєму (Raspbian). Оскільки я жодного разу не знайшов жодного документа, який би пояснював усі внески та виходи, я написав свій власний, щоб знайти його тут . Це те, до чого зводиться.
1. з'ясуйте, що на ttyUSB:

dmesg | grep ttyUSB  

2. перерахуйте всі атрибути пристрою:

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

(звичайно, з номерами вашого пристрою замість x). Виберіть унікальний набір ідентифікаторів, наприклад idVendor + idProduct. Також вам може знадобитися SerialNumber, якщо у вас є більше одного пристрою з тим самим idVendor та idProduct. SerialNumbers повинен бути унікальним для кожного пристрою.
3. Створіть у файлі /etc/udev/rules.d/99-usb-serial.rulesщось подібне до цього рядка:

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

(якщо припустити, що вам там не потрібен серійний номер, і звичайно з номерами для idVendor та idProduct, які ви знайшли на кроці 2.
4. Завантажте нове правило:

sudo udevadm trigger

5. Перевірте, що сталося:

ls -l /dev/your_device_name  

покаже, на яке число ttyUSB перейшло символьне посилання. Якщо це так /dev/ttyUSB1, то перевірте, хто йому належить та до якої групи він належить:

ls -l /dev/ttyUSB1   

Тоді просто заради цього:

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

Так чи є рішення, якщо idVendorі idProductточно такі ж? (два датчика, приєднані на однаковій моделі USB до модулів UART)
Стівен Лу

@StevenLu Так, див. Крок 2, зробіть udevadm info --name=/dev/ttyUSB1 --attribute-walkдля обох пристроїв і шукайте серійні номери, вони повинні бути унікальними для кожного пристрою. Якщо у ваших датчиків немає серійного номера, можете вказати, що вони є?
RolfBly

це приголомшливо, я звітну, коли спробую це
Стівен Лу

Мої ключі від USB до UART в $ 2 мають серійний номер 0001. Не можу сказати, що я здивований. Схоже, я повинен ідентифікувати датчики на основі їх вихідного протоколу.
Стівен Лу

@StevenLu Невдача. Перетворювачі FTDI USB-UART мають унікальний серійний номер, AFAIK. Кілька зайвих доларів, але менше часу на розвиток.
RolfBly

9

Проблема з декількома ідентичними USB-пристроями

У мене є Rasperry Pi з чотирма камерами. Я приймаю пікс з fswebcamякої ідентифікує камери , як /dev/video0.. video3. Іноді камера video0, vide02, video4і , video6але ми можемо забути про те, що на даний момент.

Мені потрібен постійний ідентифікатор, щоб визначити номер камери, щоб, наприклад video0, завжди була одна і та ж камера, тому що я підписую фотографії. На жаль, це не відбувається надійно - під час завантаження камери перераховуються як video0.., video3але не завжди однаково.

Усі камери мають однаковий ідентифікаційний номер та серійний номер.

Вирішення цієї проблеми передбачає правила udev, але там також багато риболовних каналів.

Якщо ви видаєте команду

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

Ви отримуєте стяжку виводу, але помітні біти є

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

Біт KERNELS - це порт USB-концентратора. З чотирма камерами їх є чотири - вони не змінюються при перезавантаженні, але video{x}асоційована з портом може змінитися.

Тому нам потрібно правило udev, щоб прив’язати номер відео до порту концентратора USB - щось на зразок:

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

Виглядає просто - зверніться до камери за допомогою

fswebcam –d  $realpath /dev/camera0

За винятком того, що це не працює - якщо ви помістите це в правило udev і система виділила video0 (під час завантаження) на інший порт, правило udev ігнорується. Символьне посилання в /dev/camera0основному говорить no such device. Квадратний.

Ми хочемо прив’язати символьне посилання до адреси концентратора USB, а не до video{x}числа. Знадобилася програма Python.

Першим кроком було бігти

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

для xвід 1 до 8. Наявність tst.jpgпісля кожного дзвінка визначає, чи є камера на цьому номері відео. З цього складіть список активних номерів відео. Мій досвід полягав у тому, що я використовував 0,1,2,3або 0,2,4,6для фотоапаратів.

Інші, звичайно, можуть скласти цей список, використовуючи інший процес.

Потім для кожного номера відео у списку запустіть

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

і витягти KERNELS= lineз dd. Після цього ви отримуєте список адрес USB-камер для камер. Сортуйте цей список так, щоб на наступному кроці ви завжди обробляли його в тому ж порядку. Назвіть це "списком адрес".

Запустіть udevadm … > ddріч ще раз і складіть список, який виглядає так

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

Тепер перегляньте список адрес - для кожного запису знайдіть відповідний запис зі списку відео. Створіть новий список, схожий на набір схожих рядків

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

X (номер символьного посилання) замінюється порядковим номером у списку адрес.

Тепер у вас є правило udev, яке працює. Симпосилання, прив’язане до адреси концентратора USB незалежно від того, який номер відео призначається цьому порту під час завантаження.

Запишіть остаточний список у файл /etc/udev/rules.d/cam.rules. Запустіть, udevadm triggerщоб активувати його, і робота виконана. /dev/camera2буде однаковою камерою (USB-портом) незалежно від її номера відео.


Ласкаво просимо на unix stackexchange. Будь ласка, відформатуйте свою відповідь за допомогою розмітки. Я просто зробив це для вас. Також майте на увазі, що ми хочемо, щоб відповіді були суттєвими. Це більше схоже на запис у блозі (що не зовсім погано), але це не так корисно спочатку прочитати про підходи, які не спрацювали. Ви можете брухтувати цю частину.
k0pernikus

Вибачте. Я тут новий. Я досліджував цю проблему місяцями. Я знайшов інших, які борються з тією ж проблемою, і я не знайшов відповіді, яка працювала на мене. Просто я знаю, де б ви порадили, щоб я опублікував щось подібне? Я стримався і не включав джерело Python :-)
Ian Boag

1

Мені також вдалося знайти унікальний пристрій у /dev/serial/by-id. Я ще не пробував перезавантаження, але файли в цьому каталозі були лише посиланнями на відповідний файл пристрою ( ttyACM[0-9]). "

Я запускаю аркуш Linux на Raspberry Pi, але я натрапив на них просто, зробивши findфайли файлів, що містять "Arduino". Мої програми python працюють добре, використовуючи ці файли як пристрої для читання / запису даних в / з мого Arduinos (поки що два на одному Pi).


0

Просто скажу, що вищезгадане працювало для мене, а також автоматизувало пристрій для мене після того, як я помістив запис у / etc / fstab (і він також викликає umount після видалення палиці)

тобто

/ тощо / 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"

Тож після вставлення моєї usb-палки я отримую:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.