DXGKDDI_DSITRANSMISSION fungsi panggilan balik (dispmprt.h)
Fungsi panggilan balik DxgkddiDsiTransmission melakukan transmisi Display Serial Interface (DSI).
Sintaks
DXGKDDI_DSITRANSMISSION DxgkddiDsitransmission;
NTSTATUS DxgkddiDsitransmission(
[in] HANDLE Context,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[out] PDXGK_DSI_TRANSMISSION pArgs
)
{...}
Parameter
[in] Context
[in] TargetId
Pengidentifikasi target monitor.
[out] pArgs
Penunjuk ke struktur DXGI_DSI_TRANSMISSION .
Nilai kembali
DxgkddiDsiTransmission mengembalikan STATUS_SUCCESS jika berhasil; jika tidak, ia mengembalikan salah satu kode kesalahan yang ditentukan dalam Ntstatus.h.
Keterangan
Untuk memungkinkan driver panel OEM berinteraksi melalui antarmuka privat antara adaptor grafis dan perangkat keras panel, transaksi tidak boleh memiliki efek driver grafis, selain waktu menempati bus, atau harus sepenuhnya ditentukan sehingga driver grafis memegang kendali. Karena titik memungkinkan driver panel OEM 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 DSI 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 Payload
ini buffer tidak digunakan, atau tulisan panjang yang sesuai dalam Payload
buffer. 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 FinalPacketExtraPayload
bidang menunjukkan berapa banyak byte tambahan yang telah dialokasikan tetapi ini juga harus dipertolong di TotalBufferSize
bidang .
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 mengambil alih perilaku default menggunakan nilai bukan 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 FailedPacket
bidang 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 DXGK_DSI_TRANSMISSION tidak terbentuk dengan baik, OS akan mengatur bendera DXGK_HOST_DSI_INVALID_TRANSMISSION di HostErrors
bidang 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 yang
LongWriteWordCount
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 |
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 |
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 (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 |
44 jam | set_tear_scanline |
A1h | read_DDB_start |
A2h | read_PPS_start |
A8h | read_DDB_continue |
A9h | read_PPS_continue |
Implementasi Driver Grafis
Jika transmisi melewati validasi OS, OS meneruskan buffer ke driver grafis dengan memanggil DxgkDsiTransmission DDI.
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 tersebut.
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 FailedPacket
payload , , ReadWordCount
MipiErrors
, 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 | dispmprt.h |