J'essaie d'obtenir un périphérique USB-série FTDI avec un PID personnalisé à attacher 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 fixe automatiquement à ttyUSB0 lorsqu'il est branché. Même avec le pilote recompilé pour respecter notre nouveau PID, lorsqu'il est programmé avec le ttyUSB0 personnalisé 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é le noyau entier et reflasher le périphérique. 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 le joint pas à ttyUSB0 comme il le ferait avec le PID non modifié. Des suggestions sur ce que je fais mal ici?
la source
Réponses:
Vous n'avez pas besoin de modifier le noyau juste une fois; vous pouvez le remplacer.
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
Et votre appareil devrait fonctionner.
Votre autre alternative consiste à utiliser l'
bind
interface sysfs; Je suggère d'utiliserlsusb -t
pour trouver 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).
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é un1
dans mon expérience. Quelqu'un avec une connaissance approfondie du noyau peut probablement me dire de quoi il s'agit et fournir un contre-exemple.la source
Vous n'avez pas besoin de modifier le noyau, vous pouvez automatiser le processus comme ceci:
Ajoutez la ligne unique suivante à
/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'"
Redémarrez ou exécutez
sudo udevadm control --reload
pour récupérer la nouvelle règle.Débrancher l'appareil.
Branchez l'appareil.
la source
une situation absolument similaire s'est produite avec la carte d'évaluation de SiLabs - la puce USB-UART CP2102 est fournie avec un VID / PID irrégulier:
lsusb
Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.
problème résolu en chargeant le module cp210x et en envoyant VID / PID comme mentionné précédemment:
sudo modprobe cp210x
sudo -s
echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id
le fichier 99-cp210.rules correspondant pour l'udev ressemble à ceci:
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'"
la source
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"