/**
 * @file IxI2cDrv.h
 *
 * @brief  Header file for the IXP400 I2C Driver (IxI2cDrv)
 *
 * @version $Revision: 0.1 $
 * 
 * @par
 * IXP400 SW Release version 2.0
 * 
 * -- Copyright Notice --
 * 
 * @par
 * Copyright 2001-2005, Intel Corporation.
 * All rights reserved.
 * 
 * @par
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Intel Corporation nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 * 
 * @par
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * @par
 * -- End of Copyright Notice --
 */

/**
 * @defgroup IxI2cDrv IXP400 I2C Driver(IxI2cDrv) API 
 *
 * @brief IXP400 I2C Driver Public API
 *
 * @{
 */
#ifndef IXI2CDRV_H
#define IXI2CDRV_H

#ifdef __ixp46X
#include "IxOsal.h"

/*
 * Section for #define
 */

/**
 * @ingroup IxI2cDrv
 * @brief The interval of micro/mili seconds the IXP will wait before it polls for
 *			status from the ixI2cIntrXferStatus; Every 20us is 1 byte @
 *			400Kbps and 4 bytes	@ 100Kbps. This is dependent on delay type selected
 *          through the API ixI2cDrvDelayTypeSelect.
 */
#define IX_I2C_US_POLL_FOR_XFER_STATUS	20

/**
 * @ingroup IxI2cDrv
 * @brief The number of tries that will be attempted to call a callback
 *          function if the callback does not or is unable to resolve the
 *          issue it is called to resolve
 */
#define IX_I2C_NUM_OF_TRIES_TO_CALL_CALLBACK_FUNC	10


/**
 * @ingroup IxI2cDrv
 * @brief Number of tries slave will poll the IDBR Rx full bit before it
 *			gives up
 */
#define IX_I2C_NUM_TO_POLL_IDBR_RX_FULL 0x100

/**
 * @ingroup IxI2cDrv
 * @brief Number of tries slave will poll the IDBR Tx empty bit before it
 *			gives up
 */
#define IX_I2C_NUM_TO_POLL_IDBR_TX_EMPTY 0x100

/*
 * Section for enum
 */

/**
 * @ingroup IxI2cDrv
 * 
 * @enum IxI2cMasterStatus
 *
 * @brief The master status - transfer complete, bus error or arbitration loss
 */
typedef enum
{
    IX_I2C_MASTER_XFER_COMPLETE = IX_SUCCESS,
	IX_I2C_MASTER_XFER_BUS_ERROR,
	IX_I2C_MASTER_XFER_ARB_LOSS
} IxI2cMasterStatus;


/**
 * @ingroup IxI2cDrv
 * 
 * @enum IX_I2C_STATUS
 *
 * @brief The status that can be returned in a I2C driver initialization
 */
typedef enum
{
	IX_I2C_SUCCESS = IX_SUCCESS, /**< Success status */
	IX_I2C_FAIL, /**< Fail status */
	IX_I2C_NOT_SUPPORTED, /**< hardware does not have dedicated I2C hardware */
	IX_I2C_NULL_POINTER, /**< parameter passed in is NULL */
	IX_I2C_INVALID_SPEED_MODE_ENUM_VALUE, /**< speed mode selected is invalid */
	IX_I2C_INVALID_FLOW_MODE_ENUM_VALUE, /**< flow mode selected is invalid */
	IX_I2C_SLAVE_ADDR_CB_MISSING, /**< slave callback is NULL */
	IX_I2C_GEN_CALL_CB_MISSING, /**< general callback is NULL */
	IX_I2C_INVALID_SLAVE_ADDR, /**< invalid slave address specified */
	IX_I2C_INT_BIND_FAIL, /**< interrupt bind fail */
	IX_I2C_INT_UNBIND_FAIL, /**< interrupt unbind fail */
	IX_I2C_NOT_INIT, /**< I2C is not initialized yet */
	IX_I2C_MASTER_BUS_BUSY, /**< master detected a I2C bus busy */
	IX_I2C_MASTER_ARB_LOSS, /**< master experienced arbitration loss */
	IX_I2C_MASTER_XFER_ERROR, /**< master experienced a transfer error */
	IX_I2C_MASTER_BUS_ERROR, /**< master detected a I2C bus error */
	IX_I2C_MASTER_NO_BUFFER, /**< no buffer provided for master transfer */
	IX_I2C_MASTER_INVALID_XFER_MODE, /**< xfer mode selected is invalid */
	IX_I2C_SLAVE_ADDR_NOT_DETECTED, /**< polled slave addr not detected */
	IX_I2C_GEN_CALL_ADDR_DETECTED, /**< polling detected general call */
	IX_I2C_SLAVE_READ_DETECTED, /**< polling detected slave read request */
	IX_I2C_SLAVE_WRITE_DETECTED, /**< polling detected slave write request */
	IX_I2C_SLAVE_NO_BUFFER, /**< no buffer provided for slave transfers */
	IX_I2C_DATA_SIZE_ZERO, /**< data size transfer is zero - invalid */
	IX_I2C_SLAVE_WRITE_BUFFER_EMPTY, /**< slave buffer is used till empty */
	IX_I2C_SLAVE_WRITE_ERROR, /**< slave write experienced an error */
	IX_I2C_SLAVE_OR_GEN_READ_BUFFER_FULL, /**< slave buffer is filled up */
	IX_I2C_SLAVE_OR_GEN_READ_ERROR /**< slave read experienced an error */
} IX_I2C_STATUS;

