📄 iox.c
字号:
/****************************************************************************/
/* TEXAS INSTRUMENTS PROPRIETARY INFORMATION */
/* */
/* (c) Copyright, Texas Instruments Incorporated, 2006. */
/* All Rights Reserved. */
/* */
/* Property of Texas Instruments Incorporated. Restricted Rights - */
/* Use, duplication, or disclosure is subject to restrictions set */
/* forth in TI's program license agreement and associated documentation. */
/****************************************************************************/
/****************************************************************************/
/* iox.c */
/* */
/* IO Expander. */
/****************************************************************************/
#include "common.h"
#include "i2c.h"
#include "sysmon.h"
#include "dbmessage.h"
#include "ioExpander.h"
#include "iox.h"
static IOXINITSTRUCT ioxInit =
{
IOXDEVICE_TYPE, /* driver type */
IOXDEVICE_PORT, /* base i2c device address */
IOXDEVICE_PINS, /* number of external points */
IOXDEVICE_TIMEOUT /* semaphore timeout (ms) */
};
static BOOL isOpen = FALSE; /* driver-is-open flag */
static int08 nPins; /* number of expander pins */
uint32 ioxDirection; /* direction bitfield: 0=output, 1=input */
uint32 ioxState; /* state bitfield */
EXEC_CC_ENUM ioxError( IOXCC cc ); /* log error message and return error */
/****************************************************************************/
/* Initialize external IO. */
/****************************************************************************/
EXEC_CC_ENUM iox_init( void )
{
IOXCC cc;
int08 i; /* index */
if( ioxdd_type() != ioxInit.xType ) /* validate device type */
return ioxError( IOXCC_DEVTYPE );
if(( nPins = ioxInit.xNumPins ) > MAXPIN ) /* validate number of pins */
return ioxError( IOXCC_PINNO );
if( ioxInit.xPort >= I2C_MAX_PORT ) /* validate i2c port */
return ioxError( IOXCC_PORTCFG );
if( IOXCC_PASS != ( cc = ioxdd_open( &ioxInit ))) /* open the driver */
return ioxError( cc );
ioxDirection = 0xffffffff; /* pin direction bitfield */
ioxState = 0xffffffff; /* pin state bitfield */
for( i = 0; i < ioxInit.xNumPins; i++ ) /* initialize pin states */
ioxdd_configPin( IOX_PINCFG( i, IOX_IN, IOX_TRUE ));
isOpen = TRUE;
return EXEC_CC_PASS;
}
/****************************************************************************/
/* Get an IOX point configuration. */
/****************************************************************************/
IOXCC iox_cfgGet( int08 pin, uint08 *pPointCfg )
{
IOXCC cc; /* completion code */
BOOL pinState; /* current state of pin */
if( !isOpen ) /* if driver not open */
return IOXCC_NOTOPEN;
if( pin > nPins ) /* if invalid pin */
return IOXCC_PINNO;
if( IOXCC_PASS != ( cc = iox_pinGet( pin, &pinState ))) /* get state */
return cc;
if( 0 == ( ioxDirection & ( 0x00000001 << pin ))) /* if output */
*pPointCfg = IOX_PINCFG( pin, IOX_OUT, pinState );
else /* if input */
*pPointCfg = IOX_PINCFG( pin, IOX_IN, pinState );
return IOXCC_PASS;
}
/****************************************************************************/
/* Configure an IOX point. */
/****************************************************************************/
IOXCC iox_cfgSet( uint08 pinCfg )
{
if( !isOpen ) /* if driver not open */
return IOXCC_NOTOPEN;
if( IOX_GETPIN( pinCfg ) >= nPins ) /* if invalid pin */
return IOXCC_PINNO;
return ioxdd_configPin( pinCfg );
}
/****************************************************************************/
/* Config multiple points. */
/****************************************************************************/
IOXCC iox_cfgSetMult( uint08 *pPinCfg, size_t n )
{
IOXCC cc; /* completion code */
while( n-- )
if( IOXCC_PASS != ( cc = iox_cfgSet( *pPinCfg++ )))
return cc;
return IOXCC_PASS;
}
/****************************************************************************/
/* Get an IOX point value. */
/****************************************************************************/
IOXCC iox_pinGet( int08 pin, BOOL *pValue )
{
if( !isOpen ) /* if driver not open */
return IOXCC_NOTOPEN;
if( pin >= nPins ) /* if invalid pin */
return IOXCC_PINNO;
return ioxdd_readPin( pin, pValue );
}
/****************************************************************************/
/* Set an IOX point value. */
/****************************************************************************/
IOXCC iox_pinSet( int08 pin, BOOL value )
{
if( !isOpen ) /* if driver not open */
return IOXCC_NOTOPEN;
if( pin >= nPins ) /* if invalid pin */
return IOXCC_PINNO;
if( 0 != ( ioxDirection & ( 0x00000001 << pin ))) /* if input */
return IOXCC_PORTCFG; /* can't set input pin */
return ioxdd_drivePin( pin, value );
}
/****************************************************************************/
/* Log error message and return error. */
/****************************************************************************/
EXEC_CC_ENUM ioxError( IOXCC cc )
{
dbmsg_ftrace( DBM_ALWAYS, "Can't open iox: cc = %d\r\n", cc );
return EXEC_CC_FAIL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -