การแนบอุปกรณ์ USB-Serial พร้อม PID ที่กำหนดเองไปยัง ttyUSB0 บนอุปกรณ์


19

ฉันพยายามรับอุปกรณ์ FTDI USB-Serial ที่มี PID ที่กำหนดเองเพื่อแนบ (โดยอัตโนมัติหรือด้วยตนเอง) ไปยัง ttyUSB% n โดยไม่ประสบความสำเร็จ VID / PID ปกติของอุปกรณ์คือ 0403/6001 เมื่อตั้งโปรแกรมด้วยวิธีนี้มันจะทำงานได้อย่างสมบูรณ์และแนบตัวเองกับ ttyUSB0 โดยอัตโนมัติเมื่อทำการเชื่อมต่อแม้จะมีไดรเวอร์ที่คอมไพล์ใหม่เพื่อเคารพ PID ใหม่ของเราเมื่อตั้งโปรแกรมด้วย ttyUSB0 หนึ่งที่กำหนดเองจะไม่ปรากฏขึ้น โหลดไดรเวอร์

ฉันได้เพิ่ม 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) },
    // ....

คอมไพล์เคอร์เนลทั้งหมดใหม่และ reflashed อุปกรณ์ เมื่อฉันเสียบอุปกรณ์ฉันได้รับ:

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 กับมัน แต่ไม่ได้แนบไปกับ ttyUSB0 เช่นเดียวกับ PID ที่ไม่มีการแก้ไข ข้อเสนอแนะใด ๆ เกี่ยวกับสิ่งที่ฉันทำผิดที่นี่?


1
นี่คือประเภทฝังตัว? มันมี UDEV หรือไม่? ถ้าเป็นเช่นนั้น UDEV เป็นทางออกที่ดีที่สุดของคุณ (และฉันสามารถช่วยเพิ่มเติมได้)
Brian Redbeard

คำตอบ:


17

คุณไม่จำเป็นต้องแก้ไขเคอร์เนลเพียงครั้งเดียว คุณสามารถแทนที่มันได้

  1. ถอดปลั๊กอุปกรณ์
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. เสียบอุปกรณ์

และอุปกรณ์ของคุณควรทำงาน

ทางเลือกอื่นของคุณคือใช้bindส่วนต่อประสาน sysfs ฉันแนะนำให้ใช้lsusb -tเพื่อหาเส้นทาง + อินเตอร์เฟสที่ถูกต้องในกรณีนั้น

ใช้ตัวอย่างบางส่วนจากระบบของฉันของอุปกรณ์เก็บข้อมูล usb (มันจะคล้ายกันมากสำหรับ 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

BUS-PORT(.PORT)+:1.INTERFACEรูปแบบของตัวเลขคือ: จำนวนเฉพาะที่ไม่สามารถมองเห็นได้ในเอาต์พุต lsusb คือตัวเลขหลักแรกหลังจากโคลอน และมันก็เป็น1ประสบการณ์ของฉันเสมอ ใครบางคนที่มีความรู้เกี่ยวกับเคอร์เนลลึกกว่าอาจบอกได้ว่ามันคืออะไรและให้ตัวอย่างที่เคาน์เตอร์


ทำงานได้อย่างสมบูรณ์แบบขอบคุณ ควรเป็นคำตอบที่ยอมรับได้
Amr Bekhit

1
แค่สงสัยว่า: ถ้าฉันเปลี่ยนใจและฉันไม่ต้องการให้ vid / pid นี้ใช้ไดรเวอร์ ftdi_sio แต่เป็นอีกอันหนึ่งฉันจะเปลี่ยนขั้นตอนนี้ได้อย่างไร
Bram

เขียน vid / pid เพื่อ remove_id เพื่อเลิกทำ echo ไปที่ new_id
robbat2

@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

สถานการณ์ที่คล้ายกันเกิดขึ้นกับคณะกรรมการ Eval จาก 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

ไฟล์ 99-cp210.rules ที่สอดคล้องกันสำหรับ udev มีลักษณะดังต่อไปนี้:

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 ดังกล่าวข้างต้นและ symlink อุปกรณ์ 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"
คลุมเครือ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.