DMA basée sur les paquets dans AVStream
L’accès direct à la mémoire basée sur les paquets (DMA) se produit lorsque votre minidriver lit les données directement à partir de et écrit des données directement pour capturer les mémoires tampons reçues du mode utilisateur. L’exemple de pilote de matériel simulé AVStream (AVSHwS) dans les exemples WDK (Windows Driver Kit) montre comment créer un minidriver AVStream qui exécute ce type de DMA.
Pour implémenter un schéma DMA basé sur des paquets :
Spécifiez KSPIN_FLAG_GENERATE_MAPPINGS dans le membre Indicateurs des structures KSPIN_DESCRIPTOR_EX pertinentes. Notez que cet indicateur ne doit être utilisé que par un master de bus avec prise en charge des points/regroupements.
Inscrivez une routine de service d’interruption (ISR) comme décrit dans Écriture de minidrivers AVStream pour le matériel.
Ensuite, dans AVStrMiniDeviceStart, commencez à distribuer :
Configurez un objet d’adaptateur DMA à l’aide de IoGetDmaAdapter.
Inscrivez l’objet adaptateur DMA auprès d’AVStream en appelant KsDeviceRegisterAdapterObject.
Le minidriver spécifie la taille maximale d’un mappage de nuages de points/regroupements en fournissant un paramètre MaxMappingByteCount dans l’appel à KsDeviceRegisterAdapterObject.
Si un mappage de nuages de points/regroupements dépasse cette taille maximale, AVStream divise automatiquement le mappage en plusieurs mappages de nuages de points/regroupements, chacun n’étant pas supérieur à la taille spécifiée dans MaxMappingByteCount.
Vous devez également fournir une routine de rappel AVStrMiniPinProcess . L’enregistreur de pilotes doit choisir les fonctionnalités appropriées pour ce rappel. Par exemple, vous pouvez effectuer les opérations suivantes :
Appelez KsPinGetLeadingEdgeStreamPointer.
Clonez la pointe en appelant KsStreamPointerClone.
Programmez le matériel DMA en fonction du clone.
Appelez KsStreamPointerAdvanceOffsets ou KsStreamPointerAdvance pour avancer la pointe d’avance.
Répétez l’étape 2 en fonction des besoins pour les images supplémentaires.
Lorsque le matériel s’interrompt pour l’achèvement DMA, le noyau appelle l’ISR que le fournisseur a précédemment inscrit. Dans l’ISR, le minidriver met en file d’attente un appel de procédure différée (DPC).
Votre DPC doit mettre à jour DataUsed et éventuellement d’autres membres de la structure KSSTREAM_HEADER . Le DPC peut ensuite appeler KsStreamPointerDelete pour supprimer le clone et libérer le frame associé.
Sinon, le DPC peut avancer le pointeur de clone si seule une partie du frame est terminée. Pour ce faire, appelez KsStreamPointerAdvanceOffsets.
Si nécessaire pour reprendre le traitement, appelez KsPinAttemptProcessing.
Notes
Si un mappage a une longueur inférieure à une page physique, il n’est pas garanti qu’il réside sur une seule page physique.