Skip to content

Commit cb0a2e7

Browse files
committed
Incorporated internal review comments
* Made SetTrigger's pin parameters inline with parameters of other APIs * Closed coding guidelines related comments * Added calls to Driver_GPIO.SetTrigger Signed-off-by: Pankaj Goenka <pgoenka@audience.com>
1 parent 7286196 commit cb0a2e7

3 files changed

Lines changed: 65 additions & 51 deletions

File tree

embedded/Drivers/LPC5410x-CM4/CMSIS/Driver_GPIO.c

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
| 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
3636
\*-------------------------------------------------------------------------------------------------*/
3737
/* Driver Version */
38-
static const ARM_DRIVER_VERSION DriverVersion = {
38+
static const ARM_DRIVER_VERSION DriverVersion =
39+
{
3940
OSP_GPIO_API_VERSION,
4041
OSP_GPIO_DRV_VERSION
4142
};
@@ -72,8 +73,7 @@ static int32_t OSP_GPIO_Initialize( void *gpio_priv )
7273
Chip_GPIO_Init( LPC_GPIO );
7374

7475
/* Enable Pin interrupt sources */
75-
Chip_PININT_Init( NULL ); /* Note: input arg is ignored! */
76-
76+
Chip_PININT_Init( NULL );
7777
return ARM_DRIVER_OK;
7878
}
7979

@@ -91,7 +91,7 @@ static int32_t OSP_GPIO_Uninitialize( void *gpio_priv )
9191
/* Uninitialize GPIO */
9292
Chip_GPIO_DeInit( LPC_GPIO );
9393

94-
Chip_PININT_DeInit( NULL ); /* Note: input arg is ignored! */
94+
Chip_PININT_DeInit( NULL );
9595
return ARM_DRIVER_OK;
9696
}
9797

@@ -109,16 +109,16 @@ static int32_t OSP_GPIO_PowerControl( ARM_POWER_STATE state, void *gpio_priv )
109109
{
110110
switch ( state )
111111
{
112-
case ARM_POWER_OFF:
113-
Chip_GPIO_DeInit( LPC_GPIO );
114-
break;
112+
case ARM_POWER_OFF:
113+
Chip_GPIO_DeInit( LPC_GPIO );
114+
break;
115115

116-
case ARM_POWER_FULL:
117-
Chip_GPIO_Init( LPC_GPIO );
118-
break;
116+
case ARM_POWER_FULL:
117+
Chip_GPIO_Init( LPC_GPIO );
118+
break;
119119

120-
default:
121-
return ARM_DRIVER_ERROR_UNSUPPORTED;
120+
default:
121+
return ARM_DRIVER_ERROR_UNSUPPORTED;
122122
}
123123
return ARM_DRIVER_OK;
124124
}
@@ -127,7 +127,7 @@ static int32_t OSP_GPIO_PowerControl( ARM_POWER_STATE state, void *gpio_priv )
127127
* @fn OSP_GPIO_SetDirection
128128
* Set the direction of GPIO pin
129129
*
130-
* @param pin Port pin number (Port and pin numbers encoded using ENCODE_PORT_PIN)
130+
* @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number)
131131
* @param dir Direction (GPIO_DIR_INPUT or GPIO_DIR_OUTPUT)
132132
* @param gpio_priv Private argument (Unused)
133133
*
@@ -145,15 +145,14 @@ static int32_t OSP_GPIO_SetDirection( uint32_t pin, uint32_t dir, void *gpio_pri
145145

146146
( dir == ARM_GPIO_DIR_OUTPUT ) ? Chip_GPIO_SetPinDIROutput( LPC_GPIO, port_num, pin_num ) : \
147147
Chip_GPIO_SetPinDIRInput( LPC_GPIO, port_num, pin_num );
148-
149148
return ARM_DRIVER_OK;
150149
}
151150

152151
/****************************************************************************************************
153152
* @fn OSP_GPIO_SetTrigger
154153
* Set the trigger mode for GPIO
155154
*
156-
* @param pin Port pin number (Port and pin numbers encoded using ENCODE_PORT_PIN)
155+
* @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number)
157156
* @param trigger Trigger mode
158157
* @param gpio_priv Private argument (Unused)
159158
*
@@ -162,23 +161,22 @@ static int32_t OSP_GPIO_SetDirection( uint32_t pin, uint32_t dir, void *gpio_pri
162161
***************************************************************************************************/
163162
static int32_t OSP_GPIO_SetTrigger( uint32_t pin, uint32_t trigger, void *gpio_priv )
164163
{
165-
uint32_t pinInterruptChannel = 0;
164+
uint8_t index = 0;
165+
uint8_t pinInterruptChannel = 0;
166166

167-
switch (DECODE_PIN(pin))
167+
ASF_assert( pin != (PinName)NC );
168+
169+
for ( ; index < MAX_PIN_INTERRUPT_CHANNEL; index++ )
168170
{
169-
case ACCEL_INT_PIN:
170-
pinInterruptChannel = ACCEL_PINT_CH;
171-
break;
172-
case MAG_INT_PIN:
173-
pinInterruptChannel = MAG_PINT_CH;
174-
break;
175-
case GYRO_INT_PIN:
176-
pinInterruptChannel = GYRO_PINT_CH;
171+
if ( GPIO_PinMap[index].pin == pin )
172+
{
173+
pinInterruptChannel = GPIO_PinMap[index].pinInterruptChannel;
177174
break;
178-
default:
179-
return ARM_DRIVER_ERROR_UNSUPPORTED;
175+
}
180176
}
181177

178+
ASF_assert( index < MAX_PIN_INTERRUPT_CHANNEL );
179+
182180
if ( trigger & (1 << ARM_GPIO_TRIGGER_EDGE) )
183181
{
184182
Chip_PININT_SetPinModeEdge( LPC_PININT, pinInterruptChannel ); /* edge sensitive */
@@ -203,7 +201,7 @@ static int32_t OSP_GPIO_SetTrigger( uint32_t pin, uint32_t trigger, void *gpio_p
203201
* @fn OSP_GPIO_WritePin
204202
* Set the GPIO Pin state
205203
*
206-
* @param pin Port pin number (Port and pin numbers encoded using ENCODE_PORT_PIN)
204+
* @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number)
207205
* @param val Value to be written (0 or 1)
208206
* @param gpio_priv Private argument (Unused)
209207
*
@@ -227,7 +225,7 @@ static int32_t OSP_GPIO_WritePin( uint32_t pin, uint32_t val, void *gpio_priv )
227225
* @fn OSP_GPIO_ReadPin
228226
* Get the GPIO Pin value
229227
*
230-
* @param pin Port pin number (Port and pin numbers encoded using ENCODE_PORT_PIN)
228+
* @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number)
231229
* @param gpio_priv Private argument (Unused)
232230
*
233231
* @return pin value
@@ -240,15 +238,15 @@ static int32_t OSP_GPIO_ReadPin( uint32_t pin, void *gpio_priv )
240238
ASF_assert( pin != (PinName)NC );
241239
port_num = DECODE_PORT( pin );
242240
pin_num = DECODE_PIN( pin );
243-
241+
244242
return ( Chip_GPIO_ReadPortBit( LPC_GPIO, port_num, pin_num ) );
245243
}
246244

247245
/****************************************************************************************************
248246
* @fn OSP_GPIO_SetHandler
249247
* Handler function
250248
*
251-
* @param pin Port pin number (Port and pin numbers encoded using ENCODE_PORT_PIN)
249+
* @param pin Port pin number (Upper 16-bit is port number and lower 16-bit is pin number)
252250
* @param handler Pointer to handler function
253251
* @param data Data to pass to the handler
254252
* @param gpio_priv Private argument (Unused)

embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ extern ARM_DRIVER_GPIO Driver_GPIO;
3434
const uint32_t ExtClockIn = 0;
3535
const GpioInfo_t DiagLEDs[NUM_LEDS] = {PINS_LEDS};
3636

37+
/* Mapping of Port and Pin to Pin Interrupt Channel */
38+
const GPIO_PinMap_t GPIO_PinMap[MAX_PIN_INTERRUPT_CHANNEL] =
39+
{
40+
{ ENCODE_PORT_PIN( ACCEL_INT_PORT, ACCEL_INT_PIN ), ACCEL_PINT_CH }, /* Channel 0 */
41+
{ ENCODE_PORT_PIN( GYRO_INT_PORT, GYRO_INT_PIN ), GYRO_PINT_CH }, /* Channel 1 */
42+
{ ENCODE_PORT_PIN( MAG_INT_PORT, MAG_INT_PIN ), MAG_PINT_CH }, /* Channel 2 */
43+
{ ENCODE_PORT_PIN( PROXI_INT_PORT, PROXI_INT_PIN ), PROXI_PINT_CH } /* Channel 3 */
44+
};
45+
3746
/*-------------------------------------------------------------------------------------------------*\
3847
| P R I V A T E C O N S T A N T S & M A C R O S
3948
\*-------------------------------------------------------------------------------------------------*/
@@ -315,15 +324,10 @@ void Board_SensorIfInit( InputSensor_t ifID )
315324
Chip_GPIO_SetPinDIR(LPC_GPIO_PORT, ACCEL_INT_PORT, ACCEL_INT_PIN, false);
316325

317326
Chip_INMUX_PinIntSel(ACCEL_PINT_SEL, ACCEL_INT_PORT, ACCEL_INT_PIN);
318-
Chip_PININT_SetPinModeEdge(LPC_PININT, ACCEL_PINT_CH); /* edge sensitive */
319-
Chip_PININT_EnableIntHigh(LPC_PININT, ACCEL_PINT_CH); /* Rising edge interrupt */
320-
321-
//pinDef.pin = ENCODE_PORT_PIN(ACCEL_INT2_PORT, ACCEL_INT2_PIN);
322-
//gpio_dir(&pinDef, PIN_INPUT);
327+
/* High Edge Trigger */
328+
Driver_GPIO.SetTrigger( ENCODE_PORT_PIN( ACCEL_INT_PORT, ACCEL_INT_PIN ),
329+
( ( 1 << ARM_GPIO_TRIGGER_EDGE ) | ( 1 << ARM_GPIO_TRIGGER_HIGH ) ) );
323330

324-
//Chip_SYSCON_EnableWakeup(ACCEL_WAKE); /* enable to wake from sleep */
325-
326-
//gpio_irq_disable(&gpioIrq);
327331
break;
328332

329333
case MAG_INPUT_SENSOR:
@@ -336,14 +340,10 @@ void Board_SensorIfInit( InputSensor_t ifID )
336340
Chip_GPIO_SetPinDIR(LPC_GPIO_PORT, MAG_INT_PORT, MAG_INT_PIN, false);
337341

338342
Chip_INMUX_PinIntSel(MAG_PINT_SEL, MAG_INT_PORT, MAG_INT_PIN);
339-
Chip_PININT_SetPinModeEdge(LPC_PININT, MAG_PINT_CH); /* edge sensitive */
340-
Chip_PININT_EnableIntHigh(LPC_PININT, MAG_PINT_CH); /* Rising edge interrupt */
341-
342-
//Chip_SYSCON_EnableWakeup(MAG_WAKE); /* enable to wake from sleep */
343-
//Chip_SYSCON_EnableWakeup(SYSCON_STARTER_WWDT); /* enable to wake from sleep */
343+
/* High Edge Trigger */
344+
Driver_GPIO.SetTrigger( ENCODE_PORT_PIN( MAG_INT_PORT, MAG_INT_PIN ),
345+
( ( 1 << ARM_GPIO_TRIGGER_EDGE ) | ( 1 << ARM_GPIO_TRIGGER_HIGH ) ) );
344346

