Grundlegendes zu den Linux-Gerätetreibern der Webcam


11

Soweit ich weiß, ist der Gerätetreiber ein Teil von SW, der mit einem bestimmten Gerätetyp kommunizieren kann, der an einen Computer angeschlossen ist.

Im Falle einer USB-Webcam ist der verantwortliche Treiber UVC, der alle UVC-kompatiblen Geräte unterstützt. Dies bedeutet, dass das Betriebssystem oder ein anderes Computerprogramm auf Hardwarefunktionen zugreifen kann, ohne genaue Details der verwendeten Hardware kennen zu müssen.

Aus diesem Grund habe ich den UVC Linux-Gerätetreiber installiert, indem ich Folgendes ausgeführt habe:

opkg install kernel-module-uvcvideo

Webcam wurde vom Linux-Kernel erkannt : dev/video0. Ich konnte jedoch immer noch kein Video-Streaming mit FFmpeg durchführen, da mir die V4L2-API fehlte. Ich habe V4L2 installiert, indem ich den Kernel konfiguriert habe.

Meine Fragen sind:

  • Wie sind UVC-Treiber und V4L2 miteinander verbunden?
  • Was ist der Zweck der V4L2-API?
  • Wenn ich UVC nicht zuerst installiert habe, wird es mit V4L2 installiert?

LinuxTV verweist: Die Implementierung des uvcvideo-Treibers entspricht nur der V4L2-API . Dies bedeutet, dass UVC Teil der V4L2-API ist?

Antworten:


7

Die USB-Videoklasse (UVC) ist eine Spezifikation , der USB-Webcams usw. entsprechen sollen. Auf diese Weise können sie auf jedem System verwendet werden, das UVC-kompatible Geräte unterstützt.

V4L2 ist das Linux-Kernel-Video-Subsystem, von dem die Linux-UVC-Implementierung abhängt. Mit anderen Worten, im Kernel erfordert die UVC-Unterstützung V4L2, aber nicht umgekehrt.

Die V4L2-API bezieht sich auf eine hier dokumentierte Userspace- Programmierschnittstelle .


Wenn ich verstanden habe, kann ein Kernel ohne V4L2 keine UVC-kompatiblen Geräte unterstützen, selbst wenn ein UVC-Treiber installiert ist.
Dempap

2
Ja. Treiber sind Teil des Kernels. Obwohl sie als separate Module kompiliert werden können, werden diese mithilfe einer Kernelquelle kompiliert. Wenn dies nicht die gleiche Quellversion wie Ihr laufender Kernel ist, funktionieren sie nicht. Wenn sie nicht aus derselben Konfiguration kompiliert werden, kann es zu erheblichen Inkonsistenzen kommen. Wenn Sie beispielsweise den Soundkern (ALSA) nicht im Kernel integriert haben (oder als Modul verfügbar sind), ist ein modularer Hardwaretreiber für eine Soundkarte unbrauchbar.
Goldlöckchen

13

Es ist erstaunlich, wie viel Dokumentation Sie für Video4Linux2 finden können - und nichts davon erklärt tatsächlich, was Video4Linux ist .

Erstens ist video4linux2 ein Linux - Treiber Rahmen . Framework-Treiber steuern Geräte nicht direkt. Stattdessen bieten sie ein abstraktes Modell einer Geräteklasse, in diesem Fall Videogeräte, die von Anwendungen verwendet werden können. Treiber-Frameworks bieten drei Hauptvorteile:

  1. Bereitstellung einer einheitlichen API für Anwendungen zur Verwendung mit einer Vielzahl von physischen Geräten, unabhängig davon, ob diese über USB, PCIe, MIPI, Ethernet oder einen anderen Datentransportbus verbunden sind
  2. Im Kernel enthalten Frameworks den Codetyp, der in fast allen Gerätetreibern einer bestimmten Klasse benötigt wird, wodurch das Volumen an unterschiedlichem Code erheblich reduziert wird
  3. Im Kernel bieten Frameworks eine Blaupause zum Schreiben neuer Treiber auf niedrigerer Ebene, die die Hardware tatsächlich steuern, wodurch die Treiberentwicklung vereinfacht wird.

Der V4L2-Treiber ist also ein High-Level-Treiber, der den UVC-Treiber steuert, der den USB-Treiber steuert, der möglicherweise einen noch niedrigeren Hardwaretreiber steuert.

Dieses Matroschka-Modell ist im Linux-Kerneltreiberbaum sehr verbreitet. V4L2 ist eines der komplexeren Beispiele, da einige Kamerageräte den Zugriff auf große Gruppen von Untergeräten in mehreren Schichten erfordern, die die Kamera steuern und die Ausgabe der Kamera zwischen verschiedenen Komponenten wie Bildprozessoren leiten.

Sie können weiterhin direkt aus dem Benutzerbereich mit einer Gerätedatei und "ioctl" -Systemaufrufen auf den UVC-Treiber zugreifen, ohne den V4L2-Treiber zu durchlaufen, und Sie können weiterhin direkt aus dem Benutzerbereich mit der Gerätedatei und "ioctl" auf den zugrunde liegenden USB-Treiber zugreifen.

Als allgemeines Framework, das Funktionen bietet, die einer Vielzahl von Geräten gemeinsam sind, bietet V4L2 nicht alle Funktionen, die der UVC-Treiber bieten könnte (vorausgesetzt, Ihr Gerät bietet tatsächlich mehr UVC-Funktionen als zur Unterstützung von V4L2 erforderlich ist). .

Wenn Sie also ein UVC-Gerät haben, das alle in der UVC-Spezifikation angegebenen Funktionen bietet, müssen Sie, um einige dieser Funktionen tatsächlich nutzen zu können, direkt über eine Gerätedatei und ein "ioctl" -System auf den UVC-Treiber zugreifen Aufrufe unter der Annahme, dass der Linux-Kernel-UVC-Treiber tatsächlich alle UVC-Spezifikationen unterstützt.

Die Bedeutung von

Die Implementierung des uvcvideo-Treibers entspricht nur der V4L2-API

ist, dass der UVC-Treiber im aktuellen Linux-Kernel tatsächlich nicht mehr UVC-Funktionsunterstützung bietet, als für V4L2 benötigt wird.

Die V4L2-Unterstützung im Kernel bietet selbst keine UVC- oder USB-Unterstützung oder Unterstützung für USB-Hardware auf niedrigerer Ebene.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.