Bagikan melalui


IOCTL_MIPI_DSI_TRANSMISSION IOCTL (ntddvdeo.h)

Kode Utama: IRP_MJ_DEVICE_CONTROL

IOCTL_MIPI_DSI_TRANSMISSION dikeluarkan untuk mengirim urutan paket MIPI DSI ke periferal.

Kode utama

IRP_MJ_DEVICE_CONTROL

Buffer input

n/a

Panjang buffer input

n/a

Buffer output

n/a

Panjang buffer output

n/a

Buffer Input/Output

Struktur DXGK_DSI_TRANSMISSION diikuti dengan struktur DXGK_DSI_PACKET yang berisi paket.

Panjang buffer Input/Output

Setidaknya sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload. Lihat Keterangan untuk detailnya.

Blok status

Irp->IoStatus.Status diatur ke STATUS_SUCCESS jika permintaan berhasil. Jika tidak, Status diatur ke kondisi kesalahan yang sesuai sebagai kode NTSTATUS. Untuk informasi selengkapnya, lihat Nilai NTSTATUS.

Keterangan

Driver monitor, oem-panel, dan display port/miniport harus menangani IOP Antarmuka Serial Digital (DSI) Mobile Industry Processor Interface (MIPI).

Melakukan Transmisi

Untuk memungkinkan driver panel berinteraksi melalui antarmuka privat ini jika tidak antara adaptor grafis dan perangkat keras panel, transaksi harus tidak memiliki efek driver grafis, selain waktu menempati bus, atau mereka harus sepenuhnya didefinisikan sehingga driver grafis memegang kendali. Karena titik memungkinkan driver panel berinteraksi adalah untuk memberikan dukungan untuk fitur panel kustom yang buram ke driver grafis, operasi yang sepenuhnya ditentukan dimaksudkan untuk dibatasi untuk transaksi di mana driver panel perlu melakukan operasi standar yang tidak dapat dilakukan tanpa keterlibatan driver grafis. Transaksi tersebut akan diperlakukan sebagai pengecualian yang dirutekan secara eksplisit daripada sebagai transmisi.

Setiap permintaan transmisi terdiri dari buffer tunggal yang diisi oleh driver panel OEM, melewati tumpukan monitor dan dikembalikan dengan hasil transmisi, jika ada. Buffer berisi informasi keseluruhan tentang transmisi, dengan bidang input dan output, diikuti oleh array berukuran variabel struktur DXGK_DSI_PACKET . Paket dijelaskan dalam istilah DSI, sehingga paket DSI apa pun dapat dijelaskan namun OS akan mengurai paket dan menolak transmisi apa pun yang mencakup paket yang tidak diizinkan. Semua paket kecuali yang terakhir adalah, menurut definisi DSI, menulis paket yang mungkin merupakan tulisan pendek, dalam hal ini buffer Payload tidak digunakan, atau penulisan panjang yang sesuai dalam buffer Payload . Paket terakhir dalam transmisi, yang mungkin baca atau tulis, diizinkan untuk menggunakan payload yang diperpanjang dengan mengalokasikan dan menjelaskan buffer yang lebih besar yang akan memungkinkan ruang untuk membaca atau menulis ukuran apa pun hingga batas data paket panjang DSI 64K-1 byte data. Ini memungkinkan urutan paket tulis kecil untuk diantrekan ke driver dalam satu panggilan tetapi memang mengharuskan paket yang lebih besar dikirim secara individual. Nilai bidang FinalPacketExtraPayload menunjukkan berapa banyak byte tambahan yang telah dialokasikan tetapi ini juga harus diperbantukan di bidang TotalBufferSize .

Driver panel OEM bertanggung jawab untuk memastikan bahwa transmisi yang dimintanya tidak bertentangan atau mengganggu transmisi lain yang digunakan driver grafis untuk interaksi normal dengan panel karena permintaan yang berlebihan atau meminta operasi yang akan menyebabkan keterlambatan dalam memproses transmisi lain. Driver panel tidak boleh mengubah status apa pun yang akan menyebabkan kegagalan berikutnya pada driver grafis, misalnya mengubah pengaturan waktu panel melalui perintah MCS. Demikian pula, jika OS telah meminta perubahan tampilan, melalui driver grafis, misalnya peningkatan kecerahan, driver panel tidak boleh menggunakan perintah DSI untuk membatalkan perubahan tersebut, baik sebagai respons atau untuk tujuan lain.

