SerCx2 PIO-受信トランザクション
SerCx2 は、すべてのシリアル コントローラー ドライバーがプログラムされた I/O (PIO) を使用する受信トランザクションのサポートを実装することを必要とします。 PIO 受信トランザクションを開始するために、SerCx2 はドライバーの EvtSerCx2PioReceiveReadBuffer イベント コールバック関数を呼び出し、パラメーターとして読み取りバッファーを提供します。
この呼び出し中、EvtSerCx2PioReceiveReadBuffer 関数は、シリアル コントローラー ハードウェアの受信 FIFO から読み取りバッファーにデータを転送します。 このデータ転送は、読み取りバッファーがいっぱいになるか、受信 FIFO からすぐにデータが使用できなくなるまで続行されます。 転送が終了すると、FIFO から読み取りバッファーに正常に転送されたバイト数が返されます。 この関数は、さらにデータが受信されるのを待つことはありません。
PIO 受信オブジェクトの作成
SerCx2 がシリアル コントローラー ドライバーの EvtSerCx2PioReceiveXxx** 関数のいずれかを呼び出す前に、ドライバーは SerCx2PioReceiveCreate メソッドを呼び出して、これらの関数を SerCx2 に登録する必要があります。 このメソッドは、入力パラメーターとして、ドライバーの EvtSerCx2PioReceiveXxx** 関数へのポインターを含む SERCX2_PIO_RECEIVE_CONFIG 構造体へのポインターを受け取ります。
ドライバーは、次の 3 つの関数をすべて実装する必要があります。
- EvtSerCx2PioReceiveReadBuffer
- EvtSerCx2PioReceiveEnableReadyNotification
- EvtSerCx2PioReceiveCancelReadyNotification
オプションとして、ドライバーは次の関数のいずれかまたは両方を実装できます。
SerCx2PioReceiveCreate メソッドは、PIO 受信オブジェクトを作成し、呼び出し元ドライバーにこのオブジェクトへの SERCX2PIORECEIVE ハンドルを提供します。 ドライバーの EvtSerCx2PioReceiveXxx** 関数はすべて、このハンドルを最初のパラメーターとして受け取ります。 次の SerCx2 メソッドは、このハンドルを最初のパラメーターとして受け取ります。
- SerCx2PioReceiveReady
- SerCx2PioReceiveInitializeTransactionComplete
- SerCx2PioReceiveCleanupTransactionComplete
ハードウェアの初期化とクリーンアップ
一部のシリアル コントローラー ドライバーでは、PIO 受信トランザクションの開始時にシリアル コントローラー ハードウェアを初期化したり、トランザクションの終了時にシリアル コントローラーのハードウェア状態をクリーンしたりする必要があります。
ドライバーが EvtSerCx2PioReceiveInitializeTransaction イベント コールバック関数を実装する場合、SerCx2 はこの関数を呼び出して、トランザクションを開始する EvtSerCx2PioReceiveReadBuffer 呼び出しの前にシリアル コントローラーを初期化します。 EvtSerCx2PioReceiveInitializeTransaction 関数を実装する場合は、SerCx2PioReceiveInitializeTransactionComplete メソッドを呼び出して、ドライバーがシリアル コントローラーの初期化を完了したときに SerCx2 に通知する必要があります。
ドライバーが EvtSerCx2PioReceiveCleanupTransaction イベント コールバック関数を実装する場合、SerCx2 はこの関数を呼び出して、トランザクションの最後の EvtSerCx2PioReceiveReadBuffer 呼び出しの後にハードウェア状態をクリーンします。 EvtSerCx2PioReceiveInitializeTransaction 関数を実装する場合は、SerCx2PioReceiveCleanupTransactionComplete メソッドを呼び出して、ドライバーがシリアル コントローラーのクリーンアップを完了したときに SerCx2 に通知する必要があります。
準備完了通知
EvtSerCx2PioReceiveReadBuffer 呼び出しが終了すると、受信 FIFO からすぐに読み取ることができるデータがないため、SerCx2 は、後でシリアル コントローラーがより多くのデータを受信するまで PIO 受信トランザクションを完了できません。 この場合、SerCx2 は EvtSerCx2PioReceiveEnableReadyNotification イベント コールバック関数を呼び出して、準備完了通知を有効にします。 通常、この関数を使用すると、受信 FIFO から 1 バイト以上のデータを読み取ることができるときに割り込みをトリガーできます。 この通知が有効になっている場合にのみ、シリアル コントローラー ドライバーは SerCx2PioReceiveReady メソッドを呼び出して、受信 FIFO が空でなくなったことを検出したときに SerCx2 に通知します。 この通知に応答して、SerCx2 は EvtSerCx2PioReceiveReadBuffer 関数を呼び出して、新しく受信したデータを読み取ります。
SerCx2 は、さらに準備完了通知を使用して、PIO 受信トランザクションとして処理される読み取り要求の処理中にタイムアウトを効率的に管理します。 これらのタイムアウトの詳細については、「SERIAL_TIMEOUTS」を参照してください。
読み取り要求がタイムアウトまたは取り消されたときに準備完了通知が有効になっている場合、SerCx2 は EvtSerCx2PioReceiveCancelReadyNotification イベント コールバック関数を呼び出して、保留中の通知を取り消します。 この関数が保留中の通知を正常に取り消すと、TRUE が返されます。 TRUE の戻り値は、シリアル コントローラー ドライバーが SerCx2PioReceiveReady を呼び出さないことを保証します。 FALSE の戻り値は、コントローラー ドライバーが既に呼び出されているか、SerCx2PioReceiveReady をすぐに呼び出す予定であることを示します。