/**
 * @ingroup IxI2cDrv
 * 
 * @enum IxI2cSpeedMode
 *
 * @brief Type of speed modes supported by the I2C hardware.
 */
typedef enum
{
    IX_I2C_NORMAL_MODE = 0x0,
    IX_I2C_FAST_MODE
} IxI2cSpeedMode;

/**
 * @ingroup IxI2cDrv
 * 
 * @enum IxI2cXferMode
 *
 * @brief Used for indicating it is a repeated start or normal transfer
 */
typedef enum
{
    IX_I2C_NORMAL = 0x0,
    IX_I2C_REPEATED_START
} IxI2cXferMode;

/**
 * @ingroup IxI2cDrv
 * 
 * @enum IxI2cFlowMode
 *
 * @brief Used for indicating it is a poll or interrupt mode
 */
typedef enum
{
    IX_I2C_POLL_MODE = 0x0,
    IX_I2C_INTERRUPT_MODE
} IxI2cFlowMode;

/**
 * @ingroup IxI2cDrv
 * 
 * @enum IxI2cDelayMode
 *
 * @brief Used for selecting looping delay or OS scheduler delay
 */
typedef enum
{
    IX_I2C_LOOP_DELAY = 1,  /**< delay in microseconds */
    IX_I2C_SCHED_DELAY      /**< delay in miliseconds */
} IxI2cDelayMode;

/**
 * @ingroup IxI2cDrv
 * 
 * @brief The pointer to the function that will be called when the master
 *			has completed its receive. The parameter that is passed will
 *			provide the status of the read (success, arb loss, or bus
 *			error), the transfer mode (normal or repeated start, the
 *			buffer pointer and number of bytes transferred.
 */
typedef void (*IxI2cMasterReadCallbackP)(IxI2cMasterStatus, IxI2cXferMode, char*, UINT32);

/**
 * @ingroup IxI2cDrv
 * 
 * @brief The pointer to the function that will	be called when the master
 *			has completed its transmit. The parameter that is passed will
 *			provide the status of the write (success, arb loss, or buss
 *			error), the transfer mode (normal or repeated start), the
 *			buffer pointer and number of bytes transferred.
 */
typedef void (*IxI2cMasterWriteCallbackP)(IxI2cMasterStatus, IxI2cXferMode, char*, UINT32);

/**
 * @ingroup IxI2cDrv
 * 
 * @brief The pointer to the function that will be called when a slave
 *			address detected in interrupt mode for a read. The parameters
 *			that is passed will provide the read status, buffer pointer,
 *			buffer size, and the bytes received. When a start of a read
 *			is initiated there will be no buffer allocated and this callback
 *			will be called to request for a buffer. While receiving, if the
 *			buffer gets filled, this callback will be called to request for
 *			a new buffer while sending the filled buffer's pointer and size,
 *			and data size received. When the receive is complete, this
 *			callback will be called to process the data and free the memory
 *			by passing the buffer's pointer and size, and data size received.
 */
