HPM SDK
HPMicro Software Development Kit
hpm_gpio_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_GPIO_DRV_H
9 #define HPM_GPIO_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_gpio_regs.h"
13 #include "hpm_soc_feature.h"
14 
15 #ifndef PORT_PIN_COUNT
16 #define PORT_PIN_COUNT (32U)
17 #endif
18 #define GPIO_GET_PORT_INDEX(x) (x / PORT_PIN_COUNT)
19 #define GPIO_GET_PIN_INDEX(x) (x % PORT_PIN_COUNT)
20 
32 typedef enum gpio_interrupt_trigger {
37 #if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
38  gpio_interrupt_trigger_edge_both,
39 #endif
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
55 static inline uint8_t gpio_read_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin)
56 {
57  return (ptr->DI[port].VALUE & (1 << pin)) >> pin;
58 }
59 
69 static inline uint32_t gpio_get_pin_output_status(GPIO_Type *ptr, uint32_t port, uint8_t pin)
70 {
71  return (ptr->DO[port].VALUE & (1 << pin)) >> pin;
72 }
73 
81 static inline void gpio_toggle_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin)
82 {
83  ptr->DO[port].TOGGLE = 1 << pin;
84 }
85 
94 static inline void gpio_write_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin, uint8_t high)
95 {
96  if (high) {
97  ptr->DO[port].SET = 1 << pin;
98  } else {
99  ptr->DO[port].CLEAR = 1 << pin;
100  }
101 }
102 
110 static inline void gpio_set_pin_input(GPIO_Type *ptr, uint32_t port, uint8_t pin)
111 {
112  ptr->OE[port].CLEAR = 1 << pin;
113 }
114 
122 static inline void gpio_set_pin_output(GPIO_Type *ptr, uint32_t port, uint8_t pin)
123 {
124  ptr->OE[port].SET = 1 << pin;
125 }
126 
135 void gpio_set_pin_output_with_initial(GPIO_Type *ptr, uint32_t port, uint8_t pin, uint8_t initial);
136 
146 static inline bool gpio_check_pin_interrupt_flag(GPIO_Type *ptr, uint32_t port, uint8_t pin)
147 {
148  return ptr->IF[port].VALUE & (1 << pin);
149 }
150 
158 static inline void gpio_clear_pin_interrupt_flag(GPIO_Type *ptr, uint32_t port, uint8_t pin)
159 {
160  ptr->IF[port].VALUE = 1 << pin;
161 }
162 
172 static inline bool gpio_check_pin_interrupt_enabled(GPIO_Type *ptr, uint32_t port, uint8_t pin)
173 {
174  return (ptr->IE[port].VALUE & (1 << pin)) == (uint32_t) (1 << pin);
175 }
176 
184 static inline void gpio_enable_pin_interrupt(GPIO_Type *ptr, uint32_t port, uint8_t pin)
185 {
186  ptr->IE[port].SET = 1 << pin;
187 }
188 
196 static inline void gpio_disable_pin_interrupt(GPIO_Type *ptr, uint32_t port, uint8_t pin)
197 {
198  ptr->IE[port].CLEAR = 1 << pin;
199 }
200 
211 static inline bool gpio_check_clear_interrupt_flag(GPIO_Type *ptr, uint32_t port, uint8_t pin)
212 {
213  if (!gpio_check_pin_interrupt_flag(ptr, port, pin)) {
214  return false;
215  }
216  gpio_clear_pin_interrupt_flag(ptr, port, pin);
217  return true;
218 }
219 
220 
229 static inline uint32_t gpio_read_port(GPIO_Type *ptr, uint32_t port)
230 {
231  return ptr->DI[port].VALUE;
232 }
233 
241 static inline void gpio_toggle_port_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
242 {
243  ptr->DO[port].TOGGLE = mask;
244 }
245 
253 static inline void gpio_write_port(GPIO_Type *ptr, uint32_t port, uint32_t value)
254 {
255  ptr->DO[port].VALUE = value;
256 }
257 
265 static inline void gpio_set_port_low_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
266 {
267  ptr->DO[port].CLEAR = mask;
268 }
269 
277 static inline void gpio_set_port_high_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
278 {
279  ptr->DO[port].SET = mask;
280 }
281 
289 static inline void gpio_enable_port_output_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
290 {
291  ptr->OE[port].SET = mask;
292 }
293 
301 static inline void gpio_disable_port_output_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
302 {
303  ptr->OE[port].CLEAR = mask;
304 }
305 
314 static inline uint32_t gpio_get_port_interrupt_flags(GPIO_Type *ptr, uint32_t port)
315 {
316  return ptr->IF[port].VALUE;
317 }
318 
319 
327 static inline void gpio_clear_port_interrupt_flags_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
328 {
329  ptr->IF[port].VALUE |= mask;
330 }
331 
339 static inline void gpio_enable_port_interrupt_with_mask(GPIO_Type *ptr, uint32_t port, uint8_t mask)
340 {
341  ptr->IE[port].SET = mask;
342 }
343 
351 static inline void gpio_disable_port_interrupt_with_mask(GPIO_Type *ptr, uint32_t port, uint8_t mask)
352 {
353  ptr->IE[port].CLEAR = mask;
354 }
355 
356 
365 void gpio_config_pin_interrupt(GPIO_Type *ptr, uint32_t port, uint8_t pin, gpio_interrupt_trigger_t trigger);
366 
367 
375 void gpio_toggle_pin_interrupt_trigger_polarity(GPIO_Type *ptr, uint32_t port, uint8_t pin);
376 
384 void gpio_toggle_pin_interrupt_trigger_type(GPIO_Type *ptr, uint32_t port, uint8_t pin);
385 #ifdef __cplusplus
386 }
387 #endif
391 #endif /* HPM_GPIO_DRV_H */
gpio_interrupt_trigger
Interrupt trigger type.
Definition: hpm_gpio_drv.h:32
static void gpio_disable_port_output_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
Disable pins output of specific port according to the given mask.
Definition: hpm_gpio_drv.h:301
static void gpio_set_pin_output(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Set pin to output mode.
Definition: hpm_gpio_drv.h:122
static void gpio_set_port_low_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
Set spcific port pin high according to the given mask.
Definition: hpm_gpio_drv.h:265
static void gpio_set_pin_input(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Set pin to input mode.
Definition: hpm_gpio_drv.h:110
static void gpio_enable_port_output_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
Enable pins output of specific port according to the given mask.
Definition: hpm_gpio_drv.h:289
static uint32_t gpio_get_pin_output_status(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Read target pin output state.
Definition: hpm_gpio_drv.h:69
static bool gpio_check_pin_interrupt_enabled(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Check if specific pin interrupt is enabled or not.
Definition: hpm_gpio_drv.h:172
static void gpio_disable_pin_interrupt(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Disable interrupt for specific pin.
Definition: hpm_gpio_drv.h:196
void gpio_config_pin_interrupt(GPIO_Type *ptr, uint32_t port, uint8_t pin, gpio_interrupt_trigger_t trigger)
Config pin interrupt.
Definition: hpm_gpio_drv.c:32
static void gpio_write_port(GPIO_Type *ptr, uint32_t port, uint32_t value)
Write specific port with value.
Definition: hpm_gpio_drv.h:253
static void gpio_toggle_port_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
Toggle port with specific pin mask.
Definition: hpm_gpio_drv.h:241
static bool gpio_check_pin_interrupt_flag(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Check specific pin interrupt status.
Definition: hpm_gpio_drv.h:146
static void gpio_toggle_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Toggle pin level.
Definition: hpm_gpio_drv.h:81
static void gpio_clear_port_interrupt_flags_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
Clear interrupt flags with given mask on specific port.
Definition: hpm_gpio_drv.h:327
static void gpio_set_port_high_with_mask(GPIO_Type *ptr, uint32_t port, uint32_t mask)
Set spcific port pin high according to the given mask.
Definition: hpm_gpio_drv.h:277
static bool gpio_check_clear_interrupt_flag(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Check interrupt flag of specific pin and clear if it is set.
Definition: hpm_gpio_drv.h:211
static uint32_t gpio_get_port_interrupt_flags(GPIO_Type *ptr, uint32_t port)
Get current interrupt flags on specific port.
Definition: hpm_gpio_drv.h:314
void gpio_set_pin_output_with_initial(GPIO_Type *ptr, uint32_t port, uint8_t pin, uint8_t initial)
Set pin to output mode with initial value.
Definition: hpm_gpio_drv.c:67
static void gpio_enable_port_interrupt_with_mask(GPIO_Type *ptr, uint32_t port, uint8_t mask)
Enable interrupts with given mask on specific port.
Definition: hpm_gpio_drv.h:339
static void gpio_clear_pin_interrupt_flag(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Clear specific pin interrupt flag.
Definition: hpm_gpio_drv.h:158
static uint8_t gpio_read_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Read target pin level.
Definition: hpm_gpio_drv.h:55
static void gpio_write_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin, uint8_t high)
Write pin level.
Definition: hpm_gpio_drv.h:94
static void gpio_disable_port_interrupt_with_mask(GPIO_Type *ptr, uint32_t port, uint8_t mask)
Disable interrupts with given mask on specific port.
Definition: hpm_gpio_drv.h:351
void gpio_toggle_pin_interrupt_trigger_type(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Toggle pin interrupt trigger type.
Definition: hpm_gpio_drv.c:21
enum gpio_interrupt_trigger gpio_interrupt_trigger_t
Interrupt trigger type.
static void gpio_enable_pin_interrupt(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Enable interrupt for specific pin.
Definition: hpm_gpio_drv.h:184
static uint32_t gpio_read_port(GPIO_Type *ptr, uint32_t port)
Read all pins level on specific port.
Definition: hpm_gpio_drv.h:229
void gpio_toggle_pin_interrupt_trigger_polarity(GPIO_Type *ptr, uint32_t port, uint8_t pin)
Toggle pin interrupt trigger polarity.
Definition: hpm_gpio_drv.c:11
@ gpio_interrupt_trigger_level_low
Definition: hpm_gpio_drv.h:34
@ gpio_interrupt_trigger_edge_falling
Definition: hpm_gpio_drv.h:36
@ gpio_interrupt_trigger_level_high
Definition: hpm_gpio_drv.h:33
@ gpio_interrupt_trigger_edge_rising
Definition: hpm_gpio_drv.h:35
Definition: hpm_gpio_regs.h:12
__RW uint32_t CLEAR
Definition: hpm_gpio_regs.h:21
struct GPIO_Type::@296 OE[15]
__RW uint32_t SET
Definition: hpm_gpio_regs.h:20
__R uint32_t VALUE
Definition: hpm_gpio_regs.h:14
__RW uint32_t TOGGLE
Definition: hpm_gpio_regs.h:22
struct GPIO_Type::@295 DO[15]
struct GPIO_Type::@297 IF[15]
struct GPIO_Type::@294 DI[15]
struct GPIO_Type::@298 IE[15]