Quy tắc Udev để phù hợp với nhiều thiết bị USB


7

Tôi có một thiết bị 3G / GPS tạo ra 5 nút, mặc dù đó chỉ là một kết nối USB vật lý. Về cơ bản, một bộ chuyển đổi nối tiếp usb đa cổng.

Tôi đang cố gắng tạo một số udevquy tắc để đảm bảo các nút đó luôn có cùng tên hoặc ít nhất là một liên kết tượng trưng cho chúng.

Tôi thực sự có thể tìm thấy thiết bị tại /sys/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/. Bên trong là 1-2.2:1.0/để 1-2.2:1.4/, cho 5 nút nó tạo ra.

Tôi cũng có thể tìm thấy nó tại /sys/bus/usb/devices/1-2.2.

Thông tin udev cho thiết bị như sau:

udevadm info -a -p /sys/bus/usb/devices/1-2.2/1-2.2\:1.0
looking at device '/bus/usb/devices/1-2.2/1-2.2:1.0':
KERNEL=="1-2.2:1.0"
SUBSYSTEM=="usb"
DRIVER=="option"
ATTR{bInterfaceNumber}=="00"
ATTR{bAlternateSetting}==" 0"
ATTR{bNumEndpoints}=="03"
ATTR{bInterfaceClass}=="ff"
ATTR{bInterfaceSubClass}=="01"
ATTR{bInterfaceProtocol}=="01"
ATTR{modalias}=="usb:v12D1p1506d0000dc00dsc00dp00icFFisc01ip01"
ATTR{supports_autosuspend}=="0"

Từ thời điểm này, tất cả các nút có cùng thông tin. Và điều duy nhất khác nhau giữa các nút là thuộc tính bInterfaceNumber và đường dẫn thiết bị. Vì vậy, tôi nghĩ đến việc viết một quy tắc bằng dev path.

Bây giờ, vì một số lý do, quy tắc sau được khớp bởi tất cả các nút đó.

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0" SYMLINK+="huawey0"

Về cơ bản, huawey0điểm đến nút cuối cùng được liệt kê. Thiết bị đã tạo các nút từ ttyUSB2 đến 6 và liên kết này trỏ đến USB6.

Vì vậy, tôi đã thử bằng nút kernel:

ACTION=="add", KERNEL=="1-2.2:1.0" SYMLINK+="huawey0"

Bây giờ, không có gì xuất hiện trên / dev.

Sau này, tôi đã thử sử dụng bInterfaceNumber để tách chúng. Tôi đã sử dụng quy tắc sau

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]" ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

Và vẫn không có gì xảy ra. Tôi thậm chí đã thử một phiên bản rút gọn của quy tắc ..

ACTION=="add", ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

Và vẫn không có gì xảy ra. Tại sao nó không phù hợp?

Câu trả lời:


5

Tất cả các quy tắc của bạn đều có lỗi cú pháp trong đó:

  1. =là để gán ==là để so sánh, vì vậy bạn không thực sự nhìn vào những gì DEVbằng, bạn đã chỉ định nó.
  2. Bạn cần ,giữa tất cả các báo cáo, không có trước đây SYMLINK+=.

Quy tắc nắm tay

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0", SYMLINK+="huawey0"

Quy tắc thứ hai

ACTION=="add", KERNEL=="1-2.2:1.0", SYMLINK+="huawey0"

Quy tắc thứ ba

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

Quy tắc thứ tư

ACTION=="add", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

Tất cả các quy tắc này nên làm những gì bạn muốn bây giờ (tôi sẽ sử dụng quy tắc đầu tiên cá nhân).


4

Mặc dù bài đăng này đã được hỏi ba năm trước và điều này có thể không giải quyết được câu trả lời, tôi vẫn muốn chia sẻ kinh nghiệm thành công của mình ở đây để tham khảo trong tương lai.

Theo Nhận dạng các thiết bị modem GSM của Jens Reimann, sử dụng udev , "thuộc tính thiết bị, b bnternterNumber, không phải trên thiết bị tty, nhưng trên thiết bị usb trong hệ thống phân cấp cha mẹ", vì vậy tôi đã tạo hai quy tắc cho FTDI usb-to-4- của mình bộ chuyển đổi nối tiếp cổng:

SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", SYMLINK+="ttyUSB_FTDI_4_PORT_%E{.LOCAL_ifNum}"

Điều này lưu trữ thuộc tính Hồi bInterfaceNumber Cảnh vào biến môi trường .LOCAL_ifNum tựa (dấu chấm tiền tố là ký hiệu cho các biến tạm thời hoặc ẩn). Trong quy tắc thứ hai, biến tương tự được kéo vào bằng cách sử dụng cú pháp %% ENH. Các phiên bản udev mới hơn cũng hỗ trợ cho USD $ envv thay vì của %% E.
(bởi Jens Reimann)

nơi ttyUSB_FTDI_4_PORT_là tên liên kết tượng trưng. Hai quy tắc này sẽ tạo liên kết tượng trưng như ttyUSB_FTDI_4_PORT_00, ttyUSB_FTDI_4_PORT_01, ttyUSB_FTDI_4_PORT_02, ttyUSB_FTDI_4_PORT_03. Bạn có thể thêm ATTRS{serial}thuộc tính để hạn chế liệt kê thêm.

Jens Reimann cũng thừa nhận sự đóng góp của câu hỏi U & L của Ketan Patel , tệp quy tắc Udev cho modem không hoạt động , với câu trả lời được chấp nhận bởi derobert .


0

Ngoài ý kiến ​​của Alex, còn có một vấn đề khác. Có vẻ như ATTR{bInterfaceNumber}không hoạt động vì một số lý do. Để trích dẫn câu trả lời cho một câu hỏi liên quan , bạn nên sử dụng một cái gì đó dọc theo dòng

SUBSYSTEM=="tty", ACTION=="add", \
    ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}="2303", \
    ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="test_USB0"
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.