GNU/Linux >> Linux Esercitazione >  >> Linux

Collegamento di un dispositivo seriale USB con Pid personalizzato a Ttyusb0 integrato?

Sto tentando di ottenere un dispositivo seriale USB FTDI con un PID personalizzato da collegare automaticamente (o anche manualmente) a ttyUSB%n, senza molto successo. Il VID/PID normale del dispositivo è 0403/6001. Se programmato in questo modo, funziona perfettamente e si collega automaticamente a ttyUSB0 quando è collegato. Anche con il driver ricompilato per rispettare il nostro nuovo PID, quando programmato con quello personalizzato ttyUSB0 non compare, ma lo riconosce come dispositivo ftdi_sio e carica il driver.

Ho aggiunto il nostro PID all'intestazione e alla fonte:

// 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) },
    // ....

Ricompilato l'intero kernel e rifatta il dispositivo. Quando collego il dispositivo ricevo:

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 mostra il VID/PID personalizzato corretto. Il driver sembra riconoscere che dovrebbe usare ftdi_sio con esso, ma non lo collega a ttyUSB0 come farebbe con il PID non modificato. Qualche suggerimento su cosa sto sbagliando qui?

Risposta accettata:

Non è necessario modificare il kernel solo una volta; puoi sovrascriverlo.

  1. Scollega il dispositivo
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Collega il dispositivo

E il tuo dispositivo dovrebbe funzionare.

L'altra alternativa è usare il bind interfaccia sysfs; Suggerisco di usare lsusb -t per capire il percorso corretto + interfaccia in quel caso.

Utilizzando un esempio parziale del mio sistema, di un dispositivo di archiviazione USB (sarebbe molto simile per USB seriale).

$ 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

Il formato del numero è:BUS-PORT(.PORT)+:1.INTERFACE . L'unico numero che non è visibile nell'output di lsusb è la prima cifra dopo i due punti; ed è sempre stato un 1 nella mia esperienza. Qualcuno con una conoscenza più approfondita del kernel può probabilmente dirmi di cosa si tratta e fornire un controesempio.

Correlati:annullare l'eliminazione dei file dal file server locale?
Linux
  1. Perché abbiamo bisogno di un bootloader in un dispositivo integrato?

  2. Driver di dispositivo Linux IOCTL

  3. differenza tra file di dispositivo e driver di dispositivo

  4. Come trovare il driver (modulo) associato a un dispositivo su Linux?

  5. Comprensione dei driver di dispositivo Linux della webcam

Replica le tue impostazioni Linux personalizzate con DistroTweaks

Linux:come trovare il driver (modulo) associato a un dispositivo su Linux?

Compatto computer integrato AI Axiomtek eBOX560-900-FL funziona su Ubuntu

Come uccidere lo script Python con lo script bash

Avvia zsh con uno zshrc personalizzato

Umask corrente di un processo con <pid>