1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*
3  * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
4  */
5 
6 #include "hal_conf.h"
7 
8 /** @addtogroup RK_HAL_Driver
9   * @{
10   */
11 
12 /** @addtogroup GPIO
13   * @{
14   */
15 
16 #ifndef __HAL_GPIO_H
17 #define __HAL_GPIO_H
18 
19 #include "hal_def.h"
20 #include "hal_pinctrl.h"
21 
22 /***************************** MACRO Definition ******************************/
23 /** @defgroup GPIO_Exported_Definition_Group1 Basic Definition
24  *  @{
25  */
26 
27 #ifndef GPIO_VER_ID
28 #define GPIO_VER_ID (0U)
29 #endif
30 
31 #define PIN_NUMBER_PER_BANK (32)
32 
33 #define GPIO_PIN_SHIFT  (0) /**< Bits 0-4: GPIO Pin number: 0 - 31 */
34 #define GPIO_PIN_MASK   (0x1f << GPIO_PIN_SHIFT)
35 #define GPIO_BANK_SHIFT (5) /**< Bits 5-7: GPIO Port number: 0 - 7 */
36 #define GPIO_BANK_MASK  (0x7 << GPIO_BANK_SHIFT)
37 
38 #define BANK_PIN(BANK, PIN) ((((BANK) << GPIO_BANK_SHIFT) & GPIO_BANK_MASK) + (((PIN) << GPIO_PIN_SHIFT) & GPIO_PIN_MASK))
39 
40 /***************************** Structure Definition **************************/
41 /** GPIO pin level definition */
42 typedef enum {
43     GPIO_LOW,
44     GPIO_HIGH
45 } eGPIO_pinLevel;
46 
47 /** GPIO pin direction definition */
48 typedef enum {
49     GPIO_IN,
50     GPIO_OUT
51 } eGPIO_pinDirection;
52 
53 /** GPIO pin debounce definition */
54 typedef enum {
55     GPIO_DEBOUNCE_DIS,
56     GPIO_DEBOUNCE_EN
57 } eGPIO_pinDebounce;
58 
59 /** GPIO pin interrupt enable definition */
60 typedef enum {
61     GPIO_INT_ENABLE,
62     GPIO_INT_DISABLE
63 } eGPIO_intEnable;
64 
65 /** GPIO pin interrupt type definition */
66 typedef enum {
67     GPIO_INT_TYPE_NONE         = 0x00000000,
68     GPIO_INT_TYPE_EDGE_RISING  = 0x00000001,
69     GPIO_INT_TYPE_EDGE_FALLING = 0x00000002,
70     GPIO_INT_TYPE_EDGE_BOTH    = (GPIO_INT_TYPE_EDGE_FALLING | GPIO_INT_TYPE_EDGE_RISING),
71     GPIO_INT_TYPE_LEVEL_HIGH   = 0x00000004,
72     GPIO_INT_TYPE_LEVEL_LOW    = 0x00000008,
73     GPIO_INT_TYPE_LEVEL_MASK   = (GPIO_INT_TYPE_LEVEL_LOW | GPIO_INT_TYPE_LEVEL_HIGH),
74     GPIO_INT_TYPE_SENSE_MASK   = 0x0000000f,
75     GPIO_INT_TYPE_DEFAULT      = GPIO_INT_TYPE_SENSE_MASK,
76 } eGPIO_intType;
77 
78 /** GPIO pin interrupt mode definition */
79 typedef enum {
80     GPIO_INT_MODE_EDGE_RISING,
81     GPIO_INT_MODE_EDGE_FALLING,
82     GPIO_INT_MODE_EDGE_RISING_FALLING,
83     GPIO_INT_MODE_LEVEL_HIGH,
84     GPIO_INT_MODE_LEVEL_LOW,
85     GPIO_INT_MODE_INVALID
86 } eGPIO_intMode;
87 
88 #define IS_GPIO_PIN_DIR(ACTION)   (((ACTION) == GPIO_IN) || ((ACTION) == GPIO_OUT))
89 #define IS_GPIO_PIN_LEVEL(ACTION) (((ACTION) == GPIO_LOW) || ((ACTION) == GPIO_HIGH))
90 
91 #define IS_GPIO_PIN(PIN)      ((PIN) != 0x00000000U)
92 #define IS_GPIO_HIGH_PIN(PIN) IS_GPIO_PIN(((PIN) & 0xFFFF0000U))
93 
94 #define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_PIN_A0) || \
95                               ((PIN) == GPIO_PIN_A1) || \
96                               ((PIN) == GPIO_PIN_A2) || \
97                               ((PIN) == GPIO_PIN_A3) || \
98                               ((PIN) == GPIO_PIN_A4) || \
99                               ((PIN) == GPIO_PIN_A5) || \
100                               ((PIN) == GPIO_PIN_A6) || \
101                               ((PIN) == GPIO_PIN_A7) || \
102                               ((PIN) == GPIO_PIN_B0) || \
103                               ((PIN) == GPIO_PIN_B1) || \
104                               ((PIN) == GPIO_PIN_B2) || \
105                               ((PIN) == GPIO_PIN_B3) || \
106                               ((PIN) == GPIO_PIN_B4) || \
107                               ((PIN) == GPIO_PIN_B5) || \
108                               ((PIN) == GPIO_PIN_B6) || \
109                               ((PIN) == GPIO_PIN_B7) || \
110                               ((PIN) == GPIO_PIN_C0) || \
111                               ((PIN) == GPIO_PIN_C1) || \
112                               ((PIN) == GPIO_PIN_C2) || \
113                               ((PIN) == GPIO_PIN_C3) || \
114                               ((PIN) == GPIO_PIN_C4) || \
115                               ((PIN) == GPIO_PIN_C5) || \
116                               ((PIN) == GPIO_PIN_C6) || \
117                               ((PIN) == GPIO_PIN_C7) || \
118                               ((PIN) == GPIO_PIN_D0) || \
119                               ((PIN) == GPIO_PIN_D1) || \
120                               ((PIN) == GPIO_PIN_D2) || \
121                               ((PIN) == GPIO_PIN_D3) || \
122                               ((PIN) == GPIO_PIN_D4) || \
123                               ((PIN) == GPIO_PIN_D5) || \
124                               ((PIN) == GPIO_PIN_D6) || \
125                               ((PIN) == GPIO_PIN_D7))
126 
127 /** @} */
128 /***************************** Function Declare ******************************/
129 /** @defgroup GPIO_Exported_Definition_Group2 Public Functions Declare.
130  *  @{
131  */
132 eGPIO_pinDirection HAL_GPIO_GetPinDirection(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
133 eGPIO_pinLevel HAL_GPIO_GetPinLevel(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
134 eGPIO_pinLevel HAL_GPIO_GetPinData(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
135 uint32_t HAL_GPIO_GetBankLevel(struct GPIO_REG *pGPIO);
136 
137 HAL_Status HAL_GPIO_SetPinLevel(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_pinLevel level);
138 HAL_Status HAL_GPIO_SetPinDirection(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_pinDirection direction);
139 HAL_Status HAL_GPIO_SetIntType(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_intType mode);
140 
141 HAL_Status HAL_GPIO_SetPinsLevel(struct GPIO_REG *pGPIO, uint32_t mPins, eGPIO_pinLevel level);
142 HAL_Status HAL_GPIO_SetPinsDirection(struct GPIO_REG *pGPIO, uint32_t mPins, eGPIO_pinDirection direction);
143 
144 void HAL_GPIO_EnableIRQ(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
145 void HAL_GPIO_DisableIRQ(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
146 void HAL_GPIO_IRQHandler(struct GPIO_REG *pGPIO, eGPIO_bankId bank);
147 
148 /* The parameter pin for this function is special, it's 0~31. */
149 void HAL_GPIO_IRQDispatch(eGPIO_bankId bank, uint32_t pin);
150 
151 /** @} */
152 
153 #endif
154 /** @} */
155 
156 /** @} */
157