GNU/Linux >> Tutoriels Linux >  >> Linux

Connexion d'un périphérique USB-série avec un PID personnalisé à Ttyusb0 sur Embedded ?

J'essaie d'obtenir un périphérique FTDI USB-Serial avec un PID personnalisé pour se connecter automatiquement (ou même manuellement) à ttyUSB%n, sans grand succès. Le VID/PID normal de l'appareil est 0403/6001. Lorsqu'il est programmé de cette façon, il fonctionne parfaitement et se connecte automatiquement à ttyUSB0 lorsqu'il est branché. Même avec le pilote recompilé pour respecter notre nouveau PID, lorsqu'il est programmé avec celui personnalisé, ttyUSB0 n'apparaît pas, mais il le reconnaît comme un périphérique ftdi_sio et charge le pilote.

J'ai ajouté notre PID à l'en-tête et à la source :

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

Recompilé l'intégralité du noyau et reflashé l'appareil. Lorsque je branche l'appareil, j'obtiens :

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 affiche le VID/PID personnalisé correct. Le pilote semble reconnaître qu'il est censé utiliser ftdi_sio avec lui, mais ne l'attache pas à ttyUSB0 comme il le ferait avec le PID non modifié. Des suggestions sur ce que je fais mal ici ?

Réponse acceptée :

Vous n'avez pas besoin de modifier le noyau une seule fois ; vous pouvez le remplacer.

  1. Débranchez l'appareil
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Branchez l'appareil

Et votre appareil devrait fonctionner.

Votre autre alternative est d'utiliser le bind interface sysfs ; Je suggère d'utiliser lsusb -t pour déterminer le bon chemin + interface dans ce cas.

En utilisant un exemple partiel de mon système, d'un périphérique de stockage USB (ce serait très similaire pour USB-série).

$ 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

Le format du numéro est :BUS-PORT(.PORT)+:1.INTERFACE . Le seul nombre qui n'est pas visible dans la sortie lsusb est le premier chiffre après les deux points ; et ça a toujours été un 1 dans mon expérience. Quelqu'un avec une connaissance plus approfondie du noyau peut probablement me dire ce que c'est et fournir un contre-exemple.

Connexe :Supprimer les fichiers du serveur de fichiers local ?
Linux
  1. Déconnectez et reconnectez ttyUSB0 par programmation sous Linux

  2. Postgresql 9.3 sur Centos 7 avec PGDATA personnalisé

  3. Comment tuer le script python avec le script bash

  4. Démarrer zsh avec un zshrc personnalisé

  5. umask actuel d'un processus avec <pid>

Comment installer un pilote de périphérique sous Linux

Comment chiffrer une partition avec DM-Crypt LUKS sous Linux

Commande pour déterminer les ports d'un périphérique (comme /dev/ttyusb0) ?

Trouver les capacités du pilote/dispositif Wifi ?

Ordinateur embarqué compact AI Axiomtek eBOX560-900-FL fonctionne sur Ubuntu

Comprendre les pilotes de périphérique Linux de la webcam