OK, bin jetzt schlau geworden und habe es so gemacht (ohne Gewähr): Nachdem ich die Quellen meines DVB-T-Sticks von Digittrade kompilliert 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)
Die Ausgabe von
dmesg
brachte leider nicht viel erhellendes:
[ 1402.632000] uvcvideo: Unknown symbol video_register_device
[ 1402.632000] uvcvideo: disagrees about version of symbol
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
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 mein Stick einen AF9015-Chipsatz hat, war das Modul 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 aber aus der Datei "/lib/modules/$(uname -r)/build/Module.symvers" geholt, weshalb man diese Datei durch diejenige aus dem Quellcode-Archiv des DVB-T-Sticks ersetzen muss. In diesem speziellen Fall wäre das im Terminal mit dem Befehl
sudo cp af9015*/v4l/Module.symvers /lib/modules/$(uname -r)/build/Module.symvers
erledigt. Erst danach kann man
make
ausführen und es sollte sauber durchkompilieren und die Datei "uvcvideo.ko" erstellen.
~/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'
Nach
sudo make install
muss noch das alte Modul "uvcvideo.ko" mit
sudo cp uvcvideo.ko /lib/modules/$(uname -r)/ubuntu/media/usbvideo/uvcvideo.ko
durch das neue ersetzt werden. Danach sollte man es dann fehlerfrei mit
sudo modprobe uvcvideo
laden können.