Làm cách nào để liên kết thiết bị USB dưới tên tĩnh?


43

Tôi có một Arduino đôi khi bị ràng buộc /dev/ttyUSB0và lần khác /dev/ttyUSB1, làm cho kịch bản của tôi thất bại.

Tôi không muốn liệt kê tất cả các khả năng thiết bị của mình có thể ở đâu, nhưng tôi muốn nó bị ràng buộc ở một nơi nào đó tĩnh, ví dụ /dev/arduino.

Làm thế nào để tôi đạt được điều đó?


4
Chỉ cần viết một quy tắc udev đơn giản sẽ gán symlink / dev / arduino để phát minh đúng bởi VID & PID của nó.
Eddy_Em


Câu trả lời:


41

Theo đề xuất, bạn có thể thêm một số quy tắc udev. Tôi đã chỉnh sửa /etc/udev/rules.d/10-local.rulesđể chứa:

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

Bạn có thể kiểm tra các biến của thiết bị bằng cách chạy

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

Có một hướng dẫn chuyên sâu hơn mà bạn có thể đọc trên http://www.reactivated.net/wr_udev_rules.html


Làm việc như người ở. Một câu hỏi: Làm thế nào để thoát udevam? Và điều quan trọng cần lưu ý là my_uarttạo liên kết tượng trưng bên dưới /dev/my_uart. Lần đầu tiên tôi viết /dev/arduinolần đầu tiên và nó đã thất bại trong khi đó arduinolà đủ.
k0pernikus

udevadmnên tự thoát khi hoàn thành.
Kotte

Sau đó, vì một số lý do không xác định, nó đã đóng băng phiên cuối cùng vào Raspberry Pi của tôi trong khi tạo báo cáo.
k0pernikus

35

Cú pháp quy tắc ở trên có thể hoạt động trên một số bản phân phối, nhưng không hoạt động trên phần mềm của tôi (Raspbian). Vì tôi không bao giờ tìm thấy một tài liệu duy nhất giải thích tất cả mọi thứ trong và ngoài, tôi đã viết riêng của mình, được tìm thấy ở đây . Đây là những gì nó sôi lên.
1. tìm hiểu những gì trên ttyUSB:

dmesg | grep ttyUSB  

2. liệt kê tất cả các thuộc tính của thiết bị:

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

(với số thiết bị của bạn thay vì x, tất nhiên). Chọn một bộ định danh duy nhất, ví dụ: idVendor + idSản phẩm. Bạn cũng có thể cần Số sê-ri nếu bạn có nhiều thiết bị có cùng idVendor và idSản phẩm. SerialNumbers nên là duy nhất cho mỗi thiết bị.
3. Tạo một tệp /etc/udev/rules.d/99-usb-serial.rulescó nội dung giống như dòng này trong đó:

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

