SerCx2 PIO-送信トランザクション
SerCx2 は、すべてのシリアル コントローラー ドライバーがプログラムされた I/O (PIO) を使用する送信トランザクションのサポートを実装することを必要とします。 PIO 送信トランザクションを開始するために、SerCx2 はドライバーの EvtSerCx2PioTransmitWriteBuffer イベント コールバック関数を呼び出し、パラメーターとして書き込みバッファーを提供します。
この呼び出し中、EvtSerCx2PioTransmitWriteBuffer 関数は、書き込みバッファーからシリアル コントローラー ハードウェアの送信 FIFO にデータを転送します。 このデータ転送は、書き込みバッファーが空であるか、または送信 FIFO がそれ以上のデータをすぐに受け入れることができないまで続行されます。 転送が終了すると、FIFO から書き込みバッファーから正常に転送されたバイト数が返されます。
PIO 送信オブジェクトの作成
SerCx2 がシリアル コントローラー ドライバーの EvtSerCx2PioTransmitXxx** 関数のいずれかを呼び出す前に、ドライバーは SerCx2PioTransmitCreate メソッドを呼び出して、これらの関数を SerCx2 に登録する必要があります。 このメソッドは、入力パラメーターとして、ドライバーの EvtSerCx2PioTransmitXxx** 関数へのポインターを含む SERCX2_PIO_TRANSMIT_CONFIG 構造体へのポインターを受け取ります。
ドライバーは、次の 3 つの関数をすべて実装する必要があります。
- EvtSerCx2PioTransmitWriteBuffer
- EvtSerCx2PioTransmitEnableReadyNotification
- EvtSerCx2PioTransmitCancelReadyNotification
オプションとして、ドライバーは次の関数のいずれかまたは両方を実装できます。
オプションとして、ドライバーは次の 3 つの関数を実装できます。
ドライバーは、上記の一覧で任意の関数を実装する場合は、3 つすべてを実装する必要があります。
SerCx2PioTransmitCreate メソッドは、PIO 送信オブジェクトを作成し、呼び出し元ドライバーにこのオブジェクトへの SERCX2PIOTRANSMIT ハンドルを提供します。 ドライバーの EvtSerCx2PioTransmitXxx** 関数はすべて、このハンドルを最初のパラメーターとして受け取ります。 次の SerCx2 メソッドは、このハンドルを最初のパラメーターとして受け取ります。
- SerCx2PioTransmitReady
- SerCx2PioTransmitInitializeTransactionComplete
- SerCx2PioTransmitCleanupTransactionComplete
- SerCx2PioTransmitDrainFifoComplete
- SerCx2PioTransmitPurgeFifoComplete
ハードウェアの初期化とクリーンアップ
一部のシリアル コントローラー ドライバーでは、PIO 送信トランザクションの開始時にシリアル コントローラー ハードウェアを初期化したり、トランザクションの終了時にシリアル コントローラーのハードウェア状態をクリーンアップしたりする必要があります。
ドライバーが EvtSerCx2PioTransmitInitializeTransaction イベント コールバック関数を実装する場合、SerCx2 はこの関数を呼び出して、トランザクションを開始する EvtSerCx2PioTransmitWriteBuffer 呼び出しの前にシリアル コントローラーを初期化します。 EvtSerCx2PioTransmitInitializeTransaction 関数を実装する場合は、SerCx2PioTransmitInitializeTransactionComplete メソッドを呼び出して、ドライバーがシリアル コントローラーの初期化を完了したときに SerCx2 に通知する必要があります。
ドライバーが EvtSerCx2PioTransmitCleanupTransaction イベント コールバック関数を実装する場合、SerCx2 はこの関数を呼び出して、トランザクションの最後の EvtSerCx2PioTransmitWriteBuffer 呼び出しの後にハードウェア状態をクリーンアップします。 EvtSerCx2PioTransmitInitializeTransaction 関数を実装する場合は、SerCx2PioTransmitCleanupTransactionComplete メソッドを呼び出して、ドライバーがシリアル コントローラーのクリーンアップを完了したときに SerCx2 に通知する必要があります。
送信 FIFO のドレインとパージ
シリアル コントローラー ドライバーは、ドライバーが送信 FIFO が空になったときに検出できる場合は、EvtSerCx2PioTransmitDrainFifo イベント コールバック関数を実装する必要があります。 実装されている場合、SerCx2 は、PIO 送信トランザクション内のデータの最後のバイトが送信 FIFO に書き込まれた後に、この関数を呼び出します。 この呼び出し中、EvtSerCx2PioTransmitDrainFifo 関数は通常、送信 FIFO が空になったときに割り込みをトリガーし、待機せずに戻ります。 FIFO が空になると、ドライバーは SerCx2PioTransmitDrainFifoComplete メソッドを呼び出して SerCx2 に通知します。 この通知を受信した後にのみ、SerCx2 は PIO 送信トランザクションに関連付けられている保留中の書き込み (IRP_MJ_WRITE) 要求を完了します。
シリアル コントローラー ドライバーが EvtSerCx2PioTransmitDrainFifo 関数を実装していない場合、SerCx2 は、送信 FIFO が空であることを最初に確認せずに保留中の書き込み要求を完了する必要があります。 FIFO に書き込まれたデータが大幅な遅延なく送信されるという保証はありません。 書き込みリクエストの完了後に FIFO に残っているデータは、送信される前に失われる可能性があります。 正常に完了した書き込みリクエストでのこの予期しないデータ損失は、要求を送信した周辺機器ドライバーの信頼性の問題を引き起こす可能性があります。
EvtSerCx2PioTransmitDrainFifo 関数を実装するドライバーは、EvtSerCx2PioTransmitCancelDrainFifo および EvtSerCx2PioTransmitPurgeFifo イベント コールバック関数も実装する必要があります。
EvtSerCx2PioTransmitCancelDrainFifo 関数を使用すると、SerCx2 が終了する前に、進行中の FIFO ドレイン操作を取り消すことができます。 SerCx2 は、書き込み要求がタイムアウトした場合、または取り消された場合に、この操作を取り消す可能性があります。 EvtSerCx2PioTransmitCancelDrainFifo 関数が FIFO ドレイン操作を正常にキャンセルした場合、この関数は TRUE を返します。 TRUE の戻り値は、シリアル コントローラー ドライバーが呼び出されておらず、SerCx2PioTransmitDrainFifoComplete を呼び出さないことを保証します。 FALSE の戻り値は、EvtSerCx2PioTransmitDrainFifo 関数が SerCx2PioTransmitDrainFifoComplete を呼び出したか、間もなく呼び出されることを示します。
PIO 送信トランザクションに関連付けられている書き込み要求が取り消されるか、完了する前にタイムアウトした場合、SerCx2 は EvtSerCx2PioTransmitPurgeFifo 関数を呼び出して実装されている場合は、送信 FIFO メイン再メイン可能性のある未送信データをカード破棄します。 SerCx2 は、この関数から取得した情報を使用して、書き込み要求によって周辺機器に正常に送信されたデータのバイト数を周辺機器ドライバーに正確に伝えます。
準備完了通知
EvtSerCx2PioTransmitWriteBuffer 呼び出しが終了すると、送信 FIFO がすぐにより多くのデータを受け入れることができないため、SerCx2 は PIO 受信トランザクションの完了を待機する必要があります。後で FIFO でさらに多くのデータを受け入れる準備が整います。 この場合、SerCx2 は EvtSerCx2PioTransmitEnableReadyNotification イベント コールバック関数を呼び出して、シリアル コントローラー ドライバーが準備完了通知を送信できるようにします。 この通知が有効になっている場合、シリアル コントローラー ドライバーは SerCx2PioTransmitReady メソッドを呼び出して、ドライバーが送信 FIFO がより多くのデータを受け入れる準備ができていることを検出したときに SerCx2 に通知します。 この通知に応答して、SerCx2 は EvtSerCx2PioTransmitWriteBuffer 関数を呼び出して、FIFO により多くのデータを書き込みます。
書き込み要求がタイムアウトまたは取り消されたときに準備完了通知が有効になっている場合、SerCx2 は EvtSerCx2PioTransmitCancelReadyNotification イベント コールバック関数を呼び出して、保留中の通知を取り消します。 この関数が保留中の通知を正常に取り消すと、TRUE が返されます。 TRUE の戻り値は、シリアル コントローラー ドライバーが SerCx2PioTransmitReady を呼び出さないことを保証します。 FALSE の戻り値は、EvtSerCx2PioTransmitDrainFifo 関数が SerCx2PioTransmitReady を呼び出したか、間もなく呼び出されることを示します。