caminho KERNELS para dispositivo USB conectado ao HUB

0

Estou criando regras do udev para mapear meus dispositivos USB (ttyUSB *) para as portas USB onde eles estão conectados. A maneira usual de fazer isso é observar a saída de:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

Aqui minha saída (eu removi as linhas ATTRS não significativas):

looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="ftdi_sio"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0':
    KERNELS=="1-1.5.6:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ftdi_sio"
    ATTRS{interface}=="USB-RS485 Cable"
    ATTRS{supports_autosuspend}=="1"

    looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6':
    KERNELS=="1-1.5.6"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{product}=="USB-RS485 Cable"
    ATTRS{serial}=="FTY48GF2"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5':
    KERNELS=="1-1.5"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{product}=="USB 2.0 Hub [MTT]"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{manufacturer}=="Linux 4.9.41-v7+ dwc_otg_hcd"
    ATTRS{product}=="DWC OTG Controller"

  looking at parent device '/devices/platform/soc/3f980000.usb':
    KERNELS=="3f980000.usb"
    SUBSYSTEMS=="platform"
    DRIVERS=="dwc_otg"

  looking at parent device '/devices/platform/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS==""

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

Aqui a conexão: Raspberry Pi - > HUB USB - > Dongle FTDI. Minha regra é a seguinte:

$ cat /etc/udev/rules.d/99-usb.rules 
KERNEL=="1-1.5.6", SUBSYSTEM=="usb", SYMLINK+="rs485"

mas:

# ls -l /dev/rs485 
lrwxrwxrwx 1 root root 15 Oct  4 07:04 /dev/rs485 -> bus/usb/001/009

Eu esperava que o link simbólico fosse criado para / dev / ttyUSB0. Agora, eu entendo que meu dongle está na posição usb de:

$ lsusb
Bus 001 Device 006: ID 046d:c062 Logitech, Inc. M-UAS144 [LS1 Laser Mouse]
Bus 001 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
...

mas é claro que NÃO é a porta serial (ou seja, não consigo echo ). Tentando usar 1-1.5.6:1.0 como chave KERNEL não funciona - nenhum link simbólico criado.

Qual valor devo usar?

    
por Mark 04.10.2017 / 07:09

1 resposta

3

Se você observar man udev , KERNELS pesquisará o caminho do dispositivo, enquanto KERNEL corresponderá ao próprio dispositivo e SUBSYSTEM representará a parte do kernel que gerou o evento. Quando o seu dongle USB está conectado, vários eventos do udev são criados, pois partes do kernel descobrem o dispositivo e reagem de acordo.

Você deseja que sua regra seja acionada na ação para o próprio dispositivo ( SUBSYSTEM=="tty" , porque você deseja um link para /dev/ttyUSB0 ), mas com SUBSYSTEMS=="usb" , ele é acionado quando o próprio dispositivo USB é descoberto, não quando o driver do dispositivo USB é iniciado. É por isso que você obtém um link para o dispositivo USB visto do subsistema USB, bus/usb/001/009o .

Então, o que você precisa é

KERNELS=="1-1.5.6", SUBSYSTEM=="tty", SYMLINK+="rs485"

(observe o S e o tty ).

    
por 04.10.2017 / 08:58