DMAコントローラ
SOLID-OSでは、DMAに関わるAPIを提供しています。
DMA関連のAPIを使用するには、solid_dmac.h
をインクルードしてください。
#include "solid_dmac.h"
データタイプ
SOLID_DMAC_DEVICEINFO
-
typedef struct _SOLID_DMAC_DEVICEINFO_ SOLID_DMAC_DEVICEINFO
-
struct _SOLID_DMAC_DEVICEINFO_
説明
DMAコントローラの情報用の構造体
定義
typedef struct _SOLID_DMAC_DEVICEINFO_ { uint32_t maxChannel; uint32_t maxTransferWidth; uint32_t maxTransferSize; } SOLID_DMAC_DEVICEINFO;
メンバー
-
uint32_t maxChannel
チャネルの最大数
-
uint32_t maxTransferWidth
最大転送幅 (単位:byte)
-
uint32_t maxTransferSize
最大転送量 (単位:byte)
-
uint32_t maxChannel
SOLID_DMAC_BUF
SOLID_DMAC_BUFFER
-
typedef struct _SOLID_DMAC_BUFFER_ SOLID_DMAC_BUFFER
-
struct _SOLID_DMAC_BUFFER_
説明
DMAコントローラの情報用の構造体
定義
typedef struct _SOLID_DMAC_BUFFER_ { int bufType; // バッファタイプ uint32_t width; // 転送幅(byte) uint32_t size; // 転送量(byte) SOLID_ADDRESS addr; // バッファのアドレス SOLID_PHYADDRESS phyAddr; // バッファの物理アドレス (SOLID側で設定) } SOLID_DMAC_BUFFER;
メンバー
-
int bufType
バッファタイプ
SOLID_DMAC_BUF_MEMORY
またはSOLID_DMAC_BUF_DEVICE
-
uint32_t width
転送幅 (単位:byte)
-
uint32_t size
転送量 (単位:byte)
-
SOLID_ADDRESS addr
バッファの先頭アドレス
-
SOLID_PHYADDRESS phyAddr
バッファの物理アドレス (SOLID側で設定)
-
int bufType
SOLID_DMAC_TRANSACTION
-
typedef struct _SOLID_DMAC_TRANSACTION_ SOLID_DMAC_TRANSACTION
-
struct _SOLID_DMAC_TRANSACTION_
説明
DMA転送情報用の構造体
定義
typedef struct _SOLID_DMAC_TRANSACTION_ { struct _SOLID_DMAC_TRANSACTION_ * pNext; SOLID_DMAC_BUFFER src; SOLID_DMAC_BUFFER dest; int configIdx; } SOLID_DMAC_TRANSACTION;
メンバー
-
struct _SOLID_DMAC_TRANSACTION_ *pNext
要求のキューイング用(SOLID内部で使用)
-
SOLID_DMAC_BUFFER src
転送元バッファ情報
-
SOLID_DMAC_BUFFER dest
転送先バッファ情報
-
int configIdx
DMA設定のインデックス番号, -1はオート設定
-
struct _SOLID_DMAC_TRANSACTION_ *pNext
SOLID_DMAC_BUFSTATE
-
SOLID_DMAC_BUFSTATE_ONESHOT
-
SOLID_DMAC_BUFSTATE_REUSE
DMA転送情報用バッファの設定
定数
名前
値
説明
SOLID_DMAC_BUFSTATE_ONESHOT
0
情報転送用バッファは終了/中断時にキューから解放する
SOLID_DMAC_BUFSTATE_REUSE
1
情報転送用バッファは終了/中断時にキューから解放しない (明示的な
SOLID_DMAC_ClearTransaction
の呼び出しが必要)
SOLID_DMAC_CALLBACK_STATUS
SOLID_DMAC_CALLBACK
-
typedef void (*SOLID_DMAC_CALLBACK)(void*, int, int, SOLID_DMAC_TRANSACTION*)
説明
DMA転送終了時のコールバック関数
定義
typedef void (*SOLID_DMAC_CALLBACK)(void* param, int ch, int status, SOLID_DMAC_TRANSACTION* pTx)
- Param param:
コールバック登録時に設定したparam
- Param ch:
転送の終了したチャンネル
- Param status:
DMA転送ステータス(
SOLID_DMAC_CALLBACK_STATUS_SUCCESS
,SOLID_DMAC_CALLBACK_STATUS_FAILED
,SOLID_DMAC_CALLBACK_STATUS_ABORTED
)- Param pTx:
DMA転送情報
API
SOLID_DMAC_GetInfo
-
int SOLID_DMAC_GetInfo(SOLID_DMAC_DEVICEINFO **ppInfo)
DMAコントローラの情報を取得します。
- パラメータ:
ppInfo -- デバイス情報の格納先
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_Alloc
-
int SOLID_DMAC_Alloc(int ch)
DMAチャネルを確保します。
- パラメータ:
ch -- 確保するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_Free
-
int SOLID_DMAC_Free(int ch)
確保したDMAチャネルを解放します。
- パラメータ:
ch -- 解放するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_SetBufState
-
int SOLID_DMAC_SetBufState(int ch, int state)
DMAの情報転送用バッファの設定を変更する
- パラメータ:
ch -- 設定するチャネル番号
state --
SOLID_DMAC_BUFSTATE_ONESHOT
またはSOLID_DMAC_BUFSTATE_REUSE
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_GetBufState
-
int SOLID_DMAC_GetBufState(int ch, int *state)
DMAの情報転送用バッファの設定を取得する
- パラメータ:
ch -- 設定するチャネル番号
state -- バッファ設定の保存先
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_AddTransaction
-
int SOLID_DMAC_AddTransaction(int ch, SOLID_DMAC_TRANSACTION *pTx)
DMAの転送要求を追加します。
このAPIでは要求のキューイングのみ行い、実際の転送は
SOLID_DMAC_Start
で開始します- パラメータ:
ch -- 使用するチャネル番号
pTx -- DMA転送情報
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_GetTransaction
-
int SOLID_DMAC_GetTransaction(int ch, SOLID_DMAC_TRANSACTION **ppTx)
キューイングされたDMAの転送要求情報を取得します。
- パラメータ:
ch -- 使用するチャネル番号
ppTx -- DMA転送情報へのポインタの格納先
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_ClearTransaction
-
int SOLID_DMAC_ClearTransaction(int ch)
DMAの転送要求をクリアします。
- パラメータ:
ch -- 使用するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_Start
-
int SOLID_DMAC_Start(int ch)
DMA転送をスタートします。
- パラメータ:
ch -- 使用するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_Abort
-
int SOLID_DMAC_Abort(int ch)
実行中のDMA転送を中断します。
- パラメータ:
ch -- 使用するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_IsFinished
-
int SOLID_DMAC_IsFinished(int ch)
DMA転送が実行中かどうか確認します。
- パラメータ:
ch -- 使用するチャネル番号
- 戻り値:
0: DMA転送実行中
1: DMA転送は終了
それ以外: エラー
SOLID_DMAC_SetCallback
-
int SOLID_DMAC_SetCallback(int ch, SOLID_DMAC_CALLBACK pCallBack, void *param)
DMA転送終了時のコールバックを設定します。
- パラメータ:
ch -- 設定するチャネル番号
pCallBack -- コールバック関数
param -- コールバック関数に渡す引数
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_Notify
-
void SOLID_DMAC_Notify(int ch, int status)
DMA転送の終了イベントを通知します。
これはBSP側のDMAコントローラの実装側で使用します。
- パラメータ:
ch -- 通知するチャネル番号
status -- DMA転送ステータス -
SOLID_DMAC_CALLBACK_STATUS_SUCCESS
-SOLID_DMAC_CALLBACK_STATUS_FAILED
-SOLID_DMAC_CALLBACK_STATUS_ABORTED
SOLID_DMAC_GetConfigIdx
-
int SOLID_DMAC_GetConfigIdx(const char *pName, int *pConfigIdx)
DMA設定のインデックスを取得します。
このAPIを使って得られた番号を、
SOLID_DMAC_TRANSACTION
のconfigIdxに指定してください。- パラメータ:
pName -- DMA設定の名称 (文字列、NULL終端)
pConfigIdx -- インデックス番号の格納先
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_DMAC_MaintBuffer
-
int SOLID_DMAC_MaintBuffer(SOLID_DMAC_BUFFER *pBuf, int bSrc)
DMA転送用にバッファのアドレス解決やキャッシュのメンテナンスを行います。
これはDMAコントローラの操作を手動で行い、バッファの処理だけをコアサービスで 行いたい場合に使用します。
SOLID_DMAC_AddTransaction
で設定するバッファは、 コアサービス内部でこの関数を呼び出すため、この関数を使う必要はありません。- パラメータ:
pBuf -- DMA用バッファ
bSrc -- 転送元/先設定 1: 転送元としてバッファを処理 0: 転送先としてバッファを処理
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
要実装関数
DMAC関連の要実装関数の定義は、impl_dmac.h
にあります。
#include "impl_dmac.h"
DMACに関する要実装関数は、 IMPL_DMAC_GetConfigIdx
を除き、
割り込み禁止状態(CPSRのIビットが1)で呼び出されます。
IMPL_DMAC_Init
-
int IMPL_DMAC_Init(SOLID_DMAC_DEVICEINFO *pDevInfo)
- DMAコントローラを初期化します。DMAコントローラの初期化を行い、pDevInfoにDMAコントローラの情報を格納してください。DMAコントローラをサポートしない場合は、
SOLID_ERR_NOTSUPPORTED
を返してください。- パラメータ:
pDevInfo -- DMAコントロ―ラ情報の格納先
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
IMPL_DMAC_Use
-
int IMPL_DMAC_Use(int ch)
- DMAのチャネルの占有を開始します。指定されたチャネルが使用できない場合、エラー値を返してください。
- パラメータ:
ch -- 占有するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
IMPL_DMAC_UnUse
-
int IMPL_DMAC_UnUse(int ch)
DMAのチャネル占有を終了します。
- パラメータ:
ch -- 終了するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
IMPL_DMAC_StartTransfer
-
int IMPL_DMAC_StartTransfer(int ch, SOLID_DMAC_TRANSACTION *pTx)
- DMA転送を開始します。DMA転送をセットしてください。pTxには複数の転送情報が入っている可能性があります。セットできた転送分を戻り値として返してください。
- パラメータ:
ch -- 開始するチャネル番号
pTx -- 転送情報へのポインタ
- 戻り値:
>1: 正常終了, 数はDMA転送をセットできた転送情報の数
それ以外: エラー
IMPL_DMAC_AbortTransfer
-
int IMPL_DMAC_AbortTransfer(int ch)
- 実行中のDMA転送を中断します。転送の中断が終了したら、
SOLID_DMAC_Notify
にて、中断が完了した事を通知してください。- パラメータ:
ch -- 中断するチャネル番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
IMPL_DMAC_GetConfigIdx
-
int IMPL_DMAC_GetConfigIdx(const char *pName, int *pConfigIdx)
- DMA設定のインデックスを取得します。DMA設定の名称から、該当するインデックス番号をpConfigIdxに格納してください。該当する設定が見つからない場合は、エラー値として
SOLID_ERR_NOTFOUND
を返してください。- パラメータ:
pName -- DMA設定の名称 (文字列、NULL終端)
pConfigIdx -- インデックス番号の格納先
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー