web-dev-qa-db-ja.com

ウェブカメラのLinuxデバイスドライバーについて

私の知る限り、デバイスドライバーは、コンピューターに接続されている特定の種類のデバイスと通信できるSWの一部です。

USB Webカメラの場合、責任のあるドライバーは、UVC準拠のデバイスをサポートするUVCです。これは、使用されているハードウェアの正確な詳細を知る必要なく、OSまたは他のコンピュータープログラムがハードウェア機能にアクセスできることを意味します。

このため、次のコマンドを実行してUVC Linuxデバイスドライバーをインストールしました。

opkg install kernel-module-uvcvideo

WebカメラはLinuxカーネルで認識されています:dev/video0。しかし、V4L2 APIがないため、FFmpegでビデオストリーミングを実行できませんでした。カーネルを設定してV4L2をインストールしました。

私のクエリは:

  • UVCドライバーとV4L2はどのようにリンクされていますか?
  • V4L2 APIの目的は何ですか?
  • 最初にUVCをインストールしていない場合、V4L2と共にインストールされますか?

LinuxTVは次のように言及しています:uvcvideoドライバーの実装はV4L2 APIのみに準拠しています。これは、UVCがV4L2 APIの一部であることを意味しますか?

11
dempap

USBビデオクラス(UVC)は、仕様であり、USB Webカメラなどが準拠することになっています。このようにして、UVC準拠デバイスのサポートを実装するすべてのシステムで使用できます。

V4L2は、Linux UVC実装が依存するLinuxカーネルビデオサブシステムです。言い換えると、カーネル内のUVCサポートにはV4L2が必要ですが、その逆は必要ありません。

V4L2 APIは、userspaceprogramming interface を参照します こちら に記載されています。

7
goldilocks

Video4Linux2のドキュメントがどれほど多く見つかるのは驚くべきことであり、実際に説明しているドキュメントはありませんwhatVideo4Linuxis

まず、Video4Linux2はLinuxドライバーframeworkです。フレームワークドライバーは、実際にはデバイスを直接制御しません。代わりに、それらはデバイスのあるクラスの抽象モデルを提供します。この場合、アプリケーションが使用するビデオデバイスです。ドライバーフレームワークには、3つの主な利点があります。

  1. USB、PCIe、MIPI、イーサネット、またはその他のタイプのデータ転送バスで接続されているかどうかに関係なく、アプリケーションが非常に幅広い物理デバイスで使用できる統合APIを提供します
  2. カーネルでは、フレームワークには、特定のクラスのほとんどすべてのデバイスドライバーに必要なタイプのコードが含まれているため、異種コードの量が大幅に削減されます。
  3. カーネルでは、フレームワークは、ハードウェアを実際に制御する新しい下位レベルのドライバーを作成するための青写真を提供し、ドライバー開発を簡素化します。

したがって、V4L2ドライバーは、UVCドライバーを駆動する高レベルのドライバーであり、さらに低レベルのハードウェアドライバーを駆動している可能性のあるUSBドライバーを駆動します。

このマトリョーシカモデルは、Linuxカーネルドライバーツリーでは非常に一般的です。 V4L2はより複雑な例の1つです。カメラデバイスによっては、カメラを制御し、出力をルーティングするいくつかのレイヤーのサブデバイスの大きなグループにアクセスする必要があるためです画像プロセッサなどのさまざまなコンポーネント間のカメラ。

V4L2ドライバーを経由せずに、デバイススペースと「ioctl」システムコールを使用して、ユーザースペースから直接UVCドライバーにアクセスできます。また、デバイススペースと「ioctl」を使用して、ユーザースペースから直接基になるUSBドライバーにアクセスできます。

V4L2は、幅広いデバイスに共通の機能を提供する一般的なフレームワークであるため、UVCドライバーが提供する機能のallを提供しませんcouldprovide(あなたのデバイスが実際にV4L2をサポートするために必要とされるよりも多くのUVC機能を提供すると仮定します)。

したがって、UVC仕様で指定されているすべての機能を提供するUVCデバイスがある場合、これらの機能の一部を実際に使用するには、デバイスファイルと「ioctl」システムを介してUVCドライバーに直接アクセスする必要があります。 LinuxカーネルのUVCドライバーが実際にすべてのUVC仕様をサポートしていると仮定して呼び出します。

ただし、の意味

Uvcvideoドライバーの実装はV4L2 APIのみに準拠しています

現在のLinuxカーネルでは、UVCドライバーは実際にはV4L2で必要とされる以上のUVC機能サポートを提供していません。

カーネルでのV4L2サポートは、それ自体ではUVCまたはUSBサポート、または低レベルのUSBハードウェアサポートを提供しません。

13