Partager via


SerCx2 PIO-Transmit Transactions

SerCx2 nécessite que tous les pilotes de contrôleur série implémentent la prise en charge des transactions de transmission qui utilisent des E/S programmées (PIO). Pour démarrer une transaction PIO-transmit, SerCx2 appelle la fonction de rappel d’événement EvtSerCx2PioTransmitWriteBuffer du pilote et fournit une mémoire tampon d’écriture en tant que paramètre.

Au cours de cet appel, la fonction EvtSerCx2PioTransmitWriteBuffer transfère les données de la mémoire tampon d’écriture vers le fichier FIFO de transmission dans le matériel du contrôleur série. Ce transfert de données se poursuit jusqu’à ce que la mémoire tampon d’écriture soit vide ou que le FIFO de transmission ne puisse pas accepter immédiatement d’autres données. À la fin du transfert, la fonction retourne le nombre d’octets qui ont été correctement transférés de la mémoire tampon d’écriture vers le FIFO.

Création de l’objet PIO-transmit

Avant que SerCx2 puisse appeler les fonctions EvtSerCx2PioTransmitXxx** du pilote série, le pilote doit appeler la méthode SerCx2PioTransmitCreate 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_PIO_TRANSMIT_CONFIG qui contient des pointeurs vers les fonctions EvtSerCx2PioTransmitXxx** du pilote.

Le pilote est requis pour implémenter les trois fonctions suivantes :

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

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

Si le pilote implémente une fonction dans la liste précédente, il doit implémenter les trois.

La méthode SerCx2PioTransmitCreate crée un objet de transmission PIO et fournit au pilote appelant un handle SERCX2PIOTRANSMIT pour cet objet. Les fonctions EvtSerCx2PioTransmitXxx** 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 PIO 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 EvtSerCx2PioTransmitInitializeTransaction , SerCx2 appelle cette fonction pour initialiser le contrôleur série avant l’appel EvtSerCx2PioTransmitWriteBuffer qui démarre la transaction. Si elle est implémentée, la fonction EvtSerCx2PioTransmitInitializeTransaction doit appeler la méthode SerCx2PioTransmitInitializeTransactionComplete 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 EvtSerCx2PioTransmitCleanupTransaction, SerCx2 appelle cette fonction pour propre l’état matériel après le dernier appel EvtSerCx2PioTransmitWriteBuffer dans la transaction. Si elle est implémentée, la fonction EvtSerCx2PioTransmitInitializeTransaction doit appeler la méthode SerCx2PioTransmitCleanupTransactionComplete pour informer SerCx2 lorsque le pilote termine le nettoyage du contrôleur série.

Égoutter et purger le FIFO de transmission

Un pilote de contrôleur série doit implémenter une fonction de rappel d’événement EvtSerCx2PioTransmitDrainFifo si le pilote peut détecter quand la transmission FIFO se vide. S’il est implémenté, SerCx2 appelle cette fonction après que le dernier octet de données d’une transaction de transmission PIO a été écrit dans le FIFO de transmission. Pendant cet appel, la fonction EvtSerCx2PioTransmitDrainFifo permet généralement de déclencher une interruption lorsque la transmission FIFO se vide, puis de retourner sans attendre. Lorsque le FIFO se vide, le pilote appelle la méthode SerCx2PioTransmitDrainFifoComplete 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 associée à la transaction PIO-transmit.

Si le pilote de contrôleur série n’implémente pas de fonction EvtSerCx2PioTransmitDrainFifo , SerCx2 doit effectuer la demande d’écriture en attente sans vérifier au préalable que la transmission FIFO a été vidée. Rien ne garantit 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 qu’elles puissent être transmises. Cette perte de données inattendue dans une demande d’écriture terminée avec succès peut créer des problèmes de fiabilité pour le pilote périphérique qui a envoyé la demande.

Un pilote qui implémente une fonction EvtSerCx2PioTransmitDrainFifo doit également implémenter les fonctions de rappel d’événements EvtSerCx2PioTransmitCx2PioTransmitPurgeFifo.

La fonction EvtSerCx2PioTransmitCancelDrainFifo 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 expire ou est annulée. Si la fonction EvtSerCx2PioTransmitCancelDrainFifo annule correctement l’opération de drain FIFO, cette fonction retourne TRUE. Une valeur de retour TRUE garantit que le pilote de contrôleur série n’a pas appelé et n’appellera pas SerCx2PioTransmitDrainFifoComplete. Une valeur de retour FALSE indique que la fonction EvtSerCx2PioTransmitDrainFifo a appelé ou appellera bientôt SerCx2PioTransmitDrainFifoComplete.

Si la demande d’écriture associée à une transaction de transmission PIO est annulée ou expire avant qu’elle ne se termine, SerCx2 appelle la fonction EvtSerCx2PioTransmitPurgeFifo , si elle est implémentée, pour ignorer toutes les données non envoyées qui peuvent rester le FIFO de transmission. SerCx2 utilise les informations qu’il obtient de cette fonction pour indiquer au pilote de périphérique exactement combien d’octets de données ont été transmis au périphérique par la demande d’écriture.

Notifications prêtes

Lorsqu’un appel EvtSerCx2PioTransmitWriteBuffer se termine parce que le FIFO de transmission ne peut pas accepter immédiatement plus de données, SerCx2 doit attendre de terminer la transaction de réception PIO jusqu’à ce que, ultérieurement, le FIFO soit prêt à accepter davantage de données. Dans ce cas, SerCx2 appelle la fonction de rappel d’événement EvtSerCx2PioTransmitEnableReadyNotification pour permettre au pilote du contrôleur série d’envoyer une notification prête. Si cette notification est activée, le pilote du contrôleur série appelle la méthode SerCx2PioTransmitReady pour notifier SerCx2 lorsque le pilote détecte que le fichier FIFO de transmission est prêt à accepter davantage de données. En réponse à cette notification, SerCx2 appelle la fonction EvtSerCx2PioTransmitWriteBuffer pour écrire plus de données dans le FIFO.

Si la notification prête est activée lorsque la demande d’écriture expire ou est annulée, SerCx2 appelle la fonction de rappel d’événement EvtSerCx2PioTransmitCancelReadyNotification pour annuler la notification en attente. Si cette fonction annule correctement la notification en attente, elle retourne TRUE. La valeur de retour TRUE garantit que le pilote de contrôleur série n’appellera pas SerCx2PioTransmitReady. Une valeur de retour FALSE indique que la fonction EvtSerCx2PioTransmitDrainFifo a appelé ou appellera SerCx2PioTransmitReady.