DXGKDDI_DSITRANSMISSION fonction de rappel (dispmprt.h)
La fonction de rappel DxgkddiDsiTransmission effectue une transmission DSI (Display Serial Interface).
Syntaxe
DXGKDDI_DSITRANSMISSION DxgkddiDsitransmission;
NTSTATUS DxgkddiDsitransmission(
[in] HANDLE Context,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[out] PDXGK_DSI_TRANSMISSION pArgs
)
{...}
Paramètres
[in] Context
[in] TargetId
Identificateur cible du moniteur.
[out] pArgs
Pointeur vers une structure DXGI_DSI_TRANSMISSION .
Valeur retournée
DxgkddiDsiTransmission retourne STATUS_SUCCESS si elle réussit ; sinon, il retourne l’un des codes d’erreur définis dans Ntstatus.h.
Remarques
Pour permettre à un pilote de panneau OEM d’interagir sur l’interface privée par ailleurs entre la carte graphique et le matériel du panneau, les transactions doivent être sans effet de pilote graphique, autre que le temps d’occupation du bus, ou elles doivent être entièrement définies pour que le pilote graphique soit sous contrôle. Étant donné que le point de permettre à un pilote de panneau OEM d’interagir est de fournir une prise en charge des fonctionnalités de panneau personnalisées qui sont opaques pour le pilote graphique, les opérations entièrement définies sont destinées à être limitées aux transactions où le pilote de panneau doit effectuer une opération standardisée qui ne peut pas être effectuée sans l’intervention du pilote graphique. Ces transactions seront traitées comme des exceptions routées explicitement plutôt que comme des transmissions.
Chaque demande de transmission DSI se compose d’une mémoire tampon unique qui est remplie par le pilote de panneau OEM, transmise à la pile du moniteur et retournée avec les résultats de la transmission, le cas échéant. La mémoire tampon contient des informations globales sur la transmission, avec des champs d’entrée et de sortie, suivis d’un tableau de taille variable de structures DXGK_DSI_PACKET . Les paquets sont décrits en termes DSI, de sorte que tout paquet DSI peut être décrit, mais le système d’exploitation analyse les paquets et rejette toute transmission incluant les paquets qui ne sont pas autorisés. Tous les paquets à l’exception du dernier sont, par définition DSI, des paquets d’écriture qui peuvent être des écritures courtes, auquel cas la Payload
mémoire tampon est inutilisée, ou des écritures longues qui tiennent dans la Payload
mémoire tampon. Le dernier paquet d’une transmission, qui peut être une lecture ou une écriture, est autorisé à utiliser une charge utile étendue en allouant et en décrivant une mémoire tampon plus grande qui permet d’espacer les lectures ou les écritures de toute taille jusqu’à la limite de données de paquets longs DSI de 64 Ko-1 octets de données. Cela permet de mettre en file d’attente des séquences de petits paquets d’écriture vers le pilote dans un seul appel, mais nécessite que les paquets plus volumineux soient envoyés individuellement. La valeur du champ indique le FinalPacketExtraPayload
nombre d’octets supplémentaires qui ont été alloués, mais cela doit également être pris en compte dans le TotalBufferSize
champ.
Le pilote de panneau OEM est chargé de s’assurer que les transmissions qu’il demande n’entrent pas en conflit ou n’interfèrent pas avec d’autres transmissions que le pilote graphique utilise pour une interaction normale avec le panneau en raison de demandes excessives ou de demandes d’opérations qui entraîneraient des retards dans le traitement d’autres transmissions. Le pilote de panneau ne doit pas modifier l’état qui entraînerait des défaillances ultérieures dans le pilote graphique, par exemple la modification du minutage du panneau via des commandes MCS. De même, si le système d’exploitation a demandé une modification d’affichage, via le pilote graphique, par exemple une augmentation de la luminosité, le pilote de panneau ne doit pas utiliser les commandes DSI pour annuler cette modification, que ce soit en réponse ou à d’autres fins.
Le IOCTL_MIPI_DSI_TRANSMISSION est utilisé pour demander une transmission au périphérique contenant un ou plusieurs paquets DSI. Le pilote de panneau doit toujours initialiser TotalBufferSize
, PacketCount
et les trois premiers octets de chaque paquet. Le pilote de panneau peut remplacer le comportement par défaut en utilisant des valeurs autres que zéro pour TransmissionMode
, ReportMipiErrors
, ClearMipiErrors
, SecondaryPort
ManufacturingMode
et FinalCommandExtraPayload
. Toutes les valeurs non initialisées doivent être définies sur zéro.
Le système d’exploitation s’assure que la séquence de paquets DSI est bien formée, avec des informations valides dans tous les champs définis et des tailles de mémoire tampon correctes. Le système d’exploitation est chargé d’initialiser le FailedPacket
champ pour DXGK_DSI_INVALID_PACKET_INDEX de sorte qu’une validation supplémentaire dans le système d’exploitation ou le pilote doit uniquement définir le champ si un problème est détecté avec un paquet particulier. Si le DXGK_DSI_TRANSMISSION n’est pas correctement formé, le système d’exploitation définit l’indicateur de DXGK_HOST_DSI_INVALID_TRANSMISSION dans le champ pour le HostErrors
distinguer des autres erreurs de paramètres non valides.
Pour être considérés comme bien formés, les éléments suivants doivent tous être vrais :
- 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
- Seul le dernier paquet est autorisé à être lu
- Seul un paquet d’écriture long final peut avoir une
LongWriteWordCount
valeur supérieure à [DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE]
Validation des paquets
Bien que le système d’exploitation ne tente pas de valider entièrement le contenu de tous les paquets, il rejette une transmission contenant des commandes DSI autres que les commandes suivantes, en effectuant l’IOCTL sans appeler le pilote graphique :
Valeur du type de données | Description |
---|---|
0x03 | Écriture courte générique, aucun paramètre |
0x13 | Generic Short WRITE, 1 paramètre |
0x23 | Écriture courte générique, 2 paramètres |
0x04 | LECTURE générique, aucun paramètre |
0x14 | Read générique, paramètre 1 |
0x24 | LECTURE générique, 2 paramètres |
0x05 | DCS Short WRITE, aucun paramètre |
0x15 | DCS Short WRITE, 1 paramètre |
0x06 | DCS READ, aucun paramètre |
0x29 | Écriture longue générique |
0x39 | Écriture/write_LUT longues DCS |
Les commandes de lecture et d’écriture génériques nécessitent une compréhension de la spécification du panneau, de sorte que l’on s’attend à ce que ces commandes puissent être utilisées librement par le pilote de panneau sans causer de problèmes pour le pilote graphique tant que le bus n’est pas utilisé de manière excessive. De même, les commandes MCS DCS sont explicitement définies pour une utilisation par le fabricant. Il ne doit donc pas y avoir de problème d’interférence entre le pilote graphique et le pilote de panneau.
Pour DCS UCS, les commandes non définies ne sont pas censées être utilisées par le pilote graphique. Par conséquent, le système d’exploitation les autorisera à être utilisées par le pilote de panneau, bien qu’il existe clairement un risque que les futures modifications de spécification MIPI-DCS définissent la commande afin que les commandes MCS soient préférées.
Les commandes UCS DCS standardisées seront utilisées par le pilote graphique pendant un fonctionnement normal et sont potentiellement utilisables par le pilote de panneau, de sorte que le risque que les commandes envoyées par le pilote du panneau OEM provoquent des problèmes avec les commandes de pilotes graphiques suivantes doit être atténué. Pour ce faire, le système d’exploitation analyse les commandes DCS et rejette les paquets qui sont censés provoquer des conflits, sauf si le pilote du panneau OEM définit l’indicateur ManufacturingMode
et que le système d’exploitation confirme que le système est en mode de fabrication. Si l’indicateur est défini mais que le système n’est pas en mode fabrication, la transmission IOCTL est effectuée avec l’indicateur DXGK_HOST_DSI_INVALID_TRANSMISSION défini dans le HostErrors
champ sans appeler le pilote graphique.
Les conditions qui nécessiteraient une transaction entièrement définie au lieu d’utiliser une transmission seraient les suivantes :
- Les périodes d’inactivité chrono timed sont requises avant ou après, telles que DCS soft_reset
- Modification de l’environnement d’exploitation pour la sortie de trame, par exemple set_vsync_timing DCS et enter_sleep_mode
- Utilisation de transactions avec une sémantique de démarrage/continue où le pilote graphique peut également avoir besoin d’accéder aux mêmes données, comme DCS write_memory_start/write_memory_continue
En outre, il existe des classes de commandes DCS qui seront rejetées par le système d’exploitation lorsqu’elles sont envoyées en tant que transmission :
- Toute commande qui doit être entièrement définie, comme décrit ci-dessus
- Lectures de données de pixels qui peuvent être utilisées pour le raclage d’écran
- Écritures de données de pixels
Commandes UCS que le système d’exploitation transmettra au pilote graphique :
Hex | Commande |
---|---|
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 |
Commandes UCS que le système d’exploitation rejette :
Hex | Commande |
---|---|
01h | soft_reset (doit être envoyé via un 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 |
Implémentation du pilote graphique
Si la transmission réussit la validation du système d’exploitation, le système d’exploitation transmet la mémoire tampon au pilote graphique en appelant DxgkDsiTransmission DDI.
L’ajout de transmissions OEM dans une interface qui est déjà utilisée pour envoyer à la fois des données de pixels et de contrôle en fonction des demandes du système d’exploitation et des besoins du contrôle périphérique signifie inévitablement que le pilote graphique devra améliorer son séquencement interne pour garantir que ce flux supplémentaire de paquets peut être incorporé correctement. Le pilote graphique ne doit pas réorganiser les paquets au sein d’une transmission à partir du pilote de panneau OEM et doit envoyer l’ensemble de la séquence sans interruption et sans entrelacement d’autres paquets. Le pilote graphique n’étant pas tenu de maintenir l’ordre de ses propres paquets en ce qui concerne l’heure d’arrivée de la demande de transmission de panneau OEM, il peut donc choisir d’envoyer des paquets pour configurer la trame suivante avant (ou après) l’envoi d’une transmission de panneau OEM. Si la fin d’une transmission de panneau OEM démarrée risque de faire manquer aux paquets critiques leur fenêtre de temps, le pilote doit signaler l’annulation de la transmission. Si une transmission n’a pas démarré mais que le pilote s’attend à ce qu’elle provoque des paquets critiques manquer leur fenêtre de temps, le pilote doit différer le démarrage de la transmission jusqu’à la prochaine période d’videment. Si le report d’une transmission d’un panneau OEM l’oblige à attendre plus de deux images pour démarrer, le pilote doit signaler la transmission comme ayant été abandonnée.
Il n’est pas possible pour un pilote graphique de s’assurer que les transmissions qu’il envoie pour le compte du pilote de panneau ne sont pas en conflit avec les transmissions sur lesquelles il contrôle. Le pilote peut choisir d’inspecter les paquets au sein d’une transmission et de rejeter la transmission s’ils provoquent des problèmes, mais tous les paquets considérés comme non sécurisés doivent être marqués pour le rejet au niveau du système d’exploitation. Par conséquent, le rejet au niveau du pilote doit idéalement être dû à des préoccupations spécifiques du fournisseur de graphiques. Le pilote ne doit pas tenter de mettre en cache ou d’optimiser les lectures ou les écritures, même si les paquets semblent être des commandes standardisées.
Si le pilote graphique rejette une transmission en raison d’un problème avec un paquet, il doit mettre à jour le FailedPacket
champ avec l’index du premier paquet, ce qui entraîne le rejet de la transmission et définir l’indicateur HostErrors
DXGK_HOST_DSI_DRIVER_REJECTED_PACKET avant de retourner. Si une substitution de mode de transmission est fournie, le pilote doit vérifier que la substitution est compatible avec ses contraintes matérielles et, si ce n’est pas le cas, définir l’indicateur HostErrors
DXGK_HOST_DSI_BAD_TRANSMISSION_MODE avant de retourner.
Si une défaillance se produit pendant la communication, le pilote graphique doit mettre à jour le FailedPacket
champ avec l’index du paquet qui a échoué, mais il peut ne pas être possible dans tous les cas pour le pilote d’identifier le paquet afin que le pilote conserve la valeur par défaut, DXGK_DSI_INVALID_PACKET_INDEX pour de tels cas.
Le pilote graphique est responsable de la communication des paquets et doit donc s’assurer que les sommes case activée sont calculées et vérifiées. Toute transmission se terminant par une lecture, sera un paquet court, de sorte que les champs Data0 et Data1 contiennent tous les paramètres et la réponse peut être un paquet court ou long. Le pilote graphique ne sait peut-être pas quelle forme et combien de temps seront les données retournées, mais la taille maximale est la taille totale de la charge utile pour le paquet final, y compris le FinalPacketExtraPayload
. Le système d’exploitation valide que cette valeur n’est pas supérieure à la TargetMaximumReturnPacketSize
valeur signalée par le pilote dans ses fonctionnalités pour la cible, mais le pilote doit s’assurer à la fois que cette mémoire tampon n’est pas dépassée par un périphérique signalant plus de données et que les données du périphérique ne sont pas tronquées en raison d’une taille supérieure à la valeur MaximumReturnPacketSize actuellement appliquée au périphérique. Le pilote écrit le nombre d’octets lus dans la mémoire tampon dans le ReadWordCount
champ décrivant la transmission.
Il peut y avoir des cas où le pilote graphique est forcé de réinitialiser l’interface de communication au panneau ou le panneau entier en raison d’erreurs qui peuvent ne pas être liées au pilote de panneau OEM et peuvent ne pas être observables avec le pilote de panneau OEM. Pour ce faire, le pilote doit signaler DXGK_HOST_DSI_INTERFACE_RESET ou DXGK_HOST_DSI_DEVICE_RESET défini dans le champ lors de la HostErrors
première tentative de transmission après la réinitialisation afin que le pilote du panneau OEM puisse détecter la situation et se rétablir. Le pilote ne doit pas envoyer cette transmission au matériel, mais le pilote du panneau OEM peut simplement réessayer la même commande si aucune récupération n’est requise, auquel cas le pilote doit continuer à traiter la transmission comme d’habitude.
Fin d’une transmission
Lorsque le IOCTL termine la FailedPacket
charge utile , ReadWordCount
, HostErrors
MipiErrors
et d’un paquet de lecture (final) peut avoir été mis à jour en fonction du résultat. Si des erreurs ont été détectées lors du traitement de la transmission, le pilote de panneau OEM doit utiliser les MipiErrors
valeurs de sortie et HostErrors
pour déterminer comment récupérer et continuer.
Pour garantir que la sortie est retournée à l’appelant afin de fournir des détails sur les erreurs, les appels IOCTL et DDI doivent signaler un succès, même si des erreurs sont détectées. La réussite n’indique pas que la transaction a réussi, elle indique que les appels pour gérer la transaction se sont déroulés comme prévu et que les indicateurs d’erreur ont été définis, le cas échéant. Des échecs peuvent toujours être signalés pour des conditions telles qu’un appel DDI non pris en charge (probablement en raison d’une incompatibilité de pilote), des échecs d’allocation de mémoire ou la transmission de paramètres complètement incorrects, tels que le passage d’une mémoire tampon NULL. Si aucune erreur n’est signalée pour un appel réussi, l’appelant doit supposer que la transaction a réussi.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10, version 2004 |
En-tête | dispmprt.h |