Prise en charge System-Mode DMA
[S’applique uniquement à KMDF]
La DMA en mode système, contrairement à la DMA master bus, décrit une configuration dans laquelle plusieurs appareils partagent un seul contrôleur DMA multicanal.
À compter de Kernel-Mode Driver Framework (KMDF) version 1.11, l’infrastructure prend en charge le mode système DMA sur les systèmes basés sur le système sur une puce (SoC) s’exécutant sur Windows 8 ou versions ultérieures du système d’exploitation Windows.
Cette rubrique décrit le code qu’un pilote KMDF doit fournir dans ses fonctions de rappel d’événements, ainsi que les fonctions de rappel d’événements facultatives qu’il peut inscrire, pour gérer les demandes d’E/S pour un appareil DMA en mode système.
Pour plus d’informations sur KMDF et DMA master bus, consultez Gestion des demandes d’E/S dans un pilote KMDF pour un appareil DMA Bus-Master.
L’illustration suivante montre les fonctions de rappel d’événements que votre pilote utilise pour prendre en charge LDMA en mode système :
Création d’un enabler DMA System-Mode
La création d’un profil DMA en mode système est un processus en deux étapes. Les étapes suivantes représentent un scénario classique :
En règle générale, dans sa fonction de rappel EvtDriverDeviceAdd , le pilote appelle WDF_DMA_ENABLER_CONFIG_INIT, en définissant le paramètre Profile sur SystemMode ou SystemModeDuplex. Le pilote appelle ensuite WdfDmaEnablerCreate, en passant la structure WDF_DMA_ENABLER_CONFIG qu’il vient de recevoir.
Le pilote peut également créer l’activation pendant EvtDevicePrepareHardware.
La fonction de rappel EvtDevicePrepareHardware de votre pilote associe l’enabler DMA à ses ressources DMA en appelant la méthode WdfDmaEnablerConfigureSystemProfile . Pour un enabler duplex, le pilote appelle WdfDmaEnablerConfigureSystemProfile deux fois, une fois pour configurer chaque sens de transfert.
Le pilote peut appeler WdfDmaEnablerConfigureSystemProfile une fois EvtDevicePrepareHardware terminé, mais le pilote doit appeler cette méthode avant d’initialiser les transactions DMA.
Fourniture de fonctions de rappel facultatives
En règle générale, les pilotes KMDF ne configurent pas les canaux DMA. Toutefois, dans certaines circonstances, les pilotes peuvent avoir besoin d’effectuer une configuration spécifique au canal. Par exemple, un pilote peut appeler une fonction personnalisée implémentée par le contrôleur DMA en procédant comme suit :
- Dans l’un des gestionnaires de requêtes du pilote, le pilote appelle WdfDmaTransactionSetChannelConfigurationCallback pour inscrire une fonction de rappel EvtDmaTransactionConfigureDmaChannel .
- La fonction de rappel EvtDmaTransactionConfigureDmaChannel de votre pilote appelle WdfDmaEnablerWdmGetDmaAdapter pour récupérer un pointeur vers le DMA_ADAPTER WDM. Cette structure est l’objet d’adaptateur qui représente le canal DMA en mode système du pilote.
- Le pilote peut ensuite appeler ConfigureAdapterChannel pour activer les fonctions personnalisées implémentées par le contrôleur DMA. Cette routine peut être appelée uniquement par le pointeur à partir de l’adresse retournée dans une structure de DMA_OPERATIONS .
- La fonction de rappel EvtDmaTransactionConfigureDmaChannel de votre pilote retourne TRUE si elle configure correctement le canal DMA.
- Le framework appelle la fonction de rappel EvtProgramDma du pilote.
Réception d’une notification d’achèvement du transfert
Contrairement aux appareils qui utilisent des contrôleurs de gestion de bus, le matériel d’un appareil DMA en mode système peut ne pas signaler l’achèvement du transfert DMA en émettant une interruption.
Si votre appareil ne déclenche pas d’interruption pour signaler l’achèvement du transfert DMA, votre pilote peut fournir une fonction de rappel d’événement EvtDmaTransactionDmaTransferComplete que l’infrastructure appelle lorsqu’un transfert DMA en mode système est terminé.
Pour inscrire cette fonction de rappel, un pilote appelle WdfDmaTransactionSetTransferCompleteCallback à partir de l’un de ses gestionnaires de requêtes.