(giả sử bạn không cần số sê-ri ở đó và tất nhiên với các số cho idVendor và idSản phẩm mà bạn đã tìm thấy ở bước 2.
4. Tải quy tắc mới:

sudo udevadm trigger

5. Xác minh những gì đã xảy ra:

ls -l /dev/your_device_name  

sẽ hiển thị số ttyUSB mà symlink đã sử dụng. Nếu là vậy /dev/ttyUSB1, thì hãy xác minh xem ai sở hữu nhóm đó và thuộc nhóm nào:

ls -l /dev/ttyUSB1   

Sau đó, chỉ để cho niềm vui của nó:

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

Vậy có giải pháp nào nếu idVendoridProducthoàn toàn giống nhau không? (hai cảm biến được gắn trên mô hình USB giống hệt với mô-đun UART)
Steven Lu

@StevenLu Có, xem bước 2, làm udevadm info --name=/dev/ttyUSB1 --attribute-walkcho cả hai thiết bị và tìm số sê-ri, chúng phải là duy nhất cho mỗi thiết bị. Nếu cảm biến của bạn không có số sê-ri, bạn có thể chỉ định chúng là gì không?
RolfBly

thật tuyệt vời, tôi sẽ báo cáo lại khi tôi thử nó
Steven Lu

USB 2 đô la cho UART của tôi có số sê-ri 0001. Không thể nói tôi ngạc nhiên. Có vẻ như tôi phải xác định các cảm biến dựa trên giao thức đầu ra của chúng.
Steven Lu

@StevenLu Xui xẻo. Bộ chuyển đổi USB-UART của FTDI có số sê-ri duy nhất, AFAIK. Một vài đô la thêm, nhưng ít thời gian để phát triển.
RolfBly

9

Sự cố nhiều thiết bị USB giống hệt nhau

Tôi có một chiếc Rasperry Pi với bốn camera. Tôi lấy pix với fswebcamsẽ xác định các máy ảnh như /dev/video0.. video3. Đôi khi máy ảnh là video0, vide02, video4video6nhưng chúng ta có thể quên về điều đó vào lúc này.

Tôi cần một ID liên tục để xác định số camera để, ví dụ như video0luôn luôn là cùng một camera vì tôi chú thích ảnh. Thật không may, điều này không xảy ra một cách đáng tin cậy - khi khởi động, các máy ảnh được liệt kê là video0.. video3nhưng không phải lúc nào cũng như vậy.

Các máy ảnh đều có cùng ID và số sê-ri.

Giải pháp cho vấn đề này liên quan đến các quy tắc udev, nhưng cũng có rất nhiều lưỡi câu ở đó.

Nếu bạn ban hành lệnh

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

bạn nhận được một lượng lớn đầu ra nhưng các bit nổi bật là

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

Bit Kernels là một cổng trung tâm USB. Với bốn máy ảnh, có bốn trong số này - chúng không thay đổi khi khởi động lại, nhưng video{x}liên kết với một cổng có thể thay đổi.

Vì vậy, chúng ta cần một quy tắc udev để buộc một số video vào cổng trung tâm USB - đại loại như:

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

Trông đơn giản - truy cập máy ảnh với

fswebcam –d  $realpath /dev/camera0

Ngoại trừ nó không hoạt động - nếu bạn đặt điều này trong quy tắc udev và hệ thống đã phân bổ video0 (khi khởi động) cho một cổng khác, quy tắc udev sẽ bị bỏ qua. Các symlink /dev/camera0về cơ bản nói no such device. Một hình vuông.

Những gì chúng tôi muốn là liên kết một liên kết tượng trưng với một địa chỉ trung tâm USB, không phải là một video{x}số. Nó lấy một chương trình Python.

Bước đầu tiên là chạy

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

trong xkhoảng từ 1 đến 8. Sự tồn tại của tst.jpgsau mỗi cuộc gọi sẽ xác định xem có camera trên số video này hay không. Từ đây tạo một danh sách các số video hoạt động. Kinh nghiệm của tôi đã được rằng nó là một trong hai 0,1,2,3hoặc 0,2,4,6cho máy ảnh Tôi đã sử dụng.

Những người khác tất nhiên có thể xây dựng danh sách này bằng cách sử dụng một quy trình khác.

Sau đó, cho mỗi số video trong danh sách chạy

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

và trích xuất KERNELS= linetừ dd. Từ quá trình này, bạn kết thúc với một danh sách các địa chỉ cổng USB cho máy ảnh. Sắp xếp danh sách này để ở bước tiếp theo, bạn luôn xử lý nó theo cùng một thứ tự. Gọi đây là "danh sách địa chỉ".

Chạy lại udevadm … > ddthứ đó và tạo một danh sách giống như

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

Bây giờ bước qua danh sách địa chỉ - cho mỗi mục tìm mục nhập tương ứng từ danh sách video. Tạo một danh sách mới trông giống như một bộ sưu tập các dòng như

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

X (số liên kết tượng trưng) được thay thế bằng số thứ tự trong danh sách địa chỉ.

Bây giờ bạn có một quy tắc udev hoạt động. Một liên kết tượng trưng được gắn với một địa chỉ trung tâm USB bất kể số video nào được phân bổ cho cổng đó khi khởi động.

Viết danh sách cuối cùng vào một tập tin /etc/udev/rules.d/cam.rules. Chạy udevadm triggerđể kích hoạt nó và công việc được thực hiện. /dev/camera2sẽ là cùng một camera (cổng USB) bất kể số video của nó.


Chào mừng bạn đến unix stackexchange. Vui lòng định dạng câu trả lời của bạn bằng cách sử dụng markdown. Tôi chỉ làm điều đó cho bạn. Cũng nên nhớ rằng chúng tôi muốn câu trả lời là chính xác. Điều này đọc giống như một mục blog (không hoàn toàn xấu) nhưng nó không hữu ích khi lần đầu tiên đọc về các phương pháp không hiệu quả. Bạn có thể loại bỏ phần đó.
k0pernikus

Lấy làm tiếc. Tôi là người mới ở đây. Tôi đã nghiên cứu vấn đề này trong nhiều tháng. Tôi đã tìm thấy những người khác đang vật lộn với cùng một vấn đề và tôi đã không tìm thấy câu trả lời phù hợp với mình. Chỉ để tôi biết, bạn sẽ khuyên tôi đăng một cái gì đó như thế này ở đâu? Tôi đã kiềm chế bản thân và không bao gồm nguồn Python :-)
Ian Boag

1

Tôi cũng có thể tìm thấy một thiết bị độc đáo trong /dev/serial/by-id. Tôi chưa thử khởi động lại, nhưng các tệp trong thư mục đó chỉ là các liên kết đến tệp thiết bị thích hợp ( ttyACM[0-9]) .`

Tôi đang chạy arch linux trên Raspberry Pi, nhưng tôi tình cờ phát hiện ra chúng chỉ bằng cách thực hiện một findtên tệp có chứa "Arduino". Các chương trình python của tôi chạy tốt khi sử dụng các tệp đó làm thiết bị để đọc / ghi dữ liệu đến / từ Arduinos của tôi (cho đến nay, hai trên một Pi).


0

Chỉ cần nói rằng những điều trên đã làm việc cho tôi và cũng tự động kết nối thiết bị cho tôi sau khi tôi đã đặt một mục trong / etc / fstab (và nó cũng gọi umount sau khi gỡ bỏ thanh)

I E

/ etc / fstab

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

mèo /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"

Vì vậy, sau khi cắm thanh USB của tôi, tôi nhận được:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.