udev re-numeração ao criar links simbólicos

4

Eu tenho um modem de celular USB conectado a uma placa ALIX 3d2 executando o voyage linux (que é baseado no Debian Squeeze). O modem se registra como um dispositivo TTY e, assim, por padrão, o udev cria dispositivos TTY denominados "ttyUSB0" por meio de "ttyUSB3" em /dev . No entanto, pode haver outros dispositivos USB para serial conectados e gostaria de ter uma referência conhecida ao modem. Então, eu escrevi uma regra do udev simples para fazer um link do modem para /dev/ttyModem{0-3} , no entanto, a única maneira que encontrei para lidar automaticamente com a numeração foi através da variável %n no udev, que tem o problema de criar /dev/ttyModem{4-7} se um adaptador USB-para-Serial de quatro portas for enumerado antes do modem. Eu encontrei algumas referências a uma variável %e na documentação antiga do udev que faria exatamente o que eu preciso, mas parece que foi removida há algum tempo.

Felizmente, há um número de porta que pode ser referenciado a partir do dispositivo para cada dispositivo tty, portanto, devo ser capaz de manipular a numeração manualmente. Posso criar um link com base no número da porta, mas sempre que tento usar o número da porta e o ID do produto do fornecedor + USB, a regra não é mais aplicada. Eu suspeito que eu possa estar violando a regra "um único dispositivo pai" em algum lugar, pois esses atributos são reconhecidos em dispositivos diferentes de acordo com udevadm info , mas, até onde eu sei, todos os atributos devem vir de um dispositivo e seu pai .

Aqui estão as regras que apliquei:

Esta regra funciona, e é com o que eu comecei, mas o número que ela gera pode não começar em 0.

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyUSBID%n"

Por isso, tentei especificar o número da porta usando quatro regras como essa, no entanto, isso falha, porque viola a regra "um único dispositivo pai".

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{port_number}=="0", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyFailingPort0"

Todas as condições dessa regra devem vir do mesmo nó, portanto, essa regra (que funciona como seria de se esperar) deve ser capaz de fazer referência a um nó pai.

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{port_number}=="0", SYMLINK+="ttyPortNumberChild0"

No entanto, esta regra falha e não tenho ideia do motivo.

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{idVendor}=="1199" ATTRS{port_number}=="0", SYMLINK+="ttyFailingPortNumber0

E aqui está a saída de udevadm info --attribute-walk para port0 , port1 , port2 , port3 . O segundo dispositivo da parte superior contém o número da porta e o quarto dispositivo contém as informações USB de identificação.

Eu percebo que isso é um problema XY , então se você conhece uma maneira melhor de dar ao modem uma constante nome, sinta-se à vontade para postar isso como sua resposta.

    
por isidor3 12.06.2013 / 01:08

4 respostas

1

Acabei trabalhando em torno da limitação "apenas um pai" dividindo a configuração entre várias regras. Para os interessados, aqui está o código que acabei:

ACTION!="add", GOTO="modem_rules_end"
SUBSYSTEM!="tty" GOTO="modem_rules_end"

#ModemType1
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", GOTO="type1_rules_begin"
GOTO="type1_rules_end"
LABEL="type1_rules_begin"

ATTRS{port_number}=="0", SYMLINK:="ttyType1_0"
ATTRS{port_number}=="1", SYMLINK:="ttyType1_1"
ATTRS{port_number}=="2", SYMLINK:="ttyType1_2"
ATTRS{port_number}=="3", SYMLINK:="ttyType1_3"

LABEL="type1_rules_end"
LABEL="modem_rules_end"
    
por 13.06.2013 / 23:51
1

As regras do modem devem corresponder a ACTION=="add", SUBSYSTEM=="tty" combinadas com os atributos idVendor, idProduct e port_number:

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="0", SYMLINK+="ttyPort0"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="1", SYMLINK+="ttyPort1"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="2", SYMLINK+="ttyPort2"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="3", SYMLINK+="ttyPort3"

Verifique também se algum dos links simbólicos existentes em /dev/serial/by-id (ajuda se o modem tiver um número de série exclusivo) ou /dev/serial/by-path (funciona se você sempre conecta o modem à mesma porta USB) funcionaria para o seu propósito.

    
por 12.06.2013 / 02:57
0

Eu tive um problema parecido de trazer um modem celular USB on-line com numeração consistente em um sistema junto com outros dispositivos USB tty competindo por números / dev / ttyUSB *. No meu caso, foi um EuroTech ReliaCELL 10-20-32 com o chipset Telit. Eu resolvi o problema usando algumas ideias daqui, terminando com o seguinte trecho em minhas regras:

SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="00", SYMLINK+="ttyUSB_modem_port_0"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="01", SYMLINK+="ttyUSB_modem_port_1"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="02", SYMLINK+="ttyUSB_modem_port_2"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="03", SYMLINK+="ttyUSB_modem_port_3"
    
por 03.04.2015 / 07:55
0

Eu fiz uma configuração com vários adaptadores seriais idênticos usb para acessar minhas máquinas unix.

Eu estou supondo que o atributo KERNELS na última linha resulta da minha "Prolific Technology Inc." hub existente de dois hubs onde um é anexado ao outro.

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.5:1.0", SYMLINK+="ttyUSB_Sol1"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.6:1.0", SYMLINK+="ttyUSB_Sol2"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.7:1.0", SYMLINK+="ttyUSB_Sol3"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.4:1.0", SYMLINK+="ttyUSB_Sol4"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.3:1.0", SYMLINK+="ttyUSB_HPUX1"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.2:1.0", SYMLINK+="ttyUSB_HPUX2"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.1.4:1.0", SYMLINK+="ttyUSB_HPUX3"
    
por 01.09.2015 / 11:02