Memasang perangkat USB-Serial dengan PID khusus ke ttyUSB0 saat tertanam

19

Saya mencoba untuk mendapatkan perangkat USB-Serial FTDI dengan PID khusus untuk secara otomatis (atau bahkan secara manual) melampirkan ke ttyUSB% n, tanpa banyak keberhasilan. VID / PID normal perangkat adalah 0403/6001. Ketika diprogram dengan cara ini, ia bekerja dengan sempurna dan secara otomatis menempelkan dirinya ke ttyUSB0 ketika dicolokkan. Bahkan dengan driver yang dikompilasi ulang untuk menghormati PID baru kami, ketika diprogram dengan kustom, satu ttyUSB0 tidak muncul, tetapi ia mengenalinya sebagai perangkat ftdi_sio dan memuat driver.

Saya telah menambahkan PID kami ke header dan sumber:

// 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) },
    // ....

Mengkompilasi ulang seluruh kernel dan mem-flash perangkat. Ketika saya mencolokkan perangkat saya mendapatkan:

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 menunjukkan VID / PID kustom yang benar. Pengemudi tampaknya menyadari bahwa ia seharusnya menggunakan ftdi_sio dengannya, tetapi tidak melampirkannya ke ttyUSB0 seperti pada PID yang tidak dimodifikasi. Ada saran untuk apa yang saya lakukan salah di sini?

coba tangkap
sumber
1
Jenis tertanam apa ini? Apakah ada UDEV? Jika demikian, UDEV adalah taruhan terbaik Anda (dan saya dapat membantu lebih jauh dengan itu).
Brian Redbeard

Jawaban:

17

Anda tidak perlu memodifikasi kernel hanya sekali saja; Anda bisa menimpanya.

  1. Cabut perangkat
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Tancapkan perangkat

Dan perangkat Anda harusnya berfungsi.

Alternatif Anda yang lain adalah dengan menggunakan bindantarmuka sysfs; Saya sarankan menggunakan lsusb -tuntuk mencari tahu jalur + antarmuka yang benar dalam kasus itu.

Menggunakan contoh parsial dari sistem saya, dari perangkat penyimpanan usb (akan sangat mirip dengan 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

Format nomor adalah: BUS-PORT(.PORT)+:1.INTERFACE. Satu-satunya angka yang tidak terlihat dalam output lsusb adalah digit pertama setelah titik dua; dan itu selalu menjadi 1pengalaman saya. Seseorang dengan pengetahuan kernel yang lebih dalam mungkin dapat memberi tahu saya apa itu dan memberikan contoh tandingan.

robbat2
sumber
Bekerja dengan baik, terima kasih. Seharusnya jawaban yang diterima.
Amr Bekhit
1
Hanya ingin tahu: jika saya berubah pikiran, dan saya tidak ingin vid / pid ini menggunakan driver ftdi_sio tetapi yang lain, bagaimana cara mengembalikan langkah ini?
Bram
Tulis vid / pid untuk menghapus_id untuk membatalkan gema ke new_id.
robbat2
@trycatch dapatkah Anda menerima jawabannya?
robbat2
1
@mungkin new_id / remove_id hanya untuk menghapus ID yang ditambahkan secara dinamis. Jika saya mengerti apa yang ingin Anda lakukan: Anda ingin mencegah driver tertentu memuat untuk beberapa perangkat.
robbat2
12

Anda tidak perlu memodifikasi kernel, Anda dapat mengotomatiskan proses seperti ini:

  1. Tambahkan baris berikut ke /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. Mulai ulang atau jalankan sudo udevadm control --reloaduntuk mengambil aturan baru.

  3. Cabut perangkat.

  4. Tancapkan perangkat.

Stephen
sumber
1

situasi yang sangat mirip telah terjadi dengan papan eval dari SiLabs - chip USB-UART CP2102 dilengkapi dengan VID / PID tidak teratur:

lsusb

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

masalah diselesaikan dengan memuat modul cp210x dan mengirim VID / PID seperti yang disebutkan sebelumnya:

sudo modprobe cp210x

sudo -s

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

file 99-cp210.rules yang sesuai untuk udev terlihat sebagai berikut:

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

Oleg Kokorin
sumber
Untuk pelancong masa depan yang mencoba untuk mendapatkan tongkat HUSBZB-1 untuk bekerja, berikut adalah file udev yang akan menautkan driver cp210x seperti yang disebutkan di atas, dan mengaitkan perangkat tty dengan / dev / zigbee dan / dev / z-wave 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"
nebulous