次の方法で共有


IOCTL_MIPI_DSI_TRANSMISSION IOCTL (ntddvdeo.h)

メジャー コード: IRP_MJ_DEVICE_CONTROL

IOCTL_MIPI_DSI_TRANSMISSION は、MIPI DSI パケットのシーケンスを周辺機器に送信するために発行されます。

メジャー コード

IRP_MJ_DEVICE_CONTROL

[入力バッファー]

該当なし

入力バッファーの長さ

該当なし

出力バッファー

該当なし

出力バッファーの長さ

該当なし

入力/出力バッファー

DXGK_DSI_TRANSMISSION構造体の後に、パケットを含むDXGK_DSI_PACKET構造体が続きます。

入力/出力バッファーの長さ

少なくとも sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload。 詳細については、「解説」を参照してください。

ステータス ブロック

Irp->要求が成功した場合、IoStatus.Status はSTATUS_SUCCESSに設定されます。 それ以外の場合、 Status は NTSTATUS コードとして適切なエラー条件に設定されます。 詳細については、「 NTSTATUS 値」を参照してください。

注釈

モニター、oem パネル、およびディスプレイ ポート/ミニポート ドライバーは、モバイル 業界プロセッサ インターフェイス (MIPI) デジタル シリアル インターフェイス (DSI) IOCTL を処理する必要があります。

伝送の実行

パネル ドライバーがグラフィックス アダプターとパネル ハードウェアの間でこのプライベート インターフェイスを操作できるようにするには、トランザクションは、バスを占める時間以外のグラフィックス ドライバー効果を持たないか、グラフィックス ドライバーが制御されるように完全に定義する必要があります。 パネル ドライバーの対話を許可するポイントは、グラフィックス ドライバーに不透明なカスタム パネル機能のサポートを提供するため、完全に定義された操作は、パネル ドライバーがグラフィックス ドライバーの関与なしに実行できない標準化された操作を実行する必要があるトランザクションに限定することを目的としています。 このようなトランザクションは、送信としてではなく、明示的にルーティングされた例外として扱われます。

各送信要求は、OEM パネル ドライバーによって入力され、モニター スタックを渡され、転送の結果 (存在する場合) と共に返される 1 つのバッファーで構成されます。 バッファーには、送信に関する全体的な情報が含まれており、入力フィールドと出力フィールドの両方に続いて、 DXGK_DSI_PACKET 構造体の可変サイズの配列が続きます。 パケットは DSI 用語で記述され、DSI パケットは記述できますが、OS はパケットを解析し、許可されていないパケットを含むすべての送信を拒否します。 最後を除くすべてのパケットは、DSI 定義によって、短い書き込みである可能性があるパケットを書き込みます。この場合、 ペイロード バッファーが使用されていないか、 ペイロード バッファー内に収まる長い書き込みになります。 送信の最後のパケット (読み取りまたは書き込み) は、64K-1 データ バイトの DSI の長いパケット データ制限までの任意のサイズの読み取りまたは書き込みを可能にする大きなバッファーを割り当て、記述することで拡張ペイロードを使用できます。 これにより、小さな書き込みパケットのシーケンスを 1 回の呼び出しでドライバーにキューに入れられますが、より大きなパケットを個別に送信する必要があります。 FinalPacketExtraPayload フィールドの値は、割り当てられた余分なバイト数を示しますが、これは TotalBufferSize フィールドにも考慮する必要があります。

OEM パネル ドライバーは、過剰な要求や他の転送の処理の遅延を引き起こす操作の要求のために、グラフィックス ドライバーがパネルとの通常の対話に使用する他の転送と競合したり干渉したりしないようにする責任があります。 パネル ドライバーは、グラフィックス ドライバーで後続のエラーを引き起こす状態を変更しないでください 。たとえば、MCS コマンドを使用してパネルのタイミングを変更します。 同様に、OS がグラフィックス ドライバー (明るさの向上など) を介して表示の変更を要求した場合、パネル ドライバーは、応答または他の目的で、その変更を元に戻すために DSI コマンドを使用してはなりません。

