SerCx2 システム-DMA-送信トランザクション
一部のシリアル コントローラー ドライバーは、システム DMA コントローラーを使用する送信トランザクションのサポートを実装しています。 このようなサポートは省略可能ですが、長いデータ転送のためにプログラムされた I/O (PIO) を使用する必要性からメイン プロセッサを解放することで、パフォーマンスを向上させることができます。 SerCx2 は、システム DMA コントローラをセットアップし、シリアル コントローラ ドライバに代わって必要な DMA 転送を開始することにより、システム DMA 送信トランザクションを実行します。
シリアル コントローラー ドライバーがシステム DMA 送信オブジェクトを作成するとき、ドライバーは SerCx2 がシステム DMA 送信トランザクション用にシステム DMA アダプターを設定するために使用するパラメーターを提供します。
トランザクションを開始する前に、シリアルコントローラドライバーは、トランザクションに必要かもしれないシリアルコントローラハードウェアまたは DMA アダプターの特別なセットアップを行うオプションがあります。 トランザクションの終了後、ドライバーには送信 FIFO を空にし、必要に応じてシリアル コントローラーのハードウェア状態をクリーンアップするオプションがあります。
システム DMA 送信オブジェクトの作成
SerCx2 がシリアル コントローラー ドライバーの EvtSerCx2SystemDmaTransmitXxx** 関数を呼び出す前に、ドライバーは SerCx2SystemDmaTransmitCreate メソッドを呼び出してこれらの関数を SerCx2 に登録する必要があります。 このメソッドは、入力パラメーターとして、ドライバーの EvtSerCx2SystemDmaTransmitXxx** 関数へのポインターを含む SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG 構造体へのポインターを受け入れます。
オプションとして、ドライバーは次の関数の一部またはすべてを実装できます。
- EvtSerCx2SystemDmaTransmitInitializeTransaction
- EvtSerCx2SystemDmaTransmitCleanupTransaction
- EvtSerCx2SystemDmaTransmitConfigureDmaChannel
オプションとして、ドライバは以下の機能を実装することができます:
- EvtSerCx2SystemDmaTransmitDrainFifo
- EvtSerCx2SystemDmaTransmitCancelDrainFifo
- EvtSerCx2SystemDmaTransmitPurgeFifo
前述のリストの関数のいずれかを実装するドライバーは、3 つすべてを実装する必要があります。
SerCx2SystemDmaTransmitCreate メソッドはシステム DMA 送信オブジェクトを作成し、呼び出し元ドライバーにこのオブジェクトへの SERCX2SYSTEMDMATRANSMIT ハンドルを提供します。 ドライバーの EvtSerCx2SystemDmaTransmitXxx** 関数はすべて、このハンドルを最初のパラメーターとして受け取ります。 次の SerCx2 メソッドは、このハンドルを最初のパラメーターとして受け取ります。
- SerCx2SystemDmaTransmitDrainFifoComplete
- SerCx2SystemDmaTransmitPurgeFifoComplete
- SerCx2SystemDmaTransmitInitializeTransactionComplete
- SerCx2SystemDmaTransmitCleanupTransactionComplete
- SerCx2SystemDmaTransmitGetDmaEnabler
ハードウェアの初期化とクリーンアップ
シリアルコントローラドライバによっては、システム DMA 送信トランザクションの開始時にシリアル コントローラ ハードウェアを初期化したり、トランザクションの終了時にシリアル コントローラ ハードウェアの状態をクリーンアップする必要がある場合があります。
ドライバーが EvtSerCx2SystemDmaTransmitInitializeTransaction イベント コールバック関数を実装している場合、SerCx2 はトランザクションの最初の DMA 転送を開始する前にこの関数を呼び出してシリアル コントローラーを初期化します。 実装されている場合、 EvtSerCx2SystemDmaTransmitInitializeTransaction 関数は SerCx2SystemDmaTransmitInitializeTransactionComplete メソッドを呼び出し、ドライバがシリアルコントローラの初期化を完了したときに SerCx2 に通知する必要があります。
ドライバーが EvtSerCx2SystemDmaTransmitCleanupTransaction イベント コールバック関数を実装している場合、SerCx2 はこの関数を呼び出し、トランザクションの最後の DMA 転送の終了後にハードウェア状態をクリーンアップします。 実装されている場合、EvtSerCx2SystemDmaTransmitInitializeTransaction 関数は、SerCx2SystemDmaTransmitCleanupTransactionComplete メソッドを呼び出し、ドライバがシリアルコントローラのクリーンアップを終了したときにSerCx2に通知する必要があります。
システム DMA 送信トランザクションの開始時にシステム DMA コントローラの特別な構成を行う必要があるシリアル コントローラ ドライバは、EvtSerCx2SystemDmaTransmitConfigureDmaChannel イベント コールバック関数を実装する必要があります。 この関数は、SerCx2SystemDmaTransmitGetDmaEnabler メソッドを呼び出して、トランザクションに使用されるシステム DMA アダプタの DMA イネーブラを取得できます。 SerCx2 は、トランザクションで最初の DMA 転送を開始する前に、この関数を呼び出します。 DMA 有効化機能の詳細については、「DMA トランザクションの有効化」を参照してください。
送信 FIFO のドレインとパージ
システム DMA 送信トランザクションをサポートするシリアル コントローラー ドライバーは、送信 FIFO が空になったことをドライバーが検出できる場合、EvtSerCx2SystemDmaTransmitDrainFifo イベント コールバック関数を実装する必要があります。 実装されている場合、SerCx2 は、システム DMA 送信トランザクションのデータの最後のバイトが送信 FIFO に書き込まれた後にこの関数を呼び出します。 この呼び出し中に、EvtSerCx2SystemDmaTransmitDrainFifo 関数は通常、送信 FIFO が空になったときにトリガーされる割り込みを有効にし、割り込みを待たずに戻ります。 FIFO が空になると、ドライバーは SerCx2SystemDmaTransmitDrainFifoComplete メソッドを呼び出して SerCx2 に通知します。 SerCx2 は、この通知を受信した後でのみ、システム DMA 送信トランザクションに関連付けられている保留中の書き込み (IRP_MJ_WRITE) 要求を完了します。
シリアル コントローラー ドライバーが EvtSerCx2SystemDmaTransmitDrainFifo 関数を実装していない場合、SerCx2 は送信 FIFO が空になったことを最初に確認せずに保留中の書き込み要求を完了する必要があります。 FIFO に書き込まれたデータが大幅な遅延なく送信されるという保証はありません。 書き込みリクエストの完了後に FIFO に残っているデータは、送信される前に失われる可能性があります。 正常に完了した書き込みリクエストでのこの予期しないデータ損失は、要求を送信した周辺機器ドライバーの信頼性の問題を引き起こす可能性があります。
EvtSerCx2SystemDmaTransmitDrainFifo 関数を実装するドライバーは、EvtSerCx2SystemDmaTransmitCancelDrainFifo および EvtSerCx2SystemDmaTransmitPurgeFifo イベント コールバック関数も実装する必要があります。
EvtSerCx2SystemDmaTransmitCancelDrainFifo 関数を使用すると、SerCx2 は進行中の FIFO ドレイン操作を終了前にキャンセルできます。 SerCx2 は、書き込み要求がキャンセルされた場合、またはシリアル・コントローラが D0 デバイス電源状態から低電力状態に移行しようとした場合に、この動作をキャンセルする可能性があります。 EvtSerCx2SystemDmaTransmitCancelDrainFifo 関数が FIFO ドレイン操作のキャンセルに成功した場合、この関数は TRUE を返します。 TRUE の戻り値は、EvtSerCx2SystemDmaTransmitDrainFifo 関数が SerCx2SystemDmaTransmitDrainFifoComplete を最初に呼び出さずに戻ることを保証します。 FALSE の戻り値は、EvtSerCx2SystemDmaTransmitDrainFifo 関数が SerCx2SystemDmaTransmitDrainFifoComplete を呼び出したか、または呼び出す予定であることを示します。
システム DMA 送信トランザクションに関連付けられた書き込みリクエストが完了前にキャンセルまたはタイムアウトした場合、SerCx2 は EvtSerCx2SystemDmaTransmitPurgeFifo 関数 (実装されている場合) を呼び出し、送信 FIFO に残っている可能性のある未送信データを破棄します。 FIFO がパージされると、EvtSerCx2SystemDmaTransmitPurgeFifo 関数は SerCx2SystemDmaTransmitPurgeFifoComplete メソッドを呼び出し、SerCx2 に通知します。 この通知を受信した後でのみ、SerCx2 は新しい I/O トランザクションを開始します。