• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_GPIOM_DRV_H
9 #define HPM_GPIOM_DRV_H
10 
11 #include "hpm_gpiom_regs.h"
12 #include "hpm_gpiom_soc_drv.h"
13 
14 /**
15  *
16  * @brief GPIOM driver APIs
17  * @defgroup gpiom_interface GPIOM driver APIs
18  * @ingroup io_interfaces
19  * @{
20  */
21 
22 /* @brief pin visibility */
23 typedef enum gpiom_pin_visibility {
24     gpiom_pin_visible = 0,
25     gpiom_pin_invisible = 1,
26 } gpiom_pin_visibility_t;
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 /**
33  * @brief Get pin's controller
34  *
35  * @param ptr GPIOM base address
36  * @param gpio_index gpio port index
37  * @param pin_index pin index
38  *
39  * @retval pin control module
40  */
gpiom_get_pin_controller(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index)41 static inline gpiom_gpio_t gpiom_get_pin_controller(GPIOM_Type *ptr,
42                                                       uint8_t gpio_index,
43                                                       uint8_t pin_index)
44 {
45     return (gpiom_gpio_t)((ptr->ASSIGN[gpio_index].PIN[pin_index]
46             & (GPIOM_ASSIGN_PIN_SELECT_MASK)) >> GPIOM_ASSIGN_PIN_SELECT_SHIFT);
47 }
48 
49 /**
50  * @brief set pin's controller
51  *
52  * @param ptr GPIOM base address
53  * @param gpio_index gpio port index
54  * @param pin_index pin index
55  * @param gpio gpio module index
56  */
gpiom_set_pin_controller(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index,gpiom_gpio_t gpio)57 static inline void gpiom_set_pin_controller(GPIOM_Type *ptr,
58                               uint8_t gpio_index,
59                               uint8_t pin_index,
60                               gpiom_gpio_t gpio)
61 {
62     ptr->ASSIGN[gpio_index].PIN[pin_index] =
63         (ptr->ASSIGN[gpio_index].PIN[pin_index] & ~(GPIOM_ASSIGN_PIN_SELECT_MASK))
64       | GPIOM_ASSIGN_PIN_SELECT_SET(gpio);
65 }
66 
67 /**
68  * @brief Check if pin is visibility for specified module
69  *
70  * @param ptr GPIOM base address
71  * @param gpio_index gpio port index
72  * @param pin_index pin index
73  * @param gpio gpio module index
74  *
75  * @retval true if pin is visible by specified module
76  * @retval false if pin is not visible by specified module
77  */
gpiom_check_pin_visibility(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index,gpiom_gpio_t gpio)78 static inline bool gpiom_check_pin_visibility(GPIOM_Type *ptr,
79                               uint8_t gpio_index,
80                               uint8_t pin_index,
81                               gpiom_gpio_t gpio)
82 {
83     return (ptr->ASSIGN[gpio_index].PIN[pin_index] & ((1 << gpio) << GPIOM_ASSIGN_PIN_HIDE_SHIFT))
84         >> GPIOM_ASSIGN_PIN_HIDE_SHIFT >> gpio == gpiom_pin_visible;
85 }
86 
87 /**
88  * @brief enable pin visibility for specified module
89  *
90  * @param ptr GPIOM base address
91  * @param gpio_index gpio port index
92  * @param pin_index pin index
93  * @param gpio gpio module index
94  */
gpiom_enable_pin_visibility(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index,gpiom_gpio_t gpio)95 static inline void gpiom_enable_pin_visibility(GPIOM_Type *ptr,
96                               uint8_t gpio_index,
97                               uint8_t pin_index,
98                               gpiom_gpio_t gpio)
99 {
100     ptr->ASSIGN[gpio_index].PIN[pin_index] =
101         (ptr->ASSIGN[gpio_index].PIN[pin_index] & ~((1 << gpio) << GPIOM_ASSIGN_PIN_HIDE_SHIFT));
102 }
103 
104 /**
105  * @brief disable pin visibility for specified module
106  *
107  * @param ptr GPIOM base address
108  * @param gpio_index gpio port index
109  * @param pin_index pin index
110  * @param gpio gpio module index
111  */
gpiom_disable_pin_visibility(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index,gpiom_gpio_t gpio)112 static inline void gpiom_disable_pin_visibility(GPIOM_Type *ptr,
113                               uint8_t gpio_index,
114                               uint8_t pin_index,
115                               gpiom_gpio_t gpio)
116 {
117     ptr->ASSIGN[gpio_index].PIN[pin_index] =
118         (ptr->ASSIGN[gpio_index].PIN[pin_index] & ~((1 << gpio) << GPIOM_ASSIGN_PIN_HIDE_SHIFT))
119       | GPIOM_ASSIGN_PIN_HIDE_SET(1 << gpio);
120 }
121 
122 /**
123  * @brief Check if pin management is locked
124  *
125  * @param ptr GPIOM base address
126  * @param gpio_index gpio port index
127  * @param pin_index pin index
128  *
129  * @retval true if pin management is locked
130  * @retval false if pin management is not locked
131  */
gpiom_pin_is_locked(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index)132 static inline bool gpiom_pin_is_locked(GPIOM_Type *ptr,
133                               uint8_t gpio_index,
134                               uint8_t pin_index)
135 {
136     return (ptr->ASSIGN[gpio_index].PIN[pin_index] & GPIOM_ASSIGN_PIN_LOCK_MASK)
137         == GPIOM_ASSIGN_PIN_LOCK_MASK;
138 }
139 
140 /**
141  * @brief lock pin management
142  *
143  * @param ptr GPIOM base address
144  * @param gpio_index gpio port index
145  * @param pin_index pin index
146  */
gpiom_lock_pin(GPIOM_Type * ptr,uint8_t gpio_index,uint8_t pin_index)147 static inline void gpiom_lock_pin(GPIOM_Type *ptr,
148                               uint8_t gpio_index,
149                               uint8_t pin_index)
150 {
151     ptr->ASSIGN[gpio_index].PIN[pin_index] |= GPIOM_ASSIGN_PIN_LOCK_MASK;
152 }
153 
154 #ifdef __cplusplus
155 }
156 #endif
157 /**
158  * @}
159  */
160 
161 #endif /* HPM_GPIOM_DRV_H */
162 
163