Anschließen eines USB-seriellen Geräts mit benutzerdefinierter PID an ttyUSB0 on ​​embedded


19

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?


1
Welcher Embedded-Typ ist das? Hat es UDEV? In diesem Fall ist UDEV Ihre beste Wahl (und ich kann Ihnen dabei weiterhelfen).
Brian Redbeard

Antworten:


17

Sie müssen den Kernel nicht nur einmal ändern. Sie können es überschreiben.

  1. Trennen Sie das Gerät ab
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Stecken Sie das Gerät ein

Und Ihr Gerät sollte funktionieren.

Alternativ können Sie die bindsysfs-Schnittstelle verwenden. Ich schlage vor, mit lsusb -tden 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).

$ 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 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 eine 1meiner erfahrungen. Jemand mit tieferem Kernel-Wissen kann mir wahrscheinlich sagen, was es ist und ein Gegenbeispiel liefern.


Hat perfekt funktioniert, danke. Sollte die akzeptierte Antwort sein.
Amr Bekhit

1
Ich frage mich nur: Wenn ich es mir anders überlege und nicht möchte, dass dieses VID / PID den Treiber ftdi_sio verwendet, sondern einen anderen, wie kann ich diesen Schritt rückgängig machen?
Bram

Schreiben Sie die vid / pid in remove_id, um das Echo in new_id rückgängig zu machen.
robbat2

@trycatch Kannst du bitte die Antwort annehmen?
robbat2

1
@kay new_id / remove_id dient nur zum Entfernen dynamisch hinzugefügter IDs. Wenn ich verstehe, was Sie tun möchten: Sie möchten verhindern, dass ein bestimmter Treiber für ein bestimmtes Gerät geladen wird.
Robbat2

12

Sie brauchen den Kernel nicht zu modifizieren, Sie können den Prozess wie folgt automatisieren:

  1. 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'"

  2. Starten Sie den Computer neu oder führen Sie ihn aus sudo udevadm control --reload, um die neue Regel zu übernehmen.

  3. Trennen Sie das Gerät ab.

  4. Stecken Sie das Gerät ein.


1

Ä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'"


Für zukünftige Reisende, die versuchen, einen HUSBZB-1-Stick zum Laufen zu bringen, ist hier eine udev-Datei, die den cp210x-Treiber wie oben erwähnt verknüpft und die tty-Geräte mit / dev / zigbee und / dev / z-wave symbolisiert 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"
nebulous
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.