Atribuir webcam a um / dev / video # específico

4

Eu tenho três webcams no meu servidor Ubuntu 14.04. A saída do lsusb:

Bus 006 Device 002: ID 0bda:8153 Realtek Semiconductor Corp.
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 2537:1066
Bus 004 Device 002: ID 05e3:0616 Genesys Logic, Inc.
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 1871:0101 Aveo Technology Corp. UVC camera (Bresser microscope)
Bus 003 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 003 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 046d:0807 Logitech, Inc. Webcam B500
Bus 001 Device 004: ID 1871:0101 Aveo Technology Corp. UVC camera (Bresser microscope)
Bus 001 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Eu quero atribuir um / dev / video # específico para cada um. Eu li que tenho que criar uma regra do udev em /etc/udev/rules.d/, mas a maioria do que eu li parece desatualizado e eu não quero causar problemas ao meu servidor. Eu estava pensando em criar um 25-name-video-devices.rules contendo o seguinte:

SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="1871", SYSFS{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="1871", SYSFS{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="046d", SYSFS{idProduct}=="0807", NAME="video12"

O problema adicional que tenho é que 2 das 3 webcams parecem idênticas (embora não sejam, elas são compradas no ebay e são usadas para monitorar uma área diferente). Então, quais seriam as regras para o meu caso? Obrigado

    
por Panos 31.12.2015 / 10:57

1 resposta

4

Solução sem regras do Udev

Existe uma chance de que o video4linux já forneça nomes de dispositivos estáveis. Você pode querer verificar os diretórios /dev/v4l/by-id/ e /dev/v4l/by-path/ para isso. Conecte seus dispositivos a diferentes portas USB e compare os nomes de dispositivos criados para garantir que eles sejam realmente estáveis.

Solução com regras do Udev

Caso contrário, depende se seus dois dispositivos aparentemente idênticos têm pelo menos um número de série diferente, que é acessível pelo udev. Você pode descobrir isso usando o número "Bus" e "Device" corretos da sua saída lsusb no seguinte comando:

udevadm info --attribute-walk /dev/bus/usb/003/005

Se houver algum tipo de saída como o seguinte no primeiro bloco de pares de chave / valor e o serial for diferente entre os dois dispositivos, você poderá usá-lo em suas regras do udev:

  

ATTR {serial} == "68974689267119892"

Suas regras do udev podem ser assim:

SUBSYSTEM=="usb", ATTR{serial}=="68974689267119892", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="usb", ATTR{serial}=="12345698798725654", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0807", NAME="video12"

Se houver um número não serial (ou similar), só vejo a seguinte possibilidade: você teria que garantir que seus dispositivos permanecessem sempre conectados nas mesmas portas USB. Nesse caso, você poderia usar regras como estas:

SUBSYSTEM=="usb", KERNEL=="2-3", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="usb", KERNEL=="2-4", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="usb", KERNEL=="2-2", ATTR{idVendor}=="046d", ATTR{idProduct}=="0807", NAME="video12"

Você teria que descobrir quais KERNEL IDs usar novamente executando o comando udevadm mencionado acima e procurando pelo par% chave / valor KERNEL .

Notas secundárias

Pode ser melhor / melhor apenas criar novos links simbólicos em vez de novos nomes de dispositivos, e talvez até mesmo agrupá-los em um diretório comum:

SUBSYSTEM=="usb", KERNEL=="2-3", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", SYMLINK+="foo/video10"

A regra anterior, por exemplo, criaria um link simbólico de dispositivo em /dev/foo/video10 .

Eu provavelmente também nomearia simplesmente o arquivo de regras name-video-devices.rules , ou seja, deixando o número inicial fora. Provavelmente não importa quando as regras são executadas, portanto, não é necessário usar uma prioridade (bastante alta) de 25.

    
por Chriki 31.12.2015 / 15:53

Tags