DXGKDDI_DSITRANSMISSION Rückruffunktion (dispmprt.h)
Die DxgkddiDsiTransmission Rückruffunktion führt eine DSI-Übertragung (Display Serial Interface) durch.
Syntax
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
Zielbezeichner des Monitors.
[out] pArgs
Zeiger auf eine DXGI_DSI_TRANSMISSION Struktur.
Rückgabewert
DxgkddiDsiTransmission gibt STATUS_SUCCESS zurück, wenn dies erfolgreich ist; andernfalls wird eine der in Ntstatus.hdefinierten Fehlercodes zurückgegeben.
Bemerkungen
Damit ein OEM-Paneltreiber über die andernfalls private Schnittstelle zwischen Grafikkarte und Panelhardware interagieren kann, müssen die Transaktionen entweder keinen Grafiktreibereffekt haben, außer der Zeit, die den Bus belegt, oder sie müssen vollständig definiert sein, damit der Grafiktreiber die Steuerung hat. Da der Zeitpunkt der Interaktion eines OEM-Paneltreibers darin besteht, Unterstützung für benutzerdefinierte Panelfeatures bereitzustellen, die für den Grafiktreiber undurchsichtig sind, sollen vollständig definierte Vorgänge auf Transaktionen beschränkt werden, bei denen der Paneltreiber einen standardisierten Vorgang ausführen muss, der ohne Beteiligung des Grafiktreibers nicht ausgeführt werden kann. Solche Transaktionen werden als Ausnahmen behandelt, die explizit und nicht als Übertragungen weitergeleitet werden.
Jede DSI-Übertragungsanforderung besteht aus einem einzelnen Puffer, der vom OEM-Paneltreiber gefüllt wird, den Monitorstapel übergeben und bei Bedarf mit den Ergebnissen der Übertragung zurückgegeben wird. Der Puffer enthält allgemeine Informationen zur Übertragung mit Eingabe- und Ausgabefeldern, gefolgt von einem Array mit variabler Größe von DXGK_DSI_PACKET Strukturen. Die Pakete werden in DSI-Ausdrücken beschrieben, sodass jedes DSI-Paket beschrieben werden kann, das Betriebssystem analysiert jedoch die Pakete und lehnt alle Übertragungen ab, die Pakete enthalten, die unzulässig sind. Alle Pakete mit Ausnahme der letzten sind, nach DSI-Definition, Pakete zu schreiben, die entweder kurze Schreibvorgänge sein können, in diesem Fall ist der Payload
Puffer nicht verwendet, oder lange Schreibvorgänge, die in den Payload
Puffer passen. Das letzte Paket in einer Übertragung, die ein Lese- oder Schreibvorgang sein kann, kann eine erweiterte Nutzlast verwenden, indem ein größerer Puffer zugeordnet und beschrieben wird, der Speicherplatz für Lese- oder Schreibvorgänge bis zum DSI-Long-Paketdatenlimit von 64K-1-Datenbytes ermöglicht. Dadurch können Sequenzen kleiner Schreibpakete an den Treiber in einem einzigen Anruf in die Warteschlange gestellt werden, erfordern jedoch, dass größere Pakete einzeln gesendet werden. Der Wert des Felds FinalPacketExtraPayload
gibt an, wie viele zusätzliche Bytes zugeordnet wurden, dies muss jedoch auch im Feld TotalBufferSize
berücksichtigt werden.
Der OEM-Paneltreiber ist dafür verantwortlich, sicherzustellen, dass die von ihr angeforderten Übertragungen keine Konflikte verursachen oder andere Übertragungen beeinträchtigen, die der Grafiktreiber für die normale Interaktion mit dem Panel verwendet, da übermäßige Anforderungen erforderlich sind oder Vorgänge angefordert werden, die zu Verzögerungen bei der Verarbeitung anderer Übertragungen führen würden. Der Paneltreiber darf keinen Zustand ändern, der nachfolgende Fehler im Grafiktreiber verursachen würde, z. B. das Ändern der Panelanzeigedauer über MCS-Befehle. Wenn das Betriebssystem eine Anzeigeänderung angefordert hat, z. B. über den Grafiktreiber, z. B. eine Erhöhung der Helligkeit, darf der Paneltreiber keine DSI-Befehle verwenden, um diese Änderung entweder als Reaktion oder für andere Zwecke rückgängig zu machen.
Die IOCTL_MIPI_DSI_TRANSMISSION wird verwendet, um eine Übertragung an das Peripheriegerät mit einem oder mehreren DSI-Paketen anzufordern. Der Paneltreiber muss immer TotalBufferSize
, PacketCount
und die ersten drei BYTES jedes Pakets initialisieren. Der Paneltreiber kann das Standardverhalten mit Werten ungleich Null für TransmissionMode
, ReportMipiErrors
, ClearMipiErrors
, SecondaryPort
, ManufacturingMode
und FinalCommandExtraPayload
überschreiben. Alle nicht initialisierten Werte müssen auf Null festgelegt werden.
Das Betriebssystem stellt sicher, dass die Sequenz von DSI-Paketen wohlgeformt ist, mit gültigen Informationen in allen definierten Feldern und korrekten Puffergrößen. Das Betriebssystem ist dafür verantwortlich, das feld FailedPacket
in DXGK_DSI_INVALID_PACKET_INDEX zu initialisieren, sodass eine weitere Überprüfung im Betriebssystem oder Treiber nur das Feld festlegen muss, wenn ein Problem mit einem bestimmten Paket gefunden wird. Wenn die DXGK_DSI_TRANSMISSION nicht wohlgeformt ist, legt das Betriebssystem das DXGK_HOST_DSI_INVALID_TRANSMISSION Flag im feld HostErrors
fest, um dies von anderen ungültigen Paramsfehlern zu unterscheiden.
Um wohlgeformt zu sein, muss folgendes wahr sein:
- 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
- Nur das letzte Paket darf ein Lesevorgang sein.
- Nur ein endgültiges langes Schreibpaket kann einen
LongWriteWordCount
Wert aufweisen, der größer als [DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE] ist.
Paketüberprüfung
Obwohl das Betriebssystem nicht versucht, den Inhalt aller Pakete vollständig zu überprüfen, wird eine Übertragung mit anderen DSI-Befehlen als den folgenden abgelehnt, ohne den Grafiktreiber aufzurufen:
Datentypwert | Beschreibung |
---|---|
0x03 | Generic Short WRITE, no parameters |
0x13 | Generic Short WRITE, 1 Parameter |
0x23 | Generic Short WRITE, 2 Parameter |
0x04 | Generisches LESEN, keine Parameter |
0x14 | Generic READ, 1 Parameter |
0x24 | Generische READ-Parameter, 2 Parameter |
0x05 | DCS Short WRITE, keine Parameter |
0x15 | DCS Short WRITE, 1 Parameter |
0x06 | DCS READ, keine Parameter |
0x29 | Generischer langer Schreibzugriff |
0x39 | DCS Long Write/write_LUT |
Generische Lese- und Schreibbefehle erfordern ein Verständnis der Panelspezifikation, sodass die Erwartung besteht, dass diese Befehle vom Paneltreiber frei verwendet werden können, ohne probleme für den Grafiktreiber zu verursachen, solange der Bus nicht übermäßig verwendet wird. Ebenso sind DCS MCS-Befehle explizit für die Herstellerverwendung definiert, sodass es kein Problem mit Störungen zwischen dem Grafiktreiber und dem Paneltreiber geben sollte.
Für DCS UCS werden nicht definierte Befehle vom Grafiktreiber verwendet, sodass sie vom Paneltreiber verwendet werden können, obwohl es eindeutig ein Risiko gibt, dass zukünftige MIPI-DCS Spezifikationsänderungen den Befehl definieren, sodass MCS-Befehle bevorzugt werden.
Standardisierte DCS UCS-Befehle werden vom Grafiktreiber während des normalen Betriebs verwendet und können vom Paneltreiber verwendet werden, sodass das Risiko von Befehlen, die vom OEM-Paneltreiber gesendet werden, Probleme mit nachfolgenden Grafiktreiberbefehlen verursachen muss, verringert werden. Dazu analysiert das Betriebssystem DCS-Befehle und lehnt Pakete ab, die zu Konflikten führen sollen, es sei denn, der OEM-Paneltreiber legt das ManufacturingMode
Flag fest, und das Betriebssystem bestätigt, dass sich das System im Fertigungsmodus befindet. Wenn die Kennzeichnung festgelegt ist, sich das System jedoch nicht im Fertigungsmodus befindet, wird die Übertragungs-IOCTL mit dem im feld HostErrors
festgelegten DXGK_HOST_DSI_INVALID_TRANSMISSION Flag abgeschlossen, ohne den Grafiktreiber aufzurufen.
Bedingungen, die eine vollständig definierte Transaktion anstelle einer Übertragung erfordern würden, wären:
- Zeitliche Leerlaufzeiten sind vor oder nach erforderlich, z. B. DCS-soft_reset
- Ändern der Betriebsumgebung für die Frameausgabe, z. B. DCS-set_vsync_timing und enter_sleep_mode
- Verwenden von Transaktionen mit Start-/Fortsetzungsemantik, bei denen der Grafiktreiber möglicherweise auch auf dieselben Daten zugreifen muss, z. B. DCS write_memory_start/write_memory_continue
Darüber hinaus gibt es Klassen von DCS-Befehlen, die vom Betriebssystem abgelehnt werden, wenn sie als Übertragung gesendet werden:
- Jeder Befehl, der vollständig definiert werden muss, wie oben beschrieben
- Lesevorgänge von Pixeldaten, die für bildschirmabwrackend verwendet werden können
- Schreiben von Pixeldaten
UCS-Befehle, die vom Betriebssystem an den Grafiktreiber übergeben werden:
Fluch | Befehl |
---|---|
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 |
UCS-Befehle, die vom Betriebssystem abgelehnt werden:
Fluch | Befehl |
---|---|
01h | soft_reset (muss über eine IOCTL_MIPI_DSI_RESETgesendet werden) |
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 |
Implementierung des Grafiktreibers
Wenn die Übertragung die Betriebssystemüberprüfung übergibt, übergibt das Betriebssystem den Puffer an den Grafiktreiber, indem DxgkDsiTransmission DDI aufgerufen wird.
Das Hinzufügen von OEM-Übertragungen zu einer Schnittstelle, die bereits verwendet wird, um Pixel- und Steuerdaten basierend auf Betriebssystemanforderungen und den Anforderungen der Peripheriesteuerung zu senden, bedeutet zwangsläufig, dass der Grafiktreiber seine interne Sequenzierung verbessern muss, um sicherzustellen, dass dieser zusätzliche Datenstrom von Paketen ordnungsgemäß integriert werden kann. Der Grafiktreiber darf keine Pakete innerhalb einer Übertragung vom OEM-Paneltreiber neu anordnen und muss die gesamte Sequenz unterbrechungsfrei und ohne Interleaving anderer Pakete senden. Der Grafiktreiber ist nicht verpflichtet, die Reihenfolge seiner eigenen Pakete im Hinblick auf die Ankunft der OEM-Panelübertragungsanforderung aufrechtzuerhalten. Daher können Sie pakete senden, um den folgenden Frame vor (oder nach) zu senden, um eine OEM-Panelübertragung zu senden. Wenn der Abschluss einer gestarteten OEM-Panelübertragung gefährdet, dass kritische Pakete ihr Zeitfenster verpassen, sollte der Treiber die Übertragung als abgebrochen melden. Wenn eine Übertragung nicht gestartet wurde, aber der Treiber erwartet, dass kritische Pakete ihr Zeitfenster verpassen, sollte der Treiber das Starten der Übertragung bis zum nächsten Leerlauf verzögern. Wenn das Zurückstellen einer OEM-Panelübertragung dazu führen würde, dass sie auf mehr als zwei Frames wartet, sollte der Treiber das Getriebe als verworfen melden.
Es ist nicht möglich, dass ein Grafiktreiber sicherstellen kann, dass die Übertragungen, die er im Auftrag des Paneltreibers sendet, nicht mit den Übertragungen in Konflikt stehen, über die es kontrolle hat. Der Treiber kann sich entscheiden, Pakete innerhalb einer Übertragung zu prüfen und die Übertragung abzulehnen, wenn sie Probleme verursachen würden, aber alle Pakete, die als unsicher eingestuft werden, sollten für ablehnung auf Betriebssystemebene gekennzeichnet werden, sodass die Ablehnung auf Treiberebene idealerweise auf spezifischen Bedenken des Grafikanbieters zurückzuführen sein sollte. Der Treiber darf nicht versuchen, entweder Lese- oder Schreibvorgänge zwischenzuspeichern oder zu optimieren, auch wenn die Pakete als standardisierte Befehle erscheinen.
Wenn der Grafiktreiber eine Übertragung aufgrund eines Problems mit einem Paket ablehnt, muss es das FailedPacket
Feld mit dem Index des ersten Pakets aktualisieren, das dazu führt, dass die Übertragung abgelehnt wird, und das HostErrors
DXGK_HOST_DSI_DRIVER_REJECTED_PACKET Flag festlegen, bevor es zurückgegeben wird. Wenn eine Außerkraftsetzung für den Übertragungsmodus bereitgestellt wird, sollte der Treiber überprüfen, ob die Außerkraftsetzung mit den Hardwareeinschränkungen kompatibel ist. Andernfalls legen Sie das HostErrors
DXGK_HOST_DSI_BAD_TRANSMISSION_MODE Flag vor der Rückgabe fest.
Wenn während der Kommunikation ein Fehler auftritt, sollte der Grafiktreiber das FailedPacket
Feld mit dem Index des Pakets aktualisieren, das fehlgeschlagen ist, kann jedoch in allen Fällen nicht möglich sein, dass der Treiber das Paket identifizieren kann, damit der Treiber den Standardwert verlassen sollte, DXGK_DSI_INVALID_PACKET_INDEX für solche Fälle.
Der Grafiktreiber ist für die Kommunikation der Pakete verantwortlich, daher müssen Sie sicherstellen, dass alle Prüfsummen berechnet und überprüft werden. Jede Übertragung, die mit einem Lesevorgang endet, ist ein kurzes Paket, sodass die Felder "Data0" und "Data1" alle Parameter enthalten, und die Antwort kann entweder ein kurzes oder langes Paket sein. Der Grafiktreiber weiß möglicherweise nicht, welches Formular und wie lange die zurückgegebenen Daten sein, aber die maximale Größe ist die volle Größe der Nutzlast für das endgültige Paket, einschließlich des FinalPacketExtraPayload
. Das Betriebssystem überprüft, ob dieser Wert nicht größer als die vom Treiber in seinen Funktionen für das Ziel gemeldete TargetMaximumReturnPacketSize
ist, aber der Treiber muss sicherstellen, dass dieser Puffer nicht von einem Peripheriegerät überlastet wird, das mehr Daten meldet, und dass Daten aus dem Peripheriegerät nicht abgeschnitten werden, da die MaximumReturnPacketSize derzeit auf das Peripheriegerät angewendet wird. Der Treiber schreibt die Anzahl der in den Puffer gelesenen Bytes in das ReadWordCount
Feld, das die Übertragung beschreibt.
Es kann Fälle geben, in denen der Grafiktreiber gezwungen ist, entweder die Kommunikationsschnittstelle auf das Panel zurückzusetzen, oder das gesamte Panel aufgrund von Fehlern, die möglicherweise nicht mit dem OEM-Paneltreiber zusammenhängen und nicht feststellbar sind. Um dies zu bewältigen, muss der Treiber entweder DXGK_HOST_DSI_INTERFACE_RESET oder DXGK_HOST_DSI_DEVICE_RESET im Feld HostErrors
auf dem ersten Übertragungsversuch nach dem Zurücksetzen festlegen, damit der OEM-Paneltreiber die Situation erkennen und wiederherstellen kann. Der Treiber darf diese Übertragung nicht an die Hardware senden, aber der OEM-Paneltreiber kann einfach denselben Befehl wiederholen, wenn keine Wiederherstellung erforderlich ist, in diesem Fall sollte der Treiber mit der Verarbeitung der Übertragung wie gewohnt fortfahren.
Abschließen einer Übertragung
Wenn das IOCTL die FailedPacket
, ReadWordCount
, MipiErrors
, HostErrors
und Nutzlast für ein Lesepaket (endgültig) abgeschlossen hat, wurde je nach Ergebnis möglicherweise aktualisiert. Wenn fehler beim Verarbeiten der Übertragung gefunden wurden, muss der OEM-Paneltreiber die MipiErrors
und HostErrors
Ausgabewerte verwenden, um zu bestimmen, wie sie wie wie sie wiederhergestellt und fortgesetzt werden soll.
Um sicherzustellen, dass die Ausgabe an den Aufrufer zurückgegeben wird, um Details zu Fehlern bereitzustellen, müssen IOCTL- und DDI-Aufrufe einen Erfolg melden, auch wenn Fehler gefunden werden. Der Erfolg weist nicht darauf hin, dass die Transaktion erfolgreich war, es gibt an, dass die Aufrufe zur Behandlung der Transaktion erwartungsgemäß ausgeführt wurden und falls zutreffend Fehlerkennzeichnungen festgelegt wurden. Fehler können für Bedingungen wie z. B. einen nicht unterstützten DDI-Aufruf (vermutlich aufgrund eines Treiberkonflikts), Speicherzuordnungsfehler oder das Übergeben vollständig fehlerhafter Parameter, z. B. das Übergeben eines NULL-Puffers, weiterhin gemeldet werden. Wenn für einen erfolgreichen Aufruf keine Fehler gemeldet werden, sollte der Aufrufer davon ausgehen, dass die Transaktion erfolgreich war.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 10, Version 2004 |
Header- | dispmprt.h |