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

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

我试图让带有自定义 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
// then in ftdi_sio.c
static struct usb_device_id id_table_combined [] = {
    // devices....
    { USB_DEVICE(FTDI_VID, FTDI_CUSTOM_PID) },
    // ....

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

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 显示正确的自定义 VID/PID。驱动程序似乎认识到它应该使用 ftdi_sio,但不会像使用未修改的 PID 那样将其附加到 ttyUSB0。关于我在这里做错了什么有什么建议吗?

答案1

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

  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

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

答案2

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

  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. 插入设备。

答案3

SiLabs 的评估板也发生过类似的情况 - USB-UART 芯片 CP2102 提供不规则的 VID/PID:

lsusb

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

通过加载模块 cp210x 并发送 VID/PID 解决了问题,如前所述:

sudo modprobe cp210x

sudo -s

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

udev 对应的 99-cp210.rules 文件如下所示:

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'"

相关内容