typedef void (*IxI2cSlaveReadCallbackP)(IX_I2C_STATUS, char*, UINT32, UINT32);

/**
 * @ingroup IxI2cDrv
 * 
 * @brief The pointer to the function that will be called when a slave
 *			address detected in interrupt mode for a write. The parameters
 *			that is passed will provide the write status, buffer pointer,
 *			buffer size, and the bytes received. When a start of a write is
 *			initiated there will be no buffer allocated and this callback
 *			will be called to request for a buffer and to fill it with data.
 *			While transmitting, if the data in the buffer empties, this
 *			callback will be called to request for more data to be filled in
 *			the same or new buffer. When the transmit is complete, this
 *			callback will be called to free the memory or other actions to
 *			be taken.
 */
typedef void (*IxI2cSlaveWriteCallbackP)(IX_I2C_STATUS, char*, UINT32, UINT32);

/**
 * @ingroup IxI2cDrv
 * 
 * @brief The pointer to the function that will be called when a general
 *			call detected in interrupt mode for a read. The parameters that
 *			is passed will provide the read status, buffer pointer, buffer
 *			size, and the bytes received. When a start of a read is
 *			initiated there will be no buffer allocated and this callback
 *			will be called to request for a buffer. While receiving, if the
 *			buffer gets filled, this callback will be called to request for
 *			a new buffer while sending the filled buffer's pointer and size,
 *			and data size received. When the receive is complete, this
 *			callback will be called to process the data and free the memory
 *			by passing the buffer's pointer and size, and data size received.
 */
typedef void (*IxI2cGenCallCallbackP)(IX_I2C_STATUS, char*, UINT32, UINT32);

/*
 * Section for struct
 */

/**
 * @brief contains all the variables required to initialize the I2C unit
 * 
 * Structure to be filled and used for calling initialization
 */
typedef struct
{
	IxI2cSpeedMode I2cSpeedSelect;	/**<Select either normal (100kbps)
									or fast mode (400kbps)*/
	IxI2cFlowMode I2cFlowSelect;	/**<Select interrupt or poll mode*/	
	IxI2cMasterReadCallbackP MasterReadCBP;
									/**<The master read callback pointer */
	IxI2cMasterWriteCallbackP MasterWriteCBP;
									/**<The master write callback pointer */
	IxI2cSlaveReadCallbackP SlaveReadCBP;
									/**<The slave read callback pointer */
	IxI2cSlaveWriteCallbackP SlaveWriteCBP;
									/**<The slave write callback pointer */
	IxI2cGenCallCallbackP GenCallCBP;
									/**<The general call callback pointer */
	BOOL I2cGenCallResponseEnable;	/**<Enable/disable the unit to
									respond to generall calls.*/
	BOOL I2cSlaveAddrResponseEnable;/**<Enable/disable the unit to
									respond to the slave address set in
									ISAR*/
	BOOL SCLEnable;					/**<Enable/disable the unit from
									driving the SCL line during master
									mode operation*/
	UINT8 I2cHWAddr;				/**<The address the unit will
									response to as a slave device*/
} IxI2cInitVars;

/**
 * @brief contains results of counters and their overflow
 * 
 * Structure contains all values of counters and associated overflows.
 */
typedef struct
{
	UINT32 ixI2cMasterXmitCounter;			/**<Total bytes transmitted as
											master.*/
	UINT32 ixI2cMasterFailedXmitCounter;	/**<Total bytes failed for
											transmission as master.*/
	UINT32 ixI2cMasterRcvCounter;			/**<Total bytes received as
											master.*/
	UINT32 ixI2cMasterFailedRcvCounter;		/**<Total bytes failed for
											receival as master.*/
	UINT32 ixI2cSlaveXmitCounter;			/**<Total bytes transmitted as
											slave.*/
	UINT32 ixI2cSlaveFailedXmitCounter;		/**<Total bytes failed for
											transmission as slave.*/
	UINT32 ixI2cSlaveRcvCounter;			/**<Total bytes received as
											slave.*/
	UINT32 ixI2cSlaveFailedRcvCounter;		/**<Total bytes failed for
											receival as slave.*/
	UINT32 ixI2cGenAddrCallSucceedCounter;	/**<Total bytes successfully
											transmitted for general address.*/
	UINT32 ixI2cGenAddrCallFailedCounter;	/**<Total bytes failed transmission
											for general address.*/
	UINT32 ixI2cArbLossCounter;				/**<Total instances of arbitration
											loss has occured.*/
} IxI2cStatsCounters;


