📄 iic_saa9730.c
字号:
* 'OK' = 0x00: IIC service completed successfully
* ERROR_IIC_ADDRESS_ERROR: IIC address error
* ERROR_IIC_DATA_ERROR: IIC data error
*
*
************************************************************************/
static
INT32 IIC_SAA9730_check( void ) ;
/************************************************************************
*
* IIC_SAA9730_get_data
* Description :
* -------------
*
* Get data from BYTE2, BYTE1 and BYTE0 of Transfer Register and
* save it in user allocated buffer space.
*
*
* Parameters :
* ------------
*
* -
*
*
* Return values :
* ---------------
*
* -
*
************************************************************************/
static
void IIC_SAA9730_get_data( void ) ;
/************************************************************************
*
* IIC_SAA9730_flush
* Description :
* -------------
*
* Flush out any command or data of command buffer into Transfer
* Register.
*
*
* Parameters :
* ------------
*
* -
*
* Return values :
* ---------------
*
* 'OK' = 0x00: IIC service completed successfully
* ERROR_IIC_ADDRESS_ERROR: IIC address error
* ERROR_IIC_DATA_ERROR: IIC data error
* ERROR_IIC_TIMEOUT: IIC service timed-out
*
************************************************************************/
static
INT32 IIC_SAA9730_flush( void ) ;
/************************************************************************
*
* IIC_SAA9730_add
* Description :
* -------------
*
* Add another data byte to command buffer and flush in case
* command buffer gets full.
*
*
* Parameters :
* ------------
* 'data': pointer for next data byte to add
* 'attrib': either 'nop', 'start', 'cont', 'stop'
* 'read': 'true' by read, 'false' by 'write'.
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: IIC service completed successfully
* ERROR_IIC_ADDRESS_ERROR: IIC address error
* ERROR_IIC_DATA_ERROR: IIC data error
* ERROR_IIC_TIMEOUT: IIC service timed-out
*
*
************************************************************************/
static
INT32 IIC_SAA9730_add( UINT8 *data,
UINT8 attrib,
UINT8 read ) ;
/************************************************************************
*
* IIC_SAA9730_wait
* Description :
* -------------
*
* Await IIC-bus operation being completed
*
*
* Parameters :
* ------------
*
* -
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: IIC service completed successfully
* 'ERROR_IIC_TIMEOUT' IIC service timed-out
*
*
************************************************************************/
static
INT32 IIC_SAA9730_wait( void ) ;
/************************************************************************
* Implementation : Public functions
************************************************************************/
/************************************************************************
*
* IIC_SAA9730_install
* Description :
* -------------
*
* Installs the IIC SAA9730 device drivers services in
* the IO system at the reserved device slot, found in the
* 'sysdev.h' file, which defines all major device numbers.
*
* Note:
* This service is the only public declared interface function; all
* provided device driver services are static declared, but this
* function installs the function pointers in the io-system to
* enable the provided public driver services.
*
* Parameters :
* ------------
*
* -
*
*
* Return values :
* ---------------
*
* 'OK'(=0)
* 'ERROR_IO_ILLEGAL_MAJOR': Illegal major device number
* 'ERROR_IO_NO_SPACE': Device slot already allocated
*
************************************************************************/
INT32 IIC_SAA9730_install( void )
{
/* pre-initialize local variables and install device services */
return( IO_install( SYS_MAJOR_IIC, /* major device number */
(t_io_service) IIC_SAA9730_init, /* 'init' service */
NULL, /* 'open' service na */
NULL, /* 'close' service na */
(t_io_service) IIC_SAA9730_read, /* 'read' service */
(t_io_service) IIC_SAA9730_write, /* 'write' service */
(t_io_service) IIC_SAA9730_ctrl ) ) ; /* 'ctrl' service */
}
/************************************************************************
* Implementation : Static functions
************************************************************************/
/************************************************************************
*
* IIC_SAA9730_init
* Description :
* -------------
* This service initializes the IIC driver and configures
* the IIC-bus speed via the 'syscon' parameter:
*
* 'SYSCON_COM_IIC_BAUDRATE_ID'
*
*
* Parameters :
* ------------
*
* 'major', IN, major device number
* 'minor', IN, not used
* 'p_param', INOUT, not used
*
*
* Return values :
* ---------------
*
* 'OK'(=0)
*
*
*
************************************************************************/
static
INT32 IIC_SAA9730_init(
UINT32 major, /* IN: major device number */
UINT32 minor, /* IN: minor device number */
void *p_param ) /* INOUT: device parameter block */
{
int rcode ;
/* get base for SAA9730 */
rcode = SYSCON_read( SYSCON_BOARD_SAA9730_BASE_ID,
&saa9730base,
sizeof(saa9730base) ) ;
saa9730base = (void *)KSEG1( saa9730base );
/* reset command buffer */
IIC_SAA9730_reset() ;
/* STC-register: set speed = 103.125 KHz */
REG(saa9730base, IIC_STC) = 0 ;
REG(saa9730base, IIC_STC) = REGWRI(saa9730base, IIC_STC, CLK, IIC_STC_CLK_103125HZ) ;
return( rcode ) ;
}
/************************************************************************
*
* IIC_SAA9730_read
* Description :
* -------------
* This service reads data from the specified IIC device into the
* user allocated variable, *p_param.
*
* Parameters :
* ------------
*
* 'major', IN, major device number
* 'minor', IN, minor device number for multi device drivers
* 'p_param', INOUT, variable of type, t_IIC_read_descriptor.
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: IIC device data read into user variable
* 'ERROR_IIC_COMM_ERROR': communication error detected
*
*
************************************************************************/
static
INT32 IIC_SAA9730_read(
UINT32 major, /* IN: major device number */
UINT32 minor, /* IN: minor device number */
t_IIC_read_descriptor *p_param ) /* INOUT: read buffer */
{
int i, rcode ;
UINT8 addr;
UINT8 *rdbuf ;
/* Prepare IIC-read: set slave address and 'read' flag */
addr = ((p_param->IICaddress) << 1) | 0x01 ;
/* Start IIC-read operation */
rcode = IIC_SAA9730_add( &addr, IIC_TFR_BYTEATTR_START, IIC_WRITECMD) ;
if (rcode != OK) return( rcode ) ;
/* Continue IIC-read operation */
rdbuf = p_param->buffer ;
for (i = 1; i < p_param->length ; i++)
{
rcode = IIC_SAA9730_add(rdbuf++, IIC_TFR_BYTEATTR_CONT, IIC_READCMD);
if (rcode != OK) return( rcode ) ;
}
/* Complete IIC-read operation */
rcode = IIC_SAA9730_add(rdbuf, IIC_TFR_BYTEATTR_STOP, IIC_READCMD);
if (rcode != OK) return( rcode ) ;
/* Get any remaining received data in command buffer */
rcode = IIC_SAA9730_flush() ;
return( rcode ) ;
}
/************************************************************************
*
* IIC_SAA9730_write
* Description :
* -------------
* This service writes user data to the specified IIC device.
*
*
*
* Parameters :
* ------------
*
* 'major', IN, major device number
* 'minor', IN, minor device number for multi device drivers
* 'p_param', INOUT, variable of type, t_IIC_write_descriptor.
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: IIC service completed successfully
* 'ERROR_IIC_COMM_ERROR': communication error detected
*
*
************************************************************************/
static
INT32 IIC_SAA9730_write(
UINT32 major, /* IN: major device number */
UINT32 minor, /* IN: minor device number */
t_IIC_write_descriptor *p_param ) /* IN: write buffer */
{
int i, rcode ;
UINT8 addr;
UINT8 *wrbuf ;
/* Prepare IIC-write: set slave address and 'write' condition */
addr = ((p_param->IICaddress) << 1) & 0xFE ;
/* Start IIC-write operation */
rcode = IIC_SAA9730_add( &addr, IIC_TFR_BYTEATTR_START, IIC_WRITECMD) ;
if (rcode != OK) return( rcode ) ;
/* Continue IIC-write operation */
wrbuf = p_param->buffer ;
for (i = 1; i < p_param->length ; i++)
{
rcode = IIC_SAA9730_add(wrbuf++, IIC_TFR_BYTEATTR_CONT, IIC_WRITECMD);
if (rcode != OK) return( rcode ) ;
}
/* Complete IIC-write operation */
rcode = IIC_SAA9730_add(wrbuf, IIC_TFR_BYTEATTR_STOP, IIC_WRITECMD);
if (rcode != OK) return( rcode ) ;
/* Flush any remaining data in command buffer */
rcode = IIC_SAA9730_flush() ;
/* Wait until write has finished */
if (rcode == OK)
{
rcode = -1 ;
while (rcode != OK)
{
IIC_SAA9730_add( &addr, IIC_TFR_BYTEATTR_START, IIC_WRITECMD) ;
IIC_SAA9730_add( &addr, IIC_TFR_BYTEATTR_STOP, IIC_WRITECMD);
rcode = IIC_SAA9730_flush() ;
}
}
return( rcode ) ;
}
/************************************************************************
*
* IIC_SAA9730_ctrl
* Description :
* -------------
* This service comprise following aggregated IIC services:
* 1) 'write_read' IIC device.
* 2) 'test' IIC device.
*
*
*
* Parameters :
* ------------
*
* 'major', IN, major device number
* 'minor', IN, minor device number for multi device drivers
* 'p_param', INOUT, variable of type, t_IIC_ctrl_descriptor.
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: IIC service completed successfully
* 'ERROR_IIC_COMM_ERROR': communication error detected
*
*
************************************************************************/
static
INT32 IIC_SAA9730_ctrl(
UINT32 major, /* IN: major device number */
UINT32 minor, /* IN: minor device number */
t_IIC_ctrl_descriptor *p_param ) /* INOUT: IIC device data */
{
int i, rcode ;
t_IIC_write_read_descriptor *wrd ;
UINT8 addr;
UINT8 *buffer ;
/* set default error, if command not recognized */
rcode = ERROR_IIC_UNKNOWN_COMMAND ;
if (p_param->command == IIC_CTRL_TEST)
{
/* TEST command: */
/* Prepare IIC-write: set slave address and 'write' condition */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -