Objets de canal DMA

Remarque

Microsoft prend en charge un environnement diversifié et inclusif. Cet article contient des références à la terminologie que le guide de style Microsoft pour la communication sans biais reconnaît comme exclusionnaire. Le mot ou l’expression est utilisé dans cet article pour la cohérence, car il apparaît actuellement dans le logiciel. Lorsque le logiciel est mis à jour pour supprimer la langue, cet article sera mis à jour pour être aligné.

Le pilote système PortCls implémente les interfaces IDmaChannel et IDmaChannelSlave pour bénéficier des pilotes miniport WaveCyclique et WavePci. IDmaChannel représente un canal DMA ainsi que ses paramètres d’utilisation de mémoire tampon et de mémoire tampon associés. En outre, les pilotes miniport WaveCyclique utilisent IDmaChannelSlave pour gérer un canal DMA pour un appareil subordonné. IDmaChannelSlave hérite d’IDmaChannel. Pour plus d’informations sur le contrôle des opérations DMA, consultez Objets adaptateur et DMA.

Un objet IDmaChannel encapsule les éléments suivants :

  • Canal DMA pour un appareil maître ou subordonné

  • Mémoire tampon de données associée au canal

  • Informations qui décrivent comment le canal doit être utilisé

Les pilotes de port et de miniport utilisent des objets de canal DMA pour communiquer des informations sur l’utilisation du canal DMA. En règle générale, un pilote miniport alloue un ensemble de canaux DMA lors de l’initialisation ou lors de la création d’un flux. Lors de la création d’un flux, le pilote miniport indique au pilote de port quel objet de canal DMA sera utilisé pour le flux.

Un objet de canal DMA peut être créé pour un appareil maître ou subordonné :

  • Un appareil subordonné n’a pas de fonctionnalités DMA intégrées et doit s’appuyer sur le contrôleur DMA système pour effectuer les transferts de données requis par l’appareil.

  • Un appareil maître utilise son propre matériel DMA de gestion des bus pour effectuer des transferts de données sur le bus système.

Pour obtenir un exemple d’appareil WaveCyclique qui utilise un objet de canal DMA subordonné, consultez l’exemple de pilote audio Sb16 dans les versions antérieures du Kit de pilotes Microsoft Windows (WDK). Un objet de canal DMA maître est un peu plus qu’un backboard pour partager des informations sur le canal DMA entre le port et les pilotes miniport. Pour plus d’informations sur les appareils maîtres et subordonnés, consultez Présentation des objets adaptateurs.

L’objet de canal DMA pour un appareil maître ou subordonné expose les éléments suivants :

  • Un objet adaptateur.

  • Mémoire tampon commune unique que le pilote et le matériel DMA peuvent partager

  • Valeur de taille de mémoire tampon qui peut être interrogée et modifiée

L’objetadaptateur est une structure d’adaptateur DMA pour un objet d’appareil physique (PDO). L’objet adaptateur est créé automatiquement lorsque le pilote miniport crée l’objet de canal DMA en appelant l’une des méthodes suivantes :

IPortWavePci ::NewMasterDmaChannel

IPortWaveCyclique ::NewMasterDmaChannel

IPortWaveCyclique ::NewSlaveDmaChannel

La méthode IDmaChannel ::GetAdapterObject peut être utilisée pour obtenir un pointeur vers l’objet adaptateur.

Un pilote d’adaptateur peut également appeler la fonction PcNewDmaChannel pour créer un objet de canal DMA, mais cette fonction est plus difficile à utiliser que les appels IPortWaveXxx ::NewXxxDmaChannel, car l’appelant doit spécifier explicitement un objet d’appareil et d’autres informations contextuelles.

Dans le cas d’un canal DMA pour un appareil subordonné, la méthode IDmaChannel ::TransferCount retourne la taille de transfert maximale (paramètre MapSize) spécifiée dans l’appel à IDmaChannelSlave ::Start. En outre, l’objet adaptateur fournit certaines méthodes pour manipuler et interroger l’appareil DMA. Aucune de ces méthodes n’est significative pour les canaux DMA maîtres.

