wtorek, czerwca 28, 2011

udev rules for my tv card

Od wczoraj pod chochlika mam podpiętą kamerkę internetową. Jak się dziś okazało, znalezienie dla niej działających sterowników na Linuksa to najmniejszy problem. Ponieważ mam też kartę telewizyjną (Pinnacle PCTV) dla obu urządzeń tworzone są pliki urządzeń o nazwach /dev/video0 oraz /dev/video1. Wszystko ładnie, tylko że po restarcie systemu raz video0 to karta tv, a raz kamerka internetowa. Całe szczęście można to bardzo prosto rozwiązać pisząc własne reguły udev, co też zrobiłem. Najpierw przyda się zdobycie trochę informacji za pomocą narzędzia udevadm:
$ udevadm info -a -p $(udevadm info -q path -n /dev/video1)

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1e.0/0000:04:01.0/video4linux/video1':
    KERNEL=="video1"
    SUBSYSTEM=="video4linux"
    DRIVER==""
    ATTR{name}=="saa7133[0] video (Pinnacle PCTV"
    ATTR{index}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1e.0/0000:04:01.0':
    KERNELS=="0000:04:01.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="saa7134"
    ATTRS{vendor}=="0x1131"
    ATTRS{device}=="0x7133"
    ATTRS{subsystem_vendor}=="0x11bd"
    ATTRS{subsystem_device}=="0x002e"
    ATTRS{class}=="0x048000"
    ATTRS{irq}=="19"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

  looking at parent device '/devices/pci0000:00/0000:00:1e.0':
    KERNELS=="0000:00:1e.0"
    SUBSYSTEMS=="pci"
    DRIVERS==""
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x244e"
    ATTRS{subsystem_vendor}=="0x1458"
    ATTRS{subsystem_device}=="0x5000"
    ATTRS{class}=="0x060401"
    ATTRS{irq}=="0"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS=="
Ponieważ mam tylko jedno urządzenie firmy Pinnacle, więc reguła oparta jest o dość prosty atrybut, a mianowicie nazwę widoczną dla systemu. Do pliku /etc/udev/rules.d/10-local.rules dodałem następującą linię: KERNEL=="video*", ATTR{name}=="*Pinnacle PCTV", NAME="%k", SYMLINK="video_tvcard" Po restarcie maszyny w katalogu /dev utworzyło się dowiązanie symboliczne video_tvcard wskazujące na kartę tv. Teraz wystarczyła drobna zmiana konfiguracji programów takich jak tvtime, by odwoływały się do /dev/video_tvcard za każdym razem gdy chcę sobie pooglądać TV. Tych którzy chcą pisać własne reguły odsyłam do artykułu na Arch wiki, który okazał się być bardzo przydatny oraz manuala udevadm.

Brak komentarzy: