ISSDK  1.8
IoT Sensing Software Development Kit
gpio_driver.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /**
10 * @file gpio_driver.c
11 * @brief The gpio_driver.c file contains Generic API Adaption to SDK 2.0 GPIO Driver.
12 */
13 
14 #include "gpio_driver.h"
15 
16 /*******************************************************************************
17 * Definitions
18 ******************************************************************************/
19 #define GPIO_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */
20 // ISR handler array for each gpio pin in the system
21 #define GPIO_NUMBER_OF_PIN 0x20
22 
23 /*******************************************************************************
24 * Variables
25 ******************************************************************************/
26 
27 /* Driver Version */
28 static const GENERIC_DRIVER_VERSION DriverVersion = {GPIO_API_VERSION, GPIO_DRV_VERSION};
30 static gpioConfigKSDK_t gpioConfigDefault = {
31  .pinConfig = {kGPIO_DigitalInput, 0}, .modeFunc = 0, .interruptMode = kGPIO_InterruptRisingEdge};
32 
33 /*******************************************************************************
34  * Code
35  ******************************************************************************/
36 
37 /***********************************************************************
38  *
39  * Function Name : ksdk_gpio_get_version
40  * Description : get the driver version.
41  *
42  ***************************************************************************/
44 {
45  return DriverVersion;
46 }
47 
48 /***********************************************************************
49  *
50  * Function Name : ksdk_gpio_set_interrupt
51  * Description : Set the Interrupt.
52  *
53  ***************************************************************************/
54 void ksdk_gpio_set_interrupt(GPIO_Type *base, uint32_t mask, uint8_t interruptMode)
55 {
56  switch (interruptMode)
57  {
59  GPIO_SetLowLevelInterrupt(base, mask);
60  break;
62  GPIO_SetHighLevelInterrupt(base, mask);
63  break;
65  GPIO_SetFallingEdgeInterrupt(base, mask);
66  break;
68  GPIO_SetRisingEdgeInterrupt(base, mask);
69  break;
70  default:
71  break;
72  }
73 
74  GPIO_EnableInterrupt(base, mask);
75 }
76 
77 /***********************************************************************
78  *
79  * Function Name : ksdk_gpio_pin_init
80  * Description : Initialize particular GPIO pin used by board.
81  *
82  ***************************************************************************/
84  pinID_t aPinId, gpio_direction_t dir, void *apPinConfig, gpio_isr_handler_t aIsrHandler, void *apUserData)
85 {
86  gpioConfigKSDK_t *pGpioConfig = (gpioConfigKSDK_t *)apPinConfig;
87  gpioHandleKSDK_t *pinHandle = (gpioHandleKSDK_t *)aPinId;
88  if (NULL == apPinConfig)
89  {
90  pGpioConfig = &gpioConfigDefault;
91  pGpioConfig->modeFunc = (IOCON_FUNC0 | IOCON_MODE_PULLUP);
92  }
93  // Configure the clock
94  CLOCK_EnableClock(pinHandle->clockName);
95 
96  // Set the ICON pin mux
97  IOCON_PinMuxSet(IOCON, pinHandle->portNumber, pinHandle->pinNumber, pGpioConfig->modeFunc);
98 
99  pGpioConfig->pinConfig.pinDirection = dir == GPIO_DIRECTION_IN ? kGPIO_DigitalInput : kGPIO_DigitalOutput;
100  // Set the pin information
101  GPIO_PinInit(pinHandle->base, pinHandle->pinNumber, &pGpioConfig->pinConfig);
102 
103  // Isr is installed
104  if (aIsrHandler)
105  {
106  // Enable the IRQ
107  EnableIRQ(pinHandle->irq);
108  isrObj[pinHandle->portNumber][pinHandle->pinNumber].isrHandle = aIsrHandler;
109  isrObj[pinHandle->portNumber][pinHandle->pinNumber].pUserData = apUserData;
110  // Enable the interrupt on a pin.
111  ksdk_gpio_set_interrupt(pinHandle->base, pinHandle->mask, pGpioConfig->interruptMode);
112  }
113 }
114 
115 /***********************************************************************
116  *
117  * Function Name : ksdk_gpio_set_pin
118  * Description : Set output level of individual GPIO pin to logic 1.
119  *
120  ***************************************************************************/
122 {
123  gpioHandleKSDK_t *pinHandle = (gpioHandleKSDK_t *)aPinId;
124  GPIO_SetPinsOutput(pinHandle->base, pinHandle->mask);
125 }
126 
127 /***********************************************************************
128  *
129  * Function Name : ksdk_gpio_clr_pin
130  * Description : Set output level of individual GPIO pin to logic 0..
131  *
132  ***************************************************************************/
134 {
135  gpioHandleKSDK_t *pinHandle = (gpioHandleKSDK_t *)aPinId;
136  GPIO_ClearPinsOutput(pinHandle->base, pinHandle->mask);
137 }
138 
139 /***********************************************************************
140  *
141  * Function Name : ksdk_gpio_toggle_pin
142  * Description : toggle the currrent output logic of individual GPIO pin.
143  *
144  ***************************************************************************/
146 {
147  gpioHandleKSDK_t *pinHandle = (gpioHandleKSDK_t *)aPinId;
148  GPIO_TogglePinsOutput(pinHandle->base, pinHandle->mask);
149 }
150 
151 /***********************************************************************
152  *
153  * Function Name : ksdk_gpio_write_pin
154  * Description : Set output level of individual GPIO pin to desired value, ie 1 or 0.
155  *
156  ***************************************************************************/
157 void ksdk_gpio_write_pin(pinID_t aPinId, uint8_t aValue)
158 {
159  gpioHandleKSDK_t *pinHandle = (gpioHandleKSDK_t *)aPinId;
160  GPIO_WritePinOutput(pinHandle->base, pinHandle->pinNumber, aValue);
161 }
162 
163 /***********************************************************************
164  *
165  * Function Name : ksdk_gpio_read_pin
166  * Description : Read current input value of individual GPIO pin.
167  *
168  ***************************************************************************/
169 uint32_t ksdk_gpio_read_pin(pinID_t aPinId)
170 {
171  gpioHandleKSDK_t *pinHandle = (gpioHandleKSDK_t *)aPinId;
172  return GPIO_ReadPinInput(pinHandle->base, pinHandle->pinNumber);
173 }
174 
175 /***********************************************************************
176  *
177  * Function Name : ksdk_gpio_handle_interrupt
178  * Description : handle the gpio interrupt in a pin.
179  *
180  ***************************************************************************/
181 void ksdk_gpio_handle_interrupt(GPIO_Type *apBase, port_number_t aPortNumber)
182 {
183  uint32_t isfr = GPIO_GetPinsInterruptFlags(apBase);
184 
185  // parse through all the pending interrupt for a PORT
186  for (uint8_t i = 0; i < GPIO_NUMBER_OF_PIN; i++)
187  {
188  if (isfr & (1 << i))
189  {
190  gpio_isr_handler_t handle = isrObj[aPortNumber][i].isrHandle;
191  if (handle == NULL)
192  {
193  continue;
194  }
195  // call user defined handler
196  handle(isrObj[aPortNumber][i].pUserData);
197  GPIO_ClearPinsInterruptFlags(apBase, (1 << i));
198  }
199  }
200 }
201 
205 };
The GPIO Configuration KSDK.
Definition: gpio_driver.h:39
uint32_t ksdk_gpio_read_pin(pinID_t aPinId)
Definition: gpio_driver.c:141
void ksdk_gpio_clr_pin(pinID_t aPinId)
Definition: gpio_driver.c:105
void ksdk_gpio_toggle_pin(pinID_t aPinId)
Definition: gpio_driver.c:117
uint32_t modeFunc
Definition: gpio_driver.h:47
The gpio isr object.
Definition: gpio_driver.h:62
void(* gpio_isr_handler_t)(void *apUserData)
Definition: Driver_GPIO.h:34
Access structure of the GPIO Driver.
Definition: Driver_GPIO.h:38
void * pinID_t
GPIO Driver direction.
Definition: Driver_GPIO.h:30
void * pUserData
Definition: gpio_driver.h:64
void ksdk_gpio_pin_init(pinID_t aPinId, gpio_direction_t dir, void *apPinConfig, gpio_isr_handler_t aIsrHandler, void *apUserData)
Definition: gpio_driver.c:54
The GPIO pin handle for KSDK.
Definition: gpio_driver.h:49
gpio_pin_config_t pinConfig
Definition: gpio_driver.h:41
void ksdk_gpio_write_pin(pinID_t aPinId, uint8_t aValue)
Definition: gpio_driver.c:129
void ksdk_gpio_handle_interrupt(GPIO_Type *apBase, port_number_t aPortNumber)
Definition: gpio_driver.c:153
gpio_isr_handler_t isrHandle
Definition: gpio_driver.h:65
uint32_t mask
Definition: gpio_driver.h:54
void ksdk_gpio_set_pin(pinID_t aPinId)
Definition: gpio_driver.c:93
port_interrupt_t interruptMode
Definition: gpio_driver.h:43
GENERIC_DRIVER_GPIO Driver_GPIO_KSDK
Definition: gpio_driver.c:177
IRQn_Type irq
Definition: gpio_driver.h:55
enum gpio_direction_en gpio_direction_t
#define GPIO_DRV_VERSION
Definition: gpio_driver.c:19
ARM_DRIVER_VERSION GENERIC_DRIVER_VERSION
Definition: Driver_GPIO.h:32
GPIO_Type * base
Definition: gpio_driver.h:51
#define GPIO_API_VERSION
Definition: Driver_GPIO.h:14
clock_ip_name_t clockName
Definition: gpio_driver.h:56
enum port_number port_number_t
GPIO PORT NAMES.
GENERIC_DRIVER_VERSION ksdk_gpio_get_version(void)
Definition: gpio_driver.c:43
port_number_t portNumber
Definition: gpio_driver.h:57
void ksdk_gpio_set_interrupt(GPIO_Type *base, uint32_t mask, uint8_t interruptMode)
Definition: gpio_driver.c:54
uint32_t pinNumber
Definition: gpio_driver.h:53
#define GPIO_NUMBER_OF_PIN
Definition: gpio_driver.c:21