Estoy intentando obtener un dispositivo FTDI USB-Serial con un PID personalizado para conectarlo automáticamente (o incluso manualmente) a ttyUSB%n, sin mucho éxito. El VID/PID normal del dispositivo es 0403/6001. Cuando se programa de esta manera, funciona perfectamente y se conecta automáticamente a ttyUSB0 cuando se conecta. Incluso con el controlador recompilado para respetar nuestro nuevo PID, cuando se programa con uno personalizado, ttyUSB0 no aparece, pero lo reconoce como un dispositivo ftdi_sio y carga el controlador.
He agregado nuestro PID al encabezado y fuente:
// 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) },
// ....
Recompilé todo el kernel y actualicé el dispositivo. Cuando conecto el dispositivo obtengo:
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 muestra el VID/PID personalizado correcto. El controlador parece reconocer que se supone que debe usar ftdi_sio con él, pero no lo conecta a ttyUSB0 como lo haría con el PID no modificado. ¿Alguna sugerencia sobre lo que estoy haciendo mal aquí?
Respuesta aceptada:
No es necesario que modifique el kernel solo una vez; puede anularlo.
- Desconecte el dispositivo
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
- Conecte el dispositivo
Y tu dispositivo debería funcionar.
Su otra alternativa es usar el bind
interfaz sysfs; Sugiero usar lsusb -t
para averiguar la ruta+interfaz correcta en ese caso.
Usando un ejemplo parcial de mi sistema, de un dispositivo de almacenamiento usb (sería muy similar para 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
El formato del número es:BUS-PORT(.PORT)+:1.INTERFACE
. El único número que no está visible en la salida de lsusb es el primer dígito después de los dos puntos; y siempre ha sido un 1
en mi experiencia. Alguien con un conocimiento más profundo del kernel probablemente pueda decirme qué es y proporcionar un contraejemplo.