Próbuję uzyskać urządzenie szeregowe USB FTDI z niestandardowym PID, aby automatycznie (lub nawet ręcznie) podłączyć się do ttyUSB% n, bez większego powodzenia. Normalny VID / PID urządzenia to 0403/6001. Po zaprogramowaniu w ten sposób działa idealnie i automatycznie podłącza się do ttyUSB0 po podłączeniu. Nawet po ponownym skompilowaniu sterownika w celu przestrzegania naszego nowego PID, po zaprogramowaniu z niestandardowym ttyUSB0 nie pojawia się, ale rozpoznaje to jako urządzenie ftdi_sio i ładuje sterownik.
Dodałem nasz PID do nagłówka i źródła:
// 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) },
// ....
Zrekompilowano całe jądro i przebudowano urządzenie. Po podłączeniu urządzenia otrzymuję:
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 pokazuje poprawny niestandardowy VID / PID. Wydaje się, że sterownik rozpoznaje, że powinien używać ftdi_sio, ale nie dołącza go do ttyUSB0, tak jak w przypadku niezmodyfikowanego PID. Wszelkie sugestie co do tego, co robię źle tutaj?
źródło
Odpowiedzi:
Nie musisz modyfikować jądra tylko raz; możesz to zmienić.
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
Twoje urządzenie powinno działać.
Inną alternatywą jest użycie
bind
interfejsu sysfs; W takim przypadku sugeruję użycie wlsusb -t
celu znalezienia właściwej ścieżki + interfejsu.Korzystając z częściowego przykładu z mojego systemu, urządzenia pamięci USB (byłoby to bardzo podobne w przypadku USB-serial).
Format numeru jest:
BUS-PORT(.PORT)+:1.INTERFACE
. Jedyną liczbą niewidoczną na wyjściu lsusb jest pierwsza cyfra po dwukropku; i zawsze było to1
z mojego doświadczenia. Ktoś z głębszą wiedzą na temat jądra prawdopodobnie może mi powiedzieć, co to jest i podać kontrprzykład.źródło
Nie musisz modyfikować jądra, możesz zautomatyzować proces w następujący sposób:
Dodaj następujący pojedynczy wiersz do
/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'"
Uruchom ponownie lub uruchom,
sudo udevadm control --reload
aby pobrać nową regułę.Odłącz urządzenie.
Podłącz urządzenie.
źródło
absolutnie podobna sytuacja miała miejsce w przypadku płyty ewaluacyjnej od SiLabs - układ CP2102 USB-UART ma nieregularny VID / PID:
lsusb
Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.
problem rozwiązany przez załadowanie modułu cp210x i wysłanie VID / PID, jak wspomniano wcześniej:
sudo modprobe cp210x
sudo -s
echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id
odpowiedni plik 99-cp210.rules dla udev wygląda następująco:
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'"
źródło
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"