Sto tentando di ottenere un dispositivo seriale USB FTDI con un PID personalizzato da collegare automaticamente (o anche manualmente) a ttyUSB%n, senza molto successo. Il VID/PID normale del dispositivo è 0403/6001. Se programmato in questo modo, funziona perfettamente e si collega automaticamente a ttyUSB0 quando è collegato. Anche con il driver ricompilato per rispettare il nostro nuovo PID, quando programmato con quello personalizzato ttyUSB0 non compare, ma lo riconosce come dispositivo ftdi_sio e carica il driver.
Ho aggiunto il nostro PID all'intestazione e alla fonte:
// 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) },
// ....
Ricompilato l'intero kernel e rifatta il dispositivo. Quando collego il dispositivo ricevo:
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 mostra il VID/PID personalizzato corretto. Il driver sembra riconoscere che dovrebbe usare ftdi_sio con esso, ma non lo collega a ttyUSB0 come farebbe con il PID non modificato. Qualche suggerimento su cosa sto sbagliando qui?
Risposta accettata:
Non è necessario modificare il kernel solo una volta; puoi sovrascriverlo.
- Scollega il dispositivo
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
- Collega il dispositivo
E il tuo dispositivo dovrebbe funzionare.
L'altra alternativa è usare il bind
interfaccia sysfs; Suggerisco di usare lsusb -t
per capire il percorso corretto + interfaccia in quel caso.
Utilizzando un esempio parziale del mio sistema, di un dispositivo di archiviazione USB (sarebbe molto simile per USB seriale).
$ 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
Il formato del numero è:BUS-PORT(.PORT)+:1.INTERFACE
. L'unico numero che non è visibile nell'output di lsusb è la prima cifra dopo i due punti; ed è sempre stato un 1
nella mia esperienza. Qualcuno con una conoscenza più approfondita del kernel può probabilmente dirmi di cosa si tratta e fornire un controesempio.