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

📄 wmgpiotests.c

📁 pxa270平台 windows mobile 5.2 wm9713 触摸屏+音频驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/*-----------------------------------------------------------------------------
 * 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 + -