我试图让带有自定义 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
您不需要将内核修改一次;你可以覆盖它。
- 拔掉设备插头
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
- 插入设备
并且您的设备应该可以工作。
您的另一个选择是使用bind
sysfs 接口;我建议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
您不需要修改内核,您可以像这样自动化该过程:
将以下单行添加到
/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'"
重新启动或运行
sudo udevadm control --reload
以获取新规则。拔掉设备插头。
插入设备。
答案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'"