DVB-T zusammen mit der Webcam nutzen
Update: Die Entwickler des UVC-Treibers haben ihre Versionsverwaltung umgestellt. Außerdem gibt es beim Kompilieren des Quellcodes mit dem Kernel 2.6.27-7 weniger Probleme, als ich sie weiter unten beschreibe. Deshalb gibt es zum diesem Artikel einen 2. Teil: DVB-T zusammen mit der Webcam nutzen 2.
Nachdem ich die Quellen meines DVB-T-Sticks von Digittrade kompiliert hatte, ließ sich der UVC-Treiber für die integrierte Crystal Eye Webcam in meinem Acer Aspire 2920 nicht mehr nutzen. Wenn ich mir zum Beispiel mit luvcview ein Bild machen wollte, brach der Aufruf des Programms mit folgender Fehlermeldung ab:
video /dev/video0 ERROR opening V4L interface : No such file or directory
Das Modul uvcvideo, das für den Betrieb der Kamera dringend nötig ist, war nicht geladen. Mit sudo modprobe uvcvideo
sollte man es problemlos nachladen können, was bei mir aber nicht funktionierte. Stattdessen erhielt ich folgende Fehlermeldung:
FATAL: Error inserting uvcvideo (/lib/modules/2.6.24-19-generic/ubuntu/media/usbvideo/uvcvideo.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Das Verzeichnis /lib/modules/2.6.24-19-generic/ubuntu/media/usbvideo/uvcvideo.ko sollte man sich merken, da man später das neu erstellte uvcvideo-Modul dahin kopieren muss. Man sieht hier, wo sich die Datei auf einem Ubuntu-System befindet, bei anderen Distributionen kann das Verzeichnis abweichen. Die Ausgabe von dmesg
brachte leider nicht viel erhellendes:
[ 938.937194] uvcvideo: Unknown symbol video_unregister_device [ 938.937400] uvcvideo: disagrees about version of symbol video_device_alloc [ 938.937404] uvcvideo: Unknown symbol video_device_alloc [ 938.937543] uvcvideo: disagrees about version of symbol video_register_device [ 938.937547] uvcvideo: Unknown symbol video_register_device [ 938.937955] uvcvideo: disagrees about version of symbol video_device_release [ 938.937958] uvcvideo: Unknown symbol video_device_release
Kurz gesagt, das neue „Video for Linux“-Module (v4l) des Digittrade-Sticks erzeugte einen Konflikt mit dem Video-Modul der Webcam, was zur Folge hatte, dass letzteres nicht mehr geladen wurde. Aber man kann was dagegen machen. Den entscheidenden Hinweis fand ich auf der Mailing-Liste der Linux-UVC-Entwickler.
Laut Filippo Argiolas braucht man zu erst den Quellcode des UVC-Treibers. Entweder lädt man sich den von der Projektseite herunter oder holt ihn mit Subversion aus dem Projektarchiv:
svn checkout svn://svn.berlios.de/linux-uvc/linux-uvc/trunk
Nachdem man mit cd trunk
in das Quellcode-Verzeichnis gewechselt ist, kann man zum erstenmal make
aufrufen, um zu kompilieren. Dieser erste Aufruf wird aber mit Warnungen und Fehlern abbrechen, wie in diesem Beispiel zu sehen ist:
Building USB Video Class driver... make[1]: Betrete Verzeichnis '/usr/src/linux-headers-2.6.24-19-generic' CC [M] /home/christian/trunk/uvc_driver.o In Datei, eingefügt von /home/christian/trunk/uvcvideo.h:7, von /home/christian/trunk/uvc_driver.c:40: /home/christian/trunk/uvc_compat.h:137:1: Warnung: »V4L2_CTRL_CLASS_CAMERA« redefiniert In Datei, eingefügt von include/linux/videodev.h:16, von /home/christian/trunk/uvc_driver.c:31: include/linux/videodev2.h:798:1: Warnung: dies ist die Stelle der vorherigen Definition In file included from /home/christian/trunk/uvcvideo.h:7, from /home/christian/trunk/uvc_driver.c:40: /home/christian/trunk/uvc_compat.h:140: Fehler: Verschachtelte Redefinition von »enum v4l2_power_line_frequency« /home/christian/trunk/uvc_compat.h:140: Fehler: Redeklaration von »enum v4l2_power_line_frequency« /home/christian/trunk/uvc_compat.h:141: Fehler: Redeklaration von Aufzählung »V4L2_CID_POWER_LINE_FREQUENCY_DISABLED« include/linux/videodev2.h:874: Fehler: Vorherige Definition von »V4L2_CID_POWER_LINE_FREQUENCY_DISABLED« war hier /home/christian/trunk/uvc_compat.h:142: Fehler: Redeklaration von Aufzählung »V4L2_CID_POWER_LINE_FREQUENCY_50HZ« include/linux/videodev2.h:875: Fehler: Vorherige Definition von »V4L2_CID_POWER_LINE_FREQUENCY_50HZ« war hier /home/christian/trunk/uvc_compat.h:143: Fehler: Redeklaration von Aufzählung »V4L2_CID_POWER_LINE_FREQUENCY_60HZ« include/linux/videodev2.h:876: Fehler: Vorherige Definition von »V4L2_CID_POWER_LINE_FREQUENCY_60HZ« war hier /home/christian/trunk/uvc_compat.h:155: Fehler: Verschachtelte Redefinition von »enum v4l2_exposure_auto_type« /home/christian/trunk/uvc_compat.h:155: Fehler: Redeklaration von »enum v4l2_exposure_auto_type« /home/christian/trunk/uvc_compat.h:156: Fehler: Redeklaration von Aufzählung »V4L2_EXPOSURE_MANUAL« include/linux/videodev2.h:1077: Fehler: Vorherige Definition von »V4L2_EXPOSURE_MANUAL« war hier /home/christian/trunk/uvc_compat.h:157: Fehler: Redeklaration von Aufzählung »V4L2_EXPOSURE_AUTO« include/linux/videodev2.h:1076: Fehler: Vorherige Definition von »V4L2_EXPOSURE_AUTO« war hier /home/christian/trunk/uvc_compat.h:158: Fehler: Redeklaration von Aufzählung »V4L2_EXPOSURE_SHUTTER_PRIORITY« include/linux/videodev2.h:1078: Fehler: Vorherige Definition von »V4L2_EXPOSURE_SHUTTER_PRIORITY« war hier /home/christian/trunk/uvc_compat.h:160: Fehler: Redeklaration von Aufzählung »V4L2_EXPOSURE_APERTURE_PRIORITY« include/linux/videodev2.h:1080: Fehler: Vorherige Definition von »V4L2_EXPOSURE_APERTURE_PRIORITY« war hier make[2]: *** [/home/christian/trunk/uvc_driver.o] Fehler 1 make[1]: *** [_module_/home/christian/trunk] Fehler 2 make[1]: Verlasse Verzeichnis '/usr/src/linux-headers-2.6.24-19-generic' make: *** [uvcvideo] Fehler 2
Welche Fehler- und Warnmeldungen erscheinen hängt vom verwendeten Kernel ab. Man braucht diese Meldungen als Hinweis, um die Datei „uvc_compat.h“ bearbeiten zu können. Dazu öffnet man sie in seinem Lieblingseditor und sucht nach dem ersten Eintrag, z.B. „v4l2_power_line_frequency“. Den Eintrag kann man dann komplett mit Kommetarzeichen (/* … */) versehen oder gleich ganz löschen:
/*#define V4L2_CID_POWER_LINE_FREQUENCY (V4L2_CID_BASE+24) enum v4l2_power_line_frequency { V4L2_CID_POWER_LINE_FREQUENCY_DISABLED = 0, V4L2_CID_POWER_LINE_FREQUENCY_50HZ = 1, V4L2_CID_POWER_LINE_FREQUENCY_60HZ = 2, };*/
Mit den anderen Fehlern und Warnungen wird genauso verfahren und anschließend die Datei gespeichert. Damit beim erneuten Aufruf von make
die korrekten Prüfsummen beim Kompilieren erzeugt werden, benötigt man die Datei „Module.symvers“ aus dem Quellcode-Archiv des DVB-T-Sticks. Da zum Beispiel der Digittrade-Stick einen AF9015-Chipsatz hat, findet man die Datei im Verzeichnis „af9015*/v4l/Module.symvers“. Bei anderen Chipsätzen sollte es ähnlich in einem Verzeichnis zu finden sein. Normalerweise sollte es reichen, die Datei ins Quellcode-Verzeichnis des Linux-UVC-Moduls zu kopieren und dann zu kompilieren. Das hat bei mir aber nicht funktioniert. Beim Kompilieren des UVC-Video-Moduls wird die Prüfsumme aus der Datei „/lib/modules/$(uname -r)/build/Module.symvers“ geholt, weshalb ich diese Datei durch diejenige aus dem Quellcode-Archiv des DVB-T-Sticks ersetzen musste. In meinem speziellen Fall war das im Terminal mit dem Befehl sudo cp af9015*/v4l/Module.symvers /lib/modules/$(uname -r)/build/Module.symvers
erledigt. Danach habe ich dann make
ausgeführt und es hat sauber durchkompiliert und die Datei „uvcvideo.ko“ erstellt.
~/trunk$ make Building USB Video Class driver... make[1]: Betrete Verzeichnis '/usr/src/linux-headers-2.6.24-19-generic' CC [M] /home/christian/trunk/uvc_driver.o CC [M] /home/christian/trunk/uvc_queue.o CC [M] /home/christian/trunk/uvc_v4l2.o CC [M] /home/christian/trunk/uvc_video.o CC [M] /home/christian/trunk/uvc_ctrl.o CC [M] /home/christian/trunk/uvc_status.o CC [M] /home/christian/trunk/uvc_isight.o LD [M] /home/christian/trunk/uvcvideo.o Building modules, stage 2. MODPOST 1 modules CC /home/christian/trunk/uvcvideo.mod.o LD [M] /home/christian/trunk/uvcvideo.ko make[1]: Verlasse Verzeichnis '/usr/src/linux-headers-2.6.24-19-generic'
Danach muss noch das alte Modul durch das neue ersetzt werden. Mit install
wird die Datei kopiert und dabei mit -m644 die Attribute gesetzt. Anschließend sucht man mit Depmod nach Abhängigkeiten zwischen den Kernelmodulen.
sudo install -v -m644 uvcvideo.ko /lib/modules/$(uname -r)/kernel/ubuntu/media/usbvideo/uvcvideo.ko sudo depmod -ae
Bei anderen Distributionen als Ubuntu muss man sich nochmal das Verzeichnis in Erinnerung rufen, das bei der Fehlermeldung weiter oben angezeigt wurde und den Befehl entsprechend ändern. Danach sollte man das Modul fehlerfrei mit sudo modprobe uvcvideo
laden können.
Geschrieben in Gnu/Linux