/**
 * @brief           I2C Manager Header
 * @author          AXELL CORPORATION
 * @description     I2C Manager提供ヘッダ。<p>I2C 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 _I2CMGR_H_
#define _I2CMGR_H_
/* DOM-IGNORE-END */

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

#ifdef __cplusplus
extern "C" {
#endif

/** CLK_FTPの周波数 [Hz] */
#define AG903_I2C_CLK				(100000000)

/** SCL初期設定値 [Hz] */
#define AG903_I2C_DFLT_SCL			(100000)

/** IICnTGSR GSR初期設定値 */
#define AG903_I2C_DFLT_GSR			(8)

/** IICnTGSR TSR初期設定値 */
#define AG903_I2C_DFLT_TSR			(64)

/** ハンドル数 */
#define AG903_I2C_HANDLE_NUM		(4)

/** キュー数 */
#define AG903_I2C_QUENUM			(6)

/** イベント検出ビット （Readエラー）*/
#define AG903_I2C_EVENT_READ_ERR			(1<<11)
/** イベント検出ビット （Writeエラー）*/
#define AG903_I2C_EVENT_WRITE_ERR			(1<<10)
/** イベント検出ビット （通信エラー）*/
#define AG903_I2C_EVENT_SEQUENCE_ERR		(1<<9)
/** イベント検出ビット （アービトレーション負け）*/
#define AG903_I2C_EVENT_LOSES_ARBITRATION	(1<<8)
/** イベント検出ビット （Read完了）*/
#define AG903_I2C_EVENT_READ_END			(1<<1)
/** イベント検出ビット （Write完了）*/
#define AG903_I2C_EVENT_WRITE_END			(1<<0)

/** I2Cハンドル */
typedef uint32_t	AG903_I2CMgrHandle;

/** コールバック関数の型。<p>
	handleはI2Cハンドル、eventはイベント検出ビット(下表参照)。<p>
    <table>
    <tr><th>bit</th><th>内容</th></tr>
    <tr><td>31:12</td><td>reserve</td></tr>
    <tr><td>11</td><td>Readエラー</td></tr>
    <tr><td>10</td><td>Writeエラー</td></tr>
    <tr><td>9</td><td>通信エラー</td></tr>
    <tr><td>8</td><td>アービトレーション負け</td></tr>
    <tr><td>7:2</td><td>reserve</td></tr>
    <tr><td>1</td><td>Read完了</td></tr>
    <tr><td>0</td><td>Write完了</td></tr>
    </table> */
typedef void (*AG903_I2CMgrClbk)(AG903_I2CMgrHandle* handle, uint32_t event);

/** Writeパラメータ */
typedef struct _AG903_I2CMgrWriteParam {
	uint8_t*	buf;			/* バッファ */
	uint32_t	size;			/* データサイズ */
	uint16_t	addr;			/* Slave Address */
	uint8_t		stop;			/* Stop Condition有無 */
	uint8_t		reserve; 		/* 予約 */
} AG903_I2CMgrWriteParam;

/** Readパラメータ */
typedef struct _AG903_I2CMgrReadParam {
	uint8_t*	buf;			/* バッファ */
	uint32_t	size;			/* データサイズ */
	uint16_t	addr;			/* Slave Address */
	uint8_t		reserve[2]; 	/* 予約 */
} AG903_I2CMgrReadParam;

/** クロックパラメータ */
typedef struct _AG903_I2CMgrClkPrm {
	uint32_t	cdr_val;		/* IICnCDR 設定値 */
	uint16_t	tsr_val;		/* IICnTGSR TSR設定値 */
	uint8_t		gsr_val;		/* IICnTGSR GSR設定値 */
	uint8_t		reserve;		/* 予約 */
} AG903_I2CMgrClkPrm;


int32_t	AG903_I2CMgrInit(uint8_t ch);
int32_t AG903_I2CMgrSetClock(uint8_t ch, AG903_I2CMgrClkPrm* param);
int32_t AG903_I2CMgrSetSlaveAddress(uint8_t ch, uint16_t saddr);
int32_t	AG903_I2CMgrGetHandle(uint8_t ch,  AG903_I2CMgrHandle** handle);
int32_t	AG903_I2CMgrReleaseHandle(AG903_I2CMgrHandle* handle);
int32_t AG903_I2CMgrSetCallback(AG903_I2CMgrHandle* handle, AG903_I2CMgrClbk clbk);
int32_t AG903_I2CMgrMasterWrite(AG903_I2CMgrHandle* handle, AG903_I2CMgrWriteParam* param);
int32_t AG903_I2CMgrMasterRead(AG903_I2CMgrHandle* handle, AG903_I2CMgrReadParam* param);
int32_t AG903_I2CMgrSlaveWrite(AG903_I2CMgrHandle* handle, uint8_t* buf, uint32_t size);
int32_t AG903_I2CMgrSlaveRead(AG903_I2CMgrHandle* handle, uint8_t* buf, uint32_t size);
int32_t AG903_I2CMgrReset(AG903_I2CMgrHandle* handle);
int32_t AG903_I2CMgrGetQueCount(AG903_I2CMgrHandle* handle, uint32_t* count);

#ifdef __cplusplus
}
#endif
#endif /* _I2CMGR_H_ */
