udev regras não distinguem

4

Eu tenho uma unidade Neato XV-*, conectada com um chip Sparkfun FTDI e um Arduino Uno. Eles aparecem como /dev/ttyUSB0 e /dev/ttyUSB1 , imprevisivelmente não atribuídos.

Então, eu escrevi /etc/udev/rules.d/80-arduinouno.rules :

SUBSYSTEM=="tty",
ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86",
MODE="0666",
OWNER="pi", GROUP="pi",
SYMLINK+="arduinouno"

... e /etc/udev/rules.d/90-neatolidar.rules :

SUBSYSTEM=="tty", ENV(ID_SERIAL_SHORT)=="AL01OTZS",
ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS",
MODE="0666", OWNER="pi", GROUP="pi",
SYMLINK+="neatolidar"

idProduct e idVendor foram retirados da primeira linha de

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idProduct

e

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idVendor

, respectivamente, com referência cruzada com a saída de lsusb . IS_SERIAL_SHORT foi retirado da saída de

udevadm info -q all -n /dev/ttyUSB0 | grep ID_SERIAL

ou

udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep {serial}

mas, enquanto este comando funcionava para o FTDI / lidar, ele só dava um ID_SERIAL , não um ID_SERIAL_SHORT , para o Arduino.

Quando eu faço um sudo service udev restart , tente conectar e desconectar os dispositivos enquanto monitora watch 'ls -lah /dev | grep ">"' , vejo links simbólicos aparecendo para arduinouno e neatolidar para qualquer ttyUSB* foi conectado por último. Ou seja, no momento, vejo os dois arduinouno -> ttyUSB1 e neatolidar -> ttyUSB1 . Mas se eu desconectar e reconectar ttyUSB0 , ambos irão mudar para isso.

Como posso obter minhas regras do udev para distinguir esses dois dispositivos e só disparar quando o dispositivo correto for detectado?

Se isso importa, isso é em um Raspberry Pi 3 executando Raspbian Jessie. O Arduino é conectado diretamente ao RPi, enquanto o o FTDI é conectado a um amarelo barato EagleTec hub USB de 4 portas .

    
por tsbertalan 29.12.2016 / 06:21

2 respostas

2

Executando sudo udevadm control --log-priority=info e, em seguida, observando a saída de tail -f /var/log/syslog , notei alguns erros.

Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 1,starting at character 17 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 2,starting at character 50 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 3,starting at character 12 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 4,starting at character 23 ('\n')

e

Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: unknown key 'ENV(ID_SERIAL_SHORT)' in /etc/udev/rules.d/90-neatolidar.rules:1
Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid rule '/etc/udev/rules.d/90-neatolidar.rules:1'
Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 2,starting at character 77 ('\n') Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 3,starting at character 36 ('\n')

A partir disso inferimos (1) que minha regra ENV(ID_SERIAL_SHORT) não estava funcionando e (2) não deveria ter novas linhas. Então, mudei para os seguintes arquivos .rules de uma linha:

/etc/udev/rules.d/80-arduinouno.rules :

SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="arduinouno"

e /etc/udev/rules.d/90-neatolidar.rules :

SUBSYSTEM=="tty", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="neatolidar"

Após a reinicialização (ou talvez apenas sudo service udev restart e / ou sudo udevadm control --reload ), isso parece funcionar.

    
por 23.01.2017 / 22:32
2

Minha reputação não parece ser alta o suficiente para permitir um comentário.

Além disso: eu uso o script bash a seguir para recarregar minhas regras do udev e o retrigger, por isso nem preciso desconectar e reconfigurar o dispositivo:

#!/bin/bash

sudo udevadm control --reload-rules
sudo udevadm trigger
    
por 24.01.2017 / 01:47