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?
sumber
Jawaban:
Anda tidak perlu memodifikasi kernel hanya sekali saja; Anda bisa menimpanya.
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
Dan perangkat Anda harusnya berfungsi.
Alternatif Anda yang lain adalah dengan menggunakan
bind
antarmuka sysfs; Saya sarankan menggunakanlsusb -t
untuk 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).
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 menjadi1
pengalaman saya. Seseorang dengan pengetahuan kernel yang lebih dalam mungkin dapat memberi tahu saya apa itu dan memberikan contoh tandingan.sumber
Anda tidak perlu memodifikasi kernel, Anda dapat mengotomatiskan proses seperti ini:
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'"
Mulai ulang atau jalankan
sudo udevadm control --reload
untuk mengambil aturan baru.Cabut perangkat.
Tancapkan perangkat.
sumber
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'"
sumber
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"