IOCTL_MIPI_DSI_TRANSMISSION は、1 つ以上の DSI パケットを含む周辺機器への送信を要求するために使用されます。 パネル ドライバーは、常に TotalBufferSizePacketCount 、および各パケットの最初の 3 バイトを初期化する必要があります。 パネル ドライバーは、 TransmissionModeReportMipiErrorsClearMipiErrorsSecondaryPortManufacturingModeFinalCommandExtraPayload の 0 以外の値を使用して、既定の動作をオーバーライドできます。 初期化されていない値はすべて 0 に設定する必要があります。

OS では、DSI パケットのシーケンスが整形式であり、すべての定義済みフィールドに有効な情報と正しいバッファー サイズが含まれます。 OS は FailedPacket フィールドを初期化してDXGK_DSI_INVALID_PACKET_INDEXします。そのため、OS またはドライバーの詳細な検証では、特定のパケットで問題が見つかった場合にのみフィールドを設定する必要があります。 DXGK_DSI_TRANSMISSION構造が整形式でない場合、OS は HostErrors フィールドに DXGK_HOST_DSI_INVALID_TRANSMISSION フラグを設定して、他の無効なパラメーター エラーと区別します。

整形式と見なすには、次のすべてが当てはまる必要があります。

  • TotalBufferSize >= sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload
  • FinalPacketExtraPayload <= 64K-1-DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE (0xFFF7)
  • TotalBufferSize <= ROUND_TO_PAGES( sizeof(DXGK_DSI_TRANSMISSION) + (0xFE * sizeof(DXGK_DSI_PACKET)) + 0xFFF7 )
  • PacketCount != 0
  • 最後のパケットのみが読み取り可能です
  • longWriteWordCount 値が DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE より大きいのは、最終的な長い書き込みパケットのみです。

パケットの検証

OS は、すべてのパケットのコンテンツを完全に検証しようとはしませんが、次以外の DSI コマンドを含む送信を拒否し、グラフィックス ドライバーを呼び出さずに IOCTL を完了します。

データ型の値 説明
0x03 ジェネリック Short WRITE(パラメーターなし)
0x13 汎用 Short WRITE、1 パラメーター
0x23 汎用短書き込み、2 つのパラメーター
0x04 ジェネリック READ、パラメーターなし
0x14 ジェネリック READ、1 パラメーター
0x24 ジェネリック READ、2 つのパラメーター
0x05 DCS Short WRITE、パラメーターなし
0x15 DCS Short WRITE、1 パラメーター
0x06 DCS READ、パラメーターなし
0x29 汎用長書き込み
0x39 DCS Long Write/write_LUT

汎用の読み取りコマンドと書き込みコマンドでは、パネル仕様を理解する必要があるため、バスが過剰に使用されていない限り、グラフィックス ドライバーに問題を引き起こさずに、これらのコマンドをパネル ドライバーで自由に使用できることを期待します。 同様に、DCS MCS コマンドは製造元用に明示的に定義されているため、グラフィックス ドライバーとパネル ドライバーの間の干渉に問題はありません。

DCS UCS の場合、未定義のコマンドはグラフィックス ドライバーで使用されることが想定されていないため、OS ではパネル ドライバーで使用できるようになりますが、将来 の MIPI-DCS 仕様の変更によってコマンドが定義されるため、MCS コマンドが優先されるリスクは明らかです。

標準化された DCS UCS コマンドは、通常の操作中にグラフィックス ドライバーによって使用され、パネル ドライバーで使用できる可能性があるため、OEM パネル ドライバーによって送信されたコマンドが後続のグラフィックス ドライバー コマンドの問題を引き起こすリスクを軽減する必要があります。 これを行うには、OS は DCS コマンドを解析し、OEM パネル ドライバーがフラグを設定 ManufacturingMode し、OS がシステムが製造モードであることを確認しない限り、競合が発生すると予想されるパケットを拒否します。 フラグが設定されていても、システムが製造モードでない場合、伝送 IOCTL は、グラフィックス・ドライバーを呼び出さずに フィールドHostErrors DXGK_HOST_DSI_INVALID_TRANSMISSIONフラグを設定して完了します。

転送を使用する代わりに完全に定義されたトランザクションを必要とする条件は、次のようになります。

  • DCS soft_resetなど、アイドル期間の前後に時間指定が必要です
  • DCS set_vsync_timingやenter_sleep_modeなど、フレーム出力の動作環境を変更する
  • グラフィックス ドライバーが DCS write_memory_start/write_memory_continue など、同じデータにアクセスする必要がある場合がある開始/継続セマンティクスでトランザクションを使用する

