Como posso criar uma regra do udev usando um número de série do dispositivo "irmão" (para dispositivos USB sem séries únicas)?

4

Eu tenho um equipamento de teste composto dos seguintes itens:

  • um hub USB conectado ao PC mestre, o hub é incorporado ao gabarito de teste e é usado para que tenhamos apenas 1 cabo USB sendo executado do gabarito para o PC.
  • um Arduino UNO, conectado por USB ao Hub
  • um instrumento de medição (powermeter) conectado ao hub USB através de USB
  • outro dispositivo de medição (termômetro) conectado ao hub USB por USB
  • um script Python que executa o procedimento de teste no PC mestre e se comunica com o Arduino e os dois instrumentos.

Tudo isso funciona bem com meu primeiro gabarito, mas agora preciso duplicar a configuração de teste (3 gabaritos de teste em um PC). Eu quero atribuir udev regras persistentes para os dispositivos para que os testadores mais tarde precisem selecionar 1, 2 ou 3 dependendo de qual jig eles usarem, para que eles não precisem mexer com os números de porta.

Existe uma maneira de fazer uma regra que basicamente diria: assign symlink /dev/powermeter01 to the powermeter that is on the same USB hub as the Arduino with the serial xxxxxxx ?

Para o Arduino, isso é fácil, pois há números de série apropriados no udevadm info, mas para o powermeter, o número de série é sempre o mesmo e para o termômetro , simplesmente não há um número de série (obrigado fornecedores baratos !!!).

O hub USB também não possui aparentemente nenhuma série.

    
por Memes 28.06.2016 / 12:51

2 respostas

4

Bem, isso não é uma resposta para a pergunta, mas me traz uma solução. então aqui está.

Eu brinco bastante com as regras do Udev, não consegui nada melhor do que o meu Arduino aparecer persistentemente em /dev/arduino01 (usará /dev/arduino02 , /dev/arduino03 , ... para outros gabaritos)

Meu script de teste está em Python, acabei de descobrir que há uma boa biblioteca chamada pyudev então decidi dar uma olhada nessa rota.

Depois de apenas alguns minutos, acabei com

from pyudev import *
context = Context()
Arduino = Device.from_device_file(context, '/dev/arduino01') 
Hub = Arduino.find_parent("usb","usb_device").find_parent("usb") #first find_parent brings me up to the USB device Arduino, another find_parent brings me to the Hub

Fixture = Enumerator(context)
for dev in Fixture.match_parent(Hub).match_subsystem('tty'):
    if (dev.get('ID_VENDOR_ID')=="10c4" and dev.get('ID_MODEL_ID')=="ea60"): #I got those ID through udevadm.
        powermeter=dev
    if (dev.get('ID_VENDOR_ID')=="067b" and dev.get('ID_MODEL_ID')=="2303"): #I got those ID through udevadm.
        temprecorder=dev

print('Arduino in on ' + str(Arduino.device_node)) #prints : Arduino is on /dev/ttyACM0
print('Powermeter in on ' + str(powermeter.device_node)) #prints : Powermeter is on /dev/ttyUSB1
print('Thermometer in on ' + str(temprecorder.device_node)) #prints : Thermometer is on /dev/ttyUSB0

Isso me dá as portas USB dos meus 3 dispositivos do jig de teste, agora posso alimentá-lo com meu script de rotina de teste.

O mais experiente entre nós terá visto que o meu temprecorder é através de um serial USB pl2303 e meu powermeter através de um serial USB CP2102.

    
por 29.06.2016 / 13:16
1

udev não tem apenas séries para corresponder aos dispositivos, você pode usar qualquer propriedade disponível.

Assim, você pode usar praticamente qualquer coisa diferente em udevadm info /dev/... & udevadm info -a /dev/... de ambos os dispositivos com as mesmas séries.

Se você puder compartilhar essas saídas para cada dispositivo, poderei ajudar. Pela sua resposta, parece que você já tem o fornecedor / modelo não o mesmo, então isso pode ser usado nas regras do udev.

    
por 08.07.2016 / 19:49