GNU/Linux >> Linux の 問題 >  >> Linux

Webcam の Linux デバイス ドライバーを理解する

Video4Linux2 に関するドキュメントがこれほど多く見つかるのは驚くべきことですが、内容を実際に説明しているものはありません。 Video4Linux .

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

<オール>
  • USB、PCIe、MIPI、イーサネット、またはその他のタイプのデータ転送バスで接続されているかどうかにかかわらず、非常に幅広い物理デバイスで使用するアプリケーション用の統合 API を提供します
  • カーネルでは、特定のクラスのほぼすべてのデバイス ドライバで必要とされるタイプのコードがフレームワークに含まれているため、異種コードの量が大幅に削減されます
  • カーネルでは、フレームワークはハードウェアを実際に制御する新しい低レベル ドライバを作成するための青写真を提供するため、ドライバ開発が簡素化されます。
  • したがって、V4L2 ドライバーは、UVC ドライバーを駆動する高レベルのドライバーであり、さらに低レベルのハードウェア ドライバーを駆動している可能性のある USB ドライバーを駆動します。

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

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

    V4L2 は幅広いデバイスに共通の機能を提供する一般的なフレームワークであるため、すべてを提供するわけではありません。 UVC ドライバーができる機能の 提供します (デバイスが V4L2 のサポートに必要な以上の UVC 機能を実際に提供していると仮定します)。

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

    ただし、

    の意味は <ブロック引用>

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

    現在の Linux カーネルの UVC ドライバーは、実際には V4L2 に必要な以上の UVC 機能サポートを提供していないということです。

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


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

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

    V4L2 API は ユーザー空間 を参照します プログラミング インターフェイス、ここに文書化されています。


    Linux
    1. Linuxにデバイスドライバーをインストールする方法

    2. Linux:デバイスに使用されているデバイスドライバーを見つける方法は?

    3. Linux – Linux上のデバイスに関連付けられているドライバー(モジュール)を見つける方法は?

    1. Linuxデスクトップを理解していますか?

    2. Linux での dm-Multipath 識別子について

    3. init に加えて、Linux デバイスドライバーでプローブメソッドが必要なのはなぜですか?

    1. Linux プラットフォーム ドライバーと通常のデバイス ドライバーの違いは何ですか?

    2. IOCTL Linux デバイス ドライバー

    3. Linux でデバイスをマウントするには?