diff --git a/embedded/Drivers/LPC5410x-CM4/CMSIS/Driver_GPIO.c b/embedded/Drivers/LPC5410x-CM4/CMSIS/Driver_GPIO.c new file mode 100644 index 0000000..8b281fb --- /dev/null +++ b/embedded/Drivers/LPC5410x-CM4/CMSIS/Driver_GPIO.c @@ -0,0 +1,267 @@ +/* Open Sensor Platform Project + * https://github.com/sensorplatforms/open-sensor-platform + * + * Copyright (C) 2015 Audience Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*-------------------------------------------------------------------------------------------------*\ + | I N C L U D E F I L E S +\*-------------------------------------------------------------------------------------------------*/ +#include "common.h" +#include "Driver_GPIO.h" +#include "chip.h" + +/*-------------------------------------------------------------------------------------------------*\ + | P R I V A T E C O N S T A N T S & M A C R O S +\*-------------------------------------------------------------------------------------------------*/ +#define OSP_GPIO_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR( 1,00 ) + +/*-------------------------------------------------------------------------------------------------*\ + | T Y P E D E F I N I T I O N S +\*-------------------------------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------------------------------*\ + | S T A T I C V A R I A B L E S D E F I N I T I O N S +\*-------------------------------------------------------------------------------------------------*/ +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = +{ + OSP_GPIO_API_VERSION, + OSP_GPIO_DRV_VERSION +}; + +/*-------------------------------------------------------------------------------------------------*\ + | P R I V A T E F U N C T I O N S +\*-------------------------------------------------------------------------------------------------*/ +/**************************************************************************************************** + * @fn OSP_GPIO_GetVersion + * Get driver version. + * + * @param gpio_priv Private argument (Unused) + * + * @return ARM_DRIVER_VERSION + * + ***************************************************************************************************/ +static ARM_DRIVER_VERSION OSP_GPIO_GetVersion( void *gpio_priv ) +{ + return DriverVersion; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_Initialize + * Initializes the GPIO Module and Hardware + * + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_Initialize( void *gpio_priv ) +{ + /* Enable the peripheral clock in the PMC */ + Chip_GPIO_Init( LPC_GPIO ); + + /* Enable Pin interrupt sources */ + Chip_PININT_Init( NULL ); + return ARM_DRIVER_OK; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_Uninitialize + * Unitialize the GPIO Module + * + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_Uninitialize( void *gpio_priv ) +{ + /* Uninitialize GPIO */ + Chip_GPIO_DeInit( LPC_GPIO ); + + Chip_PININT_DeInit( NULL ); + return ARM_DRIVER_OK; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_PowerControl + * Control the GPIO's power state + * + * @param state Target GPIO Power state + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_PowerControl( ARM_POWER_STATE state, void *gpio_priv ) +{ + switch ( state ) + { + case ARM_POWER_OFF: + Chip_GPIO_DeInit( LPC_GPIO ); + break; + + case ARM_POWER_FULL: + Chip_GPIO_Init( LPC_GPIO ); + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + return ARM_DRIVER_OK; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_SetDirection + * Set the direction of GPIO pin + * + * @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number) + * @param dir Direction (GPIO_DIR_INPUT or GPIO_DIR_OUTPUT) + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_SetDirection( uint32_t pin, uint32_t dir, void *gpio_priv ) +{ + uint32_t port_num = 0, pin_num = 0; + + ASF_assert( pin != (PinName)NC ); + ASF_assert( (dir == ARM_GPIO_DIR_INPUT) || (dir == ARM_GPIO_DIR_OUTPUT) ); + port_num = DECODE_PORT( pin ); + pin_num = DECODE_PIN( pin ); + + ( dir == ARM_GPIO_DIR_OUTPUT ) ? Chip_GPIO_SetPinDIROutput( LPC_GPIO, port_num, pin_num ) : \ + Chip_GPIO_SetPinDIRInput( LPC_GPIO, port_num, pin_num ); + return ARM_DRIVER_OK; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_SetTrigger + * Set the trigger mode for GPIO + * + * @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number) + * @param trigger Trigger mode + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_SetTrigger( uint32_t pin, uint32_t trigger, void *gpio_priv ) +{ + uint8_t index = 0; + uint8_t pinInterruptChannel = 0; + + ASF_assert( pin != (PinName)NC ); + + for ( ; index < MAX_PIN_INTERRUPT_CHANNEL; index++ ) + { + if ( GPIO_PinMap[index].pin == pin ) + { + pinInterruptChannel = GPIO_PinMap[index].pinInterruptChannel; + break; + } + } + + ASF_assert( index < MAX_PIN_INTERRUPT_CHANNEL ); + + if ( trigger & (1 << ARM_GPIO_TRIGGER_EDGE) ) + { + Chip_PININT_SetPinModeEdge( LPC_PININT, pinInterruptChannel ); /* edge sensitive */ + } + else + { + Chip_PININT_SetPinModeLevel( LPC_PININT, pinInterruptChannel ); /* Level sensitive */ + } + + if ( (trigger & (1 << ARM_GPIO_TRIGGER_HIGH)) || (trigger & (1 << ARM_GPIO_TRIGGER_RISING)) ) + { + Chip_PININT_EnableIntHigh( LPC_PININT, pinInterruptChannel ); /* Rising Edge/High Level */ + } + else + { + Chip_PININT_EnableIntLow( LPC_PININT, pinInterruptChannel ); /* Falling Edge/Low Level */ + } + return ARM_DRIVER_OK; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_WritePin + * Set the GPIO Pin state + * + * @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number) + * @param val Value to be written (0 or 1) + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_WritePin( uint32_t pin, uint32_t val, void *gpio_priv ) +{ + uint32_t port_num = 0, pin_num = 0; + + ASF_assert( pin != (PinName)NC ); + ASF_assert( val <= 1 ); + port_num = DECODE_PORT( pin ); + pin_num = DECODE_PIN( pin ); + + Chip_GPIO_WritePortBit( LPC_GPIO, port_num, pin_num, (bool) val ); + return ARM_DRIVER_OK; +} + +/**************************************************************************************************** + * @fn OSP_GPIO_ReadPin + * Get the GPIO Pin value + * + * @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number) + * @param gpio_priv Private argument (Unused) + * + * @return pin value + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_ReadPin( uint32_t pin, void *gpio_priv ) +{ + uint32_t port_num = 0, pin_num = 0; + + ASF_assert( pin != (PinName)NC ); + port_num = DECODE_PORT( pin ); + pin_num = DECODE_PIN( pin ); + + return ( Chip_GPIO_ReadPortBit( LPC_GPIO, port_num, pin_num ) ); +} + +/**************************************************************************************************** + * @fn OSP_GPIO_SetHandler + * Handler function + * + * @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number) + * @param handler Pointer to handler function + * @param data Data to pass to the handler + * @param gpio_priv Private argument (Unused) + * + * @return Return code: On success return ARM_DRIVER_OK + * + ***************************************************************************************************/ +static int32_t OSP_GPIO_SetHandler( uint32_t pin, ARM_GPIO_Handler_t handler, void *data, void *gpio_priv ) +{ + return ARM_DRIVER_ERROR_UNSUPPORTED; //Not Supported +} + +/* Driver Definition */ +ARM_BUILD_DRIVER_GPIO( GPIO, OSP_GPIO, NULL ); + +/*-------------------------------------------------------------------------------------------------*\ + | E N D O F F I L E +\*-------------------------------------------------------------------------------------------------*/ diff --git a/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvoptx b/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvoptx index 625f4ec..222b0e4 100644 --- a/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvoptx +++ b/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvoptx @@ -1365,6 +1365,26 @@ + + Device + 0 + 0 + 0 + 0 + + 13 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\embedded\Drivers\LPC5410x-CM4\CMSIS\Driver_GPIO.c + Driver_GPIO.c + 0 + 0 + + + ::CMSIS 0 diff --git a/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvprojx b/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvprojx index c44dd66..fa5cfe7 100644 --- a/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvprojx +++ b/embedded/projects/SH-Xpresso-LPC54102/keil-mdk-build/SH-Xpresso-LPC54102.uvprojx @@ -790,6 +790,16 @@ + + Device + + + Driver_GPIO.c + 1 + ..\..\..\..\embedded\Drivers\LPC5410x-CM4\CMSIS\Driver_GPIO.c + + + ::CMSIS @@ -1579,6 +1589,16 @@ + + Device + + + Driver_GPIO.c + 1 + ..\..\..\..\embedded\Drivers\LPC5410x-CM4\CMSIS\Driver_GPIO.c + + + ::CMSIS @@ -2368,6 +2388,16 @@ + + Device + + + Driver_GPIO.c + 1 + ..\..\..\..\embedded\Drivers\LPC5410x-CM4\CMSIS\Driver_GPIO.c + + + ::CMSIS @@ -2740,7 +2770,7 @@ SYSTEM_CLOCK_FREQ=96000000, __FPU_PRESENT=1, CHIP_LPC5410X, CORE_M4, DEBUG_BUILD, XPRESSO_LPC54102_BOARD, UART_DMA_ENABLE, ANDROID_DEMO, ASF_PROFILING, ON_DEMAND_PROFILING - ..\sources\app;..\sources\config;..\sources\boardsupport;..\..\..\..\include;..\..\..\common\app;..\..\..\common\asf;..\..\..\common\alg;..\..\..\..\external\rtos\rtx\inc;..\..\..\..\external\rtos\rtx\cm;..\..\..\..\external\MCU\NXP-5410x\CSLib\inc;..\..\..\common\modules\bus-drivers;..\..\..\common\modules\sensor-drivers;..\..\..\..\external\Drivers\Sensor\Bosch-Sensortec;..\..\..\common\hostinterface + ..\sources\app;..\sources\config;..\sources\boardsupport;..\..\..\..\include;..\..\..\common\app;..\..\..\common\asf;..\..\..\common\alg;..\..\..\..\external\rtos\rtx\inc;..\..\..\..\external\rtos\rtx\cm;..\..\..\..\external\MCU\NXP-5410x\CSLib\inc;..\..\..\common\modules\bus-drivers;..\..\..\common\modules\sensor-drivers;..\..\..\..\external\Drivers\Sensor\Bosch-Sensortec;..\..\..\common\hostinterface;..\..\..\..\external\CMSIS\Driver\Include @@ -3157,6 +3187,16 @@ + + Device + + + Driver_GPIO.c + 1 + ..\..\..\..\embedded\Drivers\LPC5410x-CM4\CMSIS\Driver_GPIO.c + + + ::CMSIS diff --git a/embedded/projects/SH-Xpresso-LPC54102/sources/app/hostif_i2c.c b/embedded/projects/SH-Xpresso-LPC54102/sources/app/hostif_i2c.c index a8e2fdd..c56cc98 100644 --- a/embedded/projects/SH-Xpresso-LPC54102/sources/app/hostif_i2c.c +++ b/embedded/projects/SH-Xpresso-LPC54102/sources/app/hostif_i2c.c @@ -24,10 +24,12 @@ #include "i2cs_driver.h" #include "hostif_i2c.h" #include +#include "Driver_GPIO.h" /*-------------------------------------------------------------------------------------------------*\ | E X T E R N A L V A R I A B L E S & F U N C T I O N S \*-------------------------------------------------------------------------------------------------*/ +extern ARM_DRIVER_GPIO Driver_GPIO; /*-------------------------------------------------------------------------------------------------*\ | P R I V A T E C O N S T A N T S & M A C R O S @@ -362,10 +364,10 @@ void Hostif_I2C_Init(void) i2c_slave_mode(&slave_i2c_handle,1); /* init host interrupt pin */ - Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, HOSTIF_IRQ_PORT, HOSTIF_IRQ_PIN); + Driver_GPIO.SetDirection (ENCODE_PORT_PIN(HOSTIF_IRQ_PORT, HOSTIF_IRQ_PIN), ARM_GPIO_DIR_OUTPUT); /* de-assert interrupt line to high to indicate Host/AP that - * there is no data to receive */ - Chip_GPIO_SetPinState(LPC_GPIO_PORT, HOSTIF_IRQ_PORT, HOSTIF_IRQ_PIN, 0); + * there is no data to receive */ + Driver_GPIO.WritePin (ENCODE_PORT_PIN(HOSTIF_IRQ_PORT, HOSTIF_IRQ_PIN), false); /* Enable the interrupt for the I2C */ NVIC_SetPriority(I2C_HOSTIF_IRQn, HOSTIF_IRQ_PRIORITY); diff --git a/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup.c b/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup.c index d8ec16d..398bc88 100644 --- a/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup.c +++ b/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup.c @@ -21,10 +21,12 @@ #include "common.h" #include "timer_5410x.h" #include "i2c_driver.h" +#include "Driver_GPIO.h" /*-------------------------------------------------------------------------------------------------*\ | E X T E R N A L V A R I A B L E S & F U N C T I O N S \*-------------------------------------------------------------------------------------------------*/ +extern ARM_DRIVER_GPIO Driver_GPIO; /*-------------------------------------------------------------------------------------------------*\ | P U B L I C V A R I A B L E S D E F I N I T I O N S @@ -32,6 +34,15 @@ const uint32_t ExtClockIn = 0; const GpioInfo_t DiagLEDs[NUM_LEDS] = {PINS_LEDS}; +/* Mapping of Port and Pin to Pin Interrupt Channel */ +const GPIO_PinMap_t GPIO_PinMap[MAX_PIN_INTERRUPT_CHANNEL] = +{ + { ENCODE_PORT_PIN( ACCEL_INT_PORT, ACCEL_INT_PIN ), ACCEL_PINT_CH }, /* Channel 0 */ + { ENCODE_PORT_PIN( GYRO_INT_PORT, GYRO_INT_PIN ), GYRO_PINT_CH }, /* Channel 1 */ + { ENCODE_PORT_PIN( MAG_INT_PORT, MAG_INT_PIN ), MAG_PINT_CH }, /* Channel 2 */ + { ENCODE_PORT_PIN( PROXI_INT_PORT, PROXI_INT_PIN ), PROXI_PINT_CH } /* Channel 3 */ +}; + /*-------------------------------------------------------------------------------------------------*\ | P R I V A T E C O N S T A N T S & M A C R O S \*-------------------------------------------------------------------------------------------------*/ @@ -43,21 +54,6 @@ const GpioInfo_t DiagLEDs[NUM_LEDS] = {PINS_LEDS}; /*-------------------------------------------------------------------------------------------------*\ | S T A T I C V A R I A B L E S D E F I N I T I O N S \*-------------------------------------------------------------------------------------------------*/ -/* Pin muxing table, only items that need changing from their default pin - state are in this table. Not every pin is mapped. */ -//TODO Pin init should be moved to respective modules handling the pin function -STATIC const PINMUX_GRP_T pinmuxing[] = { - - /* I2C1 standard/fast (bridge) */ - {0, 27, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_STDI2C_EN)}, /* BRIDGE_SCL (SCL) */ - {0, 28, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_STDI2C_EN)}, /* BRIDGE_SDA (SDA) */ - - /* Sensor related */ - {0, 4, (IOCON_FUNC0 | IOCON_MODE_PULLDOWN | IOCON_DIGITAL_EN)}, /* GYR_INT1 (GPIO input) */ - {0, 18, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN)}, /* CT32B0_MAT0-ACCL_INT1 */ - {0, 22, (IOCON_FUNC0 | IOCON_MODE_PULLDOWN | IOCON_DIGITAL_EN)}, /* MAG_DRDY_INT (GPIO input) */ - -}; /*-------------------------------------------------------------------------------------------------*\ | F O R W A R D F U N C T I O N D E C L A R A T I O N S @@ -67,20 +63,6 @@ STATIC const PINMUX_GRP_T pinmuxing[] = { | P R I V A T E F U N C T I O N S \*-------------------------------------------------------------------------------------------------*/ -/**************************************************************************************************** - * @fn GPIO_AINConfig - * Configures all IOs as AIN to reduce the power consumption. - * - * @param none - * - * @return none - * - ***************************************************************************************************/ -static void GPIO_AINConfig(void) -{ -} - - /*-------------------------------------------------------------------------------------------------*\ | P U B L I C F U N C T I O N S \*-------------------------------------------------------------------------------------------------*/ @@ -143,13 +125,11 @@ void LED_Init( void ) Chip_IOCON_PinMuxSet(LPC_IOCON, DiagLEDs[index].PinDef.port, DiagLEDs[index].PinDef.pin, DiagLEDs[index].PinDef.modefunc); - Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, DiagLEDs[index].PinDef.port, DiagLEDs[index].PinDef.pin); + Driver_GPIO.SetDirection (ENCODE_PORT_PIN(DiagLEDs[index].PinDef.port,DiagLEDs[index].PinDef.pin), ARM_GPIO_DIR_OUTPUT); LED_Off(index); } } - - /**************************************************************************************************** * @fn SystemGPIOConfig * Configures the various GPIO ports on the chip according to the usage by various @@ -162,20 +142,14 @@ void LED_Init( void ) ***************************************************************************************************/ void SystemGPIOConfig( void ) { - /* Set all GPIOs to analog input mode to begin with */ - GPIO_AINConfig(); - - /* Enable the peripheral clock in the PMC */ - Chip_GPIO_Init(LPC_GPIO_PORT); + /* Initialize GPIO */ + Driver_GPIO.Initialize(); /* Setup the Sensor Hub interrupt pin as output */ //Chip_IOCON_Config(LPC_IOCON, SH_INT_PIN); //Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, SH_INT_GPIO_GRP, SH_INT_GPIO_PIN); //SensorHubIntLow(); //Deassert on startup - /* TODO: Catch ALL for uninitialized pins... should be moved to respective modules */ - Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); - /* Setup DMA Common here since its not specific to any peripheral */ Chip_DMA_Init(LPC_DMA); //Chip_SYSCON_PeriphReset(RESET_DMA); @@ -192,9 +166,6 @@ void SystemGPIOConfig( void ) void SystemInterruptConfig( void ) { NVIC_SetPriorityGrouping( SYSTEM_INTERRUPT_PRIORITY_GRP ); - - /* Enable Pin interrupt sources */ - Chip_PININT_Init(NULL); /* Note: input arg is ignored! */ } @@ -344,6 +315,8 @@ void Board_SensorIfInit( InputSensor_t ifID ) switch (ifID) { case ACCEL_INPUT_SENSOR: + /* Initialize the pinmux pin */ + Chip_IOCON_PinMuxSet(LPC_IOCON, PIN_ACCEL); /* ACCEL INT1 irq setup */ NVIC_DisableIRQ(ACCEL_PINT_IRQn); NVIC_SetPriority(ACCEL_PINT_IRQn, ACCEL_INT_IRQ_PRIORITY); @@ -351,18 +324,15 @@ void Board_SensorIfInit( InputSensor_t ifID ) Chip_GPIO_SetPinDIR(LPC_GPIO_PORT, ACCEL_INT_PORT, ACCEL_INT_PIN, false); Chip_INMUX_PinIntSel(ACCEL_PINT_SEL, ACCEL_INT_PORT, ACCEL_INT_PIN); - Chip_PININT_SetPinModeEdge(LPC_PININT, ACCEL_PINT_CH); /* edge sensitive */ - Chip_PININT_EnableIntHigh(LPC_PININT, ACCEL_PINT_CH); /* Rising edge interrupt */ + /* High Edge Trigger */ + Driver_GPIO.SetTrigger( ENCODE_PORT_PIN( ACCEL_INT_PORT, ACCEL_INT_PIN ), + ( ( 1 << ARM_GPIO_TRIGGER_EDGE ) | ( 1 << ARM_GPIO_TRIGGER_HIGH ) ) ); - //pinDef.pin = ENCODE_PORT_PIN(ACCEL_INT2_PORT, ACCEL_INT2_PIN); - //gpio_dir(&pinDef, PIN_INPUT); - - //Chip_SYSCON_EnableWakeup(ACCEL_WAKE); /* enable to wake from sleep */ - - //gpio_irq_disable(&gpioIrq); break; case MAG_INPUT_SENSOR: + /* Initialize the pinmux pin */ + Chip_IOCON_PinMuxSet(LPC_IOCON, PIN_MAG); NVIC_DisableIRQ(MAG_PINT_IRQn); NVIC_SetPriority(MAG_PINT_IRQn, MAG_INT_IRQ_PRIORITY); @@ -370,17 +340,15 @@ void Board_SensorIfInit( InputSensor_t ifID ) Chip_GPIO_SetPinDIR(LPC_GPIO_PORT, MAG_INT_PORT, MAG_INT_PIN, false); Chip_INMUX_PinIntSel(MAG_PINT_SEL, MAG_INT_PORT, MAG_INT_PIN); - Chip_PININT_SetPinModeEdge(LPC_PININT, MAG_PINT_CH); /* edge sensitive */ - Chip_PININT_EnableIntHigh(LPC_PININT, MAG_PINT_CH); /* Rising edge interrupt */ - - //Chip_SYSCON_EnableWakeup(MAG_WAKE); /* enable to wake from sleep */ - //Chip_SYSCON_EnableWakeup(SYSCON_STARTER_WWDT); /* enable to wake from sleep */ + /* High Edge Trigger */ + Driver_GPIO.SetTrigger( ENCODE_PORT_PIN( MAG_INT_PORT, MAG_INT_PIN ), + ( ( 1 << ARM_GPIO_TRIGGER_EDGE ) | ( 1 << ARM_GPIO_TRIGGER_HIGH ) ) ); - //pinDef.pin = ENCODE_PORT_PIN(MAG_INT3_PORT, MAG_INT3_PIN); - //gpio_dir(&pinDef,PIN_INPUT); break; case GYRO_INPUT_SENSOR: + /* Initialize the pinmux pin */ + Chip_IOCON_PinMuxSet(LPC_IOCON, PIN_GYRO); NVIC_DisableIRQ(GYRO_PINT_IRQn); NVIC_SetPriority(GYRO_PINT_IRQn, GYRO_INT_IRQ_PRIORITY); @@ -388,10 +356,10 @@ void Board_SensorIfInit( InputSensor_t ifID ) Chip_GPIO_SetPinDIR(LPC_GPIO_PORT, GYRO_INT_PORT, GYRO_INT_PIN, false); Chip_INMUX_PinIntSel(GYRO_PINT_SEL, GYRO_INT_PORT, GYRO_INT_PIN); - Chip_PININT_SetPinModeEdge(LPC_PININT, GYRO_PINT_CH); /* edge sensitive */ - Chip_PININT_EnableIntHigh(LPC_PININT, GYRO_PINT_CH); /* Rising edge interrupt */ + /* High Edge Trigger */ + Driver_GPIO.SetTrigger( ENCODE_PORT_PIN( GYRO_INT_PORT, GYRO_INT_PIN ), + ( ( 1 << ARM_GPIO_TRIGGER_EDGE ) | ( 1 << ARM_GPIO_TRIGGER_HIGH ) ) ); - //Chip_SYSCON_EnableWakeup(GYRO_WAKE); break; case PRESSURE_INPUT_SENSOR: diff --git a/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup_xpresso_lpc54102.h b/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup_xpresso_lpc54102.h index f183077..5bbaa61 100644 --- a/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup_xpresso_lpc54102.h +++ b/embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup_xpresso_lpc54102.h @@ -34,6 +34,35 @@ \*-------------------------------------------------------------------------------------------------*/ #define SENSORHUB_INT_ACTIVE_HIGH +/* Pin handling macros for GPIO */ +#define NC (uint32_t)0xFFFFFFFF //Indicates pin is not assigned +/* Port and pin number are encoded into a 32-bit word with port number as upper 16 bits and pin number as lower 16 bits */ +#define ENCODE_PORT_PIN(port,pin) (PinName)(((uint32_t)port << 16) + (uint16_t)pin) +#define DECODE_PORT(X) (((uint32_t)(X) >> 16) & 0xF) +#define DECODE_PIN(X) ((uint32_t)(X) & 0xFFFF) + +/*-------------------------------------------------------------------------------------------------*\ + | T Y P E D E F I N I T I O N S +\*-------------------------------------------------------------------------------------------------*/ + +/* ########################################################################## */ +/* # G P I O # */ +/* ########################################################################## */ +/* Number of pin interrupt channels */ +#define MAX_PIN_INTERRUPT_CHANNEL 8 + +/* Type to address GPIO pins */ +typedef uint32_t PinName; + +/* Structure to hold pin/port to interrupt channel mapping */ +typedef struct _GPIO_PinMap +{ + uint32_t pin; + uint8_t pinInterruptChannel; +} GPIO_PinMap_t; + +extern const GPIO_PinMap_t GPIO_PinMap[MAX_PIN_INTERRUPT_CHANNEL]; + /* ########################################################################## */ /* # T I M I N G S # */ /* ########################################################################## */ @@ -164,6 +193,9 @@ extern const GpioInfo_t DiagLEDs[NUM_LEDS]; #define ACCEL_INT2_PORT 0 #define ACCEL_INT2_PIN 7 +/* CT32B0_MAT0-ACCL_INT1 */ +#define PIN_ACCEL 0, 18, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN) + /* IMPORTANT! - Sensor interrupts are shared by multiple sensor devices on the * LPCXpresso Sensor Shield board. Particularly when Accel on BMI055 is used, * INT1 is connected to P0_18 via R16 (220ohm) and fights with the INT1 of BMC150 @@ -186,6 +218,9 @@ extern const GpioInfo_t DiagLEDs[NUM_LEDS]; #define MAG_INT3_PORT 0 #define MAG_INT3_PIN 10 +/* MAG_DRDY_INT (GPIO input) */ +#define PIN_MAG 0, 22, (IOCON_FUNC0 | IOCON_MODE_PULLDOWN | IOCON_DIGITAL_EN) + /* ########################################################################## */ /* # G Y R O S C O P E I N T E R F A C E # */ /* ########################################################################## */ @@ -198,6 +233,9 @@ extern const GpioInfo_t DiagLEDs[NUM_LEDS]; #define GYRO_WAKE SYSCON_STARTER_PINT1 #define GYRO_IRQHandler PIN_INT1_IRQHandler +/* GYR_INT1 (GPIO input) */ +#define PIN_GYRO 0, 4, (IOCON_FUNC0 | IOCON_MODE_PULLDOWN | IOCON_DIGITAL_EN) + /* ########################################################################## */ /* # B A R O M E T E R I N T E R F A C E # */ /* ########################################################################## */ @@ -212,7 +250,7 @@ extern const GpioInfo_t DiagLEDs[NUM_LEDS]; #define PROXI_INT_PORT 0X0 #define PROXI_INT_PIN 9 #define PROXI_PINT_SEL PININTSELECT3 -#define PROXI_PINT_CH PINTINTCH3 +#define PROXI_PINT_CH PININTCH3 #define PROXI_PINT_IRQn PIN_INT3_IRQn #define PROXI_WAKE SYSCON_STARTER_PINT3 #define PROXI_IRQHandler PIN_INT3_IRQHandler diff --git a/external/CMSIS/Driver/Include/Driver_Common.h b/external/CMSIS/Driver/Include/Driver_Common.h new file mode 100644 index 0000000..b11a115 --- /dev/null +++ b/external/CMSIS/Driver/Include/Driver_Common.h @@ -0,0 +1,72 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 2. Jan 2014 + * $Revision: V2.00 + * + * Project: Common Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.00 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Added General return codes definitions + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_COMMON_H +#define __DRIVER_COMMON_H + +#include +#include +#include + +#define ARM_DRIVER_VERSION_MAJOR_MINOR(major,minor) (((major) << 8) | (minor)) + +/** +\brief Driver Version +*/ +typedef struct _ARM_DRIVER_VERSION { + uint16_t api; ///< API version + uint16_t drv; ///< Driver version +} ARM_DRIVER_VERSION; + +/* General return codes */ +#define ARM_DRIVER_OK 0 ///< Operation succeeded +#define ARM_DRIVER_ERROR -1 ///< Unspecified error +#define ARM_DRIVER_ERROR_BUSY -2 ///< Driver is busy +#define ARM_DRIVER_ERROR_TIMEOUT -3 ///< Timeout occurred +#define ARM_DRIVER_ERROR_UNSUPPORTED -4 ///< Operation not supported +#define ARM_DRIVER_ERROR_PARAMETER -5 ///< Parameter error +#define ARM_DRIVER_ERROR_SPECIFIC -6 ///< Start of driver specific errors + +/** +\brief General power states +*/ +typedef enum _ARM_POWER_STATE { + ARM_POWER_OFF, ///< Power off: no operation possible + ARM_POWER_LOW, ///< Low Power mode: retain state, detect and signal wake-up events + ARM_POWER_FULL ///< Power on: full operation at maximum performance +} ARM_POWER_STATE; + +#endif /* __DRIVER_COMMON_H */ diff --git a/external/CMSIS/Driver/Include/Driver_GPIO.h b/external/CMSIS/Driver/Include/Driver_GPIO.h new file mode 100644 index 0000000..16fcc93 --- /dev/null +++ b/external/CMSIS/Driver/Include/Driver_GPIO.h @@ -0,0 +1,103 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2015 Pinecone Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 8. June 2015 + * $Revision: V1.00 + * + * Project: GPIO Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_GPIO_H +#define __DRIVER_GPIO_H + +#include "Driver_Common.h" + +#define OSP_GPIO_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,00) + +#define ARM_GPIO_DIR_INPUT 0 +#define ARM_GPIO_DIR_OUTPUT 1 + +#define ARM_GPIO_TRIGGER_NONE 0 +#define ARM_GPIO_TRIGGER_HIGH 1 +#define ARM_GPIO_TRIGGER_LOW 2 +#define ARM_GPIO_TRIGGER_RISING 3 +#define ARM_GPIO_TRIGGER_FALLING 4 +#define ARM_GPIO_TRIGGER_EDGE 5 + +typedef void (*ARM_GPIO_Handler_t) (uint32_t pin, void *data); + +typedef struct _ARM_DRIVER_GPIO { + ARM_DRIVER_VERSION (*GetVersion) (void); + int32_t (*Initialize) (void); + int32_t (*Uninitialize) (void); + int32_t (*PowerControl) (ARM_POWER_STATE state); + int32_t (*SetDirection) (uint32_t pin, uint32_t dir); + int32_t (*SetTrigger) (uint32_t pin, uint32_t trigger); + int32_t (*WritePin) (uint32_t pin, uint32_t value); + int32_t (*ReadPin) (uint32_t pin); + int32_t (*SetHandler) (uint32_t pin, ARM_GPIO_Handler_t handler, void *data); +} const ARM_DRIVER_GPIO; + +#define ARM_BUILD_DRIVER_GPIO(pre1, pre2, priv) \ + static ARM_DRIVER_VERSION pre1##_GetVersion (void) { \ + return pre2##_GetVersion (priv); \ + } \ + static int32_t pre1##_Initialize (void) { \ + return pre2##_Initialize (priv); \ + } \ + static int32_t pre1##_Uninitialize (void) { \ + return pre2##_Uninitialize (priv); \ + } \ + static int32_t pre1##_PowerControl (ARM_POWER_STATE state) { \ + return pre2##_PowerControl (state, priv); \ + } \ + static int32_t pre1##_SetDirection (uint32_t pin, uint32_t dir) { \ + return pre2##_SetDirection (pin, dir, priv); \ + } \ + static int32_t pre1##_SetTrigger (uint32_t pin, uint32_t trigger) { \ + return pre2##_SetTrigger (pin, trigger, priv); \ + } \ + static int32_t pre1##_WritePin (uint32_t pin, uint32_t value) { \ + return pre2##_WritePin (pin, value, priv); \ + } \ + static int32_t pre1##_ReadPin (uint32_t pin) { \ + return pre2##_ReadPin (pin, priv); \ + } \ + static int32_t pre1##_SetHandler (uint32_t pin, ARM_GPIO_Handler_t handler, void *data) { \ + return pre2##_SetHandler (pin, handler, data, priv); \ + } \ + ARM_DRIVER_GPIO Driver_##pre1 = { \ + pre1##_GetVersion, \ + pre1##_Initialize, \ + pre1##_Uninitialize, \ + pre1##_PowerControl, \ + pre1##_SetDirection, \ + pre1##_SetTrigger, \ + pre1##_WritePin, \ + pre1##_ReadPin, \ + pre1##_SetHandler, \ + }; + +#endif /* __DRIVER_GPIO_H */