IOCTL_MIPI_DSI_TRANSMISSION IOCTL (ntddvdeo.h)
メジャー コード: IRP_MJ_DEVICE_CONTROL
IOCTL_MIPI_DSI_TRANSMISSION は、MIPI DSI パケットのシーケンスを周辺機器に送信するために発行されます。
メジャー コード
[入力バッファー]
該当なし
入力バッファーの長さ
該当なし
出力バッファー
該当なし
出力バッファーの長さ
該当なし
入力/出力バッファー
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 パケットを含む周辺機器への送信を要求するために使用されます。 パネル ドライバーは、常に TotalBufferSize、 PacketCount 、および各パケットの最初の 3 バイトを初期化する必要があります。 パネル ドライバーは、 TransmissionMode、 ReportMipiErrors、 ClearMipiErrors、 SecondaryPort、 ManufacturingMode 、 FinalCommandExtraPayload の 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 が読み取り (最終) パケットの 、ReadWordCount
、MipiErrors
、HostErrors
および ペイロードを完了FailedPacket
すると、結果に応じて更新されている可能性があります。 転送の処理中にエラーが見つかった場合、OEM パネル ドライバーでは、 と HostErrors
の出力値をMipiErrors
使用して、復旧と続行の方法を決定する必要があります。
エラーの詳細を提供するために出力が呼び出し元に返されるようにするには、エラーが見つかった場合でも、IOCTL 呼び出しと DDI 呼び出しで成功を報告する必要があります。 成功は、トランザクションが成功したことを示すものではありません。トランザクションを処理するための呼び出しが期待どおりに進み、必要に応じてエラー フラグが設定されていることを示します。 サポートされていない DDI 呼び出し (ドライバーの不一致、メモリ割り当てエラー、NULL バッファーの渡しなど、完全に無効なパラメーターの渡しなど) などの条件に対して、エラーが報告される場合があります。 呼び出しが成功した場合にエラーが報告されない場合、呼び出し元はトランザクションが成功したと見なす必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 10 バージョン 2004 |
Header | ntddvdeo.h |