Ich versuche, ein FTDI USB-Serial-Gerät mit einer benutzerdefinierten PID zum automatischen (oder sogar manuellen) Anschließen an ttyUSB% n zu erhalten, ohne großen Erfolg. Die normale VID / PID des Geräts ist 0403/6001. Wenn es auf diese Weise programmiert wird, funktioniert es einwandfrei und verbindet sich beim Einstecken automatisch mit ttyUSB0. Auch wenn der Treiber neu kompiliert wurde, um unsere neue PID zu respektieren, erscheint ttyUSB0 bei der Programmierung nicht, erkennt es jedoch als 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) },
// ....
Kompilierte den gesamten Kernel neu und brachte das Gerät auf den neusten Stand. 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 ftdi_sio verwendet werden soll, hängt es jedoch nicht an ttyUSB0 an, wie dies bei der unveränderten PID der Fall wäre. Irgendwelche Vorschläge, was ich hier falsch mache?
quelle
Antworten:
Sie müssen den Kernel nicht nur einmal ändern. Sie können es überschreiben.
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
Und Ihr Gerät sollte funktionieren.
Alternativ können Sie die
bind
sysfs-Schnittstelle verwenden. Ich schlage vor, mitlsusb -t
den richtigen Pfad + Schnittstelle in diesem Fall herauszufinden.Anhand eines Teilbeispiels aus meinem System eines USB-Speichergeräts (es wäre sehr ähnlich für USB-Seriell).
Das Format der Nummer lautet:
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 schon immer eine1
meiner erfahrungen. Jemand mit tieferem Kernel-Wissen kann mir wahrscheinlich sagen, was es ist und ein Gegenbeispiel liefern.quelle
Sie brauchen den Kernel nicht zu modifizieren, Sie können den Prozess wie folgt automatisieren:
Fügen Sie die folgende einzelne Zeile hinzu
/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'"
Starten Sie den Computer neu oder führen Sie ihn aus
sudo udevadm control --reload
, um die neue Regel zu übernehmen.Trennen Sie das Gerät ab.
Stecken Sie das Gerät ein.
quelle
Ähnlich verhält es sich mit der Evaluierungsplatine von SiLabs - der USB-UART-Chip CP2102 ist mit einer unregelmäßigen VID / PID versehen:
lsusb
Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.
Problem gelöst durch Laden des Moduls cp210x und Senden der VID / PID wie oben erwähnt:
sudo modprobe cp210x
sudo -s
echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id
Die entsprechende 99-cp210.rules-Datei für das udev sieht folgendermaßen aus:
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'"
quelle
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"