AG903ライブラリリファレンス
内容インデックスホーム
前へ上へ次へ
DMAC

DMAコントローラ制御用ライブラリ

本モジュールは、以下の機能を提供します。

  • DMACの制御
  • リモードディスクリプタ領域の管理

 

  • DMACのディスクリプタとサイズについて
    • DMACの転送設定をディスクリプタといいます。プログラムは1つあるいは複数のディスクリプタを使って転送の設定を行います。
    • AG903_DMACMgrSetSimpleTrnsDescを使用した場合、ディスクリプタの内容は直接レジスタに書き込まれます。
    • AG903_DMACMgrSetDescListを使用した場合、ディスクリプタの内容はディスクリプタメモリに書き込まれます。ディスクリプタメモリは次の2つが存在します。
      • ローカルディスクリプタメモリ
        • アドレス:0xFD100000 (メモリ属性はDeviceとしてください)
        • エントリ数:32
      • リモートディスクリプタメモリ
        • アドレス:AG903_DMACMgrSetRemoteDescAddrで指定 (メモリ属性はキャッシュ不可としてください)
        • エントリ数:AG903_DMAC_RDD_ENTRY_NUMで指定
    • ディスクリプタメモリはローカルディスクリプタメモリから使われます。32エントリ分埋まった場合にリモートディスクリプタメモリが使用されます。

 

  • 複数のディスクリプタを使用する場合
    • AG903_DMACMgrSetDescListで渡すディスクリプタのnextの値に次のディスクリプタを設定してください。nextがNULLで終端を表します。
    • ディスクリプタの最大リンク数はAG903_DMAC_DESC_LINK_MAXで指定します。

  • 複数のディスクリプタを循環させる場合
    • 複数のディスクリプタを使用する場合で終端をNULLとせず、先頭のディスクリプタを設定するとディスクリプタが循環参照されます。

 

  • 終了割り込みのコールバック関数について
    • 終了割り込みのコールバック関数の型はvoid (*cb_term)(AG903_DMACMgrHandle* handle, AG903_DMACMgrDesc** desc, uint8_t* end)です。
    • 複数のディスクリプタを循環参照させている場合に限り第二引数descと第三引数endで次の指定が可能です。
    • desc:今転送が完了したディスクリプタを上書きする場合、新しいディスクリプタのアドレスを指定。
    • end:循環参照を終了させる場合、end=TRUEを指定。(今完了したディスクリプタのnextがNULLに書き換わります。)
    • cb_termでライブラリにディスクリプタを上書きさせる場合、descが指すディスクリプタは静的なメモリとし、次の終了割り込みがあるまで値を保持し続けてください。
    • 例)
      • 下図のようにディスクリプタが①~④で循環参照されているとします。
      • 今、ディスクリプタ①の転送終了で終了割り込みのコールバックがされたとします。(ディスクリプタ②が転送中。)
      • ディスクリプタ①の内容を書き換える場合はdescに新しいディスクリプタのアドレスを指定します。
      • end=TRUEとするとディスクリプタ①のnextがNULLに書き換わります。
        • これにより次にディスクリプタ①の内容が転送された後でDMA転送が停止します。
        • 即刻DMA転送を停止させたい場合はAG903_DMACMgrAbort関数を使用してください。
      • 特に変更なく循環参照を続ける場合はdesc=NULL、end=FALSEを指定してください。
      • 循環参照中のディスクリプタの更新はなるべく早く速やかに完了して下さい。

注意事項

  1. 本モジュールはINTMgrに依存しています。使用前にINTMgrを初期化してください。
  2. メモリキャッシュの整合は必要に応じ転送の前後でアプリケーションで行ってください。

制限事項

  1. 本モジュールはシステムレジスタへのアクセスはサポートしません。
    • コントローラに対するクロックの供給やペリフェラルインターフェース選択については「AX51903仕様書」を参照してください。
  2. ローカルディスクリプタメモリのBase Addressは0xFD100000で固定です。

本モジュールが動作するために次のライブラリが必要です。

簡易ディスクリプタによる転送シーケンス(画像をクリックして拡大) 

 

<シーケンス説明>

  1. ハンドル取得。「AG903_DMACMgrGetHandle
  2. コールバック関数登録。「AG903_DMACMgrSetIntCallback
  3. 簡易転送用ディスクリプタ設定。「AG903_DMACMgrSetSimpleTrnsDesc
  4. DMAC実行。「AG903_DMACMgrEnable
  5. 転送完了でTerm割込み発生。(コールバック通知)
  6. ハンドル解放。「AG903_DMACMgrReleaseHandle

 

ディスクリプタリストによる転送シーケンス(画像をクリックして拡大) 

 

<シーケンス説明>

  1. ハンドル取得。「AG903_DMACMgrGetHandle
  2. コールバック関数登録。「AG903_DMACMgrSetIntCallback
  3. リモードディスクリプタ領域アドレス指定。「AG903_DMACMgrSetRemoteDescAddr
    • リモードディスクリプタ領域を使用しない場合は省略可能。
  4. 転送用ディスクリプタ設定。「AG903_DMACMgrSetDescList
  5. DMAC実行。「AG903_DMACMgrEnable
  6. ディスクリプタ転送完了でTerm割込み発生。(コールバック通知)
    • 設定したリスト数分コールバック。(TCMsk=0の場合)
  7. ハンドル解放。「AG903_DMACMgrReleaseHandle

 

ディスクリプタ設定例

  1. 転送元アドレスから転送先アドレスへの単純転送例
AG903_DMACMgrConfig config;
AG903_DMACMgrDesc desc;
config.val = 0;
desc.Ctrl.val = 0;
desc.SrcAddr = (uint32_t)srcaddr;
desc.DstAddr = (uint32_t)dstaddr;
desc.Trns.val = size;
desc.Stride.val = 0;
desc.next = NULL;
AG903_DMACMgrSetDescList(handle, &config, &desc, 1);
【動作】
  1. srcaddrから dstaddrに size分のデータが転送(コピー)されます。
 
  1. 転送先をペリフェラルのレジスタにした場合の例
AG903_DMACMgrConfig config;
AG903_DMACMgrDesc desc;
config.val = 0;
config.st.DstHEn = 1;
config.st.DstRS = source_select;
desc.Ctrl.val = 0;
desc.Ctrl.st.DstCtrl = 2; /* Fixed */
desc.SrcAddr = (uint32_t)srcaddr;
desc.DstAddr = (uint32_t)regaddr;
desc.Trns.val = size;
desc.Stride.val = 0;
desc.next = NULL;
AG903_DMACMgrSetDescList(handle, &config, &desc, 1);
【動作】
  1. srcaddrから regaddr に size分のデータが転送されます。
  2. desc.Ctrl.st.DstCtrl = 2としているので転送先アドレスは固定です。(インクリメントされません。)
  3. source_selectはハンドシェイクに使用するdma_req/dma_ackのペアを指定します。システムレジスタでペリフェラルインターフェース0~15のいずれかを設定し、その番号(0~15)を指定してください。
システムレジスタについては『AX51903仕様書』を参照してください。 
名前 
説明 
アプリケーションにDMAC制御のためのインタフェースを提供します。 
マネージャに DMACレジスタアクセスのためのインタフェースを提供します。 
 
Copyright (c) 2017-2025 Axell Corporation. All rights reserved.