さらに、転送として送信されるときに OS によって拒否される DCS コマンドのクラスがあります。

  • 上記のように、完全に定義する必要があるコマンド
  • 画面スクレイピングに使用できるピクセル データの読み取り
  • ピクセル データの書き込み

OS がグラフィックス ドライバーに渡す UCS コマンド

Hex コマンド
00h Nop
26h set_gamma_curve
2Dh write_LUT
51h set_display_brightness
52h get_display_brightness
53h write_control_display
54h get_control_display
55h write_power_save
56h get_power_save
5Eh set_CABC_min_brightness
5Fh get_CABC_min_brightness
03h get_compression_mode
05h get_error_count_on_DSI
06h get_red_channel
07h get_green_channel
08h get_blue_channel
0Ah get_power_mode
0Bh get_address_mode
0Ch get_pixel_format
0Dh get_display_mode
0Eh get_signal_mode
0Fh get_diagnostic_result
14h get_image_checksum_rgb
15h get_image_checksum_ct
3Fh get_3D_control
45h get_scanline

OS が拒否する UCS コマンド

Hex コマンド
01h soft_reset - これはIOCTL_MIPI_DSI_RESET経由で送信する必要があることに注意してください
10h enter_sleep_mode
11h exit_sleep_mode
12h enter_partial_mode
13h enter_normal_mode
20h exit_invert_mode
21h enter_invert_mode
28h set_display_off
29h set_display_on
2Ah set_column_address
2Bh set_page_address
2Ch write_memory_start
2Eh read_memory_start
30h set_partial_rows
31h set_partial_columns
33h set_scroll_area
34h set_tear_off
35h set_tear_on
36h set_address_mode
37h set_scroll_start
38h exit_idle_mode
39h enter_idle_mode
3Ah set_pixel_format
Ch write_memory_continue
3Dh set_3D_control
3Eh read_memory_continue
40h set_vsync_timing
44h set_tear_scanline
A1h read_DDB_start
A2h read_PPS_start
A8h read_DDB_continue
A9h read_PPS_continue

注意

OS 検証ポリシーは、今後のリリースで変更される可能性があります。

グラフィックス ドライバーの実装

転送が OS 検証に合格した場合、OS は DsiTransmission を使用してバッファーをグラフィックス ドライバーに渡します。

OS 要求と周辺機器制御のニーズに基づいてピクセルデータと制御データの両方を送信するために既に使用されているインターフェイスに OEM 伝送を追加することは、グラフィックス ドライバーが内部シーケンス処理を強化して、この追加のパケット ストリームを正しく組み込むことができるようにする必要があることを意味します。 グラフィックス ドライバーは、OEM パネル ドライバーからの伝送内でパケットを並べ替える必要があります。また、シーケンス全体を中断なく送信し、他のパケットをインターリーブせずに送信する必要があります。 グラフィックス ドライバーは、OEM パネル送信要求の到着時刻に関して独自のパケットの順序を維持する必要がないため、OEM パネル転送を送信する前 (または後) に次のフレームを設定するパケットを送信することを選択できます。 開始された OEM パネル転送が完了すると、重要なパケットが時間枠を逃す恐れがある場合、ドライバーは転送を取り消し済みとして報告する必要があります。 転送が開始されていないが、ドライバーが重要なパケットの時間枠を逃すと予想される場合、ドライバーは次の空白期間まで転送の開始を延期する必要があります。 OEM パネル転送を遅延すると、2 フレームを超えるフレームが開始されるまで待機していた場合、ドライバーは送信を破棄済みとして報告する必要があります。

グラフィックス ドライバーが、パネル ドライバーの代わりに送信する転送が、制御を持つ転送と競合しないようにすることはできません。 ドライバーは、転送内のパケットを検査し、問題が発生する場合は送信を拒否することを選択できますが、安全でないと見なされるパケットは OS レベルの拒否にフラグを設定する必要があるため、ドライバー レベルの拒否は、グラフィックス ベンダー固有の懸念が原因であることが理想的です。 ドライバーは、パケットが標準化されたコマンドのように見える場合でも、読み取りまたは書き込みをキャッシュまたは最適化しないでください。