IOCTL_MIPI_DSI_TRANSMISSION digunakan untuk meminta transmisi ke periferal yang berisi satu atau beberapa paket DSI. Driver panel harus selalu menginisialisasi TotalBufferSize, PacketCount , dan tiga BYTES pertama dari setiap paket. Driver panel dapat mengganti perilaku default menggunakan nilai non-nol untuk TransmissionMode, ReportMipiErrors, ClearMipiErrors, SecondaryPort, ManufacturingMode , dan FinalCommandExtraPayload. Semua nilai yang tidak diinisialisasi harus diatur ke nol.

OS akan memastikan bahwa urutan paket DSI terbentuk dengan baik, dengan info yang valid di semua bidang yang ditentukan dan ukuran buffer yang benar. OS bertanggung jawab untuk menginisialisasi bidang FailedPacket untuk DXGK_DSI_INVALID_PACKET_INDEX sehingga validasi lebih lanjut di OS atau driver hanya perlu mengatur bidang jika masalah ditemukan dengan paket tertentu. Jika struktur DXGK_DSI_TRANSMISSION tidak terbentuk dengan baik, OS akan mengatur bendera DXGK_HOST_DSI_INVALID_TRANSMISSION di bidang HostErrors untuk membedakan ini dari kesalahan params lain yang tidak valid.

Agar dianggap terbentuk dengan baik, semua hal berikut ini harus benar:

  • 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
  • Hanya paket terakhir yang diizinkan untuk dibaca
  • Hanya paket tulis panjang akhir yang dapat memiliki nilai LongWriteWordCount yang lebih besar dari DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE

Validasi Paket

Meskipun OS tidak akan mencoba sepenuhnya memvalidasi konten semua paket, OS akan menolak transmisi yang berisi perintah DSI selain yang berikut, menyelesaikan IOCTL tanpa memanggil driver grafis:

Nilai jenis data Deskripsi
0x03 Tulis Pendek Generik, tidak ada parameter
0x13 Penulisan Singkat Generik, 1 parameter
0x23 Penulisan Pendek Generik, 2 parameter
0x04 READ generik, tidak ada parameter
0x14 Baca generik, 1 parameter
0x24 BACA generik, 2 parameter
0x05 DCS Short WRITE, tanpa parameter
0x15 DCS Short WRITE, 1 parameter
0x06 DCS READ, tidak ada parameter
0x29 Penulisan Panjang Generik
0x39 DCS Long Write/write_LUT

Perintah baca dan tulis generik memerlukan pemahaman spesifikasi panel sehingga harapannya adalah bahwa perintah ini dapat digunakan secara bebas oleh driver panel tanpa menyebabkan masalah bagi driver grafis selama bus tidak digunakan secara berlebihan. Demikian pula, perintah DCS MCS secara eksplisit didefinisikan untuk penggunaan produsen sehingga seharusnya tidak ada masalah dengan gangguan antara driver grafis dan driver panel.

Untuk DCS UCS, perintah yang tidak terdefinisi tidak diharapkan untuk digunakan oleh driver grafis, sehingga OS akan memungkinkan mereka untuk digunakan oleh driver panel meskipun jelas ada risiko bahwa perubahan spesifikasi MIPI-DCS di masa depan menentukan perintah sehingga perintah MCS lebih disukai.

Perintah DCS UCS standar akan digunakan oleh driver grafis selama operasi normal dan berpotensi dapat digunakan oleh driver panel sehingga risiko perintah yang dikirim oleh driver panel OEM menyebabkan masalah dengan perintah driver grafis berikutnya perlu dimitigasi. Untuk melakukan ini, OS akan mengurai perintah DCS dan menolak paket yang diharapkan menyebabkan konflik kecuali driver panel OEM menetapkan ManufacturingMode bendera dan OS mengonfirmasi bahwa sistem dalam mode manufaktur. Jika bendera diatur tetapi sistem tidak dalam mode manufaktur, transmisi IOCTL akan dilengkapi dengan bendera DXGK_HOST_DSI_INVALID_TRANSMISSION diatur di HostErrors lapangan tanpa memanggil driver grafis.

