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

説明

DMAコントローラの情報用の構造体

定義

typedef struct _SOLID_DMAC_DEVICEINFO_ {
    uint32_t maxChannel;
    uint32_t maxTransferWidth;
    uint32_t maxTransferSize;
} SOLID_DMAC_DEVICEINFO;

メンバー

maxChannel

チャネルの最大数

maxTransferWidth

最大転送幅 (単位:byte)

maxTransferSize

最大転送量 (単位:byte)

SOLID_DMAC_BUF

SOLID_DMAC_BUF_MEMORY
SOLID_DMAC_BUF_DEVICE

DMA用バッファの種類

定数

名前

説明

SOLID_DMAC_BUF_MEMORY

0

バッファタイプはメモリ (転送時にアドレスをインクリメントする)

SOLID_DMAC_BUF_DEVICE

1

バッファタイプはデバイス (転送時にアドレスは固定)

SOLID_DMAC_BUFFER

typedef struct _SOLID_DMAC_BUFFER_ 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;

メンバー

bufType

バッファタイプ SOLID_DMAC_BUF_MEMORY または SOLID_DMAC_BUF_DEVICE

width

転送幅 (単位:byte)

size

転送量 (単位:byte)

addr

バッファの先頭アドレス

phyAddr

バッファの物理アドレス (SOLID側で設定)

SOLID_DMAC_TRANSACTION

typedef struct _SOLID_DMAC_TRANSACTION_ 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;

メンバー

pNext

要求のキューイング用(SOLID内部で使用)

src

転送元バッファ情報

dest

転送先バッファ情報

configIdx

DMA設定のインデックス番号, -1はオート設定

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_STATUS_SUCCESS
SOLID_DMAC_CALLBACK_STATUS_FAILED
SOLID_DMAC_CALLBACK_STATUS_ABORTED

DMA転送ステータス

定数

名前

説明

SOLID_DMAC_CALLBACK_STATUS_SUCCESS

0

転送が正常に終了した

SOLID_DMAC_CALLBACK_STATUS_FAILED

1

何らかの要因により、転送が失敗した

SOLID_DMAC_CALLBACK_STATUS_ABORTED

2

中断要求により、転送が中断された

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

ch

転送の終了したチャンネル

status

DMA転送ステータス( SOLID_DMAC_CALLBACK_STATUS_SUCCESS, SOLID_DMAC_CALLBACK_STATUS_FAILED, SOLID_DMAC_CALLBACK_STATUS_ABORTED )

API

SOLID_DMAC_GetInfo

int SOLID_DMAC_GetInfo(SOLID_DMAC_DEVICEINFO **ppInfo)

DMAコントローラの情報を取得します。

パラメータ

ppInfo -- デバイス情報の格納先

戻り値

SOLID_DMAC_Alloc

int SOLID_DMAC_Alloc(int ch)

DMAチャネルを確保します。

パラメータ

ch -- 確保するチャネル番号

戻り値

SOLID_DMAC_Free

int SOLID_DMAC_Free(int ch)

確保したDMAチャネルを解放します。

パラメータ

ch -- 解放するチャネル番号

戻り値

SOLID_DMAC_SetBufState

int SOLID_DMAC_SetBufState(int ch, int state)

DMAの情報転送用バッファの設定を変更する

パラメータ
戻り値

SOLID_DMAC_GetBufState

int SOLID_DMAC_GetBufState(int ch, int *state)

DMAの情報転送用バッファの設定を取得する

パラメータ
  • ch -- 設定するチャネル番号

  • state -- バッファ設定の保存先

戻り値

SOLID_DMAC_AddTransaction

int SOLID_DMAC_AddTransaction(int ch, SOLID_DMAC_TRANSACTION *pTx)

DMAの転送要求を追加します。

このAPIでは要求のキューイングのみ行い、実際の転送は SOLID_DMAC_Start() で開始します

パラメータ
  • ch -- 使用するチャネル番号

  • pTx -- DMA転送情報

戻り値

SOLID_DMAC_GetTransaction

int SOLID_DMAC_GetTransaction(int ch, SOLID_DMAC_TRANSACTION **ppTx)

キューイングされたDMAの転送要求情報を取得します。

パラメータ
  • ch -- 使用するチャネル番号

  • ppTx -- DMA転送情報へのポインタの格納先

戻り値

SOLID_DMAC_ClearTransaction

int SOLID_DMAC_ClearTransaction(int ch)

DMAの転送要求をクリアします。

パラメータ

ch -- 使用するチャネル番号

戻り値

SOLID_DMAC_Start

int SOLID_DMAC_Start(int ch)

DMA転送をスタートします。

パラメータ

ch -- 使用するチャネル番号

戻り値

SOLID_DMAC_Abort

int SOLID_DMAC_Abort(int ch)

実行中のDMA転送を中断します。

パラメータ

ch -- 使用するチャネル番号

戻り値

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_DMAC_Notify

void SOLID_DMAC_Notify(int ch, int status)

DMA転送の終了イベントを通知します。

これはBSP側のDMAコントローラの実装側で使用します。

パラメータ

SOLID_DMAC_GetConfigIdx

int SOLID_DMAC_GetConfigIdx(const char *pName, int *pConfigIdx)

DMA設定のインデックスを取得します。

このAPIを使って得られた番号を、SOLID_DMAC_TRANSACTION のconfigIdxに指定してください。

パラメータ
  • pName -- DMA設定の名称 (文字列、NUL終端)

  • pConfigIdx -- インデックス番号の格納先

戻り値

SOLID_DMAC_MaintBuffer

int SOLID_DMAC_MaintBuffer(SOLID_DMAC_BUFFER *pBuf, int bSrc)

DMA転送用にバッファのアドレス解決やキャッシュのメンテナンスを行います。

これはDMAコントローラの操作を手動で行い、バッファの処理だけをコアサービスで 行いたい場合に使用します。 SOLID_DMAC_AddTransaction() で設定するバッファは、 コアサービス内部でこの関数を呼び出すため、この関数を使う必要はありません。

パラメータ
  • pBuf -- DMA用バッファ

  • bSrc -- 転送元/先設定 1: 転送元としてバッファを処理 0: 転送先としてバッファを処理

戻り値

要実装関数

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コントローラをサポートしない場合は、:any: SOLID_ERR_NOTSUPPORTED を返してください。
パラメータ

pDevInfo -- DMAコントロ―ラ情報の格納先

戻り値

IMPL_DMAC_Use

int IMPL_DMAC_Use(int ch)
DMAのチャネルの占有を開始します。
指定されたチャネルが使用できない場合、エラー値を返してください。
パラメータ

ch -- 占有するチャネル番号

戻り値

IMPL_DMAC_UnUse

int IMPL_DMAC_UnUse(int ch)

DMAのチャネル占有を終了します。

パラメータ

ch -- 終了するチャネル番号

戻り値

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 -- 中断するチャネル番号

戻り値

IMPL_DMAC_GetConfigIdx

int IMPL_DMAC_GetConfigIdx(const char *pName, int *pConfigIdx)
DMA設定のインデックスを取得します。
DMA設定の名称から、該当するインデックス番号をpConfigIdxに格納してください。
該当する設定が見つからない場合は、エラー値として SOLID_ERR_NOTFOUND を返してください。
パラメータ
  • pName -- DMA設定の名称 (文字列、NUL終端)

  • pConfigIdx -- インデックス番号の格納先

戻り値