グラフィックス ドライバーがパケットの問題のために送信を拒否する場合は、最初のパケットのインデックスを使用してフィールドを更新 FailedPacket して送信を拒否し、戻る前に DXGK_HOST_DSI_DRIVER_REJECTED_PACKET フラグを設定 HostErrors する必要があります。 転送モードのオーバーライドが指定されている場合、ドライバーはオーバーライドがハードウェア制約と互換性があることを確認し、互換性がない場合は、戻る前に DXGK_HOST_DSI_BAD_TRANSMISSION_MODE フラグを設定 HostErrors する必要があります。

通信中にエラーが発生した場合、グラフィックス ドライバーは失敗したパケットのインデックスを使用してフィールドを更新 FailedPacket する必要がありますが、ドライバーがパケットを識別できない場合があるため、ドライバーは既定値 (DXGK_DSI_INVALID_PACKET_INDEX) のままにしておく必要があります。

グラフィックス ドライバーはパケットの通信を担当するため、チェック合計が計算および検証されていることを確認する必要があります。 読み取りで終了するすべての送信は短いパケットであるため、Data0 フィールドと Data1 フィールドにはパラメーターが含まれており、応答は短いパケットまたは長いパケットである可能性があります。 グラフィックス ドライバーは、返されるデータの形式と期間がわからない場合がありますが、最大サイズは、 を含む FinalPacketExtraPayload最終的なパケットのペイロードのフル サイズです。 OS は、この値がターゲットの機能でドライバーによって報告された値より TargetMaximumReturnPacketSize 大きくないことを検証しますが、ドライバーは、このバッファーが、より多くのデータを報告する周辺機器によってオーバーランされないことと、周辺機器からデータが切り捨てられないようにする必要があります。これは、現在周辺機器に適用されている MaximumReturnPacketSize よりも大きいためです。 ドライバーは、バッファーに読み取られたバイト数を転送を ReadWordCount 記述するフィールドに書き込みます。

グラフィックス ドライバーが、パネルへの通信インターフェイス、または OEM パネル ドライバーに対して監視できないエラーが原因でパネル全体を強制的にリセットする場合があります。 これに対処するには、ドライバーは、OEM パネル ドライバーが状況を検出して回復できるように、リセット後の最初の転送試行で HostErrors フィールドに設定されたDXGK_HOST_DSI_INTERFACE_RESETまたはDXGK_HOST_DSI_DEVICE_RESETを報告する必要があります。 ドライバーは、ハードウェアにこの転送を送信する必要がありますが、OEM パネル ドライバーは、回復が必要ない場合は、同じコマンドを再試行できます。その場合、ドライバーは通常どおりに転送の処理を続行する必要があります。

転送の完了

IOCTL が読み取り (最終) パケットの 、ReadWordCountMipiErrorsHostErrorsおよび ペイロードを完了FailedPacketすると、結果に応じて更新されている可能性があります。 転送の処理中にエラーが見つかった場合、OEM パネル ドライバーでは、 と HostErrors の出力値をMipiErrors使用して、復旧と続行の方法を決定する必要があります。

エラーの詳細を提供するために出力が呼び出し元に返されるようにするには、エラーが見つかった場合でも、IOCTL 呼び出しと DDI 呼び出しで成功を報告する必要があります。 成功は、トランザクションが成功したことを示すものではありません。トランザクションを処理するための呼び出しが期待どおりに進み、必要に応じてエラー フラグが設定されていることを示します。 サポートされていない DDI 呼び出し (ドライバーの不一致、メモリ割り当てエラー、NULL バッファーの渡しなど、完全に無効なパラメーターの渡しなど) などの条件に対して、エラーが報告される場合があります。 呼び出しが成功した場合にエラーが報告されない場合、呼び出し元はトランザクションが成功したと見なす必要があります。

要件

要件
サポートされている最小のクライアント Windows 10 バージョン 2004
Header ntddvdeo.h

こちらもご覧ください

DsiTransmission

DXGK_DSI_PACKET

DXGK_DSI_TRANSMISSION

IOCTL_MIPI_DSI_QUERY_CAPS

IOCTL_MIPI_DSI_RESET