IDmaChannel ::AllocateBuffer et IDmaChannel ::FreeBuffer sont utilisés pour gérer la mémoire tampon commune unique associée à l’objet de canal DMA. La mémoire tampon allouée par l’objet est garantie d’être accessible à la fois au pilote (avec des adresses de mémoire virtuelle du noyau) et à un périphérique DMA (avec des adresses de mémoire physique). En outre, la mémoire tampon sera physiquement contiguë. En règle générale, la meilleure stratégie consiste à allouer la mémoire tampon DMA pendant l’initialisation de miniport-driver lorsque la mémoire contiguë physiquement est la plus abondante. IDmaChannel ::AllocateBufferSize retourne la taille de la mémoire tampon telle qu’elle a été spécifiée dans l’appel à IDmaChannel ::AllocateBuffer.

IDmaChannel ::MaximumBufferSize indique la taille de mémoire tampon maximale réelle qui peut être utilisée. Cela peut dépasser la taille allouée si la taille allouée n’est pas un même multiple de la taille de page. Elle peut être inférieure à la taille allouée si l’appareil DMA ne peut pas prendre en charge les transferts de la taille allouée. IDmaChannel ::BufferSize et IDmaChannel ::SetBufferSize sont utilisés pour interroger et définir la taille de la mémoire tampon à utiliser pour les transferts DMA. Lorsque la mémoire tampon est allouée, la taille de la mémoire tampon est définie sur la taille maximale de la mémoire tampon. Après l’initialisation, le pilote de port et le pilote miniport ont la possibilité de modifier la taille de la mémoire tampon ou de découvrir sa valeur actuelle. Le pilote miniport utilise le résultat d’IDmaChannel  ::BufferSize pour déterminer la taille de transfert des opérations DMA lorsque le canal DMA est démarré. IDmaChannel ::SystemAddress et IDmaChannel ::P hysicalAddress sont utilisés pour obtenir les adresses virtuelles et physiques de la mémoire tampon, respectivement.

IDmaChannel ::CopyTo et IDmaChannel ::CopyFrom copient des exemples de données vers et à partir de la mémoire tampon DMA. Le pilote de port WaveCyclique appelle ces méthodes pour copier des données audio entre la mémoire tampon de l’application et la mémoire tampon cyclique du pilote miniport.

La mémoire tampon DMA n’est pas nécessairement utilisée pour transférer les données diffusées en continu. Dans le cas du pilote de port WavePci, les données diffusées en continu sont remises au pilote miniport (ou récupérés à partir de) sous la forme d’une liste de mappages de nuages de points/collectes. Toutefois, le pilote miniport peut toujours utiliser la mémoire tampon DMA comme espace mémoire partagée pour communiquer avec le pilote de l’adaptateur.

Les pilotes de port fournissent des pilotes miniport avec des fonctions qu’ils peuvent utiliser pour créer des canaux DMA. Sauf indication contraire dans la description du pilote de port, il n’est pas absolument nécessaire d’utiliser des objets DMA alloués à partir du pilote de port. Le pilote de port nécessite simplement un pointeur vers une interface IDmaChannel qui prend en charge les méthodes dont il a besoin. Consultez la documentation de chaque pilote de port pour obtenir la liste des méthodes de canal DMA requises par le pilote de port.

En règle générale, l’approche la plus simple consiste à utiliser les fonctions d’allocation de canal DMA que le pilote de port implémente. Dans de rares cas, les développeurs de pilotes miniports peuvent avoir besoin d’implémenter leurs propres objets de canal DMA pour répondre aux exigences particulières de leurs adaptateurs particuliers. Cela nécessite parfois l’implémentation d’un nouvel objet. À d’autres moments, il suffit que l’objet de flux du pilote miniport expose une interface IDmaChannel et implémente les méthodes de canal DMA elle-même.

L’interface IDmaChannel prend en charge les méthodes suivantes :

IDmaChannel ::AllocateBuffer

IDmaChannel ::AllocatedBufferSize

IDmaChannel ::BufferSize

IDmaChannel ::CopyFrom

IDmaChannel ::CopyTo

IDmaChannel ::FreeBuffer

IDmaChannel ::GetAdapterObject

IDmaChannel ::MaximumBufferSize

IDmaChannel ::P hysicalAddress

IDmaChannel ::SetBufferSize

IDmaChannel ::SystemAddress

IDmaChannel ::TransferCount

L’interface IDmaChannelSlave étend IDmaChannel en ajoutant les méthodes suivantes :

IDmaChannelSlave ::ReadCounter

IDmaChannelSlave ::Start

IDmaChannelSlave ::Stop

IDmaChannelSlave ::WaitForTC