DRM とは:
DRM の正式名称は DirectRenderingManager で、Linux の主流の表示フレームワークであり、マルチレイヤ構成をサポートし、ユーザーレイヤが GPU にアクセスして一元管理を実現するための統合 API (libdrm) を提供します。これは、複数のプログラムがビデオ カードにアクセスし、共同リソースを使用するという問題を解決するために作成されました。DRM は単純に 3 つのモジュールに分割できます。
- libdrm:上位層に汎用APIを提供し、画像表示や画像処理のための各種ioctlインターフェースを下位層にカプセル化するライブラリです。もちろん、drmのioctlやフレームバッファを利用して画像を操作・表示することも可能です。
- GEM: メモリ管理。主にディスプレイ バッファの割り当てと解放、ビデオ メモリの共有と処理 CPU、GPU メモリの同期を担当します。
- KMS: カーネル モード設定。画面とパラメータ設定を更新し、グラフィックス カードの構成を完了し、ハードウェア GPU 操作をインターフェイス層でカプセル化するために使用されます。フレームバッファ、CRTC、プレーン、エンコーダ、コネクタ、その他のモジュールに抽象化できます。
DRM フレームワーク図:
KMS フレームワークは次のもので構成されます。
- フレームバッファ: 表示された画像データを保存するメモリ領域。ドライバーとアプリケーション層の両方からアクセスでき、解像度、カラー モード (yuv、rgb) などの情報が保存されます。
- crtc: 表示タイミングや解像度などの表示制御を行い、Framebuffer のデータをスキャンして読み出し、重畳された Plane の内容を Encoder に送信します。vop (Video Output Processor) では、lcdc コントローラーです。
- プレーン: フレームバッファと同様、メモリの一部、ハードウェア イメージ レイヤーであり、イメージ レイヤーは 1 つ以上のプレーンで構成されます。携帯電話の異なるインターフェースを重ね合わせるのもこの原理です。飛行機には次の 3 種類があります。
- DRM_PLANE_TYPE_PRIMARY: プライマリ レイヤ、背景または画像コンテンツを表示します。
- DRM_PLANE_TYPE_OVERLAY: 表示オーバーレイ、スケーリング用
- DRM_PLANE_TYPE_CURSOR: マウスの表示に使用されます
- エンコーダ: エンコーダは、受信データをさまざまな信号 (mipi、edp、vga など) に変換します。
- コネクタ: edp、hdmi、mipi などの特定の外部インターフェイスは物理ディスプレイ出力デバイスに接続され、EDID、ビデオ モードなどの出力デバイスの関連情報を保存します。
一般的なプロセスは、ユーザーが表示されたデータをフレームバッファに入力し、libdrm インターフェイスを介して VOP デバイスに通知することです (crtc) VOP ドライバーは、フレームバッファとプレーンのデータを重ね合わせ、標準の LCDC タイミング シーケンスに変換します。そしてそれを特定の mipi、edp、vga、その他の信号に変換して、コネクタのディスプレイ出力に送ります。
KMS フレーム図: