IOCTL_MIPI_DSI_TRANSMISSION IOCTL (ntddvdeo.h)
主なコード: IRP_MJ_DEVICE_CONTROL
IOCTL_MIPI_DSI_TRANSMISSION は、MIPI DSI パケットのシーケンスを周辺機器に送信するために発行されます。
メジャー コード
入力バッファー
n/a
入力バッファーの長さ
n/a
出力バッファー
n/a
出力バッファーの長さ
n/a
入力/出力バッファー
DXGK_DSI_TRANSMISSION 構造体の後に、パケットを含む DXGK_DSI_PACKET 構造体が続きます。
入力/出力バッファーの長さ
少なくとも sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload
. 詳細については、「解説」を参照してください。
状態ブロック
Irp->IoStatus.Status は、要求が成功した場合にSTATUS_SUCCESSに設定されます。 それ以外の場合、状態 は NTSTATUS コードとして適切なエラー条件に設定されます。 詳細については、「NTSTATUS 値 を参照してください。
備考
モニター、oem パネル、およびディスプレイ ポート/ミニポート ドライバーは、モバイル 業界プロセッサ インターフェイス (MIPI) デジタル シリアル インターフェイス (DSI) IOCTL を処理する必要があります。
伝送の実行
パネル ドライバーがグラフィックス アダプターとパネル ハードウェアの間でこのプライベート インターフェイスを操作できるようにするには、トランザクションは、バスを占有する時間以外のグラフィックス ドライバー効果を持たないか、グラフィックス ドライバーが制御されるように完全に定義する必要があります。 パネル ドライバーの対話を許可するポイントは、グラフィックス ドライバーに不透明なカスタム パネル機能のサポートを提供するため、完全に定義された操作は、パネル ドライバーがグラフィックス ドライバーの関与なしでは実行できない標準化された操作を実行する必要があるトランザクションに制限されます。 このようなトランザクションは、転送ではなく明示的にルーティングされる例外として扱われます。
各送信要求は、OEM パネル ドライバーによって満たされる 1 つのバッファーで構成され、モニター スタックを受け渡し、転送の結果 (存在する場合) と共に返されます。 バッファーには、入力フィールドと出力フィールドの両方に続く、DXGK_DSI_PACKET 構造体の可変サイズ配列を含む、伝送に関する全体的な情報が含まれています。 パケットは DSI の用語で記述され、DSI パケットを記述できますが、OS はパケットを解析し、許可されていないパケットを含む送信を拒否します。 最後のパケットを除くすべてのパケットは、DSI 定義によって、短い書き込みである可能性があるパケットを書き込みます。この場合、ペイロード バッファーが使用されていないか、Payload バッファー内に収まる長い書き込みになります。 送信の最後のパケット (読み取りまたは書き込み) は、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 | 汎用の短い WRITE、パラメーターなし |
0x13 | 汎用 Short WRITE、1 パラメーター |
0x23 | 汎用の短い WRITE、2 つのパラメーター |
0x04 | ジェネリック READ、パラメーターなし |
0x14 | ジェネリック READ、1 パラメーター |
0x24 | ジェネリック READ、2 つのパラメーター |
0x05 | DCS Short WRITE、パラメーターなし |
0x15 | DCS Short WRITE、1 パラメーター |
0x06 | DCS READ、パラメーターなし |
0x29 | 汎用の長い書き込み |
0x39 | DCS の長い書き込み/write_LUT |
汎用の読み取りおよび書き込みコマンドでは、パネルの仕様を理解する必要があるため、バスが過度に使用されていない限り、グラフィックス ドライバーの問題を引き起こすことなく、パネル ドライバーがこれらのコマンドを自由に使用できることを期待します。 同様に、DCS MCS コマンドは製造元用に明示的に定義されているため、グラフィックス ドライバーとパネル ドライバーの間の干渉に問題はありません。
DCS UCS の場合、未定義のコマンドはグラフィックス ドライバーで使用されることが想定されていないため、OS ではパネル ドライバーで使用できるようになりますが、MIPI-DCS 仕様の変更 将来、MCS コマンドが優先されるようにコマンドが定義されるリスクは明らかです。
標準化された DCS UCS コマンドは、通常の操作中にグラフィックス ドライバーによって使用され、パネル ドライバーが使用できる可能性があるため、OEM パネル ドライバーから送信されたコマンドによって後続のグラフィックス ドライバー コマンドの問題が発生するリスクを軽減する必要があります。 これを行うために、OS は DCS コマンドを解析し、OEM パネル ドライバーが ManufacturingMode
フラグを設定し、OS がシステムが製造モードであることを確認しない限り、競合が発生することが予想されるパケットを拒否します。 フラグが設定されていても、システムが製造モードでない場合は、グラフィックス ドライバーを呼び出さずに、HostErrors
フィールドに DXGK_HOST_DSI_INVALID_TRANSMISSION フラグが設定された状態で伝送 IOCTL が完了します。
伝送を使用する代わりに完全に定義されたトランザクションを必要とする条件は、次のようになります。
- DCS soft_resetなど、アイドル時間の前後が必要です
- DCS set_vsync_timingやenter_sleep_modeなど、フレーム出力の動作環境を変更する
- グラフィックス ドライバーが DCS write_memory_start/write_memory_continue など、同じデータにアクセスする必要がある場合がある開始/続行セマンティクスでトランザクションを使用する
さらに、転送として送信されるときに OS によって拒否される DCS コマンドのクラスもあります。
- 上記のように、完全に定義する必要があるコマンド
- 画面のスクレイピングに使用できるピクセル データの読み取り
- ピクセル データの書き込み
OS がグラフィックス ドライバーに渡す UCS コマンド
16 進 | 命令 |
---|---|
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 コマンド
16 進 | 命令 |
---|---|
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 |
3Ch | 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
フィールドを更新して送信を拒否し、戻る前に HostErrors
DXGK_HOST_DSI_DRIVER_REJECTED_PACKET フラグを設定する必要があります。 転送モードのオーバーライドが指定されている場合、ドライバーは、オーバーライドがハードウェア制約と互換性があることを確認する必要があります。そうでない場合は、戻る前に HostErrors
DXGK_HOST_DSI_BAD_TRANSMISSION_MODE フラグを設定します。
通信中にエラーが発生した場合、グラフィックス ドライバーは、失敗したパケットのインデックスを使用して 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 が FailedPacket
、ReadWordCount
、MipiErrors
、HostErrors
、および読み取り (最終) パケットのペイロードを完了すると、結果に応じて更新されている可能性があります。 転送の処理中にエラーが見つかった場合、OEM パネル ドライバーは、MipiErrors
と HostErrors
出力値を使用して、回復して続行する方法を決定する必要があります。
エラーの詳細を提供するために呼び出し元に出力が確実に返されるようにするには、エラーが見つかった場合でも、IOCTL および DDI 呼び出しで成功を報告する必要があります。 成功はトランザクションが成功したことを示すのではなく、トランザクションを処理するための呼び出しが想定どおりに続行され、必要に応じてエラー フラグが設定されていることを示します。 サポートされていない DDI 呼び出し (ドライバーの不一致が原因と考えられます)、メモリ割り当てエラー、NULL バッファーの受け渡しなど、完全に無効なパラメーターの渡しなどの条件に対して、エラーが報告される場合があります。 呼び出しが成功した場合にエラーが報告されない場合、呼び出し元はトランザクションが成功したと見なす必要があります。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 10 バージョン 2004 |
ヘッダー | ntddvdeo.h |