Gắn thiết bị USB-serial với bộ điều chỉnh PID vào ttyUSB0 khi được nhúng


19

Tôi đang cố gắng để thiết bị FTDI USB-serial có bộ điều chỉnh PID tự động (hoặc thậm chí thủ công) gắn vào ttyUSB% n, nhưng không thành công. VID / PID bình thường của thiết bị là 0403/6001. Khi được lập trình theo cách này, nó hoạt động hoàn hảo và tự động gắn vào ttyUSB0 khi được cắm. Ngay cả khi trình điều khiển được biên dịch lại để tôn trọng PID mới của chúng tôi, khi được lập trình với một ttyUSB0 tùy chỉnh không xuất hiện, nhưng nó nhận ra đó là thiết bị ftdi_sio và tải tài xế.

Tôi đã thêm PID của chúng tôi vào tiêu đề và nguồn:

// in ftdi_sio_ids.h
#define FTDI_CUSTOM_PID 0xABCD // not the actual pid
// then in ftdi_sio.c
static struct usb_device_id id_table_combined [] = {
    // devices....
    { USB_DEVICE(FTDI_VID, FTDI_CUSTOM_PID) },
    // ....

Biên dịch lại toàn bộ kernel và khởi động lại thiết bị. Khi tôi cắm thiết bị vào, tôi nhận được:

usb 1-1: new full-speed USB device number 2 using at91_ohci
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver

lsusb hiển thị VID / PID tùy chỉnh chính xác. Trình điều khiển dường như nhận ra rằng nó được cho là sử dụng ftdi_sio với nó, nhưng không gắn nó với ttyUSB0 giống như với bộ điều khiển PID chưa được sửa đổi. Có gợi ý nào về những gì tôi đang làm sai ở đây không?


1
Đây là loại nhúng nào? Nó có UDEV không? Nếu vậy, UDEV là đặt cược tốt nhất của bạn (và tôi có thể giúp thêm về điều đó).
Brian Redbeard

Câu trả lời:


17

Bạn không cần phải sửa đổi kernel chỉ một lần; bạn có thể ghi đè lên nó.

  1. Rút phích cắm thiết bị
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Cắm thiết bị

Và thiết bị của bạn sẽ hoạt động.

Thay thế khác của bạn là sử dụng bindgiao diện sysfs; Tôi đề nghị sử dụng lsusb -tđể tìm ra đường dẫn + giao diện chính xác trong trường hợp đó.

Sử dụng một ví dụ một phần từ hệ thống của tôi, về một thiết bị lưu trữ usb (nó sẽ rất giống với usb-serial).

$ lsusb -t
...
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    |__ Port 1: Dev 5, If 0, Class=Hub, Driver=hub/3p, 5000M
        |__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/3p, 5000M
            |__ Port 3: Dev 7, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
 ...
 $ echo '4-1.3.3:1.0' >/sys/bus/usb/drivers/usb-storage/bind

Định dạng của số là : BUS-PORT(.PORT)+:1.INTERFACE. Số duy nhất không thể nhìn thấy trong đầu ra lsusb là chữ số đầu tiên sau dấu hai chấm; và nó luôn luôn là một 1kinh nghiệm của tôi. Ai đó có kiến ​​thức hạt nhân sâu hơn có thể cho tôi biết đó là gì và cung cấp một ví dụ ngược lại.


Làm việc hoàn hảo, cảm ơn. Nên là câu trả lời được chấp nhận.
Amr Bekhit

1
Chỉ tự hỏi: nếu tôi thay đổi ý định và tôi không muốn vid / pid này sử dụng trình điều khiển ftdi_sio nhưng một cái khác, làm thế nào để tôi hoàn nguyên bước này?
Bram

Viết vid / pid vào remove_id để hoàn tác tiếng vang cho new_id.
robbat2

@trycatch bạn có thể vui lòng chấp nhận câu trả lời không?
robbat2

1
@kay new_id / remove_id chỉ để xóa ID được thêm động. Nếu tôi hiểu những gì bạn muốn làm: bạn muốn ngăn một trình điều khiển cụ thể tải cho một số thiết bị.
robbat2

12

Bạn không cần sửa đổi kernel, bạn có thể tự động hóa quy trình như thế này:

  1. Thêm dòng đơn sau vào /etc/udev/rules.d/99-ftdi.rules

    ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0403 6001 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

  2. Hoặc khởi động lại hoặc chạy sudo udevadm control --reloadđể chọn quy tắc mới.

  3. Rút phích cắm của thiết bị.

  4. Cắm thiết bị.


1

tình huống hoàn toàn tương tự đã xảy ra với bảng eval từ SiLabs - chip USB-UART CP2102 được cung cấp với VID / PID không đều:

lsusb

Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.

vấn đề được giải quyết bằng cách tải mô-đun cp210x và gửi VID / PID như đã đề cập trước đó:

sudo modprobe cp210x

sudo -s

echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id

tệp 99-cp210.rules tương ứng cho udev trông như sau:

ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="804c", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id'"


Đối với du khách trong tương lai cố gắng để có được một cây gậy HUSBZB-1 để làm việc, đây là một tập tin udev đó sẽ liên kết các tài xế cp210x như đã đề cập ở trên, và liên kết mềm các thiết bị tty đến / dev / Zigbee và / dev / z-wave ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="8a2a", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 8a2a > /sys/bus/usb-serial/drivers/cp210x/new_id'" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ Z-Wave Com Port", SYMLINK+="zwave" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ ZigBee Com Port", SYMLINK+="zigbee"
mơ hồ
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.