Objets de canal DMA

Notes

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 préjugés reconnaît comme exclusion. Le mot ou l’expression est utilisé dans cet article à des fins de cohérence, car il apparaît actuellement dans le logiciel. Lorsque le logiciel est mis à jour pour supprimer la langue, cet article est mis à jour pour être aligné.

Le pilote système PortCls implémente les interfaces IDmaChannel et IDmaChannelSlave au profit des pilotes miniport WaveCyclic et WavePci. IDmaChannel représente un canal DMA ainsi que les paramètres d’utilisation de la mémoire tampon et de la mémoire tampon DMA associés. En outre, les pilotes de miniport WaveCyclic 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 Adapter Objects and DMA.

Un objet IDmaChannel encapsule les éléments suivants :

  • Canal DMA pour un appareil master ou subordonné

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

  • Informations décrivant la façon dont 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 des canaux DMA. En règle générale, un pilote miniport alloue un ensemble de canaux DMA lors de l’initialisation ou 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 master ou subordonné :

  • Un appareil subordonné n’a pas de fonctionnalités matérielles 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 master 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 WaveCyclic 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 master n’est guère plus qu’un backboard pour le partage d’informations sur le canal DMA entre le port et les pilotes miniport. Pour plus d’informations sur les appareils master et subordonnés, consultez Présentation des objets adaptateurs.

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

  • Objet adaptateur

  • Mémoire tampon commune 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’objet adaptateur est une structure d’adaptateur DMA pour un objet de périphérique 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

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::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 master canaux DMA.

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 à l’appareil 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 lors de l’initialisation du pilote miniport lorsque la mémoire contiguë physiquement est la plus abondante. IDmaChannel::AllocationBufferSize 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 multiple pair de la taille de la page. Il peut être inférieur à 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 de IDmaChannel::BufferSize pour déterminer la taille de transfert pour les 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 WaveCyclic appelle ces méthodes pour copier des données audio entre la mémoire tampon d’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 sont remises au pilote miniport (ou récupérées à partir de) sous la forme d’une liste de mappages de nuages de points/regroupements. Toutefois, le pilote miniport peut toujours utiliser la mémoire tampon DMA comme espace mémoire partagé pour communiquer avec le pilote de l’adaptateur.

Les pilotes de port fournissent aux pilotes miniport 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 stream du pilote miniport expose une interface IDmaChannel et implémente les méthodes de canal DMA proprement dites.

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

IDmaChannel::AllocateBuffer

IDmaChannel::AllocationBufferSize

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