# MINDmaConfig 構造体

## 定義

  `#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 初版