テクニカル ドキュメント #3



Doc ID: 3
製品: WinDriver
Version: 11.10 およびそれ以降

Windows で連続 DMA バッファを事前に確保

WinDriver の DMA 関連 API で確保できる DMA バッファサイズの制限はしておりません。ただし、DMA バッファの確保が成功するかどうかは、その時のシステムリソース使用量に依存します。よって、早いうちにバッファの確保をすれば、成功する確率が高まります。
WinDriver v11.1 以降では、DMA 連続バッファ (host からデバイス方向、デバイスから host 方向の、いずれか、または双方) をブート時に確保するよう、Windows 用 INF ファイルに設定することが可能です。

下記に概要を示します。これにより、バッファ確保が成功する確率を上げております。
NOTE
host からデバイス方向のバッファおよび/またはデバイスから host 方向のバッファを確保します。

  1. 対象のデバイス用 INF ファイル中に、[UpdateRegistryDevice] レジストリ キーの下に、以下の行を追加してください。
    ; Host-to-device DMA buffer:
    HKR,, "DmaToDeviceBytes",0x00010001,0x100000   ; Buffer size, in bytes
    HKR,, "DmaToDeviceOptions",0x00010001,0x41 ; DMA flags (0x40=DMA_TO_DEVICE
    ; + 0x1=DMA_KERNEL_BUFFER_ALLOC)

    ; Device-to-host DMA buffer: HKR,, "DmaFromDeviceBytes",0x00010001,0x100000 ; Buffer size, in bytes
    HKR,, "DmaFromDeviceOptions",0x00010001,0x21 ; DMA flags (0x20=DMA_FROM_DEVICE
    ; + 0x1=DMA_KERNEL_BUFFER_ALLOC)
    NOTE
    DriverWizard で生成された対象のデバイスの INF ファイル、WinDriver の関連するサンプルのデバイスの INF ファイルには、既にこれらの行が含まれています — 従って、これらのファイルの関連する行のコメントを外すだけです (行の先頭の (';') を削除します)。

  2. バッファサイズを変更したり、オプションのマスクのフラグを追加したり、適宜対応してください。
    NOTE: 上記のオプションのマスクのフラグは必ず設定してください。

  3. コード中で、WDC_DMAContigBufLock() をコールする際、INF ファイルに事前確保バッファ設定と同じパラメータを指定してください。
    NOTE
    WDC_DMAContigBufLock() をコールする際、この関数に直接パラメータが渡されます。

    • host からデバイス方向のバッファの場合、dwDMABufSize パラメータが DmaToDeviceBytes のレジストリキーの値に設定されている必要があります。dwOptions マスクには DmaToDeviceOptions レジストリキーの値 (DMA_TO_DEVICEDMA_KERNEL_BUFFER_ALLOC (下記 NOTE 2 参照)) として設定されたフラグが含まれます。

    • デバイスから host 方向のバッファの場合、dwDMABufSize パラメータが DmaFromDeviceBytes のレジストリキーの値に設定されている必要があります。dwOptions マスクには DmaFromDeviceOptions レジストリキーの値 (DMA_FROM_DEVICEDMA_KERNEL_BUFFER_ALLOC (下記 NOTE 2 参照))として設定されたフラグが含まれます。
    NOTE
    1. INF ファイルで DmaToDeviceXXX の値を設定した場合、最初にコールした DMA_TO_DEVICE フラグ付加の WDC_DMAContigBufLock() で、予め確保した host からデバイス方向のバッファが使用されます。 INF ファイルで DmaFromDeviceXXX の値を設定した場合、最初にコールした DMA_FROM_DEVICE フラグ付加の WDC_DMAContigBufLock() で、予め確保したデバイスから host 方向のバッファが使用されます。

    2. WDC_DMAContigBufLock() を使用する場合、DMA_KERNEL_BUFFER_ALLOC フラグは関数が自動的に設定します。そのため、とくには設定する必要はありません。

    3. DMA オプションのフラグは、WinDriver\include\windrvr.h で定義されています。INF ファイル中で DmaXXXDeviceOptions レジストリキーの値に使用できる関連する値が、確認できます。フラグについては、WinDriver PCI のユーザーズマニュアルでも説明されています。

リソース不足によってバッファを予め確保することできなかった場合には、非ページプールのサイズを増やす必要があるかもしれません。ここから、バッファ用にメモリが割り当てられます。