/**
 * @brief           OSP Manager Header
 * @author          AXELL CORPORATION
 * @description     OSP Manager提供ヘッダ。<p>OSP Manager使用時に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 __OSPMGR_H__
#define __OSPMGR_H__
/* DOM-IGNORE-END */

#ifdef __cplusplus
extern "C" {
#endif

/** OSPチャンネル数 */
#define	AG903_OSP_CH_NUM					(4)

/** 優先度 */
enum _AG903_OSPMgrPri{
	AG903_OSP_PRI_LOWEST					= 0	,	/** 優先度(低)		*/
	AG903_OSP_PRI_LOW							,	/** 優先度(｜)		*/
	AG903_OSP_PRI_HIGH							,	/** 優先度(｜)		*/
	AG903_OSP_PRI_HIGHEST						,	/** 優先度(高)		*/
	AG903_OSP_PRI_NUM							,	/** 優先度最大数	*/
};

/** コマンドバッファモード */
typedef enum _AG903_OSPMgrBufMode{
	AG903_OSP_BUFMODE_FIFO = 0,		/** FIFOバッファモード	*/
	AG903_OSP_BUFMODE_RING,			/** RINGバッファモード	*/
	AG903_OSP_BUFMODE_NUM,			/** コマンドバッファモード数 */
} AG903_OSPMgrBufMode;

/** コマンド */
typedef enum _AG903_OSPMgrCmd {
	AG903_OSP_CMD_BUS_SINGLE = 0,	/** Bus Access Single [BAS] */
	AG903_OSP_CMD_BUS_BURST_FIX,	/** Bus Access Burst (Address Fixed) [BAB] */
	AG903_OSP_CMD_BUS_BURST_INC,	/** Bus Access Burst (Address Increment) [BAB] */
	AG903_OSP_CMD_BUS_ADDR,			/** Bus Access Address */
	AG903_OSP_CMD_BUS_DATA,			/** Bus Access Data */
	AG903_OSP_CMD_BUS_WAIT,			/** Bus Access Wait [BAW] */
	AG903_OSP_CMD_INTR_WAIT,		/** Wait Interrupt [INTR] */
	AG903_OSP_CMD_EVNT_WAIT,		/** Wait Event [EVENT] */
	AG903_OSP_CMD_EVNT_DEC,			/** Event Decrement [EVENTD] */
	AG903_OSP_CMD_EVNT_CLR,			/** Event Clear [EVENTC] */
	AG903_OSP_CMD_FLAG_SET,			/** Set Flag [SETF] */
	AG903_OSP_CMD_FLAG_CLR,			/** Clear Flag [CLRF] */
	AG903_OSP_CMD_NOP,				/** No Operation [NOP] */
	AG903_OSP_CMD_NUM,				/** コマンド定義数 */
} AG903_OSPMgrCmd;

/** イベント最大数 */
#define	AG903_OSP_EVENT_NUM					(64)

/** FIFO最大サイズ(Byte) */
#define	AG903_OSP_FIFO_SIZE					(512)

/** FIFO 最大段数 */
#define	AG903_OSP_FIFO_NUM					(AG903_OSP_FIFO_SIZE / sizeof(uint32_t))

/** BAS コマンド長(6ビット) ペア数 */
#define	AG903_OSP_CMD_BAS_SIZE				(63)

/** BAB コマンド長(6ビット) データ数 */
#define	AG903_OSP_CMD_BAB_SIZE				(63)

/** コマンド登録時のコマンドフォーマット解析<p>
	0:パースなし 1:パース実行 */
#define	AG903_OSP_CMD_PARSE					(0)

/** OSPハンドル */
typedef uint32_t	AG903_OSPMgrHandle;

/** コマンドバッファ */
typedef struct _AG903_OSPCmdBuf {

	uint32_t			*addr;	/** バッファポインタ */
	uint32_t			size;	/** バッファサイズ	 */
	AG903_OSPMgrBufMode	mode;	/** バッファモード	 */

}	AG903_OSPCmdBuf;


/*************************************************************************************
 * プロトタイプ定義
 ************************************************************************************/
int32_t AG903_OSPMgrInit(void);
int32_t AG903_OSPMgrGetHandle(AG903_OSPMgrHandle **handle);
int32_t AG903_OSPMgrReleaseHandle(AG903_OSPMgrHandle *handle);
int32_t AG903_OSPMgrEnable(AG903_OSPMgrHandle *handle);
int32_t AG903_OSPMgrDisable(AG903_OSPMgrHandle *handle);
int32_t AG903_OSPMgrSetPriority(AG903_OSPMgrHandle *handle, uint8_t priority);
int32_t AG903_OSPMgrGetStat(AG903_OSPMgrHandle *handle, uint8_t *stat, uint8_t *cnt);
int32_t AG903_OSPMgrGetFIFOStat(AG903_OSPMgrHandle *handle, uint8_t *ovf, uint8_t *siz);
int32_t AG903_OSPMgrSetFlag(uint32_t flag);
int32_t AG903_OSPMgrClearFlag(uint32_t flag);
int32_t AG903_OSPMgrGetFlagStat(uint32_t *flag);
int32_t AG903_OSPMgrSetEventCntEnable(uint32_t evt, uint8_t enable, uint8_t cnt);
int32_t AG903_OSPMgrGetEventStat(uint32_t evt, uint8_t *ovf, uint8_t *cnt);
int32_t AG903_OSPMgrSetFIFO(AG903_OSPMgrHandle *handle, uint32_t setcnt);
int32_t AG903_OSPMgrClearFIFO(AG903_OSPMgrHandle *handle);
int32_t AG903_OSPMgrGetCommandCnt(AG903_OSPMgrHandle *handle, uint32_t *cnt);
int32_t AG903_OSPMgrClearCommand(AG903_OSPMgrHandle *handle);
int32_t AG903_OSPMgrSetCommandBuf(AG903_OSPMgrHandle *handle, AG903_OSPCmdBuf *param, bool init);
int32_t AG903_OSPMgrSetCommand(AG903_OSPMgrHandle *handle, AG903_OSPMgrCmd cmd, uint32_t param);


#ifdef __cplusplus
}
#endif

#endif/* __OSPMGR_H__ */
