/**
 * @brief           SSC Primitive Header
 * @author          AXELL CORPORATION
 * @description     SSC Primitive提供ヘッダ。<p>SSC Primitive使用時にincludeして下さい。
 * @note            none
 * @history         2017_02_22  初版
 * @history         2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */

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

#include <stdint.h>
#include "lib_common/AG903_common.h"

#ifdef __cplusplus
extern "C" {
#endif

#define AG903_SSC_SYSINT_CH_NUM			(4)		/** システムレジスタ割込みCH数 */
#define	AG903_SSC_PINFUNC_REG_NUM		(2)		/** 端子機能選択レジスタ数 */
#define AG903_SSC_PIN_SETUP_INDEX_MAX	(136)	/** 端子設定INDEX最大値 */
#define	AG903_SSC_GPIOEN_REG_NUM		(4)		/** 端子GPIO選択レジスタ数 */
#define	AG903_SSC_GPIOPU_REG_NUM		(4)		/** 端子GPIOプルアップ設定レジスタ数 */
#define	AG903_SSC_GPIOPD_REG_NUM		(4)		/** 端子GPIOプルダウン設定レジスタ数 */
#define	AG903_SSC_DMASEL_REG_NUM		(4)		/** DMAペリフェラルインターフェース選択レジスタ数 */
#define AG903_SSC_TICKCNT_CH_NUM		(2)		/** TickカウンタCH数 */
#define AG903_SSC_CVBSDEC_CH_NUM		(4)		/** コンポジットビデオデコーダCH数 */

#define AG903_SSC_PINDIR_INPUT 			(0)		/** 端子入出力指定 (入力) */
#define	AG903_SSC_PINDIR_OUTPUT			(1)		/** 端子入出力指定 (出力) */

#define AG903_SSC_SSPMODE_FLLDPLX 		(0)		/** 全二重モード */
#define	AG903_SSC_SSPMODE_HLFDPLX		(1)		/** 半二重モード */

#define	AG903_SSC_PBHWAIT_HWAIT			(0)		/** nHWAIT端子指定 */
#define AG903_SSC_PBHWAIT_BLP0BLGT 		(1)		/** BLP0_BLGT端子指定 */

#define	AG903_SSC_USBMODE_HOST			(0)		/** USB HOST動作指定 */
#define AG903_SSC_USBMODE_DEVICE 		(1)		/** USB DEVICE動作指定 */


/** PIN SETUP DATAのビット定義 */
#define AG903_SSC_PIN_SETUP_LS3V_POS	(7)											/** I/O電圧設定 位置 */
#define AG903_SSC_PIN_SETUP_LS3V_MSK	(0x1UL<<AG903_SSC_PIN_SETUP_LS3V_POS)		/** I/O電圧設定 マスク */
#define AG903_SSC_PIN_SETUP_DV_POS		(5)											/** 出力電流設定 位置 */
#define AG903_SSC_PIN_SETUP_DV_MSK		(0x3UL<<AG903_SSC_PIN_SETUP_DV_POS)			/** 出力電流設定 マスク */
#define AG903_SSC_PIN_SETUP_SR_POS		(4)											/** スルーレート設定 位置 */
#define AG903_SSC_PIN_SETUP_SR_MSK		(0x1UL<<AG903_SSC_PIN_SETUP_SR_POS)			/** スルーレート設定 マスク */
#define AG903_SSC_PIN_SETUP_SMT_POS		(3)											/** シュミットトリガ設定 位置 */
#define AG903_SSC_PIN_SETUP_SMT_MSK		(0x1UL<<AG903_SSC_PIN_SETUP_SMT_POS)		/** シュミットトリガ設定 マスク */
#define AG903_SSC_PIN_SETUP_LVST_POS	(0)											/** レベルキープ動作設定 位置 */
#define AG903_SSC_PIN_SETUP_LVST_MSK	(0x7UL<<AG903_SSC_PIN_SETUP_LVST_POS)		/** レベルキープ動作設定 マスク */

/** WDT割込みモード */
enum  _AG903_SSC_WdtIntMode {
	AG903_SSC_WDTINT_PULSE = 0,	/** パルス割込み */
	AG903_SSC_WDTINT_LEVEL,		/** レベル割込み */
};

/** 端子処理レベル動作パラメータ */
enum  _AG903_SSC_PINSETUP_LVST {
	AG903_SSC_INPUT_DISABLE = 0,	/** 入力無効 */
	AG903_SSC_INPUT_DISABLE_PLDWN,	/** 入力無効,PullDown */
	AG903_SSC_INPUT_DISABLE_PLUP,	/** 入力無効,PullUp */
	AG903_SSC_INPUT_ENABLE  = 4,	/** 入力有効 */
	AG903_SSC_INPUT_ENABLE_PLDWN,	/** 入力有効,PullDown */
	AG903_SSC_INPUT_ENABLE_PLUP,	/** 入力有効,PullUp */
	AG903_SSC_INPUT_ENABLE_LVKP,	/** 入力有効,LevelKeep */
};

/** クロックソース指定 */
enum  _AG903_SSC_TICK_SOURCE {
	AG903_SSC_TICKSRC_SYSCLK = 0,	/** システムクロック */
	AG903_SSC_TICKSRC_INTERNAL,		/** 内蔵発振器出力 */
	AG903_SSC_TICKSRC_ALT0,			/** ALT0 CLK */
	AG903_SSC_TICKSRC_ALT1,			/** ALT1 CLK */
	AG903_SSC_TICKSRC_SSP0MCLK,		/** SSP0 MCLK */
	AG903_SSC_TICKSRC_SSP1MCLK,		/** SSP1 MCLK */
	AG903_SSC_TICKSRC_SSP2MCLK,		/** SSP2 MCLK */
	AG903_SSC_TICKSRC_SSP3MCLK,		/** SSP3 MCLK */
};



/** 端子処理設定パラメータ */
typedef struct _AG903_SSCPrmPinSetup{
	uint8_t		io3v;		/** I/O電圧 (true=3[V],false=1.8[V]) */
	uint8_t		drive;		/** 出力電流設定 */
	uint8_t		sr_slow;	/** スルーレート設定 (true=Slow,false=Fast) */
	uint8_t		schmitt;	/** シュミットトリガ設定 (true=あり,false=なし) */
	uint8_t		lv_set;		/** レベル動作設定 */
	uint8_t		reserve[3];	/** 予約 */
}AG903_SSCPrmPinSetup;

/** CA5動作ステータス */
typedef struct _AG903_SSCPrmCpuRunStatus{
	uint8_t		sev_op;		/** SEV命令実行有無 (true/false) */
	uint8_t		wfi_stby;	/** WFIスタンバイ状態 (true/false) */
	uint8_t		wfe_stby;	/** WFEスタンバイ状態 (true/false) */
	uint8_t		reset;		/** リセット状態 (true/false) */
	uint8_t		clk;		/** クロック供給状態 (true/false) */
	uint8_t		reserve[3];	/** 予約 */
}AG903_SSCPrmCpuRunStatus;

/** 表示入出力端子設定 */
typedef struct _AG903_SSCPrmDspSetup{
	uint8_t		vsync0;		/** CMOS表示出力0のVSYNC端子 */
	uint8_t		field0;		/** CMOS表示出力0のFIELD端子 */
	uint8_t		dot0;		/** CMOS表示出力0のドットクロック端子 */
	uint8_t		vsync1;		/** CMOS表示出力1のVSYNC端子 */
	uint8_t		field1;		/** CMOS表示出力1のFIELD端子 */
	uint8_t		dot1;		/** CMOS表示出力1のドットクロック端子 */
	uint8_t		reserve[2];	/** 予約 */
}AG903_SSCPrmDspSetup;

/** SSP端子入出力設定 */
typedef struct _AG903_SSCPrmSspSetup{
	uint8_t		mclk_div;	/** MCLK出力時の分周比 */
	uint8_t		mclk_dir;	/** MCLK端子の方向 (半二重時) */
	uint8_t		mode;		/** 外部端子モード (全二重 / 半二重) */
	uint8_t		dir;		/** 外部端子の方向 (半二重時) */
}AG903_SSCPrmSspSetup;

/** TDM[0-3]_SETUP設定パラメータ */
typedef struct _AG903_SSCPrmTdmParam{
	uint8_t		enable;		/** TDMフォーマッタ 有効/無効 */
	uint8_t		sclk_pol;	/** クロック極性 */
	uint8_t		fs_pol;		/** FS信号極性 */
	uint8_t		fs_txpw;	/** FS信号パルス幅 */
	uint8_t		fs_dist;	/** FS信号とデータ信号の開始タイミング */
	uint8_t		dir_tx;		/** 端子出力制御 */
	uint8_t		tdm_n;		/** 多重化数 */
	uint8_t		sclk_n;		/** 1chあたりのビット数 */
} AG903_SSCPrmTdmParam;

/** TDM動作状況 */
typedef struct _AG903_SSCPrmTdmStatus{
	uint8_t		rx_err;		/** 受信フォーマットエラー */
	uint8_t		tx_stat;	/** 送信状態 */
	uint8_t		rx_stat;	/** 受信状態 */
	uint8_t		reserve[2];	/** 予約 */
} AG903_SSCPrmTdmStatus;

/** ビデオADC設定パラメータ */
typedef struct _AG903_SSCPrmVideoAdcParam{
	uint8_t		acq_clr;	/** ADC最大値最小値レジスタクリア */
	uint8_t		acq_en;		/** ADC最大値最小値レジスタ値更新 */
	uint8_t		dat_en;		/** ADC出力データイネーブル */
	uint8_t		clmp_tmg;	/** クランプタイミング制御選択 */
	uint8_t		clmp_lv;	/** クランプレベル制御選択 */
	uint8_t		pga_ctl;	/** PGA制御選択 */
	uint8_t		reserve[2];	/** 予約 */
} AG903_SSCPrmVideoAdcParam;


void AG903_SSCPrmGetRevesion(uint32_t* rev);
void AG903_SSCPrmGetModeStatus(uint8_t* btmode, uint8_t* bttest, uint8_t* status);
void AG903_SSCPrmClrModeStatus(uint8_t clr);
void AG903_SSCPrmGetIrqStatus(uint32_t* lower, uint32_t* upper);
void AG903_SSCPrmGetIntBusStatus(uint8_t* status);
void AG903_SSCPrmSetIntBusEnable(uint8_t enable);
void AG903_SSCPrmGetIntBusEnable(uint8_t* status);
void AG903_SSCPrmGetSysIntStatus(uint32_t* lower, uint32_t* middle, uint32_t* upper);
void AG903_SSCPrmSetSysIntEnable(uint8_t ch, uint32_t lower, uint32_t middle, uint32_t upper);
void AG903_SSCPrmGetSysIntEnable(uint8_t ch, uint32_t* lower, uint32_t* middle, uint32_t* upper);
void AG903_SSCPrmSetGfxClkDuty(uint8_t clk, uint8_t duty);
void AG903_SSCPrmGetGfxClkDuty(uint8_t* clk, uint8_t* duty);
void AG903_SSCPrmSetGvdClkDuty(uint8_t duty);
void AG903_SSCPrmGetGvdClkDuty(uint8_t* duty);
void AG903_SSCPrmSetWdtIntMode(uint8_t mode);
void AG903_SSCPrmGetWdtIntMode(uint8_t* mode);
void AG903_SSCPrmClrWdtInt(void);
void AG903_SSCPrmSetWdtOutputMode(uint8_t rst_ini, uint8_t rst_wdt, uint8_t wdt_ena, uint8_t wdt_od);
void AG903_SSCPrmGetWdtOutputMode(uint8_t* rst_ini, uint8_t* rst_wdt, uint8_t* wdt_ena, uint8_t* wdt_od);
void AG903_SSCPrmSetPinFunction(uint8_t reg_no, uint32_t val);
void AG903_SSCPrmGetPinFunction(uint8_t reg_no, uint32_t* val);
void AG903_SSCPrmSetPinSetup(uint8_t tbl_no, AG903_SSCPrmPinSetup* setup);
void AG903_SSCPrmGetPinSetup(uint8_t tbl_no, AG903_SSCPrmPinSetup* setup);
void AG903_SSCPrmSetPinGpioEnable(uint8_t reg_no, uint32_t val);
void AG903_SSCPrmGetPinGpioEnable(uint8_t reg_no, uint32_t* val);
void AG903_SSCPrmSetPinGpioPullUp(uint8_t reg_no, uint32_t val);
void AG903_SSCPrmGetPinGpioPullUp(uint8_t reg_no, uint32_t* val);
void AG903_SSCPrmSetPinGpioPullDown(uint8_t reg_no, uint32_t val);
void AG903_SSCPrmGetPinGpioPullDown(uint8_t reg_no, uint32_t* val);
void AG903_SSCPrmSetCpuSetup(uint8_t clk, uint8_t rst, uint8_t vbit);
void AG903_SSCPrmGetCpuSetup(uint8_t* clk, uint8_t* rst, uint8_t* vbit);
void AG903_SSCPrmClrCpuEventOutStatus(void);
void AG903_SSCPrmGetCpuStatus(AG903_SSCPrmCpuRunStatus* status);
void AG903_SSCPrmSetCpuAcpSetup(uint32_t acp_addr);
void AG903_SSCPrmGetCpuAcpSetup(uint32_t* acp_addr);
void AG903_SSCPrmSetDmaInterface(uint8_t reg_no, uint32_t val);
void AG903_SSCPrmGetDmaInterface(uint8_t reg_no, uint32_t* val);
void AG903_SSCPrmSetPbdDmaInterface(uint8_t val);
void AG903_SSCPrmGetPbdDmaInterface(uint8_t* val);
void AG903_SSCPrmSetDspPinDir(AG903_SSCPrmDspSetup* dir);
void AG903_SSCPrmGetDspPinDir(AG903_SSCPrmDspSetup* dir);
void AG903_SSCPrmSetTickSetup(uint8_t ch, uint8_t clksel, uint32_t div);
void AG903_SSCPrmGetTickSetup(uint8_t ch, uint8_t* clksel, uint32_t* div);
void AG903_SSCPrmSetTimerPinDir(uint8_t tim_dir);
void AG903_SSCPrmGetTimerPinDir(uint8_t* tim_dir);
void AG903_SSCPrmSetSspSetup(uint8_t ch, AG903_SSCPrmSspSetup* param);
void AG903_SSCPrmGetSspSetup(uint8_t ch, AG903_SSCPrmSspSetup* param);
void AG903_SSCPrmSetPbdCheckAddr(uint32_t sta_addr, uint32_t end_addr);
void AG903_SSCPrmGetPbdCheckAddr(uint32_t* sta_addr, uint32_t* end_addr);
void AG903_SSCPrmSetPbdAddrCheckEnable(uint8_t enable);
void AG903_SSCPrmGetPbdAddrCheckEnable(uint8_t* enable);
void AG903_SSCPrmGetPbdAddrCheckStatus(uint8_t* status);
void AG903_SSCPrmGetBmuStatus(uint16_t* src_req, uint16_t* src_rdy, uint8_t* snk_req, uint8_t* snk_rdy);
void AG903_SSCPrmSetBmuControl(uint16_t set_src, uint16_t clr_src, uint8_t set_snk, uint8_t clr_snk);
void AG903_SSCPrmGetBmuTriggerStatus(uint16_t* src_req, uint16_t* src_rdy, uint8_t* snk_req, uint8_t* snk_rdy);
void AG903_SSCPrmClrBmuTriggerStatus(uint16_t src_req, uint16_t src_rdy, uint8_t snk_req, uint8_t snk_rdy);
void AG903_SSCPrmSetPortWait(uint16_t wait);
void AG903_SSCPrmGetPortWait(uint16_t* wait);
void AG903_SSCPrmSetPbhMode(uint8_t wait_sel);
void AG903_SSCPrmGetPbhMode(uint8_t* wait_sel);
void AG903_SSCPrmSetTdmSetup(uint8_t ch, AG903_SSCPrmTdmParam* param);
void AG903_SSCPrmGetTdmSetup(uint8_t ch, AG903_SSCPrmTdmParam* param, AG903_SSCPrmTdmStatus* stat);
void AG903_SSCPrmSetUsbPowerSetup(uint8_t mode, uint8_t int_ena, uint8_t prtct_ena);
void AG903_SSCPrmGetUsbPowerSetup(uint8_t* mode, uint8_t* int_ena, uint8_t* prtct_ena);
void AG903_SSCPrmGetUsbPowerStatus(uint8_t* vbus_lv, uint8_t* prtct_lv, uint8_t* prtct_stat);
void AG903_SSCPrmClrUsbPowerStatus(void);
void AG903_SSCPrmSetSdPowerSetup(uint8_t int_ena, uint8_t prtct_ena);
void AG903_SSCPrmGetSdPowerSetup(uint8_t* int_ena, uint8_t* prtct_ena);
void AG903_SSCPrmGetSdPowerStatus(uint8_t* prtct_lv, uint8_t* prtct_stat);
void AG903_SSCPrmClrSdPowerStatus(void);
void AG903_SSCPrmSetVideoAdcSetup(AG903_SSCPrmVideoAdcParam* param);
void AG903_SSCPrmGetVideoAdcSetup(AG903_SSCPrmVideoAdcParam* param);
void AG903_SSCPrmWriteCmpstVideoDec(uint8_t ch, uint16_t reg, uint16_t data);
void AG903_SSCPrmReadCmpstVideoDec(uint8_t ch, uint16_t reg, uint16_t* data);
void AG903_SSCPrmGetVideoAdcMaxMin(uint8_t ch, uint16_t* max, uint16_t* min);
void AG903_SSCPrmGetSgiStatus(uint32_t* stat);
void AG903_SSCPrmSetSgi(uint32_t set);
void AG903_SSCPrmClrSgi(uint32_t clr);
void AG903_SSCPrmSetCpuJumpAddr(uint32_t addr);
void AG903_SSCPrmGetCpuJumpAddr(uint32_t* addr);
void AG903_SSCPrmSetFreeRunCnt(uint32_t upper, uint32_t lower);
void AG903_SSCPrmGetFreeRunCnt(uint32_t* upper, uint32_t* lower);

#ifdef __cplusplus
}
#endif
#endif /* _SSCPRM_H_ */

