#include <twl/mi.h>typedef struct _MINDmaConfig
{
u32 intervalTimer;
u32 prescaler;
u32 blockWord;
u32 wordCount;
}
MINDmaConfig;
MINDmaConfig 構造体のメンバーは以下の通りです。
| メンバ名 | 説明 | 関係するレジスタ | 初期値 |
|---|---|---|---|
intervalTimer |
ブロック転送のインターバルタイマーです。 | DMAxBCNT の d15-0 | MI_NDMA_NO_INTERVAL |
prescaler |
ブロック転送インターバルタイマーのプリスケーラです。 | DMAxBCNT の d17-16 | MI_NDMA_INTERVAL_PS_1 |
blockWord |
ブロック転送ワード数です。 | DMAx_CNT の d19-16 | MI_NDMA_BWORD_1 |
wordCount |
転送ワード数です。 | DMAxWCNT | MI_NDMA_AT_A_TIME |
MINDmaConfig は新規DMAの操作で使用される、DMAの動作を指定するための構造体です。
新規DMAの動作を指定するパラメータは数多いため、動作の度に全てを指定していると命令の記述が長くなり非常に煩雑です。そこで、複数のDMA動作を行っても大きく変わらないであろうと思われる部分を MINDmaConfig 構造体にまとめ、DMA動作のときにはこの構造体を参照することでアプリケーション側の負担を減らします。
4つの新規DMAはそれぞれ内部で MINDmaConfig 構造体を保持しています。DMA動作の際には、
(1) 内部で保持するMINDmaConfig構造体を参照する
(2) アプリケーションで指定するMINDmaConfig構造体を参照する
のどちらかの動作を選ぶことが出来ます。
内部で保持する MINDmaConfig 構造体を設定する関数として、
4つの内部構造体を初期化するMI_InitNDmaConfig()
指定のMINDmaConfig構造体を内部構造体にコピーするMI_SetNDmaConfig()
特定の内部構造体の Intarval 情報を指定するMI_SetNDmaInterval()
特定の内部構造体の BlockWord 情報を指定するMI_SetNDmaBlockWord()
特定の内部構造体の WordCount 情報を指定するMI_SetNDmaWordCount()
があります。また、内部の MINDmaConfig 構造体の情報を取得する関数として、
内部構造体を指定の領域にコピーするMI_GetNDmaConfig()
特定の内部構造体の Interval Timer 情報を取得するMI_GetNDmaIntervalTimer()
特定の内部構造体の Interval Prescaler 情報を取得するMI_GetNDmaIntervalPrescaler()
特定の内部構造体の BlockWord 情報を取得するMI_GetNDmaBlockWord()
特定の内部構造体の WordCount 情報を取得するMI_GetNDmaWordCount()
があります。 設定関数の「Interval 情報」は Interval Timer 情報と Interval Prescaler 情報のことで、両方を同時に設定します。取得関数ではこの2つを個別に取得する関数が用意されています。
内部構造体の初期化は OS_Init() で行われますので最初にアプリケーションで行う必要はありません。必要があれば呼び出してください。
内部構造体を変化させたくないが、デフォルトの設定とは違うパラメータで新規DMAを行いたい場合は、(1) 内部の MINDmaConfig 構造体をコピしてくる (2) コピーしたMINDmaConfig 構造体のメンバーを書き換える (3) その構造体を指定して新規DMA を行う 、という手順を踏んでください。
ライブラリ内部構造体の値自体を変更したい場合は、コピーして必要部分を書き換えた
MINDmaConfig 構造体をライブラリに設定するか、MI_SetNDmaInterval() などの関数で必要なパラメータを直接書き換えてください。
(例) 新規DMA1番の設定をコピーして、Interval情報(Interval Timer 情報と Interval
Prescaler 情報) を書き換えてそれを改めて新規DMA 1番の config として設定します。
MINDmaConfig config;
//---- get config
MI_GetNDmaConfig( 1, &config );
//---- change config values
config.intervalTimer = 0x100;
config.prescaler = MI_NDMA_INTERVAL_PS_16;
//---- set config
MI_SetNDmaConfig( 1, &config );
MI_InitNDmaConfig, MI_SetNDmaConfig
2008/01/22 初版