/*
 * Section for prototypes interface functions
 */

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvInit(
	IxI2cInitVars *InitVarsSelected)
 *
 * @brief Initializes the I2C Driver.
 *
 * @param "IxI2cInitVars [in] *InitVarsSelected" - struct containing required
 *			variables for initialization 
 *
 * Global Data	:
 *		- None.
 *
 * This API will check if the hardware supports this I2C driver and the validity
 * of the parameters passed in. It will continue to process the parameters
 * passed in by setting the speed of the I2C unit (100kbps or 400kbps), setting
 * the flow to either interrupt or poll mode, setting the address of the I2C unit,
 * enabling/disabling the respond to General Calls, enabling/disabling the respond
 * to Slave Address and SCL line driving. If it is interrupt mode, then it will
 * register the callback routines for master, slavetransfer and general call receive.
 *
 * @return 
 *      - IX_I2C_SUCCESS - Successfully initialize and enable the I2C
 *							hardware.
 *		- IX_I2C_NOT_SUPPORTED - The hardware does not support or have a
 *                              dedicated I2C unit to support this driver
 *		- IX_I2C_NULL_POINTER - The parameter passed in is a NULL pointed
 *		- IX_I2C_INVALID_SPEED_MODE_ENUM_VALUE - The speed mode selected in the
 *												InitVarsSelected is invalid
 *		- IX_I2C_INVALID_FLOW_MODE_ENUM_VALUE - The flow mode selected in the
 *												InitVarsSelected is invalid
 *		- IX_I2C_INVALID_SLAVE_ADDR - The address 0x0 is reserved for
 *										general call.
 *		- IX_I2C_SLAVE_ADDR_CB_MISSING - interrupt mode is selected but
 *										slave address callback pointer is NULL
 *		- IX_I2C_GEN_CALL_CB_MISSING - interrupt mode is selected but
 *										general call callback pointer is NULL
 *		- IX_I2C_INT_BIND_FAIL - The ISR for the I2C failed to bind
 *		- IX_I2C_INT_UNBIND_FAIL - The ISR for the I2C failed to unbind
 *
 * @li   Reentrant    : yes
 * @li   ISR Callable : yes
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvInit(IxI2cInitVars *InitVarsSelected);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvUninit(
	void)
 *
 * @brief Disables the I2C hardware
 *
 * @param - None
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will disable the I2C hardware, unbind interrupt, and unmap memory.
 *
 * @return 
 *      - IX_I2C_SUCCESS - successfully un-initialized I2C
 *		- IX_I2C_INT_UNBIND_FAIL - failed to unbind the I2C interrupt
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : yes
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvUninit(void);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvSlaveAddrSet(
	UINT8 SlaveAddrSet)
 *
 * @brief Sets the I2C Slave Address
 *
 * @param "UINT8 [in] SlaveAddrSet" - Slave Address to be inserted into ISAR
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will insert the SlaveAddrSet into the ISAR.
 *
 * @return 
 *      - IX_I2C_SUCCESS - successfuly set the slave addr
 *		- IX_I2C_INVALID_SLAVE_ADDR - invalid slave address (zero) specified
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : yes
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvSlaveAddrSet(UINT8 SlaveAddrSet);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvBusScan(
	void)
 *
 * @brief scans the I2C bus for slave devices
 *
 * @param - None
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will prompt all slave addresses for a reply except its own
 *
 * @return 
 *      - IX_I2C_SUCCESS - found at least one slave device
 *		- IX_I2C_FAIL - Fail to find even one slave device
 *		- IX_I2C_BUS_BUSY - The I2C bus is busy (held by another I2C master)
 *		- IX_I2C_ARB_LOSS - The I2C bus was loss to another I2C master
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : yes
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvBusScan(void);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvWriteTransfer(
	UINT8 SlaveAddr,
	char *bufP,
	UINT32 dataSize,
	IxI2cXferMode XferModeSelect)
 *
 * @param "UINT8 [in] SlaveAddr" - The slave address to request data from.
 * @param "char [in] *bufP" - The pointer to the data to be transmitted.
 * @param "UINT32 [in] dataSize" - The number of bytes requested.
 * @param "IxI2cXferMode [in] XferModeSelect" - the transfer mode selected,
 *			either repeated start (ends w/o stop) or normal (start and stop)
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will try to obtain master control of the I2C bus and transmit the
 * number of bytes, specified by dataSize, to the user specified slave
 * address from the buffer pointer. It will use either interrupt or poll mode
 * depending on the method selected. 
 *
 * If in interrupt mode and IxI2cMasterWriteCallbackP is not NULL, the driver
 * will initiate the transfer and return immediately. The function pointed to
 * by IxI2cMasterWriteCallbackP will be called in the interrupt service
 * handlers when the operation is complete.
 *
 * If in interrupt mode and IxI2cMasterWriteCallbackP is NULL, then the driver
 * will wait for the operation to complete, and then return.
 *
 * And if the repeated start transfer mode is selected, then it will not send a
 * stop signal at the end of all the transfers.
 * *NOTE*: If repeated start transfer mode is selected, it has to end with a
 *			normal mode transfer mode else the bus will continue to be held
 *			by the IXP.
 *
 * @return 
 *      - IX_I2C_SUCCESS - Successfuuly wrote data to slave.
 *		- IX_I2C_MASTER_BUS_BUSY - The I2C bus is busy (held by another I2C master)
 *		- IX_I2C_MASTER_ARB_LOSS - The I2C bus was loss to another I2C master
 *		- IX_I2C_MASTER_XFER_ERROR - There was a transfer error
 *      - IX_I2C_MASTER_BUS_ERROR - There was a bus error during transfer
 *		- IX_I2C_MASTER_NO_BUFFER - buffer pointer is NULL
 *      - IX_I2C_MASTER_INVALID_XFER_MODE - Xfer mode selected is invalid
 *      - IX_I2C_DATA_SIZE_ZERO - dataSize passed in is zero, which is invalid
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : no
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvWriteTransfer(
	UINT8 SlaveAddr,
	char *bufP,
	UINT32 dataSize,
	IxI2cXferMode XferModeSelect);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvReadTransfer(
	UINT8 SlaveAddr,
	char *bufP,
	UINT32 dataSize,
	IxI2cXferMode XferModeSelect)
 *
 * @brief Initiates a transfer to receive bytes of data from a slave
 *			device through the I2C bus.
 *
 * @param "UINT8 [in] SlaveAddr" - The slave address to request data from.
 * @param "char [out] *bufP" - The pointer to the buffer to store the
 *			requested data.
 * @param "UINT32 [in] dataSize" - The number of bytes requested.
 * @param "IxI2cXferMode [in] XferModeSelect" - the transfer mode selected,
 *			either repeated start (ends w/o stop) or normal (start and stop)
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will try to obtain master control of the I2C bus and receive the
 * number of bytes, specified by dataSize, from the user specified address
 * into the receive buffer. It will use either interrupt or poll mode depending
 * on the mode selected.
 *
 * If in interrupt mode and IxI2cMasterReadCallbackP is not NULL, the driver
 * will initiate the transfer and return immediately. The function pointed to
 * by IxI2cMasterReadCallbackP will be called in the interrupt service
 * handlers when the operation is complete.
 *
 * If in interrupt mode and IxI2cMasterReadCallbackP is NULL, then the driver will
 * wait for the operation to complete, and then return.
 *
 * And if the repeated start transfer mode is selected, then it will not send a
 * stop signal at the end of all the transfers.
 * *NOTE*: If repeated start transfer mode is selected, it has to end with a
 *			normal mode transfer mode else the bus will continue to be held
 *			by the IXP.
 *
 * @return 
 *      - IX_I2C_SUCCESS - Successfuuly read slave data
 *		- IX_I2C_MASTER_BUS_BUSY - The I2C bus is busy (held by another I2C master)
 *		- IX_I2C_MASTER_ARB_LOSS - The I2C bus was loss to another I2C master
 *		- IX_I2C_MASTER_XFER_ERROR - There was a bus error during transfer
 *      - IX_I2C_MASTER_BUS_ERROR - There was a bus error during transfer
 *		- IX_I2C_MASTER_NO_BUFFER - buffer pointer is NULL
 *      - IX_I2C_MASTER_INVALID_XFER_MODE - Xfer mode selected is invalid
 *      - IX_I2C_INVALID_SLAVE_ADDR - invalid slave address (zero) specified
 *      - IX_I2C_DATA_SIZE_ZERO - dataSize passed in is zero, which is invalid
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : no
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvReadTransfer(
	UINT8 SlaveAddr,
	char *bufP,
	UINT32 dataSize,
	IxI2cXferMode XferModeSelect);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvSlaveAddrAndGenCallDetectedCheck(
	void)
 *
 * @brief Checks the I2C Status Register to determine if a slave address is
 *			detected
 *
 * @param - None
 *
 * Global Data	:
 *		- None.
 *                        
 * This API is used in polled mode to determine if the I2C unit is requested
 * for a slave or general call transfer. If it is requested for a slave
 * transfer then it will determine if it is a general call (read only), read,
 * or write transfer requested.
 *
 * @return 
 *      - IX_I2C_SLAVE_ADDR_NOT_DETECTED - The I2C unit is not requested for slave
 *										transfer
 *		- IX_I2C_GEN_CALL_ADDR_DETECTED - The I2C unit is not requested for slave
 *									transfer but for general call
 *      - IX_I2C_SLAVE_READ_DETECTED - The I2C unit is requested for a read
 *      - IX_I2C_SLAVE_WRITE_DETECTED - The I2C unit is requested for a write
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : no
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvSlaveAddrAndGenCallDetectedCheck(void);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvSlaveOrGenDataReceive(
	char *bufP,
	UINT32 bufSize,
	UINT32 *dataSizeRcvd)
 *
 * @brief Performs the slave receive or general call receive data transfer
 *
 * @param	"char [in] *bufP" - the pointer to the buffer to store data
 *			"UINT32 [in] bufSize" - the buffer size allocated
 *			"UINT32 [in] *dataSizeRcvd" - the length of data received in bytes
 *
 * Global Data	:
 *		- None.
 *                        
 * This API is only used in polled mode to perform the slave read or general call
 * receive data. It will continuously store the data received into bufP until
 * complete or until bufP is full in which it will return
 * IX_I2C_SLAVE_OR_GEN_READ_BUFFER_FULL. If in interrupt mode, the callback will be
 * used.
 *
 * @return 
 *      - IX_I2C_SUCCESS - The I2C driver transferred the data successfully.
 *		- IX_I2C_SLAVE_OR_GEN_READ_BUFFER_FULL - The I2C driver has ran out of
 *			space to store the received data.
 *		- IX_I2C_SLAVE_OR_GEN_READ_ERROR - The I2C driver didn't manage to
 *			detect the IDBR Rx Full bit
 *      - IX_I2C_DATA_SIZE_ZERO - bufSize passed in is zero, which is invalid
 *		- IX_I2C_SLAVE_NO_BUFFER - buffer pointer is NULL
 *      - IX_I2C_NULL_POINTER - dataSizeRcvd is NULL
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : no
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvSlaveOrGenDataReceive(
	char *bufP,
	UINT32 bufSize,
	UINT32 *dataSizeRcvd);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvSlaveDataTransmit(
	char *bufP,
	UINT32 dataSize,
	UINT32 *dataSizeXmtd)
 *
 * @brief Performs the slave write data transfer
 *
 * @param	"char [in] *bufP" - the pointer to the buffer for data to be
 *				transmitted
 *			"UINT32 [in] bufSize" - the buffer size allocated
 *			"UINT32 [in] *dataSizeRcvd" - the length of data trasnmitted in
 *				bytes
 *
 * Global Data	:
 *		- None.
 *                        
 * This API is only used in polled mode to perform the slave transmit data. It
 * will continuously transmit the data from bufP until complete or until bufP
 * is empty in which it will return IX_I2C_SLAVE_WRITE_BUFFER_EMPTY. If in
 * interrupt mode, the callback will be used.
 *
 * @return 
 *      - IX_I2C_SUCCESS - The I2C driver transferred the data successfully.
 *      - IX_I2C_SLAVE_WRITE_BUFFER_EMPTY - The I2C driver needs more data to
 *			transmit.
 *      - IX_I2C_SLAVE_WRITE_ERROR -The I2C driver didn't manage to detect the
 *          IDBR Tx empty bit or the slave stop bit.
 *      - IX_I2C_DATA_SIZE_ZERO - dataSize passed in is zero, which is invalid
 *		- IX_I2C_SLAVE_NO_BUFFER - buffer pointer is NULL
 *      - IX_I2C_NULL_POINTER - dataSizeXmtd is NULL
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : no
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvSlaveDataTransmit(
	char *bufP,
	UINT32 dataSize,
	UINT32 *dataSizeXmtd);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvSlaveOrGenCallBufReplenish(
	char *bufP,
	UINT32 bufSize)
 *
 * @brief Replenishes the buffer which stores buffer info for both slave and
 *			general call
 *
 * @param	"char [in] *bufP" - pointer to the buffer allocated
 *			"UINT32 [in] bufSize" - size of the buffer
 *
 * Global Data	:
 *		- None.
 *                        
 * This API is only used in interrupt mode for replenishing the same buffer
 * that is used by both slave and generall call by updating the buffer info
 * with new info and clearing previous offsets set by previous transfers.
 *
 * @return 
 *      - None
 *              
 * @li   Reentrant    : no
 * @li   ISR Callable : no
 *
 */