Kondisi yang akan memerlukan transaksi yang sepenuhnya ditentukan alih-alih menggunakan transmisi adalah di mana:

  • Periode menganggur berwaktu diperlukan sebelum atau sesudahnya, seperti DCS soft_reset
  • Mengubah lingkungan operasi untuk output bingkai, seperti set_vsync_timing DCS dan enter_sleep_mode
  • Menggunakan transaksi dengan semantik mulai/lanjut di mana driver grafis mungkin juga perlu mengakses data yang sama, seperti DCS write_memory_start/write_memory_continue

Selain itu, ada kelas perintah DCS yang akan ditolak oleh OS ketika dikirim sebagai transmisi:

  • Perintah apa pun yang perlu sepenuhnya didefinisikan, seperti yang dijelaskan di atas
  • Bacaan data piksel yang dapat digunakan untuk pengikisan layar
  • Menulis data piksel

Perintah UCS yang akan diteruskan OS ke driver grafis

Hex Perintah
00h nop
26h set_gamma_curve
2Dh write_LUT
51 jam set_display_brightness
52h get_display_brightness
53h write_control_display
54 jam 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
14 jam get_image_checksum_rgb
15h get_image_checksum_ct
3Fh get_3D_control
45h get_scanline

Perintah UCS yang akan ditolak OS

Hex Perintah
01h soft_reset - perhatikan, ini harus dikirim melalui IOCTL_MIPI_DSI_RESET
10h enter_sleep_mode
11 jam exit_sleep_mode
12 jam enter_partial_mode
13 jam enter_normal_mode
20h exit_invert_mode
21 jam 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
31 jam set_partial_columns
33h set_scroll_area
34 jam 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

Catatan

Kebijakan validasi OS dapat dimodifikasi dalam rilis mendatang.

Implementasi Driver Grafis

Jika transmisi melewati validasi OS, OS meneruskan buffer ke driver grafis menggunakan DsiTransmission.

Menambahkan transmisi OEM ke antarmuka yang sudah digunakan untuk mengirim data piksel dan kontrol berdasarkan permintaan OS dan kebutuhan kontrol periferal, pasti berarti bahwa driver grafis perlu meningkatkan urutan internalnya untuk memastikan bahwa aliran paket tambahan ini dapat dimasukkan dengan benar. Driver grafis tidak boleh menyusun ulang paket dalam transmisi dari driver panel OEM dan harus mengirim seluruh urutan tanpa gangguan dan tanpa mengganggu paket lain. Driver grafis tidak diperlukan untuk mempertahankan urutan paketnya sendiri sehubungan dengan waktu kedatangan permintaan transmisi panel OEM, jadi dapat memilih untuk mengirim paket untuk mengatur bingkai berikut sebelum (atau setelah) mengirim transmisi panel OEM. Jika penyelesaian transmisi panel OEM yang dimulai mengancam akan menyebabkan paket penting melewatkan jendela waktunya, driver harus melaporkan transmisi sebagai dibatalkan. Jika transmisi belum dimulai tetapi driver mengharapkannya untuk menyebabkan paket penting melewatkan jendela waktu mereka, driver harus menunda memulai transmisi sampai periode pengosongan berikutnya. Jika menunda transmisi panel OEM akan menyebabkannya menunggu lebih dari dua bingkai dimulai, driver harus melaporkan transmisi sebagai terputus.

Tidak dimungkinkan bagi driver grafis untuk memastikan bahwa transmisi yang dikirimnya atas nama driver panel tidak bertentangan dengan transmisi yang memiliki kontrol. Driver dapat memilih untuk memeriksa paket dalam transmisi dan menolak transmisi jika mereka akan menyebabkan masalah tetapi paket apa pun yang dianggap tidak aman harus ditandai untuk penolakan tingkat OS, sehingga penolakan tingkat driver idealnya harus karena masalah khusus vendor grafis. Driver tidak boleh mencoba untuk men-cache atau mengoptimalkan bacaan atau tulis, bahkan jika paket tampaknya merupakan perintah standar.

Jika driver grafis menolak transmisi karena masalah dengan paket, driver harus memperbarui FailedPacket bidang dengan indeks paket pertama yang menyebabkan transmisi ditolak dan mengatur HostErrors bendera DXGK_HOST_DSI_DRIVER_REJECTED_PACKET sebelum kembali. Jika penimpaan mode transmisi disediakan, driver harus memverifikasi bahwa penimpaan kompatibel dengan batasan perangkat kerasnya dan jika tidak, atur HostErrors bendera DXGK_HOST_DSI_BAD_TRANSMISSION_MODE sebelum kembali.

