将带有自定义 PID 的 USB 串行设备连接到嵌入式上的 ttyUSB0

try*_*tch 22 drivers embedded usb serial-port

我试图让一个带有自定义 PID 的 FTDI USB 串行设备自动(甚至手动)连接到 ttyUSB%n,但没有取得多大成功。设备的正常 VID/PID 为 0403/6001。以这种方式编程时,它可以完美运行并在插入时自动将自身连接到 ttyUSB0。即使重新编译驱动程序以尊重我们的新 PID,当使用自定义的 ttyUSB0 编程时,也不会出现,但它确实将其识别为 ftdi_sio 设备并且加载驱动程序。

我已将我们的 PID 添加到标题和源代码中:

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

重新编译整个内核并刷新设备。当我插入设备时,我得到:

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
Run Code Online (Sandbox Code Playgroud)

lsusb 显示正确的自定义 VID/PID。驱动程序似乎认识到它应该与 ftdi_sio 一起使用,但没有像使用未修改的 PID 那样将它附加到 ttyUSB0。关于我在这里做错了什么的任何建议?

rob*_*at2 23

您不需要将内核修改为仅一次;你可以覆盖它。

  1. 拔掉设备
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. 插入设备

你的设备应该可以工作。

您的另一种选择是使用bindsysfs 接口;lsusb -t在这种情况下,我建议使用来找出正确的路径+接口。

使用我系统中的一个部分示例,一个 USB 存储设备(对于 USB 串行来说非常相似)。

$ 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
Run Code Online (Sandbox Code Playgroud)

号码格式为:BUS-PORT(.PORT)+:1.INTERFACE. 在 lsusb 输出中唯一不可见的数字是冒号后的第一个数字;这一直是1我的经验。具有更深入内核知识的人可能会告诉我它是什么并提供一个反例。


小智 18

你不需要修改内核,你可以像这样自动化这个过程:

  1. 将以下单行添加到 /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. 重新启动或运行sudo udevadm control --reload以获取新规则。

  3. 拔下设备。

  4. 插入设备。