GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Anschließen eines seriellen USB-Geräts mit benutzerdefinierter Pid an Ttyusb0 On Embedded?

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.

  1. Ziehen Sie das Gerät ab
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. 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.

Verwandte:Dateien vom lokalen Dateiserver wiederherstellen?
Linux
  1. Warum brauchen wir einen Bootloader in einem eingebetteten Gerät?

  2. IOCTL-Linux-Gerätetreiber

  3. Trennen Sie ttyUSB0 programmgesteuert unter Linux und verbinden Sie es erneut

  4. Postgresql 9.3 auf Centos 7 mit benutzerdefinierten PGDATA

  5. Wie man Python-Skript mit Bash-Skript beendet

So verschlüsseln Sie eine Partition mit DM-Crypt LUKS unter Linux

HP Druckertreiber HPLIP 3.21.4 veröffentlicht mit HP Envy 6400 Support

Linux:So finden Sie den für ein Gerät verwendeten Gerätetreiber

Befehl zum Ermitteln der Ports eines Geräts (wie /dev/tttyusb0)?

Linux – Wie finde ich den Treiber (Modul), der mit einem Gerät unter Linux verbunden ist?

Kompakter KI-Embedded-Computer Axiomtek eBOX560-900-FL läuft auf Ubuntu