Ich versuche, ein FTDI USB-Serial-Gerät mit einer benutzerdefinierten PID automatisch (oder sogar manuell) an ttyUSB%n anzuhängen, ohne großen Erfolg. Die normale VID/PID des Geräts ist 0403/6001. Wenn es auf diese Weise programmiert ist, funktioniert es perfekt und verbindet sich automatisch mit ttyUSB0, wenn es angeschlossen wird. Selbst wenn der Treiber neu kompiliert wurde, um unsere neue PID zu respektieren, erscheint ttyUSB0 nicht, wenn es mit der benutzerdefinierten programmiert wird, aber es erkennt es als ein ftdi_sio-Gerät und lädt den Treiber.
Ich habe unsere PID zum Header und zur Quelle hinzugefügt:
// 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) },
// ....
Den gesamten Kernel neu kompiliert und das Gerät neu geflasht. Wenn ich das Gerät anschließe, erhalte ich:
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 zeigt die richtige benutzerdefinierte VID/PID an. Der Treiber scheint zu erkennen, dass er ftdi_sio damit verwenden soll, hängt es aber nicht an ttyUSB0 an, wie es bei der unveränderten PID der Fall wäre. Irgendwelche Vorschläge, was ich hier falsch mache?
Akzeptierte Antwort:
Sie müssen den Kernel nicht nur einmal ändern; Sie können es überschreiben.
- Ziehen Sie das Gerät ab
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
- Schließen Sie das Gerät an
Und Ihr Gerät sollte funktionieren.
Ihre andere Alternative ist die Verwendung von bind
sysfs-Schnittstelle; Ich schlage vor, lsusb -t
zu verwenden um in diesem Fall den richtigen Pfad + Schnittstelle herauszufinden.
Unter Verwendung eines Teilbeispiels aus meinem System eines USB-Speichergeräts (es wäre sehr ähnlich für 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
Das Format der Nummer ist:BUS-PORT(.PORT)+:1.INTERFACE
. Die einzige Zahl, die in der lsusb-Ausgabe nicht sichtbar ist, ist die erste Ziffer nach dem Doppelpunkt; und es war immer eine 1
durch meine Erfahrung. Jemand mit tieferen Kernel-Kenntnissen kann mir wahrscheinlich sagen, was das ist, und ein Gegenbeispiel liefern.