Como bloquear os IDs dos dispositivos para os endereços das portas?

5

Eu quero dedicar certas portas USB para determinados dispositivos. Como posso fazer isso?

Por exemplo: eu quero que ttyUSB0 seja meu mouse e ttyUSB1 seja meu teclado (sempre). Eu quero ter certeza de que a inicialização do Linux nunca os troque.

Na verdade a coisa é que eu tenho XBee que usualmente vai para USB0 e um segundo FTDI que vai para USB1, por motivo de segurança eu sempre quero que eles tenham o mesmo endereço no meu código que eu estou rodando.

Atenciosamente

    
por Christian 15.01.2013 / 11:34

2 respostas

7

Os nomes atribuídos ao kernel são sempre atribuídos na ordem em que os dispositivos são detectados e você não pode alterá-los. (Não mais, de qualquer forma - essa função foi removida devido a várias condições de corrida causadas pelas regras de "nome persistente").

Mas você pode dizer ao udev para criar symlinks com os nomes que você escolher. De fato, nos sistemas modernos, você deve já ter links simbólicos em /dev/serial com o nome do caminho do dispositivo e de seu ID exclusivo; por exemplo:

  • /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0ttyUSB0

  • /dev/serial/by-id/usb-Motorola_Inc._Motorola_Phone__C350_-if00ttyACM0

  • /dev/disk/by-id/ata-ST9640320AS_5WX1ZH91-part1sda1

  • /dev/disk/by-partlabel/Archsda3

  • /dev/input/by-id/usb-PIXART_USB_OPTICAL_MOUSE-mousemouse1

E assim por diante. Basta executar tree /dev ou ls -lR /dev para encontrar seu dispositivo.

Você também pode executar udevadm info /dev/ttyUSB0 e todos os links simbólicos para esse dispositivo serão listados como S: ... linhas.

Se isso não for suficiente, você pode escrever suas próprias regras do udev. Primeiro execute udevadm info /dev/ttyUSB0 e escolha qualquer propriedade de identificação (como ID_PATH para a porta USB). É uma boa ideia incluir sempre o subsistema também.

Em seguida, abra (ou crie) um arquivo em /etc/udev/rules.d/ (nomeado, por exemplo, serial-symlinks.rules ) e coloque a regra do udev lá.

Por exemplo, se a saída para ttyUSB0 for:

$ udevadm info /dev/ttyUSB0
. . .
E: ID_PATH=pci-0000:00:1d.0-usb-0:1.2:1.0
. . .
E: SUBSYSTEM=tty
. . .

... você pode escrever esta regra:

SUBSYSTEM=="tty", ENV{ID_PATH}=="pci-0000:00:1d.0-usb-0:1.2:1.0", SYMLINK+="tty-xbee"

... e o udev sempre irá linkar /dev/tty-xbee para qualquer dispositivo tty conectado à porta USB # 2.

(Nota: Não use os mesmos nomes para links simbólicos como o kernel usa para nós de dispositivos. Usar SYMLINK+="ttyUSB0" irá causar coisas ruins acontecerão.)

    
por 15.01.2013 / 18:30
0

Veja o que faço com dispositivos seriais USB:

  1. cd /dev/serial/by-id
  2. ls -l

    Por exemplo:

    root@toaster:/dev/serial/by-id# ls -l

    total 0 e lrwxrwxrwx 1 root root 13 Jan 1 1970 usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 -> ../../ttyUSB0

  3. Crie um link simbólico deste nome de L-O-N-G para um nome de sua escolha em um diretório de sua escolha. No meu caso, é um dispositivo do sistema e somente root controla ele então faço um link em /root , como:

    ln -s /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 /root/easydigi
    
  4. Nos seus programas ou o que precisar do nome do dispositivo serial, basta usar o link, no meu caso acima de "/ root / easydigi", como substituto do "/ dev / ttyUSB0". / p>

por 12.06.2015 / 22:48

Tags