Daten|teiler
Kopieren als Kulturtechnik

Wenn die Webcam nicht mit dem DVB-T-Stick will

27. August 2008 von Christian Imhorst


Dieser Artikel ist erstmals erschienen im
freiesMagazin 08/2008 August. Ausgabe 08/2008 als PDF herunterladen.

Manchmal ist es ganz schön ärgerlich: Gerade wenn man denkt, dass beim Notebook alles funktioniert, braucht man nur eine Kleinigkeit wie einen DVB-T-Stick installieren, und schon liefert die Webcam keine Bilder mehr. Obwohl der Stick mit EM28xx-, AF901x- oder einem anderen Chipsatz prima läuft, wird die Kamera nicht mehr erkannt. Durch das Kompilieren und Installieren der DVB-T-Treiber ist die Version von Video4Linux (v4l), durch die viele Webcams, TV-Karten und auch DVB-T-Sticks unterstützt werden, geändert worden und der Video-Treiber für die Webcam beharkt sich nun mit dem neuen Modul. Betroffen sind nicht nur Besitzer von externen USB-Kameras (USB Video Class, UVC), sondern auch Notebookbesitzer mit integrierten Webcams, die an einem USB-Port hängen.

Versucht man zum Beispiel das Modul für uvcvideo nachzuladen, damit die Kamera erkannt wird, erhält man folgende Fehlermeldung:

$ sudo modprobe uvcvideo
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 bei Ubuntu 8.04 „Hardy Heron“ befindet, bei anderen Distributionen kann das Verzeichnis abweichen. Schaut man dann mit dmesg nach, wo der Hase begraben liegen soll, bekommt man unter anderem folgende Antwort:

[  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

Demnach gibt es also Unstimmigkeiten über eine Symbolversion zwischen den Video-Modulen. Dagegen kann man etwas machen, nämlich die Quellen des UVC-Treibers neu kompilieren und installieren. Dafür muss man das Quellarchiv von der Projekt-Website [1] herunterladen, oder, falls Subversion installiert ist, im Terminal folgendes eingeben:

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. Dieser erste Aufruf wird aber voraussichtlich mit Warnungen und Fehlern abbrechen, wie im Beispiel zu sehen ist:


$ ~/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
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. Die öffnet man dafür in seinem Lieblingseditor und sucht nach dem ersten Eintrag, z.B. „v4l2_power_line_frequency“, um den dann komplett mit Kommetarzeichen (/* … */) zu versehen oder man löscht ihn am besten gleich ganz:

/* #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 Symbolversionen der Module beim Kompilieren erzeugt werden, benötigt man die Datei „Module.symvers“ aus dem Quellcode-Archiv des DVB-T-Sticks. Wenn man zum Beispiel einen Stick mit AF901x-Chipsatz hat, findet man die Datei im Verzeichnis „af9015*/v4l/Module.symvers“ und kopiert sie in das UVC-Verzeichnis. Erst danach kann man make ausführen. Dabei sollte es sauber durchkompilieren und das Modul „uvcvideo.ko“ erzeugen.

Danach muss noch das alte Modul durch das neue ersetzt werden. Mit dem Befehl install wird die Datei kopiert und dabei mit -m644 die passenden 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.

Falls der eben beschriebene Weg fehlschlägt, kann man noch folgendes probieren: Anstatt ins Quellcodeverzeichnis des UVC-Treibers kann man die Datei „Module.symvers“ direkt nach „/lib/modules/$(uname -r)/build/Module.symvers“ kopieren (nachdem man natürlich von der Orginaldatei dort eine Sicherungskopie angelegt hat), um dann mit make zu kompilieren. Das sollte dann funktionieren.

Link:
[1] http://linux-uvc.berlios.de

Geschrieben in freiesMagazin