GNU/Linux >> Znalost Linux >  >> Linux

Připojujete sériové zařízení USB s vlastním PID k Ttyusb0 na Embedded?

Snažím se získat FTDI USB-Serial zařízení s vlastním PID pro automatické (nebo dokonce ručně) připojení k ttyUSB%n, bez velkého úspěchu. Normální VID/PID zařízení je 0403/6001. Když je naprogramován tímto způsobem, funguje perfektně a po připojení se automaticky připojí k ttyUSB0. I když je ovladač překompilován tak, aby respektoval naše nové PID, při naprogramování s vlastním PID se ttyUSB0 nezobrazí, ale rozpozná jej jako zařízení ftdi_sio a načte ovladač.

Přidal jsem naše PID do záhlaví a zdroje:

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

Znovu zkompiloval celé jádro a přeformátoval zařízení. Když zařízení připojím, zobrazí se:

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 zobrazuje správné vlastní VID/PID. Zdá se, že ovladač uznává, že s ním má používat ftdi_sio, ale nepřipojuje jej k ttyUSB0, jako by tomu bylo s neupraveným PID. Nějaké návrhy, co tady dělám špatně?

Přijatá odpověď:

Nepotřebujete upravit jádro tak, aby bylo jen jednou; můžete jej přepsat.

  1. Odpojte zařízení
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Zapojte zařízení

A vaše zařízení by mělo fungovat.

Další alternativou je použití bind rozhraní sysfs; Doporučuji použít lsusb -t abyste v takovém případě zjistili správnou cestu+rozhraní.

Použijeme částečný příklad z mého systému, úložného zařízení usb (bylo by to velmi podobné pro 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

Formát čísla je:BUS-PORT(.PORT)+:1.INTERFACE . Jediné číslo, které není ve výstupu lsusb viditelné, je první číslice za dvojtečkou; a vždy to bylo 1 z mé zkušenosti. Někdo s hlubšími znalostmi jádra mi pravděpodobně může říct, co to je, a poskytnout protipříklad.

Související:Obnovit soubory z místního souborového serveru?
Linux
  1. Proč potřebujeme bootloader ve vestavěném zařízení?

  2. Ovladač zařízení IOCTL Linux

  3. Odpojte a znovu připojte ttyUSB0 programově v Linuxu

  1. Postgresql 9.3 na Centos 7 s vlastním PGDATA

  2. Spusťte zsh pomocí vlastního zshrc

  3. Aktuální umask procesu s <pid>

  1. Replikujte svá vlastní nastavení Linuxu pomocí DistroTweaks

  2. Nalezení možností ovladače/zařízení Wifi?

  3. Linux – Jak najít ovladač (modul) spojený se zařízením v Linuxu?