PUBLIC void
ixI2cDrvSlaveOrGenCallBufReplenish(
	char *bufP,
	UINT32 bufSize);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvStatsGet(IxI2cStatsCounters *I2cStats)
 *
 * @brief Returns the I2C Statistics through the pointer passed in
 *
 * @param - "IxI2cStatsCounters [out] *I2cStats" - I2C statistics counter will
 *			be read and written to the location pointed by this pointer.
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will return the statistics counters of the I2C driver.
 *
 * @return 
 *      - IX_I2C_NULL_POINTER - pointer passed in is NULL
 *		- IX_I2C_SUCCESS - successfully obtained I2C statistics
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvStatsGet(IxI2cStatsCounters *I2cStats);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvStatsReset(void)
 *
 * @brief Reset I2C statistics counters.
 *
 * @param - None
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will reset the statistics counters of the I2C driver.
 *
 * @return 
 *      - None
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : no
 *
 */
PUBLIC void
ixI2cDrvStatsReset(void);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvShow(void)
 *
 * @brief Displays the I2C status register and the statistics counter.
 *
 * @param - None
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will display the I2C Status register and is useful if any error
 * occurs. It displays the detection of bus error, slave address, general call,
 * address, IDBR receive full, IDBR transmit empty, arbitration loss, slave
 * STOP signal, I2C bus busy, unit busy, ack/nack, and read/write mode. It will
 * also call the ixI2cDrvGetStats and then display the statistics counter.
 *
 * @return 
 *		- IX_I2C_SUCCESS - successfully displayed statistics and status register
 *		- IX_I2C_NOT_INIT - I2C not init yet.
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : no
 *
 */
PUBLIC IX_I2C_STATUS
ixI2cDrvShow(void);

/**
 * @ingroup IxI2cDrv
 * 
 * @fn ixI2cDrvDelayTypeSelect (IxI2cDelayMode delayMechanismSelect)
 *
 * @brief Sets the delay type of either looping delay or OS scheduler delay
 *          according to the argument provided.
 *
 * @param - "IxI2cDelayMode [in] delayTypeSelect" - the I2C delay type selected
 *
 * Global Data	:
 *		- None.
 *                        
 * This API will set the delay type used by the I2C Driver to either looping
 * delay or OS scheduler delay.
 *
 * @return 
 *		- None
 *              
 * @li   Reentrant    : yes
 * @li   ISR Callable : no
 *
 */
PUBLIC void
ixI2cDrvDelayTypeSelect (IxI2cDelayMode delayTypeSelect);

#endif /* __ixp46X */
#endif /* IXI2CDRV_H */
