DXGKDDI_DSITRANSMISSION función de devolución de llamada (dispmprt.h)
La función de devolución de llamada DxgkddiDsiTransmission realiza una transmisión de interfaz serie de visualización (DSI).
Sintaxis
DXGKDDI_DSITRANSMISSION DxgkddiDsitransmission;
NTSTATUS DxgkddiDsitransmission(
[in] HANDLE Context,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[out] PDXGK_DSI_TRANSMISSION pArgs
)
{...}
Parámetros
[in] Context
[in] TargetId
Identificador de destino del monitor.
[out] pArgs
Puntero a una estructura de DXGI_DSI_TRANSMISSION .
Valor devuelto
DxgkddiDsiTransmission devuelve STATUS_SUCCESS si se realiza correctamente; de lo contrario, devuelve uno de los códigos de error definidos en Ntstatus.h.
Comentarios
Para permitir que un controlador de panel OEM interactúe sobre la interfaz privada en caso contrario entre el adaptador de gráficos y el hardware del panel, las transacciones no deben tener ningún efecto de controlador gráfico, excepto el tiempo que ocupa el bus o deben definirse completamente para que el controlador de gráficos esté en control. Dado que el punto de permitir que un controlador del panel OEM interactúe es proporcionar compatibilidad con características de panel personalizadas que son opacas para el controlador de gráficos, las operaciones totalmente definidas están pensadas para restringirse a las transacciones en las que el controlador del panel necesita realizar una operación estandarizada que no se puede realizar sin la participación del controlador gráfico. Estas transacciones se tratarán como excepciones enrutadas explícitamente en lugar de como transmisiones.
Cada solicitud de transmisión DSI consta de un único búfer que se rellena por el controlador del panel OEM, pasa la pila del monitor y se devuelve con los resultados de la transmisión, si existe. El búfer contiene información general sobre la transmisión, con campos de entrada y salida, seguidos de una matriz de tamaño variable de DXGK_DSI_PACKET estructuras. Los paquetes se describen en términos de DSI, de modo que cualquier paquete DSI se pueda describir, sin embargo, el sistema operativo analizará los paquetes y rechazará cualquier transmisión que incluya paquetes que no se permitan. Todos los paquetes excepto el último son, por definición de DSI, los paquetes de escritura que pueden ser escrituras cortas, en cuyo caso el Payload
búfer no se usa o las escrituras largas que caben dentro del Payload
búfer. El último paquete de una transmisión, que puede ser de lectura o escritura, puede usar una carga extendida mediante la asignación y descripción de un búfer mayor que permitirá espacio para lecturas o escrituras de cualquier tamaño hasta el límite de datos de paquetes largos DSI de 64K-1 bytes de datos. Esto permite que las secuencias de paquetes de escritura pequeños se ponen en cola en el controlador en una sola llamada, pero requiere que los paquetes más grandes se envíen individualmente. El valor del FinalPacketExtraPayload
campo indica cuántos bytes adicionales se han asignado, pero también se debe tener en cuenta en el TotalBufferSize
campo .
El controlador del panel OEM es responsable de garantizar que las transmisiones que solicita no entren en conflicto o interfieran con otras transmisiones que el controlador gráfico utiliza para la interacción normal con el panel debido a solicitudes excesivas o operaciones de solicitud que provocarían retrasos en el procesamiento de otras transmisiones. El controlador del panel no debe cambiar ningún estado que cause errores posteriores en el controlador de gráficos, por ejemplo, cambiar el tiempo del panel a través de comandos MCS. Del mismo modo, si el sistema operativo ha solicitado un cambio de pantalla, a través del controlador de gráficos, por ejemplo, un aumento del brillo, el controlador del panel no debe usar comandos DSI para deshacer ese cambio, ya sea en respuesta o con otros fines.
El IOCTL_MIPI_DSI_TRANSMISSION se usa para solicitar una transmisión al periférico que contiene uno o varios paquetes DSI. El controlador del panel siempre debe inicializar TotalBufferSize
y PacketCount
los tres primeros BYTES de cada paquete. El controlador de panel puede invalidar el comportamiento predeterminado mediante valores distintos de cero para TransmissionMode
, ReportMipiErrors
, ClearMipiErrors
, SecondaryPort
ManufacturingMode
y FinalCommandExtraPayload
. Todos los valores sin inicializar deben establecerse en cero.
El sistema operativo garantizará que la secuencia de paquetes DSI esté bien formada, con información válida en todos los campos definidos y tamaños de búfer correctos. El sistema operativo es responsable de inicializar el FailedPacket
campo en DXGK_DSI_INVALID_PACKET_INDEX para que la validación adicional en el sistema operativo o el controlador solo necesite establecer el campo si se encuentra un problema con un paquete determinado. Si el DXGK_DSI_TRANSMISSION no tiene el formato correcto, el sistema operativo establecerá la marca DXGK_HOST_DSI_INVALID_TRANSMISSION en el HostErrors
campo para distinguirlo de otros errores de parámetros no válidos.
Para considerarse bien formado, todo lo siguiente debe ser true:
- 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
- Solo se permite que el último paquete sea una lectura.
- Solo un paquete de escritura larga final puede tener un
LongWriteWordCount
valor mayor que [DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE]
Validación de paquetes
Aunque el sistema operativo no intentará validar completamente el contenido de todos los paquetes, rechazará una transmisión que contenga comandos DSI distintos de los siguientes, completando el IOCTL sin llamar al controlador de gráficos:
Valor de tipo de datos | Descripción |
---|---|
0x03 | Escritura corta genérica, sin parámetros |
0x13 | Generic Short WRITE, 1 parámetro |
0x23 | Generic Short WRITE, 2 parámetros |
0x04 | LECTURA genérica, sin parámetros |
0x14 | Read genérico, 1 parámetro |
0x24 | Lectura genérica, 2 parámetros |
0x05 | DCS Short WRITE, sin parámetros |
0x15 | DCS Short WRITE, 1 parámetro |
0x06 | DCS READ, sin parámetros |
0x29 | Escritura larga genérica |
0x39 | Escritura y write_LUT largos de DCS |
Los comandos genéricos de lectura y escritura requieren comprender la especificación del panel, por lo que la expectativa es que el controlador del panel pueda usar libremente estos comandos sin causar problemas para el controlador de gráficos siempre y cuando el bus no se use excesivamente. Del mismo modo, los comandos DCS MCS se definen explícitamente para el uso del fabricante, por lo que no debe haber ningún problema con la interferencia entre el controlador gráfico y el controlador del panel.
En el caso de DCS UCS, no se espera que los comandos no definidos los use el controlador de gráficos, por lo que el sistema operativo les permitirá usarlos por el controlador del panel, aunque existe claramente un riesgo de que los cambios futuros en la especificación MIPI-DCS definan el comando, por lo que se prefieren los comandos MCS.
El controlador de gráficos usará los comandos DCS UCS estandarizados durante el funcionamiento normal y es posible que el controlador del panel pueda usarlos, por lo que es necesario mitigar el riesgo de comandos enviados por el controlador del panel OEM que provoca problemas con comandos de controladores gráficos posteriores. Para ello, el sistema operativo analizará los comandos dcS y rechazará los paquetes que se espera que causen conflictos a menos que el controlador del panel OEM establezca la ManufacturingMode
marca y el sistema operativo confirme que el sistema está en modo de fabricación. Si se establece la marca pero el sistema no está en modo de fabricación, el IOCTL de transmisión se completará con la marca DXGK_HOST_DSI_INVALID_TRANSMISSION establecida en el HostErrors
campo sin llamar al controlador de gráficos.
Las condiciones que requerirían una transacción totalmente definida en lugar de usar una transmisión serían las siguientes:
- Se requieren períodos de inactividad con tiempo de inactividad antes o después, como DCS soft_reset
- Cambio del entorno operativo para la salida de fotogramas, como dcs set_vsync_timing y enter_sleep_mode
- Uso de transacciones con semántica de inicio/continuación, donde el controlador de gráficos también puede necesitar acceder a los mismos datos, como DCS write_memory_start/write_memory_continue
Además, hay clases de comandos dcS que el sistema operativo rechazará cuando se envíe como transmisión:
- Cualquier comando que deba definirse por completo, como se ha descrito anteriormente.
- Lecturas de datos de píxeles que se podrían usar para la extracción de pantalla
- Escrituras de datos de píxeles
Comandos UCS que el sistema operativo pasará al controlador de gráficos:
Hex | Get-Help |
---|---|
00 h | 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 |
Comandos UCS que rechazará el sistema operativo:
Hex | Get-Help |
---|---|
01h | soft_reset (debe enviarse a través de 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 |
Implementación del controlador gráfico
Si la transmisión pasa la validación del sistema operativo, el sistema operativo pasa el búfer al controlador de gráficos llamando a DxgkDsiTransmission DDI.
Agregar transmisiones OEM a una interfaz que ya se está usando para enviar datos de píxeles y de control basados en las solicitudes del sistema operativo y las necesidades de control periférico, inevitablemente significa que el controlador de gráficos tendrá que mejorar su secuencia interna para garantizar que esta secuencia adicional de paquetes se pueda incorporar correctamente. El controlador gráfico no debe reordenar los paquetes dentro de una transmisión desde el controlador del panel OEM y debe enviar toda la secuencia sin interrupciones y sin intercalar otros paquetes. El controlador gráfico no es necesario para mantener el orden de sus propios paquetes con respecto a la hora de llegada de la solicitud de transmisión del panel OEM, por lo que puede optar por enviar paquetes para configurar el siguiente fotograma antes (o después) de enviar una transmisión del panel OEM. Si la finalización de una transmisión iniciada del panel OEM amenaza con provocar que los paquetes críticos pierdan su período de tiempo, el controlador debe notificar la transmisión como cancelada. Si no se ha iniciado una transmisión, pero el controlador espera que provoque que los paquetes críticos pierdan su período de tiempo, el controlador debe aplazar el inicio de la transmisión hasta el siguiente período de espacio en blanco. Si aplazara una transmisión del panel OEM provocaría que hubiera estado esperando que se iniciaran más de dos fotogramas, el controlador debe informar de la transmisión tal como se quitó.
No es posible que un controlador gráfico se asegure de que las transmisiones que envía en nombre del controlador del panel no entren en conflicto con las transmisiones sobre las que tiene control. El controlador puede optar por inspeccionar los paquetes dentro de una transmisión y rechazar la transmisión si causarían problemas, pero los paquetes que se consideran no seguros deben marcarse para el rechazo del nivel del sistema operativo, por lo que el rechazo del nivel de controlador debería deberse idealmente a problemas específicos del proveedor de gráficos. El controlador no debe intentar almacenar en caché ni optimizar las lecturas o escrituras, incluso si los paquetes parecen ser comandos estandarizados.
Si el controlador de gráficos rechaza una transmisión debido a un problema con un paquete, debe actualizar el FailedPacket
campo con el índice del primer paquete que hace que la transmisión se rechace y establezca la HostErrors
marca DXGK_HOST_DSI_DRIVER_REJECTED_PACKET antes de devolver. Si se proporciona una invalidación del modo de transmisión, el controlador debe comprobar que la invalidación es compatible con sus restricciones de hardware y, si no es así, establezca la HostErrors
marca DXGK_HOST_DSI_BAD_TRANSMISSION_MODE antes de devolverla.
Si se produce un error durante la comunicación, el controlador de gráficos debe actualizar el FailedPacket
campo con el índice del paquete que produjo un error, pero es posible que no sea posible en todos los casos para que el controlador identifique el paquete para que el controlador deba dejar el valor predeterminado, DXGK_DSI_INVALID_PACKET_INDEX para estos casos.
El controlador de gráficos es responsable de la comunicación de los paquetes, por lo que debe asegurarse de que las sumas de comprobación se calculan y comprueban. Cualquier transmisión que termine con una lectura será un paquete corto, por lo que los campos Data0 y Data1 contienen parámetros y la respuesta puede ser un paquete corto o largo. Es posible que el controlador de gráficos no sepa qué formulario y cuánto tiempo serán los datos devueltos, pero el tamaño máximo es el tamaño completo de la carga para el paquete final, incluido .FinalPacketExtraPayload
El sistema operativo validará que este valor no es mayor que el notificado por el TargetMaximumReturnPacketSize
controlador en sus funcionalidades para el destino, pero el controlador debe asegurarse de que este búfer no está saturado por un periférico que informa de más datos y que los datos del periférico no se truncan debido a que es mayor que maximumReturnPacketSize aplicado actualmente al periférico. El controlador escribe el número de bytes leídos en el búfer en el ReadWordCount
campo que describe la transmisión.
Puede haber casos en los que el controlador de gráficos se vea obligado a restablecer la interfaz de comunicaciones al panel o a todo el panel debido a errores que pueden no estar relacionados y puede que no sean observables para el controlador del panel OEM. Para solucionarlo, el controlador debe notificar DXGK_HOST_DSI_INTERFACE_RESET o DXGK_HOST_DSI_DEVICE_RESET establecer en el HostErrors
campo en el primer intento de transmisión después del restablecimiento para que el controlador del panel OEM pueda detectar la situación y recuperarse. El controlador no debe enviar esta transmisión al hardware, pero el controlador del panel OEM puede simplemente reintentar el mismo comando si no se requiere ninguna recuperación, en cuyo caso el controlador debe continuar con el procesamiento de la transmisión como de costumbre.
Finalización de una transmisión
Cuando el IOCTL completa la FailedPacket
carga , ReadWordCount
, MipiErrors
HostErrors
y para un paquete de lectura (final) se puede haber actualizado según el resultado. Si se encontraron errores durante el procesamiento de la transmisión, el controlador del panel OEM debe usar los MipiErrors
valores de salida y HostErrors
para determinar cómo recuperarse y continuar.
Para asegurarse de que la salida se devuelve al autor de la llamada para proporcionar detalles de los errores, las llamadas IOCTL y DDI deben notificar un éxito, incluso si se encuentran errores. Correcto no indica que la transacción se realizó correctamente, indica que las llamadas para controlar la transacción continuaron según lo previsto y se han establecido las marcas de error, si procede. Es posible que todavía se notifiquen errores en condiciones como una llamada DDI no admitida (probablemente debido a un error de coincidencia del controlador), errores de asignación de memoria o pasar parámetros completamente incorrectos, como pasar un búfer NULL. Si no se notifica ningún error para una llamada correcta, el autor de la llamada debe suponer que la transacción se realizó correctamente.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 10, versión 2004 |
Encabezado | dispmprt.h |