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


19

我试图获得带有自定义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
这是哪种嵌入式类型?是否有UDEV?如果是这样,UDEV是您最好的选择(我可以进一步提供帮助)。
Brian Redbeard 2013年

Answers:


17

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

  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根据我的经验,这一直都是。拥有更深入的内核知识的人可能会告诉我它是什么,并提供一个反例。


工作完美,谢谢。应该是公认的答案。
Amr Bekhit 2014年

1
只是想知道:如果我改变主意,并且我不希望该vid / pid使用ftdi_sio驱动程序,而是要使用另一个驱动程序,我该如何还原此步骤?
布拉姆

将vid / pid写入remove_id以撤消对new_id的回显。
robbat2'2

@trycatch您可以接受答案吗?
robbat2

1
@kay new_id / remove_id仅用于删除动态添加的ID。如果我了解要执行的操作:您想防止为某些设备加载特定的驱动程序。
robbat2

12

您无需修改​​内核,可以像这样自动执行该过程:

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


1

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


对于未来的旅客试图让HUSBZB-1棒的工作,这里是一个udev的文件,该文件将链接上面提到的CP210X驱动,而符号的tty设备到/ dev / ZigBee的和/ dev / Z波 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"
模糊的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.