345-
//pinDef.pin = ENCODE_PORT_PIN(MAG_INT3_PORT, MAG_INT3_PIN);
346-
//gpio_dir(&pinDef,PIN_INPUT);
347347
break;
348348

349349
case GYRO_INPUT_SENSOR:
@@ -356,10 +356,10 @@ void Board_SensorIfInit( InputSensor_t ifID )
356356
Chip_GPIO_SetPinDIR(LPC_GPIO_PORT, GYRO_INT_PORT, GYRO_INT_PIN, false);
357357

358358
Chip_INMUX_PinIntSel(GYRO_PINT_SEL, GYRO_INT_PORT, GYRO_INT_PIN);
359-
Chip_PININT_SetPinModeEdge(LPC_PININT, GYRO_PINT_CH); /* edge sensitive */
360-
Chip_PININT_EnableIntHigh(LPC_PININT, GYRO_PINT_CH); /* Rising edge interrupt */
359+
/* High Edge Trigger */
360+
Driver_GPIO.SetTrigger( ENCODE_PORT_PIN( GYRO_INT_PORT, GYRO_INT_PIN ),
361+
( ( 1 << ARM_GPIO_TRIGGER_EDGE ) | ( 1 << ARM_GPIO_TRIGGER_HIGH ) ) );
361362

362-
//Chip_SYSCON_EnableWakeup(GYRO_WAKE);
363363
break;
364364

365365
case PRESSURE_INPUT_SENSOR:

embedded/projects/SH-Xpresso-LPC54102/sources/boardsupport/hw_setup_xpresso_lpc54102.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,33 @@
3636

3737
/* Pin handling macros for GPIO */
3838
#define NC (uint32_t)0xFFFFFFFF //Indicates pin is not assigned
39-
/* Port and pin number are encoded into a 32-bit word with port number as upper nibble and pin number as lower nibble */
39+
/* 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 */
4040
#define ENCODE_PORT_PIN(port,pin) (PinName)(((uint32_t)port << 16) + (uint16_t)pin)
4141
#define DECODE_PORT(X) (((uint32_t)(X) >> 16) & 0xF)
4242
#define DECODE_PIN(X) ((uint32_t)(X) & 0xFFFF)
4343

4444
/*-------------------------------------------------------------------------------------------------*\
4545
| T Y P E D E F I N I T I O N S
4646
\*-------------------------------------------------------------------------------------------------*/
47+
48+
/* ########################################################################## */
49+
/* # G P I O # */
50+
/* ########################################################################## */
51+
/* Number of pin interrupt channels */
52+
#define MAX_PIN_INTERRUPT_CHANNEL 8
53+
4754
/* Type to address GPIO pins */
4855
typedef uint32_t PinName;
4956

57+
/* Structure to hold pin/port to interrupt channel mapping */
58+
typedef struct _GPIO_PinMap
59+
{
60+
uint32_t pin;
61+
uint8_t pinInterruptChannel;
62+
} GPIO_PinMap_t;
63+
64+
extern const GPIO_PinMap_t GPIO_PinMap[MAX_PIN_INTERRUPT_CHANNEL];
65+
5066
/* ########################################################################## */
5167
/* # T I M I N G S # */
5268
/* ########################################################################## */
@@ -234,7 +250,7 @@ extern const GpioInfo_t DiagLEDs[NUM_LEDS];
234250
#define PROXI_INT_PORT 0X0
235251
#define PROXI_INT_PIN 9
236252
#define PROXI_PINT_SEL PININTSELECT3
237-
#define PROXI_PINT_CH PINTINTCH3
253+
#define PROXI_PINT_CH PININTCH3
238254
#define PROXI_PINT_IRQn PIN_INT3_IRQn
239255
#define PROXI_WAKE SYSCON_STARTER_PINT3
240256
#define PROXI_IRQHandler PIN_INT3_IRQHandler

0 commit comments

Comments
 (0)