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