/**
 * @brief           DMAC Primitive Header
 * @author          AXELL CORPORATION
 * @description     DMAC Primitive提供ヘッダ。<p>DMAC Primitive使用時にincludeして下さい。
 * @note            none
 * @history         2017_02_22  初版
 * @history         2017_10_26  Ver2.0
 * @history         2019_12_27  [SDK3.0] AG903仕様書AX51903_DS06.pdfの修正を反映 (#2633)
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017-2019 AXELL CORPORATION, all rights reserved.
 */

#ifndef _DMACPRM_H_
#define _DMACPRM_H_
/* DOM-IGNORE-END */

#ifdef __cplusplus
extern "C" {
#endif

/** DMACチャンネル数 */
#define AG903_DMAC_UNIT_NUM 		(8)

/** DMACハンドシェークポート数 dma_req[n]/dma_ack[n] */
#define AG903_DMAC_PORT_NUM 		(16)

/** DMACイベント数 */
#define AG903_DMAC_EVENT_NUM 		(8)

/** 1D転送時の最大転送サイズ */
#define AG903_DMAC_1DTRANS_MAX		(0x3FFFFF)

/* DMAC COMMON INTERFACE */

/** DMACHW_FEATURE レジスタの値保持用構造体 */
typedef struct _DMACPrmParamFEATURE {
	uint32_t ChNum;			/** [2:0] DMAチャンネルの数 */
	uint32_t UnalignMode;	/** [3] 非アライン転送モードの構成 */
	uint32_t DWidth;		/** [5:4] 内部バス（マスタ）のデータバス幅 */
	uint32_t SLVDWidth;		/** [7:6] 内部バス（スレーブ）のデータバス幅 */
	uint32_t DFDepth;		/** [10:8] データFIFOの段数 */
	uint32_t PriOn;			/** [12] DMAリクエストインターフェース */
	uint32_t PriNum;		/** [19:16] DMAリクエストのペアの組数 */
	uint32_t LdmOn;			/** [20] ディスクリプタメモリの構成 */
	uint32_t LdmDepth;		/** [25:24] ディスクリプタメモリの段数 */
	uint32_t CmdDepth;		/** [29:28] 読み出し／書き込みコマンドキューの段数 */
}DMACPrmParamFEATURE;

void AG903_DMACPrmGetINT(uint32_t *stat);
void AG903_DMACPrmGetTIMECOUNT_INT(uint32_t *stat);
void AG903_DMACPrmSetTIMECOUNT_INT_CLEAR(uint32_t clear);
void AG903_DMACPrmGetERR_ABORT_INT(uint32_t *err, uint32_t *wdt, uint32_t *abt);
void AG903_DMACPrmSetERR_ABORT_INT_CLEAR(uint32_t err, uint32_t wdt, uint32_t abt);
void AG903_DMACPrmGetTIMECOUNT_STATUS(uint32_t *stat);
void AG903_DMACPrmGetERR_ABORT_STATUS(uint32_t *err, uint32_t *wdt, uint32_t *abt);
void AG903_DMACPrmGetCHANNEL_ENABLE(uint32_t *enable);
void AG903_DMACPrmSetCHANNEL_ENABLE(uint32_t enable);
void AG903_DMACPrmGetSYNC_PERI_IF(uint32_t *enable);
void AG903_DMACPrmSetSYNC_PERI_IF(uint32_t enable);
void AG903_DMACPrmGetLOCAL_DESC_MEM_BASE(uint32_t *base);
void AG903_DMACPrmSetLOCAL_DESC_MEM_BASE(uint32_t base);
void AG903_DMACPrmGetWATCHDOG_TIMER(uint32_t *wdt);
void AG903_DMACPrmSetWATCHDOG_TIMER(uint32_t wdt);
void AG903_DMACPrmGetGLOBAL_EVENT(uint32_t *event);
void AG903_DMACPrmSetGLOBAL_EVENT(uint32_t set, uint32_t clear);
void AG903_DMACPrmGetPSLVERR_ENABLE(uint32_t *enable);
void AG903_DMACPrmSetPSLVERR_ENABLE(uint32_t enable);
void AG903_DMACPrmGetREVISION_NUMBER(uint32_t *rev);
void AG903_DMACPrmGetHW_FEATURE(DMACPrmParamFEATURE *feature);
void AG903_DMACPrmGetLOCAL_DESC_MEM_FREE_FLAG_SET_0(uint32_t *flag);
void AG903_DMACPrmSetLOCAL_DESC_MEM_FREE_FLAG_SET_0(uint32_t flag);
void AG903_DMACPrmGetLOCAL_DESC_MEM_FREE_FLAG_SET_1(uint32_t *flag);
void AG903_DMACPrmSetLOCAL_DESC_MEM_FREE_FLAG_SET_1(uint32_t flag);
void AG903_DMACPrmGetLOCAL_DESC_MEM_FREE_FLAG_SET_2(uint32_t *flag);
void AG903_DMACPrmSetLOCAL_DESC_MEM_FREE_FLAG_SET_2(uint32_t flag);
void AG903_DMACPrmGetLOCAL_DESC_MEM_FREE_FLAG_SET_3(uint32_t *flag);
void AG903_DMACPrmSetLOCAL_DESC_MEM_FREE_FLAG_SET_3(uint32_t flag);
void AG903_DMACPrmGetENDIAN_CONVERSION(uint32_t *ec, uint32_t *lmec);
void AG903_DMACPrmSetENDIAN_CONVERSION(uint32_t ec, uint32_t lmec);
void AG903_DMACPrmGetCONSTANT_VALUE_WRITE_ONLY(uint32_t *value);
void AG903_DMACPrmSetCONSTANT_VALUE_WRITE_ONLY(uint32_t value);

/* DMACn INTERFACE */

/** DMACnCTRL_REG レジスタの値保持用構造体 */
typedef struct _DMACPrmParamCTRL {
	uint32_t ChWEvent;		/** [7:0] チャンネルのイベント待機 */
	uint32_t WSync;			/** [8] 最後の書き込み完了の待機 */
	uint32_t ChSEvent;		/** [11:9] チャンネルのイベント */
	uint32_t SEventEn;		/** [12] イベント設定 */
	uint32_t WEventEn;		/** [13] イベント待機 */
	uint32_t DEn;			/** [14] 2D転送 */
	uint32_t ExpEn;			/** [15] 拡張制御 */
	uint32_t ChEn;			/** [16] チャンネル */
	uint32_t WDTEn;			/** [17] ウォッチドッグタイマ */
	uint32_t DstCtrl;		/** [19:18] 転送先バーストタイプの制御方法 */
	uint32_t SrcCtrl;		/** [21:20] 転送元バーストタイプの制御方法 */
	uint32_t DstWidth;		/** [24:22] 転送先のデータ幅 */
	uint32_t SrcWidth;		/** [27:25] 転送元のデータ幅 */
	uint32_t TCMsk;			/** [28] ターミナルカウントのマスク */
	uint32_t SrcTcnt;		/** [31:29] 1つのDMAハンドシェイク動作の転送元転送カウント単位 */
}DMACPrmParamCTRL;

/** DMACnCFG_REG レジスタの値保持用構造体 */
typedef struct _DMACPrmParamCFG {
	uint32_t TCIntMsk;		/** [0] ターミナルカウント割り込みマスク */
	uint32_t ErrIntMsk;		/** [1] チャンネルエラー割り込みマスク */
	uint32_t AbtIntMsk;		/** [2] チャンネルアボート割り込みマスク */
	uint32_t SrcRS;			/** [6:3] 転送元ハンドシェイク要求のソース */
	uint32_t SrcHEn;		/** [7] 転送元ハンドシェイク */
	uint32_t DstRS;			/** [12:9] 転送先ハンドシェイク要求のソース */
	uint32_t DstHEn;		/** [13] 転送先ハンドシェイク */
	uint32_t LLPCnt;		/** [19:16] リンクリストポインタ増分カウンタ */
	uint32_t ChGntWin;		/** [27:20] チャンネルアービトレーション許可ウィンドウのコマンド */
	uint32_t ChPri;			/** [28] チャンネルアービトレーション優先順位 */
	uint32_t WOMode;		/** [30] 書き込み専用モード */
	uint32_t UnalignMode;	/** [31] 非アライン転送モード */
}DMACPrmParamCFG;

void AG903_DMACPrmGetCTRL_REG(uint8_t unit, DMACPrmParamCTRL *ctrl);
void AG903_DMACPrmSetCTRL_REG(uint8_t unit, DMACPrmParamCTRL *ctrl);
void AG903_DMACPrmGetCFG_REG(uint8_t unit, DMACPrmParamCFG *cfg);
void AG903_DMACPrmSetCFG_REG(uint8_t unit, DMACPrmParamCFG *cfg);
void AG903_DMACPrmGetSRC_ADDR(uint8_t unit, uint32_t *addr);
void AG903_DMACPrmSetSRC_ADDR(uint8_t unit, uint32_t addr);
void AG903_DMACPrmGetDST_ADDR(uint8_t unit, uint32_t *addr);
void AG903_DMACPrmSetDST_ADDR(uint8_t unit, uint32_t addr);
void AG903_DMACPrmGetLINK_LIST_POINTER(uint8_t unit, uint32_t *addr);
void AG903_DMACPrmSetLINK_LIST_POINTER(uint8_t unit, uint32_t addr);
void AG903_DMACPrmGetTRNS_SIZE_1D(uint8_t unit, uint32_t *cnt);
void AG903_DMACPrmSetTRNS_SIZE_1D(uint8_t unit, uint32_t cnt);
void AG903_DMACPrmGetTRNS_SIZE_2D(uint8_t unit, uint32_t *x_cnt, uint32_t *y_cnt);
void AG903_DMACPrmSetTRNS_SIZE_2D(uint8_t unit, uint32_t x_cnt, uint32_t y_cnt);
void AG903_DMACPrmGetSTRIDE_SRC_DST_ADDR(uint8_t unit, uint32_t *src, uint32_t *dst);
void AG903_DMACPrmSetSTRIDE_SRC_DST_ADDR(uint8_t unit, uint32_t src, uint32_t dst);

/* AX51903_DS06.pdfによるレジスタ名の変更への対応 */
#define AG903_DMACPrmGetTERMCOUNT_INT		AG903_DMACPrmGetTIMECOUNT_INT
#define AG903_DMACPrmSetTERMCOUNT_INT_CLEAR	AG903_DMACPrmSetTIMECOUNT_INT_CLEAR
#define AG903_DMACPrmGetTERMCOUNT_STATUS	AG903_DMACPrmGetTIMECOUNT_STATUS

#ifdef __cplusplus
}
#endif
#endif
