SerCx2-PIO-Receive-Transaktionen
SerCx2 erfordert, dass alle seriellen Controllertreiber Unterstützung für Empfangstransaktionen implementieren, die programmierte E/A (PIO) verwenden. Um eine PIO-Receive-Transaktion zu starten, ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2PioReceiveReadBuffer des Treibers auf und stellt einen Lesepuffer als Parameter bereit.
Während dieses Aufrufs überträgt die EvtSerCx2PioReceiveReadBuffer-Funktion Daten in den Lesepuffer vom Empfangs-FIFO in der seriellen Controllerhardware. Diese Datenübertragung wird fortgesetzt, bis entweder der Lesepuffer voll ist oder keine Daten mehr sofort aus dem empfangenen FIFO verfügbar sind. Wenn die Übertragung endet, gibt die Funktion die Anzahl der Bytes zurück, die erfolgreich aus dem FIFO in den Lesepuffer übertragen wurden. Diese Funktion wartet nie, bis weitere Daten empfangen werden.
Erstellen des PIO-Receive-Objekts
Bevor SerCx2 die EvtSerCx2PioReceiveXxx**-Funktionen des seriellen Controllertreibers aufrufen kann, muss der Treiber die SerCx2PioReceiveCreate-Methode aufrufen, um diese Funktionen bei SerCx2 zu registrieren. Diese Methode akzeptiert als Eingabeparameter einen Zeiger auf eine SERCX2_PIO_RECEIVE_CONFIG-Struktur , die Zeiger auf die EvtSerCx2PioReceiveXxx**-Funktionen des Treibers enthält.
Der Treiber ist erforderlich, um alle drei der folgenden Funktionen zu implementieren:
- EvtSerCx2PioReceiveReadBuffer
- EvtSerCx2PioReceiveEnableReadyNotification
- EvtSerCx2PioReceiveCancelReadyNotification
Optional kann der Treiber eine oder beide der folgenden Funktionen implementieren:
Die SerCx2PioReceiveCreate-Methode erstellt ein PIO-Receive-Objekt und stellt dem aufrufenden Treiber ein SERCX2PIORECEIVE-Handle für dieses Objekt bereit. Die EvtSerCx2PioReceiveXxx**-Funktionen des Treibers verwenden dieses Handle als ersten Parameter. Die folgenden SerCx2-Methoden verwenden dieses Handle als ersten Parameter:
- SerCx2PioReceiveReady
- SerCx2PioReceiveInitializeTransactionComplete
- SerCx2PioReceiveCleanupTransactionComplete
Hardwareinitialisierung und sauber
Einige serielle Controllertreiber müssen möglicherweise die Hardware des seriellen Controllers zu Beginn einer PIO-Empfangstransaktion initialisieren oder den Hardwarestatus des seriellen Controllers am Ende der Transaktion sauber.
Wenn ein Treiber eine EvtSerCx2PioReceiveInitializeTransaction-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den seriellen Controller vor dem EvtSerCx2PioReceiveReadBuffer-Aufruf zu initialisieren, der die Transaktion startet. Bei Implementierung muss die EvtSerCx2PioReceiveInitializeTransaction-Funktion die SerCx2PioReceiveInitializeTransactionComplete-Methode aufrufen, um SerCx2 zu informieren, wenn der Treiber die Initialisierung des seriellen Controllers abgeschlossen hat.
Wenn der Treiber eine EvtSerCx2PioReceiveCleanupTransaction-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den Hardwarezustand nach dem letzten EvtSerCx2PioReceiveReadBuffer-Aufruf in der Transaktion zu sauber. Bei Implementierung muss die EvtSerCx2PioReceiveInitializeTransaction-Funktion die SerCx2PioReceiveCleanupTransactionComplete-Methode aufrufen, um SerCx2 darüber zu informieren, wann der Treiber die Bereinigung des seriellen Controllers abgeschlossen hat.
Bereite Benachrichtigungen
Wenn ein EvtSerCx2PioReceiveReadBuffer-Aufruf beendet wird, weil keine Weiteren Daten sofort zum Lesen aus dem Empfangs-FIFO verfügbar sind, kann SerCx2 die PIO-Receive-Transaktion erst abschließen, wenn der serielle Controller zu einem späteren Zeitpunkt mehr Daten empfängt. In diesem Fall ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2PioReceiveEnableReadyNotification auf, um eine bereite Benachrichtigung zu aktivieren. Diese Funktion ermöglicht in der Regel das Auslösen eines Interrupts, wenn ein oder mehrere Bytes von Daten verfügbar sind, um aus der Empfangs-FIFO gelesen zu werden. Wenn diese Benachrichtigung aktiviert ist, ruft der Treiber des seriellen Controllers die SerCx2PioReceiveReady-Methode auf, um SerCx2 zu benachrichtigen, wenn der Treiber erkennt, dass die Empfangs-FIFO nicht mehr leer ist. Als Reaktion auf diese Benachrichtigung ruft SerCx2 die EvtSerCx2PioReceiveReadBuffer-Funktion auf, um die neu empfangenen Daten zu lesen.
SerCx2 verwendet zusätzlich bereite Benachrichtigungen, um Timeouts während der Verarbeitung von Leseanforderungen, die als PIO-Empfangstransaktionen verarbeitet werden, effizient zu verwalten. Weitere Informationen zu diesen Timeouts finden Sie unter SERIAL_TIMEOUTS.
Wenn die bereite Benachrichtigung aktiviert ist, wenn das Zeitlimit für die Leseanforderung überschritten wird oder abgebrochen wird, ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2PioReceiveCancelReadyNotification auf, um die ausstehende Benachrichtigung abzubrechen. Wenn diese Funktion die ausstehende Benachrichtigung erfolgreich abbricht, wird TRUE zurückgegeben. Der Rückgabewert TRUE garantiert, dass der serielle Controllertreiber SerCx2PioReceiveReady nicht aufruft. Der Rückgabewert FALSE gibt an, dass der Controllertreiber bereits SerCx2PioReceiveReady aufgerufen hat oder in Kürze aufrufen wird.