次の方法で共有


SerCx2 システム-DMA-受信トランザクション

一部のシリアル コントローラー ドライバーは、システム DMA コントローラーを使用する受信トランザクションのサポートを実装します。 このようなサポートは省略可能ですが、長いデータ転送のためにプログラムされた I/O (PIO) を使用する必要性からメイン プロセッサを解放することで、パフォーマンスを向上させることができます。 SerCx2 は、システム DMA コントローラーを設定し、シリアル コントローラー ドライバーの代わりに必要な DMA 転送を開始することによって、システム DMA 受信トランザクションを実行します。

シリアル コントローラー ドライバーは、システム DMA 受信オブジェクトを作成するときに、SerCx2 がシステム DMA 受信トランザクションの システム DMA アダプターを設定するために使用するパラメーターを提供します。

システム DMA 受信トランザクションの開始前に、シリアル コントローラー ドライバーには、トランザクションに必要なシリアル コントローラー ハードウェアまたは DMA アダプターの特別なセットアップを行うオプションがあります。 トランザクションが完了すると、ドライバーは必要に応じて、シリアル コントローラーのハードウェア状態のクリーンアップを実行できます。

システムDMA受信オブジェクトの作成

SerCx2 がシリアル コントローラー ドライバーの EvtSerCx2SystemDmaReceiveXxx** 関数のいずれかを呼び出す前に、ドライバーは SerCx2SystemDmaReceiveCreate メソッドを呼び出して、これらの関数を SerCx2 に登録する必要があります。 このメソッドは、入力パラメーターとして、ドライバーの EvtSerCx2SystemDmaReceiveXxx** 関数へのポインターを含む SERCX2_SYSTEM_DMA_RECEIVE_CONFIG 構造体へのポインターを受け取ります。

オプションとして、ドライバーは次の関数の一部またはすべてを実装できます。

オプションとして、ドライバーは次の 2 つの関数を実装できます。

上記の一覧の 2 つの関数のいずれかを実装するドライバーは、両方を実装する必要があります。

SerCx2SystemDmaReceiveCreate メソッドは、システム DMA 受信オブジェクトを作成し、呼び出し元ドライバーにこのオブジェクトへのSERCX2SYSTEMDMARECEIVE ハンドルを提供します。 ドライバーの EvtSerCx2SystemDmaReceiveXxx** 関数はすべて、このハンドルを最初のパラメーターとして受け取ります。 次の SerCx2 メソッドは、このハンドルを最初のパラメーターとして受け取ります。

ハードウェアの初期化とクリーンアップ

一部のシリアル コントローラー ドライバーでは、システム DMA 受信トランザクションの開始時にシリアル コントローラー ハードウェアを初期化したり、トランザクションの終了時にシリアル コントローラーのハードウェア状態をクリーンアップしたりする必要があります。

ドライバーが EvtSerCx2SystemDmaReceiveInitializeTransaction イベント コールバック関数を実装する場合、SerCx2 はこの関数を呼び出して、トランザクションで最初の DMA 転送を開始する前にシリアル コントローラーを初期化します。 EvtSerCx2SystemDmaReceiveInitializeTransaction 関数を実装する場合は、SerCx2SystemDmaReceiveInitializeTransactionComplete メソッドを呼び出して、ドライバーがシリアル コントローラーの初期化を完了したときに SerCx2 に通知する必要があります。

ドライバーが EvtSerCx2SystemDmaReceiveCleanupTransaction イベント コールバック関数を実装する場合、SerCx2 はこの関数を呼び出して、トランザクションでの最終的な DMA 転送の終了後にハードウェアの状態をクリーンアップします。 EvtSerCx2SystemDmaReceiveInitializeTransaction 関数を実装する場合は、SerCx2SystemDmaReceiveCleanupTransactionComplete メソッドを呼び出して、ドライバーがシリアル コントローラーのクリーンアップを完了したときに SerCx2 に通知する必要があります。

システム DMA 受信トランザクションの開始時にシステム DMA コントローラーの特別な構成を行う必要があるシリアル コントローラー ドライバーは、EvtSerCx2SystemDmaReceiveConfigureDmaChannel イベント コールバック関数を実装する必要があります。 この関数は、SerCx2SystemDmaReceiveGetDmaEnabler メソッドを呼び出して、トランザクションに使用されるシステム DMA アダプターの DMA イネーブラーを取得できます。 SerCx2 は、トランザクションで最初の DMA 転送を開始する前に、この関数を呼び出します。 DMA 有効化機能の詳細については、「DMA トランザクションの有効化」を参照してください。

