/**
 * @brief           BMU Manager Header
 * @author          AXELL CORPORATION
 * @description     BMU Manager Layer.
 * @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 _BMUMGR_H_
#define _BMUMGR_H_
/* DOM-IGNORE-END */


#ifdef __cplusplus
extern "C" {
#endif

#ifndef AG903_BMU_UNIT_NUM
	/** BMUの最大チャンネル数 */
	#define AG903_BMU_UNIT_NUM (16)
#endif


/* BMU SRC モジュールID */

/** PGP演算処理パイプライン0 */
#define AG903_BMU_SRC_PGP0			(0)
/** PGP演算処理パイプライン1 */
#define AG903_BMU_SRC_PGP1			(1)
/** PGP入力画像処理パイプライン0 */
#define AG903_BMU_SRC_PGP2			(2)
/** PGP入力画像処理パイプライン1 */
#define AG903_BMU_SRC_PGP3			(3)
/** PGPフレーム保存パイプライン0 */
#define AG903_BMU_SRC_PGP4			(4)
/** PGPフレーム保存パイプライン1 */
#define AG903_BMU_SRC_PGP5			(5)
/** 使用不可 */
#define AG903_BMU_SRC_PGP6			(6)
/** 使用不可 */
#define AG903_BMU_SRC_PGP7			(7)
/** PGPヒストグラムパイプライン0 */
#define AG903_BMU_SRC_PGP8			(8)
/** PGPヒストグラムパイプライン1 */
#define AG903_BMU_SRC_PGP9			(9)
/** PGPラベリングパイプライン0 */
#define AG903_BMU_SRC_PGP10			(10)
/** PGPラベリングパイプライン1 */
#define AG903_BMU_SRC_PGP11			(11)
/** 描画回路0 */
#define AG903_BMU_SRC_GFX0			(12)
/** 描画回路1 */
#define AG903_BMU_SRC_GFX1			(13)
/** 描画回路2 */
#define AG903_BMU_SRC_GFX2			(14)
/** 描画回路3 */
#define AG903_BMU_SRC_GFX3			(15)
/** GVD動画デコード0 */
#define AG903_BMU_SRC_GVD0			(16)
/** GVD動画デコード1 */
#define AG903_BMU_SRC_GVD1			(17)
/** GVD動画デコード2 */
#define AG903_BMU_SRC_GVD2			(18)
/** GVD動画デコード3 */
#define AG903_BMU_SRC_GVD3			(19)
/** システム0 */
#define AG903_BMU_SRC_SYS0			(20)
/** システム1 */
#define AG903_BMU_SRC_SYS1			(21)
/** システム2 */
#define AG903_BMU_SRC_SYS2			(22)
/** システム3 */
#define AG903_BMU_SRC_SYS3			(23)
/** システム4 */
#define AG903_BMU_SRC_SYS4			(24)
/** システム5 */
#define AG903_BMU_SRC_SYS5			(25)
/** システム6 */
#define AG903_BMU_SRC_SYS6			(26)
/** システム7 */
#define AG903_BMU_SRC_SYS7			(27)
/** システム8 */
#define AG903_BMU_SRC_SYS8			(28)
/** システム9 */
#define AG903_BMU_SRC_SYS9			(29)
/** システム10 */
#define AG903_BMU_SRC_SYS10			(30)
/** JPG静止画コーデック（デコード） */
#define AG903_BMU_SRC_JPG0			(31)

/* SINK モジュールID */

/** PGPキャプチャ0 */
#define AG903_BMU_SINK_PGP0			(0)
/** PGPキャプチャ1 */
#define AG903_BMU_SINK_PGP1			(1)
/** PGPキャプチャ2 */
#define AG903_BMU_SINK_PGP2			(2)
/** PGPキャプチャ3 */
#define AG903_BMU_SINK_PGP3			(3)
/** 描画0 */
#define AG903_BMU_SINK_GFX0			(4)
/** 描画1 */
#define AG903_BMU_SINK_GFX1			(5)
/** 描画2 */
#define AG903_BMU_SINK_GFX2			(6)
/** 描画3 */
#define AG903_BMU_SINK_GFX3			(7)
/** システム0 */
#define AG903_BMU_SINK_SYS0			(8)
/** システム1 */
#define AG903_BMU_SINK_SYS1			(9)
/** システム2 */
#define AG903_BMU_SINK_SYS2			(10)
/** システム3 */
#define AG903_BMU_SINK_SYS3			(11)
/** 表示回路0 */
#define AG903_BMU_SINK_DSP0			(12)
/** 表示回路1 */
#define AG903_BMU_SINK_DSP1			(13)
/** JPG静止画コーデック（エンコード） */
#define AG903_BMU_SINK_JPG0			(14)

/* SINK モジュール WAIT */

/** SINKモジュールwait Enable */
#define AG903_BMU_SINK_WAIT_ENABLE	(0)
/** SINKモジュールwait Disable */
#define AG903_BMU_SINK_WAIT_DISABLE	(1)

/* 同期モード */

/** バッファ管理モード0 同期 */
#define AG903_BMU_BUF_MGR_MODE0		(0)
/** バッファ管理モード1 同期 */
#define AG903_BMU_BUF_MGR_MODE1		(1)
/** バッファ管理モード2 非同期 */
#define AG903_BMU_BUF_MGR_MODE2		(2)
/** バッファ管理モード3 非同期 */
#define AG903_BMU_BUF_MGR_MODE3		(3)

/** BMUステータス */
typedef struct _AG903_BMUMgrStatus
{
	uint8_t is_valid;                  /** バッファ書込み状態  */
	uint8_t is_empty;                  /** バッファ空き状態 */
	uint8_t is_read_wait_appeared;     /** シンクモジュールウェイト状態 （同期モード） */
	uint8_t is_read_busy;              /** シンクモジュール状態 */
	uint8_t read_module_num;           /** シンクモジュールの使用バッファ番号 */

	uint8_t is_full;                   /** バッファの空き状態 */
	uint8_t is_write_wait_appeared;    /** ソースモジュールウェイト状態 */
	uint8_t is_write_busy;             /** ソースモジュール状態 */
	uint8_t write_module_num;          /** ソースモジュールの使用バッファ番号 */
} AG903_BMUMgrStatus;

/** BMUハンドル */
typedef struct _AG903_BMUMgrHandle
{
	uint8_t unit_id;    /** 割り当てられたチャンネル */
	uint8_t is_exec;    /** 実行状態 */
	uint32_t src_id;    /** ソースモジュールID */
} AG903_BMUMgrHandle;

int32_t AG903_BMUMgrGetHandle(AG903_BMUMgrHandle **handle);
int32_t AG903_BMUMgrReleaseHandle(AG903_BMUMgrHandle *handle);
int32_t AG903_BMUMgrEnable(AG903_BMUMgrHandle *handle);
int32_t AG903_BMUMgrDisable(AG903_BMUMgrHandle *handle);
int32_t AG903_BMUMgrSetMode(AG903_BMUMgrHandle *handle, uint8_t ini, uint8_t mgr);
int32_t AG903_BMUMgrSetSrcModule(AG903_BMUMgrHandle *handle, uint8_t src);
int32_t AG903_BMUMgrAddSinkModule(AG903_BMUMgrHandle *handle, uint8_t sink);
int32_t AG903_BMUMgrRemoveSinkModule(AG903_BMUMgrHandle *handle, uint8_t sink);
int32_t AG903_BMUMgrGetSinkStatus(AG903_BMUMgrHandle *handle, uint8_t sink, uint8_t *status);
int32_t AG903_BMUMgrSetBufferConfig(AG903_BMUMgrHandle *handle, void *buffer, uint32_t stride, uint32_t buf_num);
int32_t AG903_BMUMgrGetStatus(AG903_BMUMgrHandle *handle, AG903_BMUMgrStatus *status);
int32_t AG903_BMUMgrGetBMUSinkAddress(AG903_BMUMgrHandle *handle, uint32_t *addr);
int32_t AG903_BMUMgrGetBMUSrcAddress(AG903_BMUMgrHandle *handle, uint32_t *addr);
int32_t AG903_BMUMgrGetBMUId(AG903_BMUMgrHandle *handle, uint8_t *id);

#ifdef __cplusplus
}
#endif
#endif
