1 /*
2 * Copyright (c) 2021 HPMicro
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #include "hpm_common.h"
9 #include "hpm_gpio_drv.h"
10
gpio_toggle_pin_interrupt_trigger_polarity(GPIO_Type * ptr,uint32_t gpio_index,uint8_t pin_index)11 void gpio_toggle_pin_interrupt_trigger_polarity(GPIO_Type *ptr, uint32_t gpio_index, uint8_t pin_index)
12 {
13 bool intr_was_enabled = gpio_check_pin_interrupt_enabled(ptr, gpio_index, pin_index);
14 gpio_disable_pin_interrupt(ptr, gpio_index, pin_index);
15 ptr->PL[gpio_index].TOGGLE = 1 << pin_index;
16 if (intr_was_enabled) {
17 gpio_enable_pin_interrupt(ptr, gpio_index, pin_index);
18 }
19 }
20
gpio_toggle_pin_interrupt_trigger_type(GPIO_Type * ptr,uint32_t gpio_index,uint8_t pin_index)21 void gpio_toggle_pin_interrupt_trigger_type(GPIO_Type *ptr, uint32_t gpio_index, uint8_t pin_index)
22 {
23 bool intr_was_enabled = gpio_check_pin_interrupt_enabled(ptr, gpio_index, pin_index);
24 gpio_disable_pin_interrupt(ptr, gpio_index, pin_index);
25 ptr->TP[gpio_index].TOGGLE = 1 << pin_index;
26 if (intr_was_enabled) {
27 gpio_enable_pin_interrupt(ptr, gpio_index, pin_index);
28 }
29 }
30
31
gpio_config_pin_interrupt(GPIO_Type * ptr,uint32_t gpio_index,uint8_t pin_index,gpio_interrupt_trigger_t trigger)32 void gpio_config_pin_interrupt(GPIO_Type *ptr, uint32_t gpio_index, uint8_t pin_index, gpio_interrupt_trigger_t trigger)
33 {
34 switch (trigger) {
35 case gpio_interrupt_trigger_level_high:
36 case gpio_interrupt_trigger_level_low:
37 ptr->TP[gpio_index].CLEAR = 1 << pin_index;
38 if (trigger == gpio_interrupt_trigger_level_high) {
39 ptr->PL[gpio_index].CLEAR = 1 << pin_index;
40 } else {
41 ptr->PL[gpio_index].SET = 1 << pin_index;
42 }
43 break;
44 case gpio_interrupt_trigger_edge_falling:
45 case gpio_interrupt_trigger_edge_rising:
46 #if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
47 ptr->PD[gpio_index].CLEAR = 1 << pin_index;
48 #endif
49 ptr->TP[gpio_index].SET = 1 << pin_index;
50 if (trigger == gpio_interrupt_trigger_edge_rising) {
51 ptr->PL[gpio_index].CLEAR = 1 << pin_index;
52 } else {
53 ptr->PL[gpio_index].SET = 1 << pin_index;
54 }
55 break;
56 #if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
57 case gpio_interrupt_trigger_edge_both:
58 ptr->TP[gpio_index].SET = 1 << pin_index;
59 ptr->PD[gpio_index].SET = 1 << pin_index;
60 break;
61 #endif
62 default:
63 return;
64 }
65 }
66
gpio_set_pin_output_with_initial(GPIO_Type * ptr,uint32_t port,uint8_t pin,uint8_t initial)67 void gpio_set_pin_output_with_initial(GPIO_Type *ptr, uint32_t port, uint8_t pin, uint8_t initial)
68 {
69 if (initial & 1) {
70 ptr->DO[port].SET = 1 << pin;
71 } else {
72 ptr->DO[port].CLEAR = 1 << pin;
73 }
74 ptr->OE[port].SET = 1 << pin;
75 }
76