新着データ通知

オプションとして、シリアル コントローラー ドライバーは EvtSerCx2SystemDmaReceiveEnableNewDataNotification イベント コールバック関数を実装できます。 実装されている場合、SerCx2 はこの関数を使用して、システム DMA 受信トランザクションとして処理される読み取り要求の処理中の間隔タイムアウトを効率的に管理します。

シリアル コントローラーが受信した 2 つの連続するバイト間の間隔が、クライアントが指定した最大時間を超えると、間隔タイムアウトが発生します。 周辺機器ドライバーが SerCx2 に読み取り要求を送信した後、シリアル接続された周辺機器から少なくとも 1 バイトのデータを受信するまで、間隔タイムアウトは発生できません。 読み取り要求の到着から周辺機器からのデータの最初のバイトの受信までの時間は、最初のバイトの受信後に読み取り要求の残りのデータを受信するために必要な時間よりも大幅に長くなる可能性があります。 詳細については、SERIAL_TIMEOUTSをご覧ください。

SerCx2 は、EvtSerCx2SystemDmaReceiveEnableNewDataNotification 関数を呼び出して実装されている場合は、新しいデータ通知を有効にします。 この通知が有効になっていて、シリアル コントローラーが周辺機器から 1 つ以上の新しいデータを受信する場合、または既に受信 FIFO にデータがある場合、シリアル コントローラー ドライバーは SerCx2SystemDmaReceiveNewDataNotification メソッドを呼び出して SerCx2 に通知する必要があります。

可能な間隔タイムアウトを検出するために、SerCx2 は定期的にシステム DMA アダプターの ReadDmaCounter ルーチンを呼び出して、前の間隔でデータが受信されたかどうかをチェックします。 SerCx2 がデータの最初のバイトの受信を検出する方法は、シリアル コントローラー ドライバーが EvtSerCx2SystemDmaReceiveEnableNewDataNotification 関数を実装するかどうかによって異なります。 この関数が実装されている場合、SerCx2 は関数を呼び出して新しいデータ通知を有効にし、データの最初のバイトを受信するとドライバーによって通知されます。 それ以外の場合、SerCx2 は ReadDmaCounter を定期的に呼び出して最初のバイトの受信を検出し、これらの呼び出しを行うためにプロセッサを定期的にスリープ解除する必要がある場合があります。 したがって、EvtSerCx2SystemDmaReceiveEnableNewDataNotification 関数を実装するドライバーは、頻繁にスリープ解除するプロセッサを必要としないことによって電力消費量を削減できます。

: SerCx2 は、 システム DMA 受信トランザクションおよびシステム DMA 送信トランザクション中のタイムアウトを監視するために、システム DMA アダプターの ReadDmaCounter ルーチンに依存します。 ハードウェア抽象化レイヤー (HAL) は、シリアル コントローラーとの間でデータを転送するために使用されるシステム DMA コントローラーの完全に機能する ReadDmaCounter ルーチンを実装する必要があります。

システム DMA 受信トランザクションの新しいデータ通知をサポートするシリアル コントローラー ドライバーでは、 EvtSerCx2SystemDmaReceiveCancelNewDataNotification イベント コールバック関数を実装して、SerCx2 が有効な新しいデータ通知を取り消すことができるようにする必要があります。 保留中の読み取り要求が取り消されたとき、または合計タイムアウトが発生したときに新しいデータ通知が有効になっている場合、SerCx2 は EvtSerCx2SystemDmaReceiveCancelNewDataNotification 関数を呼び出して通知を取り消します。 この関数が保留中の通知を正常に取り消すと、TRUE が返されます。 TRUE の戻り値は、シリアル コントローラー ドライバーが SerCx2SystemDmaReceiveNewDataNotification を呼び出さないことを保証します。 FALSE の戻り値は、コントローラー ドライバーが既に呼び出されているか、SerCx2SystemDmaReceiveNewDataNotification をすぐに呼び出す予定であることを示します。 合計タイムアウトの詳細については、「SERIAL_TIMEOUTS」を参照してください。