SerCx2 の I/O トランザクションの概要
SerCx2 は、1 つ以上の I/O トランザクションをシリアル コントローラー ドライバーに発行することにより、クライアントからの読み取りまたは書き込み要求を処理します。 このドライバーは、各トランザクションを、リクエスト内のシリアル コントローラーとデータ バッファーの間でデータを転送する自己完結型 I/O 操作として処理します。
システム オン チップ (SoC) 集積回路には、同じプリント基板にはんだ付けされた他の集積回路との高速シリアル通信を可能にするシリアル コントローラー (UART) が組み込まれていることがよくあります。 これらの SoC 上のプロセッサは、プログラム I/O (PIO) を使用して、これらのシリアル コントローラーのメモリ マップド データ レジスタとの間でデータを直接転送できます。 さらに、これらの SoC は通常、シリアル コントローラーとメモリ間でデータを移動するための高度な DMA ハードウェアを提供します。
PIO は短いデータ転送には十分かもしれませんが、高いデータレートでの長時間の転送に PIO を使用すると、プロセッサに過大な負担をかけます。 DMA は、このような転送をプロセッサからオフロードするために必要です。
I/Oトランザクションの種類
SerCx2 は、次の 3 つの一般的なタイプの I/O トランザクションを定義します:
- PIO
- システム DMA
- Custom
すべてのシリアル コントローラー ドライバーは、PIO を使用してデータを転送する I/O トランザクションをサポートする必要があります。 シリアル コントローラー ドライバーは、シリアル コントローラーと関連ハードウェアの機能に応じて、システム DMA またはカスタム データ転送メカニズムを使用する I/O トランザクションもサポートする場合があります。 ドライバーは、システム DMA トランザクションまたはカスタム トランザクションのいずれかをサポートできますが、両方をサポートすることはできません。
シリアル コントローラー ハードウェアでサポートされる I/O トランザクションのタイプごとに、シリアル コントローラー ドライバーはサポート パッケージを SerCx2 に登録します。 このパッケージには、関連するハードウェア機能が記述されおり、このタイプの I/O トランザクションを開始および制御するために SerCx2 が呼び出すドライバー実装のイベント コールバック関数のセットが含まれています。
シリアル コントローラーがシステム DMA コントローラーを使用できる場合 (他のデバイスと共有される可能性があります)、シリアル コントローラー ドライバーはシステム DMA トランザクションをサポートする可能性があります。 これらのトランザクションの場合、SerCx2 はシステム DMA コントローラをセットアップし、DMA 転送を開始します。 シリアル コントローラー ドライバーは、システム DMA トランザクション中には比較的小さな作業を行います。
シリアル コントローラーにデータ転送用のカスタム ハードウェア メカニズムがある場合、シリアル コントローラー ドライバーは、このメカニズムを使用するカスタム トランザクションをサポートする可能性があります。 たとえば、シリアル コントローラー ハードウェアにバスマスター DMA 機能が組み込まれている場合、シリアル コントローラー ドライバーはカスタム トランザクションをサポートして、この機能を SerCx2 で利用できるようにすることができます。
カスタム トランザクションは、サポートできるデータ転送メカニズムの種類に関して柔軟です。 しかし、これらのトランザクションは、PIOトランザクションやシステム DMA トランザクションよりも実装が難しいです。 カスタム トランザクションをサポートするには、通常、シリアル コントローラー ドライバーは、データ転送に使用されるハードウェアをセットアップして初期化する必要があります。 さらに、関連するカスタム受信またはカスタム送信トランザクションが終了する前に保留中の読み取りまたは書き込み要求がキャンセルされた場合、ドライバーはトランザクションを終了して要求を完了する必要があります。
各 I/O トランザクションは比較的単純な操作です。 I/O トランザクションは、シリアル コントローラーからデータを読み取るか、コントローラーにデータを書き込みます。読み取りと書き込みが混在することはありません。 I/O トランザクションは単一の転送モード (PIO、システム DMA、またはカスタム) を使用し、転送モードを混合することはありません。
SerCx2 は、読み取りまたは書き込み要求を満たすために PIO と DMA のどちらを使用するかをインテリジェントに決定できます。 たとえば、SerCx2 は、非常に短い読み取りまたは書き込み要求を PIO トランザクションとしてシリアル コントローラー ドライバーに提示することを選択する場合があります。 または、SerCx2 は、より長い読み取りまたは書き込み要求を DMA トランザクションとしてシリアル コントローラーに提示する可能性があります。
読み取りまたは書き込みリクエストを複数のトランザクションに分割する
システム DMA コントローラによっては、SerCx2 が長い読み取りまたは書き込み要求を 2 つ以上の I/O トランザクションに分割する必要がある制限がある場合があります。 たとえば、システム DMA コントローラが DMA 転送をメモリ内の偶数バイト境界で開始および終了する必要があるが、読み取りリクエストのデータ バッファが奇数バイト境界で開始および終了する場合、SerCx2 は PIO を使用して最初と最後のバイトをメモリに転送する可能性があります。バッファに保存し、システム DMA を使用して最初のバイトと最後のバイトの間のすべてのデータを転送します。 この例では、SerCx2 は、次の 3 つの I/O トランザクションを、示されている順序でシリアル コントローラー ドライバーに発行します。
- 最初のバイトの PIO 受信トランザクション。
- 中間バイトのシステム DMA 受信トランザクション。
- 最後のバイトの PIO 受信トランザクション。
同様に、カスタムデータ転送メカニズムがカスタム送信トランザクションをメモリ上の任意のバイト境界で開始および終了できるが、書き込み要求のバッファサイズがカスタム送信トランザクションの最大転送長を超える場合、SerCx2 は書き込み要求を 2 つ (またはそれ以上) のカスタム送信トランザクションに分割し、各トランザクションは最大転送長を超えないようにします。
SerCx2 が読み取りまたは書き込みリクエストを 2 つ以上の I/O トランザクションに分割する必要がある場合、シリアル コントローラー ドライバーはこれらのトランザクション相互およびリクエストとの関係を安全に無視できます。 SerCx2 はトランザクションをシリアル化して、データが正しい順序で送受信されることを保証します。
シリアル コントローラー ドライバーがシステム DMA トランザクションまたはカスタム トランザクションをサポートするために一連のコールバック関数を登録するとき、ドライバーはこれらのトランザクションを実行するハードウェアの機能を記述するパラメーター値を提供します。 たとえば、システム DMA トランザクションの場合、パラメータにはアライメント要件、およびシステム DMA コントローラがサポートする最小および最大転送長が含まれます。 SerCx2 はこれらのパラメータを使用して、読み取りまたは書き込みリクエストを PIO トランザクションとして処理するかシステム DMA トランザクションとして処理するか、およびリクエストを 2 つ以上の I/O トランザクションに分割するかどうかを決定します。
しかし、シリアル コントローラーには、シリアル コントローラー ドライバーが SerCx2 に提供するパラメーターでは適切に説明できない特殊なハードウェア機能がある場合があります。 したがって、ドライバーは、読み取りまたは書き込み要求を 1 つ以上の I/O トランザクションに分割する方法について、SerCx2 よりも適切な決定を下すことを可能にするハードウェア依存の情報にアクセスできる可能性があります。 オプションとして、このようなドライバーは EvtSerCx2SelectNextReceiveTransactionType および EvtSerCx2SelectNextTransmitTransactionType イベント コールバック関数を実装できます。 SerCx2 は、これらの関数が実装されている場合は呼び出して、読み取りまたは書き込み要求を満たすためにどの I/O トランザクションを使用するかをドライバーに決定させます。