Creación e inicialización de una transacción DMA
[Solo se aplica a KMDF]
Para que el controlador pueda enviar una solicitud de E/S a un dispositivo DMA, el controlador debe:
Llame a WdfDmaTransactionCreate para crear un objeto de transacción DMA para la solicitud.
Llame a WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize o WdfDmaTransactionInitializeUsingOffset para inicializar el objeto de transacción.
Normalmente, el controlador crea una transacción DMA porque un controlador de solicitudes ha recibido un objeto de solicitud de marco y debe pasar la solicitud al hardware. En este caso, el controlador debe llamar a WdfDmaTransactionInitializeUsingRequest, que acepta un identificador de objeto de solicitud como entrada y extrae los parámetros de dirección de la solicitud del objeto de solicitud.
Si el controlador debe crear una transacción DMA que no se base en un objeto de solicitud de marco que el controlador recibió, el controlador puede llamar a WdfDmaTransactionInitialize o WdfDmaTransactionInitializeUsingOffset. Ambos métodos aceptan parámetros de dirección que proporciona el controlador.
Los tres métodos de inicialización requieren la dirección de una función de devolución de llamada de evento EvtProgramDma como parámetro de entrada. Esta función de devolución de llamada programa el dispositivo y el marco llama a la función de devolución de llamada cada vez que hay disponible una transferencia DMA .
Cuando el controlador llama a WdfDmaEnablerCreate para crear un objeto de habilitador DMA, el controlador proporciona una estructura de WDF_DMA_ENABLER_CONFIG que contiene la longitud máxima de transferencia del dispositivo. El marco usa este valor como longitud máxima predeterminada para todas las transferencias de DMA.
Para algunos tipos de transacciones DMA, es posible que tenga que especificar una longitud máxima de transferencia diferente de la longitud máxima predeterminada del dispositivo. Puede usar WdfDmaTransactionSetMaximumLength para establecer una longitud máxima de transferencia para una transacción individual. El marco usa la longitud máxima de transferencia especificada solo mientras procesa la transacción especificada.
Tenga en cuenta que la longitud máxima de transferencia está limitada por el número de registros de mapa que el sistema operativo pone a disposición del objeto enabler de DMA. Para determinar la longitud máxima de transferencia disponible, el controlador puede llamar a WdfDmaEnablerGetFragmentLength. Si el valor que devuelve WdfDmaEnablerGetFragmentLength es menor que la longitud máxima de transferencia que el controlador proporcionó a WdfDmaEnablerCreate, el marco usa el valor más pequeño.
Después de que el controlador cree e inicialice una transacción DMA, el controlador debe iniciar la transacción.