• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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