Création et initialisation d’une transaction DMA

[S’applique à KMDF uniquement]

Avant que votre pilote puisse envoyer une demande d’E/S à un appareil DMA, le pilote doit :

  1. Appelez WdfDmaTransactionCreate pour créer un objet de transaction DMA pour la requête.

  2. Appelez WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize ou WdfDmaTransactionInitializeUsingOffset pour initialiser l’objet transaction.

En règle générale, votre pilote crée une transaction DMA , car un gestionnaire de requêtes a reçu un objet de demande d’infrastructure et doit passer la demande au matériel. Dans ce cas, le pilote doit appeler WdfDmaTransactionInitializeUsingRequest, qui accepte un handle d’objet de requête en tant qu’entrée et extrait les paramètres d’adresse de la requête de l’objet de requête.

Si votre pilote doit créer une transaction DMA qui n’est pas basée sur un objet de demande d’infrastructure reçu par le pilote, il peut appeler WdfDmaTransactionInitialize ou WdfDmaTransactionInitializeUsingOffset. Les deux méthodes acceptent les paramètres d’adresse que le pilote fournit.

Les trois méthodes d’initialisation nécessitent l’adresse d’une fonction de rappel d’événement EvtProgramDma en tant que paramètre d’entrée. Cette fonction de rappel programme l’appareil, et l’infrastructure appelle la fonction de rappel chaque fois qu’un transfert DMA est disponible.

Lorsque votre pilote appelle WdfDmaEnablerCreate pour créer un objet d’activation DMA, le pilote fournit une structure WDF_DMA_ENABLER_CONFIG qui contient la longueur de transfert maximale de l’appareil. L’infrastructure utilise cette valeur comme longueur maximale par défaut pour tous les transferts DMA.

Pour certains types de transactions DMA, vous devrez peut-être spécifier une longueur de transfert maximale différente de la longueur maximale par défaut de l’appareil. Vous pouvez utiliser WdfDmaTransactionSetMaximumLength pour définir une longueur de transfert maximale pour une transaction individuelle. L’infrastructure utilise la longueur maximale de transfert spécifiée uniquement pendant le traitement de la transaction spécifiée.

Notez que la longueur maximale de transfert est limitée par le nombre de registres de carte que le système d’exploitation met à la disposition de l’objet d’activation DMA. Pour déterminer la longueur maximale de transfert disponible, votre pilote peut appeler WdfDmaEnablerGetFragmentLength. Si la valeur retournée par WdfDmaEnablerGetFragmentLength est inférieure à la longueur de transfert maximale fournie par le pilote à WdfDmaEnablerCreate, l’infrastructure utilise la valeur la plus petite.

Une fois que votre pilote a créé et initialisé une transaction DMA, il doit démarrer la transaction.