/*
** Copyright (c) 2007-2010 by Silicon Laboratories
**
** $Id: si_voice_ctrl.h 2009 2010-06-11 21:26:54Z nizajerk $
**
** si_voice_ctrl.h
** SPI driver header file
**
** Author(s): 
** laj
**
** Distributed by: 
** Silicon Laboratories, Inc
**
** File Description:
** This is the header file for the control driver used 
** in the ProSLIC demonstration code.
**
** Dependancies:
** si_voice_datatypes.h 
**
*/
#ifndef CTRL_H
#define CTRL_H

/** @defgroup PROSLIC_CUSTOMER_APIS Customer implemented functions
 * This section has documentation related to APIs that the customer
 * needs to implement to allow the ProSLIC API to function correctly.
 *
 * @note Please note, in addition to the functions mentioned here, the
 * customer will need to review/modify si_voice_datatypes.h to match
 * the native datatypes of their system.
 *
 * @{
 */
/*****************************************************************************/
/** @defgroup PROSLIC_CUSTOMER_CONTROL Customer implemented control functions
 * This group of function pointer prototypes need to be implemented by the 
 * customer in order for the ProSLIC API to function correctly.  These functions
 * need to be associated with the API by the functions documented in @ref SIVOICE_IO
 * @{
 */

/**
* @brief
* Sets/clears the reset pin of all the ProSLICs/VDAAs 
*
* @param[in] *hCtrl - which interface to reset (this is a customer supplied structure)
* @param[in] in_reset -  0 = Take the device out of reset, 1 = place the device(s) in reset
* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
*/

typedef int (*ctrl_Reset_fptr) (void *hCtrl, int in_reset);

/**
* @brief 
* Register write function pointer
*
* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
* @param[in] channel - ProSLIC channel to write to (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
* @param[in] regAddr -  Address of register to write
* @param[in] data - data to write to register
* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
*
*/

typedef int (*ctrl_WriteRegister_fptr) (void *hCtrl, uInt8 channel, uInt8 regAddr, uInt8 data);

/**
* @brief 
* RAM write function pointer
*
* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
* @param[in] channel - ProSLIC channel to write to (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
* @param[in] ramAddr - Address of the RAM location to write
* @param[in] ramData - data to write to the RAM location
* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
*
*/

typedef int (*ctrl_WriteRAM_fptr) (void *hCtrl, uInt8 channel, uInt16 ramAddr, ramData data);

/**
* @brief 
* Register read function pointer
*
* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
* @param[in] channel - ProSLIC channel to read from (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
* @param[in] regAddr -  Address of register to read from
* @retval uInt8 - the value read. If an error occurs, this value is undefined.
*/

typedef uInt8 (*ctrl_ReadRegister_fptr) (void *hCtrl, uInt8 channel, uInt8 regAddr);

/**
* @brief 
* RAM read function pointer
*
* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
* @param[in] channel - ProSLIC channel to read from (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
* @param[in] ramAddr - Address of the RAM location to read from
* @retval ramData - the value read. If an error occurs, this value is undefined.
*/

typedef ramData (*ctrl_ReadRAM_fptr) (void *hCtrl, uInt8 channel, uInt16 ramAddr);

/**
 * @brief
 *  Critical Section/Semaphore function pointer
 *
* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
* @param[in] in_critical_section - request to lock the critical section 1 = lock, 0 = unlock
* @retval 1 = success, 0 = failed
*/

typedef int (*ctrl_Semaphore_fptr) (void *hCtrl, int in_critical_section);

/** @} PROSLIC_CUSTOMER_CONTROL */
/** @} */
#endif