Jika kegagalan terjadi selama komunikasi, driver grafis harus memperbarui FailedPacket bidang dengan indeks paket yang gagal namun mungkin tidak mungkin dalam semua kasus bagi driver untuk mengidentifikasi paket sehingga driver harus meninggalkan nilai default, DXGK_DSI_INVALID_PACKET_INDEX, untuk kasus seperti itu.

Driver grafis bertanggung jawab atas komunikasi paket sehingga harus memastikan jumlah pemeriksaan dihitung dan diverifikasi. Transmisi apa pun yang berakhir dengan baca, akan menjadi paket pendek, sehingga bidang Data0 dan Data1 berisi parameter apa pun dan responsnya mungkin merupakan paket pendek atau panjang. Driver grafis mungkin tidak tahu bentuk mana dan berapa lama data yang dikembalikan akan tetapi ukuran maksimum adalah ukuran penuh payload untuk paket akhir, termasuk FinalPacketExtraPayload. OS akan memvalidasi bahwa nilai ini tidak lebih besar dari TargetMaximumReturnPacketSize yang dilaporkan oleh driver dalam kemampuannya untuk target tetapi driver harus memastikan bahwa buffer ini tidak dibanjiri oleh pelaporan periferal lebih banyak data, dan data dari periferal tidak terpotong karena lebih besar dari MaximumReturnPacketSize yang saat ini diterapkan ke periferal. Driver menulis jumlah byte yang dibaca ke dalam buffer ke ReadWordCount bidang yang menjelaskan transmisi.

Mungkin ada kasus di mana driver grafis dipaksa untuk mengatur ulang antarmuka komunikasi ke panel, atau seluruh panel karena kesalahan yang mungkin tidak terkait dengan dan mungkin tidak dapat diamati oleh driver panel OEM. Untuk menangani hal ini, driver harus melaporkan DXGK_HOST_DSI_INTERFACE_RESET atau DXGK_HOST_DSI_DEVICE_RESET diatur di HostErrors lapangan pada upaya transmisi pertama setelah reset sehingga driver panel OEM dapat mendeteksi situasi dan memulihkan. Driver tidak boleh mengirim transmisi ini ke perangkat keras tetapi driver panel OEM hanya dapat mencoba kembali perintah yang sama jika tidak ada pemulihan yang diperlukan, dalam hal ini driver harus melanjutkan dengan memproses transmisi seperti biasa.

Menyelesaikan Transmisi

Ketika IOCTL menyelesaikan FailedPacketpayload , , ReadWordCountMipiErrors, HostErrors dan untuk paket baca (akhir) mungkin telah diperbarui tergantung pada hasilnya. Jika kesalahan ditemukan saat memproses transmisi, driver panel OEM perlu menggunakan MipiErrors nilai output dan HostErrors untuk menentukan cara memulihkan dan melanjutkan.

Untuk memastikan bahwa output dikembalikan ke pemanggil untuk memberikan detail kesalahan apa pun, panggilan IOCTL dan DDI perlu melaporkan keberhasilan, bahkan jika kesalahan ditemukan. Keberhasilan tidak menunjukkan bahwa transaksi berhasil, itu menunjukkan bahwa panggilan untuk menangani transaksi dilanjutkan seperti yang diharapkan dan bendera kesalahan telah ditetapkan, jika sesuai. Kegagalan mungkin masih dilaporkan untuk kondisi seperti panggilan DDI yang tidak didukung (mungkin karena ketidakcocokan driver), kegagalan alokasi memori atau melewati parameter yang benar-benar buruk, seperti melewati buffer NULL. Jika tidak ada kesalahan yang dilaporkan untuk panggilan yang berhasil, penelepon harus mengasumsikan bahwa transaksi berhasil.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 10, version 2004
Header ntddvdeo.h

Lihat juga

DsiTransmission

DXGK_DSI_PACKET

DXGK_DSI_TRANSMISSION

IOCTL_MIPI_DSI_QUERY_CAPS

IOCTL_MIPI_DSI_RESET