Desarrollo de un controlador simple de visualización para un adaptador de gráficos: Un ejemplo práctico …

publicado en: tutoriales | 0

Con la aparición de nuevos dispositivos cada día, el equipo de desarrollo de pilotos de Apriorit siempre tiene una agenda muy apretada. A veces, las soluciones predeterminadas no cumplen los requisitos de un proyecto, por lo que nuestros desarrolladores tienen que reconsiderar significativamente las soluciones existentes o incluso crear las suyas propias desde cero.

En este post, describimos cómo desarrollar un simple controlador de sólo visualización para dispositivos de visualización estándar basado en el ejemplo de Microsoft.

Recientemente, se le pidió a Apriorit que implementara un controlador sólo para la pantalla con la capacidad de habilitar o deshabilitar los cambios en la resolución de la pantalla.

En este artículo, hablamos de cómo crear un simple controlador de sólo visualización y establecer su interacción con el modo de usuario. También explicamos qué problemas puede enfrentar al construir dicho controlador y cómo superarlos.

Desarrollando un simple controlador de sólo pantalla

Un controlador de sólo pantalla es un nuevo tipo de controlador de gráficos que apunta a escenarios específicos. Los controladores sólo de pantalla son compatibles únicamente como controladores del Modelo de controlador de pantalla de Windows (WDDM) 1.2 y permiten a los proveedores de hardware independientes escribir un controlador de modo de núcleo basado en WDDM capaz de controlar dispositivos estándar sólo de pantalla como monitores y tabletas. Los dispositivos de sólo visualización no están permitidos como dispositivo gráfico principal en los sistemas cliente, pero son opcionales para los clientes que se ejecutan en un entorno virtual. Por ejemplo, en nuestro proyecto, usamos uno para ejecutar una pantalla virtual, pero también se pueden usar para configurar otros ajustes de pantalla.

Tengan en cuenta que el sistema operativo maneja la representación 2D o 3D usando una GPU simulada por software. Puedes encontrar más información sobre esto en la Red de Desarrolladores de Microsoft (MSDN). En este artículo, consideramos sólo algunos de los puntos más importantes a los que debes prestar atención cuando crees un controlador de sólo visualización personalizado.

Basamos nuestro controlador de sólo visualización en el ejemplo de Microsoft. Desarrollamos un controlador simple con varias llamadas personalizadas, y en particular con la posibilidad de activar/desactivar el cambio de la resolución de la pantalla.

Retrollamadas principales

El conductor comienza su trabajo llenando la estructura KMDDOD_INITIALIZATION_DATA y llamando a la función DxgkInitializeDisplayOnlyDriver para la inicialización. Si esta función devuelve STATUS_SUCCESS, entonces se llama a la llamada DxgkDdiStartDevice.

En esta llamada, llamamos a la función DxgkCbAcquirePostDisplayOwnership para obtener información sobre la configuración actual de la pantalla (DXGK_DISPLAY_INFORMATION) del dispositivo POST actual. En la mayoría de los casos, el dispositivo POST es el principal adaptador de gráficos. La estructura DXGK_DISPLAY_INFORMATION contiene toda la información que necesitamos para trabajar con el adaptador de gráficos.

Junto con la devolución de llamada del DxgkDdiStartDevice, también deberíamos implementar la devolución de llamada del DxgkDdiStopDevice y del PostDisplayOwnership. En esta devolución de llamada, devolvemos la estructura DXGK_DISPLAY_INFORMATION (que está almacenada en el controlador) al sistema.

Cuando se quiere, digamos, soportar varias pantallas, hay que trabajar con múltiples fuentes y objetivos. En este caso, cuando implemente todas las demás llamadas, necesita especificar el VidPnSourceId y VidPnTargetId . Puedes aprender más sobre las fuentes y los objetivos en MSDN.

Otra llamada que debemos mencionar es DxgkDdiPresentDisplayOnly. Esta devolución de llamada extrae el buffer enviado por el sistema. Aquí hay que prestar especial atención a los posibles problemas que puedan surgir al dibujar el búfer (el VidPnSourceId incorrecto, parámetros incorrectos, etc.).

Para una descripción más detallada de estas funciones, vea nuestro controlador de sólo pantalla en GitHub.

Servicios relacionados:

Desarrollo del núcleo y del controlador

Interactuando con el adaptador de gráficos

Interactuar con el adaptador de gráficos es una de las principales tareas del controlador. Por ejemplo, cuando se cambia la resolución en el sistema, es necesario notificar al adaptador para que la imagen se muestre correctamente en el monitor. Cada adaptador puede tener su propia interfaz, pero también hay una interfaz universal. En nuestro ejemplo, usamos una interfaz universal, la ROM BIOS.

Puede encontrar más detalles sobre la comunicación con la ROM BIOS en el repositorio del proyecto en GitHub.

Cómo instalar un controlador sólo para pantalla

Hay al menos tres maneras de instalar nuestro controlador de sólo pantalla:

  1. Manualmente
  2. Usando la utilidad PnPUtil
  3. Usando la utilidad de la Consola de Dispositivos (DevCon)

En este artículo, consideraremos la opción de instalar el controlador manualmente a través del Administrador de dispositivos. Pero antes de instalarlo, debemos asegurarnos de que el controlador es compatible con los dispositivos que debemos soportar. Para ello, debemos especificar los dispositivos con los que puede funcionar en el archivo .inf:

                ;; Permitir que el controlador se cargue en VGA y XGA expuesto por el bus PCI; "Simple Display Only Driver" = SDDriverInstall, PCICC_0300 "Simple Display Only Driver" = SDDriverInstall, PCICC_0301

Intentemos instalar el controlador:

  • Sustituya el controlador actual del adaptador de pantalla en el Administrador de dispositivos.
  • Selecciona Examinar mi ordenador en busca de software de controladores, navega hasta el archivo SimpleDisplayOnlyDriver.inf y ábrelo.

  • Reinicie el PC.
  • El conductor debería trabajar después del reinicio. Si el controlador se instala con éxito, se puede encontrar en el Administrador de dispositivos.

Cómo desinstalar un controlador

Si necesita desinstalar un controlador, también puede hacerlo a través del Administrador de dispositivos seleccionando Eliminar el software del controlador de este dispositivo.

Lee también:

Cómo desarrollar un controlador de Windows usando un dispositivo virtual QEMU

Interacción entre el modo de usuario y el conductor de sólo pantalla

En las siguientes secciones, discutimos los detalles de nuestro controlador sólo de pantalla y consejos importantes de implementación.

Una de nuestras tareas era permitir que el usuario activara o desactivara el cambio de resolución de la pantalla. Para realizar esta tarea, necesitábamos hacer saber al conductor la decisión del usuario. Para ello, enviamos una bandera del modo de usuario al conductor. Esta bandera puede ser un 0 o un 1.

La comunicación entre el modo de usuario y el conductor puede realizarse a través de la función DxgkDdiEscape. Todo lo que necesitamos hacer en el modo de usuario es rellenar la estructura D3DKMT_ESCAPE y llamar a la función D3DKMTEscape, pasándole la estructura rellenada. En el controlador, debemos implementar el DxgkDdiEscapecallback y analizar los parámetros pasados desde el modo de usuario para la toma de decisiones.

Puedes encontrar más detalles sobre la interacción entre el modo de usuario y el controlador en el código fuente del programa.

Veamos cómo se ve:

  • Ejecutar ResolutionManipulation.exe con el parámetro 0 desactiva la capacidad de cambiar la resolución de la pantalla. Así que si intentamos cambiar la resolución de la pantalla, por ejemplo de 1152×864 a 800×600, el cambio no se aplicará.

  • Ejecutar ResolutionManipulation.exe con el parámetro 1 permite cambiar la resolución de la pantalla. Ahora si intentamos cambiar la resolución de la pantalla de 1152×864 a 800×600 una vez más, se aplicará el cambio.

Así que ahí está: Te hemos mostrado cómo crear un simple controlador de sólo pantalla y administrarlo desde el modo de usuario. Como nuestro controlador respondió a la información recibida del usuario, podemos decir que la tarea se completó con éxito.

Ahora veamos algunos de los problemas y limitaciones a los que te puedes enfrentar cuando trabajas con un controlador de vídeo de sólo pantalla.

Lee también:

Fundamentos de la prueba de controladores de Windows: Herramientas, características y ejemplos

Problemas y limitaciones de un conductor de sólo pantalla

Las tres limitaciones más comunes relacionadas con los conductores de sólo pantalla son:

  • Limitaciones relacionadas con la función del BIOS
  • Problemas con el soporte de los dispositivos para niños
  • La aparición de artefactos en la pantalla

Echemos un vistazo a cada uno de estos problemas y sus posibles soluciones.

Limitaciones de las funciones del BIOS

Desafortunadamente, las funciones de la BIOS no funcionan en todos los casos. Sin usar las funciones de la BIOS, no podemos averiguar las capacidades de un adaptador gráfico. Otro enfoque es estudiar la documentación y el uso de una interfaz de adaptador específica. Pero en nuestro ejemplo, sólo podemos trabajar con la misma resolución que recibimos llamando a la función DxgkCbAcquirePostDisplayOwnership.

Además, hay que tener en cuenta que el uso de características no documentadas puede tener malas consecuencias para los nuevos sistemas. Es mejor no usarlas.

Soporte de dispositivos para niños

Algunos adaptadores son compuestos, lo que significa que consisten en varios dispositivos. Las cámaras web y algunas tabletas son ejemplos de tales dispositivos.

Para tal arquitectura, es necesario implementar una lógica adicional. Puedes encontrar información adicional sobre esto en MSDN.

Artefactos en la pantalla

Puede haber una situación en la que los artefactos aparecen en la pantalla o el conductor se estrella. Podemos enfrentarnos a estos problemas, por ejemplo, cuando cambiamos la resolución o la orientación de la pantalla, o después de la hibernación.

Normalmente, esto ocurre porque se asignó un búfer incorrecto.

Presta atención a la variable Pitch . Para entender por qué la variable Pitch es tan importante, debes entender cómo funciona la función PresentDisplayOnly.

La función PresentDisplayOnly toma el buffer dibujado línea por línea. Por lo tanto, si la variable Pitch es incorrecta, el número de bytes copiados en el buffer también será incorrecto.

En caso de hibernación, no olvides llamar a la función DxgkcbAcquirePostDisplayOwnership para obtener nuevos ajustes después de despertar.

Conclusión

El desarrollo de un conductor desde cero es una tarea difícil: hay que tener en cuenta una amplia gama de factores y, a menudo, hacer frente a problemas inesperados. En este artículo, te mostramos cómo construir un controlador básico de sólo pantalla para un adaptador de gráficos y cómo ampliar su funcionalidad. También esbozamos algunos de los problemas más comunes a los que te puedes enfrentar cuando trabajas en un controlador de este tipo y te dimos algunos consejos sobre cómo resolverlos. Esperamos que nuestros consejos te sean útiles y te ayuden a afrontar mejor tu proyecto de desarrollo de controladores.

Apriorit tiene un equipo de desarrolladores de drivers experimentados que pueden crear software para su proyecto. Sólo contáctenos y háganos saber cómo podemos ayudarle.

Referencias

  1. https://github.com/apriorit/simple-display-only-driver
  2. http://www.monstersoft.com/tutorial1//VESA_intro.html
  3. https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/d3dkmddi/
  4. https://github.com/Microsoft/Windows-driver-samples/tree/master/video/KMDOD
  5. https://www.geoffchappell.com/studies/windows/km/hal/api/x86bios/index.htm?tx=8
  6. https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/pnputil-command-syntax

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *