Partager via


Transactions de transmission système DMA SerCx2

Certains pilotes de contrôleur série implémentent la prise en charge des transactions de transmission qui utilisent le contrôleur DMA système. Cette prise en charge est facultative, mais peut améliorer les performances en soulageant la main processeur de la nécessité d’utiliser des E/S programmées (PIO) pour les transferts de données longs. SerCx2 effectue une transaction de transmission système-DMA en configurant le contrôleur DMA système et en lançant les transferts DMA nécessaires pour le compte du pilote de contrôleur série.

Lorsque le pilote du contrôleur série crée un objet de transmission system-DMA, le pilote fournit les paramètres que SerCx2 utilisera pour configurer l’adaptateur DMA système pour les transactions de transmission système DMA.

Avant le début de la transaction, le pilote du contrôleur série a la possibilité d’effectuer toute configuration spéciale du matériel de contrôleur série ou de l’adaptateur DMA qui peut être nécessaire pour la transaction. Une fois la transaction terminée, le pilote a la possibilité de vider le fichier FIFO de transmission et, si nécessaire, de propre l’état matériel du contrôleur série.

Création de l’objet system-DMA-transmit

Avant que SerCx2 puisse appeler les fonctions EvtSerCx2SystemDmaTransmitXxx**, le pilote doit appeler la méthode SerCx2SystemDmaTransmitCreate pour inscrire ces fonctions auprès de SerCx2. Cette méthode accepte, en tant que paramètre d’entrée, un pointeur vers une structure SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG qui contient des pointeurs vers les fonctions EvtSerCx2SystemDmaTransmitXxx** du pilote.

En option, le pilote peut implémenter l’une ou l’ensemble des fonctions suivantes :

En option, le pilote peut implémenter les fonctions suivantes :

Un pilote qui implémente l’une des fonctions de la liste précédente doit implémenter les trois.

La méthode SerCx2SystemDmaTransmitCreate crée un objet de transmission system-DMA et fournit au pilote appelant un handle SERCX2SYSTEMDMATRANSMIT à cet objet. Les fonctions EvtSerCx2SystemDmaTransmitXxx** du pilote prennent toutes ce handle comme premier paramètre. Les méthodes SerCx2 suivantes prennent ce handle comme premier paramètre :

Initialisation matérielle et propre-up

Certains pilotes de contrôleur série peuvent avoir besoin d’initialiser le matériel du contrôleur série au début d’une transaction de transmission du système DMA ou de propre l’état matériel du contrôleur série à la fin de la transaction.

Si un pilote implémente une fonction de rappel d’événement EvtSerCx2SystemDmaTransmitInitializeTransaction , SerCx2 appelle cette fonction pour initialiser le contrôleur série avant de démarrer le premier transfert DMA dans la transaction. Si elle est implémentée, la fonction EvtSerCx2SystemDmaTransmitInitializeTransaction doit appeler la méthode SerCx2SystemDmaTransmitInitializeTransactionComplete pour informer SerCx2 lorsque le pilote termine l’initialisation du contrôleur série.

Si le pilote implémente une fonction de rappel d’événement EvtSerCx2SystemDmaTransmitCleanupTransaction, SerCx2 appelle cette fonction pour propre l’état matériel après la fin du transfert DMA final dans la transaction. Si elle est implémentée, la fonction EvtSerCx2SystemDmaTransmitInitializeTransaction doit appeler la méthode SerCx2SystemDmaTransmitCleanupTransactionComplete pour informer SerCx2 lorsque le pilote termine le nettoyage du contrôleur série.

Un pilote de contrôleur série qui doit effectuer une configuration spéciale du contrôleur DMA système au début d’une transaction de transmission système DMA doit implémenter une fonction de rappel d’événement EvtSerCx2SystemDmaTransmitConfigureDmaChannel . Cette fonction peut appeler la méthode SerCx2SystemDmaTransmitGetDmaEnabler pour obtenir l’activation DMA de l’adaptateur DMA système utilisé pour la transaction. SerCx2 appelle cette fonction avant de commencer le premier transfert DMA dans la transaction. Pour plus d’informations sur les enablers DMA, consultez Activation des transactions DMA.

Égoutter et purger le FIFO de transmission

Un pilote de contrôleur série qui prend en charge les transactions de transmission système-DMA doit implémenter une fonction de rappel d’événement EvtSerCx2SystemDmaTransmitDrainFifo si le pilote peut détecter le moment où le FIFO de transmission se vide. S’il est implémenté, SerCx2 appelle cette fonction après l’écriture du dernier octet des données d’une transaction de transmission DMA système dans le FIFO de transmission. Pendant cet appel, la fonction EvtSerCx2SystemDmaTransmitDrainFifo active généralement une interruption qui est déclenchée lorsque le FIFO de transmission se vide, puis retourne sans attendre l’interruption. Lorsque le FIFO se vide, le pilote appelle la méthode SerCx2SystemDmaTransmitDrainFifoComplete pour notifier SerCx2. Ce n’est qu’après avoir reçu cette notification que SerCx2 termine la demande d’écriture (IRP_MJ_WRITE) en attente qui est associée à la transaction de transmission système-DMA.

Si le pilote de contrôleur série n’implémente pas de fonction EvtSerCx2SystemDmaTransmitDrainFifo , SerCx2 doit terminer la demande d’écriture en attente sans vérifier au préalable que le FIFO de transmission a été vidé. Il ne peut y avoir aucune garantie que les données écrites dans le FIFO seront transmises sans délai significatif. Toutes les données qui restent dans le FIFO une fois qu’une demande d’écriture est terminée peuvent être perdues avant leur transmission. Cette perte de données inattendue dans une demande d’écriture réussie peut créer des problèmes de fiabilité pour le pilote de périphérique qui a envoyé la demande.

Un pilote qui implémente une fonction EvtSerCx2SystemDmaTransmitDrainFifo doit également implémenter les fonctions de rappel d’événement EvtSerCx2SystemDmaTransmitCancelDrainFifo et EvtSerCx2SystemDmaTransmitPurgeFifo .

La fonction EvtSerCx2SystemDmaTransmitCancelDrainFifo permet à SerCx2 d’annuler une opération fiFO-drain en cours avant sa fin. SerCx2 peut annuler cette opération si la demande d’écriture est annulée ou si le contrôleur série est sur le point de quitter l’état d’alimentation du périphérique D0 pour entrer dans un état de faible consommation. Si la fonction EvtSerCx2SystemDmaTransmitCancelDrainFifo annule correctement l’opération FIFO-drain, cette fonction retourne TRUE. Une valeur de retour TRUE garantit que la fonction EvtSerCx2SystemDmaTransmitDrainFifo sera retournée sans appeler d’abord SerCx2SystemDmaTransmitDrainFifoComplete. La valeur de retour FALSE indique que la fonction EvtSerCx2SystemDmaTransmitDrainFifo a appelé ou appellera SerCx2SystemDmaTransmitDrainFifoComplete.

Si la demande d’écriture associée à une transaction de transmission system-DMA est annulée ou expire avant qu’elle ne se termine, SerCx2 appelle la fonction EvtSerCx2SystemDmaTransmitPurgeFifo , si elle est implémentée, pour ignorer les données non envoyées qui pourraient rester le FIFO de transmission. Lorsque le FIFO est vidé, la fonction EvtSerCx2SystemDmaTransmitPurgeFifo appelle la méthode SerCx2SystemDmaTransmitPurgeFifoComplete pour notifier SerCx2. Ce n’est qu’après avoir reçu cette notification que SerCx2 démarre une nouvelle transaction d’E/S.