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 ptr->TP[gpio_index].SET = 1 << pin_index;
47 if (trigger == gpio_interrupt_trigger_edge_rising) {
48 ptr->PL[gpio_index].CLEAR = 1 << pin_index;
49 } else {
50 ptr->PL[gpio_index].SET = 1 << pin_index;
51 }
52 break;
53 default:
54 return;
55 }
56 }
57
gpio_set_pin_output_with_initial(GPIO_Type * ptr,uint32_t port,uint8_t pin,uint8_t initial)58 void gpio_set_pin_output_with_initial(GPIO_Type *ptr, uint32_t port, uint8_t pin, uint8_t initial)
59 {
60 if (initial & 1) {
61 ptr->DO[port].SET = 1 << pin;
62 } else {
63 ptr->DO[port].CLEAR = 1 << pin;
64 }
65 ptr->OE[port].SET = 1 << pin;
66 }
67