EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO コールバック関数 (sercx.h)

EvtSerCx2PioTransmitDrainFifo イベント コールバック関数は、シリアル フレームワーク拡張機能 (SerCx2) のバージョン 2 によって呼び出され、シリアル コントローラー ハードウェアで送信 FIFO をドレインします。

構文

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO EvtSercx2PioTransmitDrainFifo;

void EvtSercx2PioTransmitDrainFifo(
  [in] SERCX2PIOTRANSMIT PioTransmit
)
{...}

パラメーター

[in] PioTransmit

PIO 送信オブジェクトへの SERCX2PIOTRANSMIT ハンドル。 シリアル コントローラー ドライバーは、このオブジェクトを作成するために SerCx2PioTransmitCreate メソッドを以前に呼び出しました。

戻り値

なし

解説

シリアル コントローラー ドライバーでは、オプションとしてこの関数を実装できます。 ドライバーがこの関数を実装する場合は、 EvtSerCx2PioTransmitCancelDrainFifo および EvtSerCx2PioTransmitPurgeFifo イベント コールバック関数も実装する必要があります。 これらの関数を実装するドライバーは、PIO-transmit オブジェクトを作成する SerCx2PioTransmitCreate 呼び出しに登録します。

SerCx2 は 、EvtSerCx2PioTransmitDrainFifo 関数が実装されている場合に呼び出して、PIO 送信トランザクションの終了時にシリアル コントローラー ハードウェアの送信 FIFO をドレインします。 この機能により、送信 FIFO に残っているデータ バイトが、シリアル接続された周辺機器に確実に送信されます。 最後のバイトが FIFO から送信された後、 EvtSerCx2PioTransmitDrainFifo 関数は SerCx2PioTransmitDrainFifoComplete メソッドを呼び出して SerCx2 に通知します。

シリアル コントローラー ドライバーが EvtSerCx2PioTransmitDrainFifo 関数を実装している場合、SerCx2 は、ドライバーが SerCx2PioTransmitDrainFifoComplete を呼び出すまで、保留中の書き込み (IRP_MJ_WRITE) 要求を完了しません。

シリアル コントローラーに送信データを保持するハードウェア FIFO (または同様のバッファリング メカニズム) がある場合、ドライバーは EvtSerCx2PioTransmitDrainFifo 関数を実装する必要があります。 それ以外の場合、SerCx2 は、保留中の書き込み要求が完了する前に、送信 FIFO がドレインされたことを確認できません。 代わりに、SerCx2 は、書き込みバッファー内の最後のバイトが送信 FIFO に書き込まれた後に、この要求を完了します。 送信 FIFO に書き込まれたデータが大幅な遅延なしで送信される保証はありません。 書き込み要求の完了後に FIFO に残っているデータは、シリアル接続された周辺機器に送信される前に失われる可能性があります。 正常に完了した書き込み要求で予期しないデータが失われると、周辺機器ドライバーの信頼性の問題が発生する可能性があります。

たとえば、周辺機器ドライバーは、周辺機器が接続されているシリアル ポートに書き込み要求を送信する場合があります。 未処理のすべての書き込み要求が完了するまで、このドライバーは IOCTL の送信を遅延して、シリアル ポートがデータを送信するボー レートを変更する必要があります。 ただし、 EvtSerCx2PioTransmitDrainFifo 関数が実装されていない場合は、100 バイトのデータを送信するための書き込み要求が完了し、50 データ バイトが送信 FIFO に残っている可能性があります。 その後、周辺機器ドライバーが IOCTL を送信して新しいボー レートを設定すると、FIFO の残りのバイトの一部が新しいボー レートで送信され、エラーが発生する可能性があります。

同様に、50 バイトのデータがまだ送信 FIFO に残っている間に 100 バイトのデータを送信する書き込み要求が完了し、シリアル コントローラーが D0 を終了して低電力デバイスの状態に入った後、FIFO の残りのバイトを送信できる場合、周辺機器ドライバーはこれらのバイトが失われることを認識しません。

詳細については、「 SerCx2 PIO-Transmit トランザクション」を参照してください。

EvtSerCx2PioTransmitDrainFifo コールバック関数を定義するには、まず、定義するコールバック関数の種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数の種類のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システム用のドライバーを記述するための要件になります。

たとえば、 という名前MyPioTransmitDrainFifoEvtSerCx2PioTransmitDrainFifo コールバック関数を定義するには、次のコード例に示すように、EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO関数型を使用します。

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO  MyPioTransmitDrainFifo;

次に、コールバック関数を次のように実装します。

_Use_decl_annotations_
VOID
  MyPioTransmitDrainFifo(
    SERCX2PIOTRANSMIT  PioTransmit
    )
  {...}

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO関数型は、Sercx.h ヘッダー ファイルで定義されています。 コード分析ツールを実行するときにエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイル内のEVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「 KMDF ドライバーの関数ロール型を使用した関数の宣言」を参照してください。 Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 8.1以降で使用できます。
対象プラットフォーム デスクトップ
Header sercx.h
IRQL IRQL <= DISPATCH_LEVELで呼び出されます。

こちらもご覧ください

EvtSerCx2PioTransmitCancelDrainFifo

EvtSerCx2PioTransmitPurgeFifo

IRP_MJ_WRITE

SERCX2PIOTRANSMIT

SerCx2PioTransmitCreate

SerCx2PioTransmitDrainFifoComplete