📄 wmgpiotests.c
字号:
/*-----------------------------------------------------------------------------
* Copyright (c) Wolfson Microelectronics plc. All rights reserved.
*
* This software as well as any related documentation is furnished under
* license and may only be used or copied in accordance with the terms of the
* license. The information in this file is furnished for informational use
* only, is subject to change without notice, and should not be construed as
* a commitment by Wolfson Microelectronics plc. Wolfson Microelectronics plc
* assumes no responsibility or liability for any errors or inaccuracies that
* may appear in this document or any software that may be provided in
* association with this document.
*
* Except as permitted by such license, no part of this document may be
* reproduced, stored in a retrieval system, or transmitted in any form or by
* any means without the express written consent of Wolfson Microelectronics plc.
*
* $Id: WMGPIOTests.c 2656 2006-01-27 08:03:53Z fb $
*
* Tests for the WMGPIO code.
*
* Warning:
* This driver is specifically written for Wolfson Codecs. It is not a
* general CODEC device driver.
*
* --------------------------------------------------------------------------*/
/*
* Include files
*/
#include "WMCommon.h"
#include "WMControlLink.h"
#include "WMGPIO.h"
#include "WMGPIODefs.h"
#include "Test/WMTestCommon.h"
#include "Test/WMTestHelpers.h"
#include "Test/WMGPIOTests.h"
/*
* Only build this if we are asked to.
*/
#if WM_TESTING && WM_GPIO_CONTROL && WM_AUTOTEST_GPIO_CONTROL_BASIC
/*
* Global definitions
*/
/*
* We only check whether GPIOs are correctly marked as input or output
* in DEBUG mode.
*/
#ifdef DEBUG
# define GPIO_WRONG_MODE WMS_WRONG_MODE
#else
# define GPIO_WRONG_MODE WMS_SUCCESS
#endif
/* The config tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
WMSTATUS expectedInputStatus;
WMSTATUS expectedOutputStatus;
} GPIOConfigTest;
static GPIOConfigTest s_WM9712GPIOConfigTest[] =
{
{ WM_GPIO_NONE, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_1, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_2, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_3, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_4, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_5, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_6, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_7, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_8, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_9, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_10, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_11, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_12, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_13, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_14, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_15, WMS_SUCCESS, WMS_UNSUPPORTED }
};
static GPIOConfigTest s_WM9713GPIOConfigTest[] =
{
{ WM_GPIO_NONE, WMS_UNSUPPORTED, WMS_UNSUPPORTED },
{ WM_GPIO_1, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_2, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_3, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_4, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_5, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_6, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_7, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_8, WMS_SUCCESS, WMS_SUCCESS },
{ WM_GPIO_9, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_10, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_11, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_12, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_13, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_14, WMS_SUCCESS, WMS_UNSUPPORTED },
{ WM_GPIO_15, WMS_SUCCESS, WMS_UNSUPPORTED }
};
/* The polarity tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
unsigned short direction;
unsigned short polarity;
WMSTATUS expectedStatus;
} GPIOPolarityTest;
static GPIOPolarityTest s_GPIOPolarityTest[] =
{
{ WM_GPIO_NONE, WM_GPIO_INPUT, WM_GPIO_ACTIVE_LOW, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_INPUT, WM_GPIO_ACTIVE_HIGH, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_OUTPUT, WM_GPIO_ACTIVE_LOW, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_OUTPUT, WM_GPIO_ACTIVE_HIGH, WMS_UNSUPPORTED },
{ WM_GPIO_3, WM_GPIO_INPUT, WM_GPIO_ACTIVE_LOW, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_INPUT, WM_GPIO_ACTIVE_HIGH, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_OUTPUT, WM_GPIO_ACTIVE_LOW, GPIO_WRONG_MODE },
{ WM_GPIO_3, WM_GPIO_OUTPUT, WM_GPIO_ACTIVE_HIGH, GPIO_WRONG_MODE },
{ WM_GPIO_4, WM_GPIO_INPUT, WM_GPIO_ACTIVE_LOW, WMS_SUCCESS },
{ WM_GPIO_4, WM_GPIO_INPUT, WM_GPIO_ACTIVE_HIGH, WMS_SUCCESS },
{ WM_GPIO_4, WM_GPIO_OUTPUT, WM_GPIO_ACTIVE_LOW, GPIO_WRONG_MODE },
{ WM_GPIO_4, WM_GPIO_OUTPUT, WM_GPIO_ACTIVE_HIGH, GPIO_WRONG_MODE },
{ WM_GPIO_11, WM_GPIO_INPUT, WM_GPIO_ACTIVE_LOW, WMS_SUCCESS },
{ WM_GPIO_11, WM_GPIO_INPUT, WM_GPIO_ACTIVE_HIGH, WMS_SUCCESS },
{ WM_GPIO_12, WM_GPIO_INPUT, WM_GPIO_ACTIVE_LOW, WMS_SUCCESS },
{ WM_GPIO_12, WM_GPIO_INPUT, WM_GPIO_ACTIVE_HIGH, WMS_SUCCESS }
};
/* The direction tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
unsigned short direction;
WMSTATUS expectedStatus;
} GPIODirectionTest;
static GPIODirectionTest s_GPIODirectionTest[] =
{
{ WM_GPIO_NONE, WM_GPIO_INPUT, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_OUTPUT, WMS_UNSUPPORTED },
{ WM_GPIO_2, WM_GPIO_INPUT, WMS_SUCCESS },
{ WM_GPIO_2, WM_GPIO_OUTPUT, GPIO_WRONG_MODE },
{ WM_GPIO_3, WM_GPIO_INPUT, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_OUTPUT, GPIO_WRONG_MODE }
};
/* The alternate function tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
unsigned short direction;
WMSTATUS expectedStatus;
} GPIOAltFuncTest;
static GPIOAltFuncTest s_GPIOAltFuncTest[] =
{
{ WM_GPIO_NONE, WM_GPIO_INPUT, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_OUTPUT, WMS_UNSUPPORTED },
{ WM_GPIO_2, WM_GPIO_INPUT, WMS_SUCCESS },
{ WM_GPIO_2, WM_GPIO_OUTPUT, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_INPUT, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_OUTPUT, WMS_SUCCESS },
{ WM_GPIO_11, WM_GPIO_INPUT, WMS_UNSUPPORTED },
{ WM_GPIO_11, WM_GPIO_OUTPUT, WMS_UNSUPPORTED },
{ WM_GPIO_12, WM_GPIO_INPUT, WMS_UNSUPPORTED },
{ WM_GPIO_12, WM_GPIO_OUTPUT, WMS_UNSUPPORTED }
};
/* The alternate function tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
WM_BOOL expectedRetVal;
} GPIOHasAltFuncTest;
static GPIOHasAltFuncTest s_GPIOHasAltFuncTest[] =
{
{ WM_GPIO_2, WMS_RETURN_TRUE },
{ WM_GPIO_3, WMS_RETURN_TRUE },
{ WM_GPIO_11, WMS_RETURN_FALSE },
{ WM_GPIO_12, WMS_RETURN_FALSE }
};
/* The set level tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
unsigned short direction;
unsigned short level;
WMSTATUS expectedStatus;
} GPIOSetLevelTest;
static GPIOSetLevelTest s_GPIOSetLevelTest[] =
{
{ WM_GPIO_NONE, WM_GPIO_INPUT, WM_GPIO_OUTPUT_LOW, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_INPUT, WM_GPIO_OUTPUT_HIGH, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_OUTPUT, WM_GPIO_OUTPUT_LOW, WMS_UNSUPPORTED },
{ WM_GPIO_NONE, WM_GPIO_OUTPUT, WM_GPIO_OUTPUT_HIGH, WMS_UNSUPPORTED },
{ WM_GPIO_2, WM_GPIO_INPUT, WM_GPIO_OUTPUT_LOW, GPIO_WRONG_MODE },
{ WM_GPIO_2, WM_GPIO_INPUT, WM_GPIO_OUTPUT_HIGH, GPIO_WRONG_MODE },
{ WM_GPIO_2, WM_GPIO_OUTPUT, WM_GPIO_OUTPUT_LOW, WMS_SUCCESS },
{ WM_GPIO_2, WM_GPIO_OUTPUT, WM_GPIO_OUTPUT_HIGH, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_INPUT, WM_GPIO_OUTPUT_LOW, GPIO_WRONG_MODE },
{ WM_GPIO_3, WM_GPIO_INPUT, WM_GPIO_OUTPUT_HIGH, GPIO_WRONG_MODE },
{ WM_GPIO_3, WM_GPIO_OUTPUT, WM_GPIO_OUTPUT_LOW, WMS_SUCCESS },
{ WM_GPIO_3, WM_GPIO_OUTPUT, WM_GPIO_OUTPUT_HIGH, WMS_SUCCESS },
{ WM_GPIO_11, WM_GPIO_INPUT, WM_GPIO_OUTPUT_LOW, GPIO_WRONG_MODE },
{ WM_GPIO_11, WM_GPIO_INPUT, WM_GPIO_OUTPUT_HIGH, GPIO_WRONG_MODE },
{ WM_GPIO_12, WM_GPIO_INPUT, WM_GPIO_OUTPUT_LOW, GPIO_WRONG_MODE },
{ WM_GPIO_12, WM_GPIO_INPUT, WM_GPIO_OUTPUT_HIGH, GPIO_WRONG_MODE }
};
/* The get level tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
unsigned short expectedLevel;
} GPIOGetLevelTest;
static GPIOGetLevelTest s_GPIOGetLevelTest[] =
{
{ WM_GPIO_2, WM_GPIO_OUTPUT_LOW },
{ WM_GPIO_2, WM_GPIO_OUTPUT_HIGH },
{ WM_GPIO_3, WM_GPIO_OUTPUT_LOW },
{ WM_GPIO_3, WM_GPIO_OUTPUT_HIGH }
};
/* The virtual gpio tests, as a table */
typedef struct
{
WM_GPIO_PIN gpioPin;
WM_BOOL expectedRetVal;
} GPIOHasVirtualGPIOTest;
static GPIOHasVirtualGPIOTest s_GPIOHasVirtualGPIOTest[] =
{
{ WM_GPIO_2, WMS_RETURN_FALSE },
{ WM_GPIO_3, WMS_RETURN_FALSE },
{ WM_GPIO_11, WMS_RETURN_TRUE },
{ WM_GPIO_12, WMS_RETURN_TRUE }
};
/*
* Function prototypes
*/
/*-----------------------------------------------------------------------------
* Function: WMTestGPIOBasic
*
* Test the basic GPIO functionality.
*
* Parameters:
* hDevice handle to the device (from WMOpenDevice)
*
* Returns: WM_BOOL
* TRUE if they passed, FALSE if any failed.
*---------------------------------------------------------------------------*/
WMTEST_START( WMTestGPIOBasic( WM_DEVICE_HANDLE hDevice ) )
{
savedRegister savedRegs[MAX_REGISTER_COUNT];
WM_REGVAL savedPowerReg[ MAX_GLOBAL_POWER_REGS ];
WM_POWERFLAG savedPowerRequirements[ WM_MAX_DRIVERS ];
WM_POWERFLAG savedWmPower = 0;
if ( IS_WM8753_FAMILY( hDevice ) )
{
WMTEST_TRACE(( "\r\n--- GPIO testing support not built for WM8753 ---\r\n"));
WMTEST_SKIP();
}
if ( ! WM_IS_GPIO_CONTROL_SUPPORTED( hDevice ) )
{
WMTEST_SKIP();
}
/* Save our state */
WMTEST_RUN( WMTest_SaveState( hDevice,
savedRegs,
savedPowerReg,
savedPowerRequirements,
&savedWmPower ) );
/* Now run the tests */
WMTEST_RUN( WMTestGPIOConfig( hDevice ) );
WMTEST_RUN( WMTestGPIOPolarity( hDevice ) );
WMTEST_RUN( WMTestGPIOEnableSticky( hDevice ) );
WMTEST_RUN( WMTestGPIOWakeUp( hDevice ) );
WMTEST_RUN( WMTestGPIOHasAltFunc( hDevice ) );
WMTEST_RUN( WMTestGPIOHasVirtualGPIO( hDevice ) );
WMTEST_RUN( WMTestGPIOEnableAlternateFunction( hDevice ) );
WMTEST_RUN( WMTestGPIOInvertIRQ( hDevice ) );
WMTEST_RUN( WMTestGPIOEnableGlobalWake( hDevice ) );
WMTEST_RUN( WMTestGPIOSetOutputLevel( hDevice ) );
WMTEST_RUN( WMTestGPIOGetOutputLevel( hDevice ) );
/* And set things back again. */
WMTEST_RUN( WMTest_RestoreState( hDevice,
savedRegs,
savedPowerReg,
savedPowerRequirements,
&savedWmPower ) );
}
WMTEST_END
#if WM_AUTOTEST_GPIO_CONTROL_ADVANCED
/*-----------------------------------------------------------------------------
* Function: WMTestGPIOAdvanced
*
* Test the advanced GPIO functionality.
* NOTE: To pass these test succesfully, GPIO_TEST_1 & GPIO_TEST_2 which
* are defined in WMConfig.h must be connected together.
*
* Parameters:
* hDevice handle to the device (from WMOpenDevice)
*
* Returns: WM_BOOL
* TRUE if they passed, FALSE if any failed.
*---------------------------------------------------------------------------*/
WMTEST_START( WMTestGPIOAdvanced( WM_DEVICE_HANDLE hDevice ) )
{
savedRegister savedRegs[MAX_REGISTER_COUNT];
WM_REGVAL savedPowerReg[ MAX_GLOBAL_POWER_REGS ];
WM_POWERFLAG savedPowerRequirements[ WM_MAX_DRIVERS ];
WM_POWERFLAG savedWmPower = 0;
if ( IS_WM8753_FAMILY( hDevice ) )
{
WMTEST_TRACE(( " --- GPIO testing support not built for WM8753 ---\n"));
WMTEST_SKIP();
}
if ( ! WM_IS_GPIO_CONTROL_SUPPORTED( hDevice ) )
{
WMTEST_SKIP();
}
/* Save our state */
WMTEST_RUN( WMTest_SaveState( hDevice,
savedRegs,
savedPowerReg,
savedPowerRequirements,
&savedWmPower ) );
/* Now run the tests */
WMTEST_RUN( WMTestGPIOStatus( hDevice, GPIO_TEST_1, GPIO_TEST_2 ) );
WMTEST_RUN( WMTestGPIOStatus( hDevice, GPIO_TEST_2, GPIO_TEST_1 ) );
/* And set things back again. */
WMTEST_RUN( WMTest_RestoreState( hDevice,
savedRegs,
savedPowerReg,
savedPowerRequirements,
&savedWmPower ) );
}
WMTEST_END
#endif /* WM_AUTOTEST_GPIO_CONTROL_ADVANCED */
/*-----------------------------------------------------------------------------
* Function: WMTestGPIOConfig
*
* Test WMGPIOConfig function.
*
* Parameters:
* hDevice handle to the device (from WMOpenDevice)
*
* Returns: WM_BOOL
* TRUE if it passed, FALSE if it failed.
*---------------------------------------------------------------------------*/
WMTEST_START( WMTestGPIOConfig( WM_DEVICE_HANDLE hDevice ) )
{
const WM_CHIPDEF *pChipDef;
GPIOConfigTest *pTests = NULL;
int nTests = 0;
int test = 0;
WM_REGVAL originalVal = 0;
/*
* Look up our chipdef.
*/
pChipDef = WMGetChipDef( hDevice );
WMTEST_NOTNULL( pChipDef );
switch ( pChipDef->deviceType )
{
case WM_CHIP_WM9712:
pTests = s_WM9712GPIOConfigTest;
nTests = WM_ARRAY_COUNT( s_WM9712GPIOConfigTest );
break;
case WM_CHIP_WM9713:
pTests = s_WM9713GPIOConfigTest;
nTests = WM_ARRAY_COUNT( s_WM9713GPIOConfigTest );
break;
default:
WMTEST_ASSERT( pChipDef->deviceType == 0 );
}
if( pTests )
{
/*
* Get the current setting.
*/
WMTEST_CALL( WMRead( hDevice, WM97_GPIO_PIN_CONFIG, &originalVal ) );
/*
* Now run through each test.
*/
for ( test = 0; test < nTests; test++ )
{
WM_GPIO_PIN gpioPin;
WMSTATUS expectedInputStatus, expectedOutputStatus;
gpioPin = pTests[test].gpioPin;
expectedInputStatus = pTests[test].expectedInputStatus;
expectedOutputStatus = pTests[test].expectedOutputStatus;
/*
* Try and configure the pin as an input.
*/
WMTEST_CALL_STATUS( WMGPIOConfig( hDevice, gpioPin, WM_GPIO_INPUT ),
expectedInputStatus
);
/*
* Try and configure the pin as an output.
*/
WMTEST_CALL_STATUS( WMGPIOConfig( hDevice, gpioPin, WM_GPIO_OUTPUT ),
expectedOutputStatus
);
}
/*
* Finally set it back to the original setting.
*/
WMTEST_CALL( WMWrite( hDevice, WM97_GPIO_PIN_CONFIG, originalVal ) );
}
}
WMTEST_END
/*-----------------------------------------------------------------------------
* Function: WMTestGPIOPolarity
*
* Test WMGPIOSetInputPolarity function.
*
* Parameters:
* hDevice handle to the device (from WMOpenDevice)
*
* Returns: WM_BOOL
* TRUE if it passed, FALSE if it failed.
*---------------------------------------------------------------------------*/
WMTEST_START( WMTestGPIOPolarity( WM_DEVICE_HANDLE hDevice ) )
{
const WM_CHIPDEF *pChipDef;
GPIOPolarityTest *pTests = NULL;
int nTests = 0;
int test;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -