Saya mencoba untuk mendapatkan perangkat FTDI USB-Serial dengan PID khusus untuk secara otomatis (atau bahkan secara manual) dilampirkan ke ttyUSB%n, tanpa banyak hasil. VID/PID normal perangkat adalah 0403/6001. Ketika diprogram dengan cara ini, ia bekerja dengan sempurna dan secara otomatis menempelkan dirinya ke ttyUSB0 saat dicolokkan. Bahkan dengan driver yang dikompilasi ulang untuk menghormati PID baru kami, ketika diprogram dengan yang khusus 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 ulang perangkat. Saat 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 khusus yang benar. Pengemudi tampaknya mengenali bahwa itu seharusnya menggunakan ftdi_sio dengannya, tetapi tidak melampirkannya ke ttyUSB0 seperti halnya dengan PID yang tidak dimodifikasi. Ada saran tentang apa yang saya lakukan salah di sini?
Jawaban yang Diterima:
Anda tidak perlu memodifikasi kernel hanya sekali; Anda dapat menggantinya.
- Cabut perangkat
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
- Colokkan perangkat
Dan perangkat Anda akan berfungsi.
Alternatif Anda yang lain adalah menggunakan bind
antarmuka sysfs; Saya sarankan menggunakan lsusb -t
untuk mengetahui jalur+antarmuka yang benar dalam kasus tersebut.
Menggunakan contoh parsial dari sistem saya, dari perangkat penyimpanan usb (akan sangat mirip untuk serial 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
Format nomornya adalah:BUS-PORT(.PORT)+:1.INTERFACE
. Satu-satunya angka yang tidak terlihat di keluaran lsusb adalah digit pertama setelah titik dua; dan selalu menjadi 1
dalam pengalaman saya. Seseorang dengan pengetahuan kernel yang lebih dalam mungkin dapat memberi tahu saya apa itu dan memberikan contoh tandingan.