⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iox.c

📁 IT projecotr reference design.
💻 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 + -