DMA basado en paquetes en AVStream
El acceso directo a la memoria basada en paquetes (DMA) se produce cuando el minidriver lee datos directamente desde y escribe datos directamente para capturar búferes recibidos del modo de usuario. El controlador de ejemplo de hardware simulado de AVStream (AVSHwS) en los ejemplos del Kit de controladores de Windows (WDK) muestra cómo crear un minidriver AVStream que realiza este tipo de DMA.
Para implementar un esquema DMA basado en paquetes:
Especifique KSPIN_FLAG_GENERATE_MAPPINGS en el miembro Flags de las estructuras de KSPIN_DESCRIPTOR_EXpertinentes. Tenga en cuenta que un patrón de bus solo debe usar esta marca con compatibilidad de dispersión y recopilación.
Registre una rutina de servicio de interrupción (ISR) como se describe en Escritura de minidriveres AVStream para hardware.
A continuación, en avStrMiniDeviceStart , inicie el envío:
Configure un objeto de adaptador DMA mediante IoGetDmaAdapter.
Registre el objeto de adaptador DMA con AVStream llamando a KsDeviceRegisterAdapterObject.
El minidriver especifica el tamaño máximo de una única asignación de dispersión o recopilación proporcionando un parámetro MaxMappingByteCount en la llamada a KsDeviceRegisterAdapterObject.
Si alguna asignación de dispersión o recopilación supera este tamaño máximo, AVStream divide automáticamente la asignación en varias asignaciones de dispersión y recopilación, cada una de las cuales no es mayor que el tamaño especificado en MaxMappingByteCount.
También debe proporcionar una rutina de devolución de llamada avStrMiniPinProcess . El escritor de controladores debe elegir la funcionalidad adecuada para esta devolución de llamada. Por ejemplo, podría hacer lo siguiente:
Llame a KsPinGetLeadingEdgeStreamPointer.
Clone el borde inicial llamando a KsStreamPointerClone.
Programe hardware DMA basado en el clon.
Llame a KsStreamPointerAdvanceOffsets o KsStreamPointerAdvance para avanzar en el borde inicial.
Repita el paso 2 según sea necesario para fotogramas adicionales.
Cuando el hardware se interrumpe para la finalización de DMA, el kernel llama al ISR que el proveedor ha registrado anteriormente. En el ISR, el minidriver pone en cola una llamada de procedimiento diferida (DPC).
El DPC debe actualizar DataUsed y posiblemente otros miembros de la estructura de KSSTREAM_HEADER . A continuación, el DPC podría llamar a KsStreamPointerDelete para eliminar el clon y liberar el marco asociado.
Como alternativa, el DPC podría avanzar el puntero de clonación si solo se completa parte del marco. Para ello, llame a KsStreamPointerAdvanceOffsets.
Si es necesario para reanudar el procesamiento, llame a KsPinAttemptProcessing.
Nota
Si una asignación tiene menos de una página física de longitud, no se garantiza que resida en una sola página física.