1 // Copyright (C) 2022 Beken Corporation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #pragma once
16
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20
21 #include <common/bk_generic.h>
22 #include "bk_drv_model.h"
23 #include "bk_uart.h"
24
25 #define GPIO_FAILURE (1)
26 #define GPIO_SUCCESS (0)
27
28 #define GPIO_DEV_NAME "gpio"
29
30 #define GPIO_CFG_PARAM(id, mode) (id + ((mode & 0xff) << 8))
31 #define GPIO_CFG_PARAM_DEMUX_ID(param) (param & 0xff)
32 #define GPIO_CFG_PARAM_DEMUX_MODE(param) ((param >> 8) & 0xff)
33
34 #define GPIO_OUTPUT_PARAM(id, val) (id + ((val & 0xff) << 8))
35 #define GPIO_OUTPUT_DEMUX_ID(param) (param & 0xff)
36 #define GPIO_OUTPUT_DEMUX_VAL(param) ((param >> 8) & 0xff)
37
38
39 #define GPIO_CMD_MAGIC (0xcaa0000)
40 enum
41 {
42 CMD_GPIO_CFG = GPIO_CMD_MAGIC + 0,
43 CMD_GPIO_OUTPUT_REVERSE = GPIO_CMD_MAGIC + 1,
44 CMD_GPIO_ENABLE_SECOND = GPIO_CMD_MAGIC + 2,
45 CMD_GPIO_INPUT = GPIO_CMD_MAGIC + 3,
46 CMD_GPIO_OUTPUT = GPIO_CMD_MAGIC + 4,
47 CMD_GPIO_CLR_DPLL_UNLOOK_INT_BIT = GPIO_CMD_MAGIC + 5,
48 CMD_GPIO_EN_DPLL_UNLOOK_INT = GPIO_CMD_MAGIC + 6,
49 CMD_GPIO_INT_ENABLE = GPIO_CMD_MAGIC + 7,
50 CMD_GPIO_INT_DISABLE = GPIO_CMD_MAGIC + 8,
51 CMD_GPIO_INT_CLEAR = GPIO_CMD_MAGIC + 9,
52 CMD_GPIO_EN_USB_PLUG_IN_INT = GPIO_CMD_MAGIC + 10,
53 CMD_GPIO_EN_USB_PLUG_OUT_INT = GPIO_CMD_MAGIC + 11,
54 };
55
56
57 enum
58 {
59 GMODE_INPUT_PULLDOWN = 0,
60 GMODE_OUTPUT,
61 GMODE_SECOND_FUNC,
62 GMODE_INPUT_PULLUP,
63 GMODE_INPUT,
64 GMODE_SECOND_FUNC_PULL_UP,//Special for uart1
65 GMODE_OUTPUT_PULLUP,
66 GMODE_SET_HIGH_IMPENDANCE,
67 GMODE_DEEP_PS,
68 GMODE_HIGH_Z
69 };
70
71 #if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7256XX)
72 typedef enum
73 {
74 GPIO0 = 0,
75 GPIO1,
76 GPIO2,
77 GPIO3,
78 GPIO4,
79 GPIO5,
80 GPIO6,
81 GPIO7,
82 GPIO8,
83 GPIO9,
84 GPIO10,
85 GPIO11,
86 GPIO12,
87 GPIO13,
88 GPIO14,
89 GPIO15,
90 GPIO16,
91 GPIO17,
92 GPIO18,
93 GPIO19,
94 GPIO20,
95 GPIO21,
96 GPIO22,
97 GPIO23,
98 GPIO24,
99 GPIO25,
100 GPIO26,
101 GPIO27,
102 GPIO28,
103 GPIO29,
104 GPIO30,
105 GPIO31,
106 GPIO32,
107 GPIO33,
108 GPIO34,
109 GPIO35,
110 GPIO36,
111 GPIO37,
112 GPIO38,
113 GPIO39,
114 GPIONUM
115 } GPIO_INDEX ;
116 #else
117 typedef enum
118 {
119 GPIO0 = 0,
120 GPIO1,
121 GPIO6 = 6,
122 GPIO7,
123 GPIO8,
124 GPIO9,
125 GPIO10,
126 GPIO11,
127 GPIO14 = 14,
128 GPIO15,
129 GPIO16,
130 GPIO17,
131 GPIO20 = 20,
132 GPIO21,
133 GPIO22,
134 GPIO23,
135 GPIO24,
136 GPIO26 = 26,
137 GPIO28 = 28,
138 GPIONUM,
139 } GPIO_INDEX ;
140 #endif
141
142 #define BITS_INT 32
143
144 enum
145 {
146 GFUNC_MODE_UART2 = 0,
147 GFUNC_MODE_I2C2,
148 GFUNC_MODE_I2S,
149 GFUNC_MODE_ADC1,
150 GFUNC_MODE_ADC2,
151 GFUNC_MODE_CLK13M,
152 GFUNC_MODE_PWM0,
153 GFUNC_MODE_PWM1,
154 GFUNC_MODE_PWM2,
155 GFUNC_MODE_PWM3,
156 GFUNC_MODE_WIFI_ACTIVE,
157 GFUNC_MODE_BT_ACTIVE,
158 GFUNC_MODE_BT_PRIORITY,
159 GFUNC_MODE_UART1,
160 GFUNC_MODE_SD_DMA,
161 GFUNC_MODE_SD_HOST,
162 GFUNC_MODE_SPI_DMA,
163 GFUNC_MODE_SPI,
164 GFUNC_MODE_SPI_GPIO_14,
165 GFUNC_MODE_SPI_GPIO_16_17,
166 GFUNC_MODE_PWM4,
167 GFUNC_MODE_PWM5,
168 GFUNC_MODE_I2C1,
169 GFUNC_MODE_JTAG,
170 GFUNC_MODE_CLK26M,
171 GFUNC_MODE_ADC3,
172 GFUNC_MODE_DCMI,
173 GFUNC_MODE_ADC4,
174 GFUNC_MODE_ADC5,
175 GFUNC_MODE_ADC6,
176 GFUNC_MODE_ADC7,
177 GFUNC_MODE_SD1_HOST,
178 GFUNC_MODE_SD1_DMA,
179 GFUNC_MODE_SPI1,
180 GFUNC_MODE_SPI_DMA1,
181 GFUNC_MODE_QSPI_1LINE,
182 GFUNC_MODE_QSPI_4LINE,
183 GFUNC_MODE_QSPI_CLK,
184 GFUNC_MODE_QSPI_CSN,
185 GFUNC_MODE_IRDA,
186 GFUNC_MODE_SD_GPIO34_36,
187 #if (CONFIG_SOC_BK7271)
188 GFUNC_MODE_SPI2,
189 GFUNC_MODE_SPI3_1,
190 GFUNC_MODE_SPI3_2,
191 GFUNC_MODE_PWM6_9_MODE1,
192 GFUNC_MODE_PWM6_9_MODE2,
193 GFUNC_MODE_PWM6_9_MODE3,
194 GFUNC_MODE_PWM10,
195 GFUNC_MODE_PWM11,
196 GFUNC_MODE_UART3
197 #endif
198 };
199
200 enum
201 {
202 GPIO_INT_LEVEL_LOW = 0,
203 GPIO_INT_LEVEL_HIGH = 1,
204 GPIO_INT_LEVEL_RISING = 2,
205 GPIO_INT_LEVEL_FALLING = 3
206 };
207
208 typedef struct gpio_int_st
209 {
210 UINT32 id;
211 UINT32 mode;
212 void * phandler;
213 }GPIO_INT_ST;
214
bk_gpio_config_input(GPIO_INDEX id)215 __inline static void bk_gpio_config_input(GPIO_INDEX id)
216 {
217 UINT32 ret;
218 UINT32 param;
219
220 param = GPIO_CFG_PARAM(id, GMODE_INPUT);
221 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ¶m);
222
223 if(ret !=0 )
224 os_printf("gpio config fail\r\n");
225 }
226
bk_gpio_config_input_pup(GPIO_INDEX id)227 __inline static void bk_gpio_config_input_pup(GPIO_INDEX id)
228 {
229 UINT32 ret;
230 UINT32 param;
231
232 param = GPIO_CFG_PARAM(id, GMODE_INPUT_PULLUP);
233 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ¶m);
234
235 if(ret !=0 )
236 os_printf("gpio config fail\r\n");
237
238 }
239
bk_gpio_config_input_pdwn(GPIO_INDEX id)240 __inline static void bk_gpio_config_input_pdwn(GPIO_INDEX id)
241 {
242 UINT32 ret;
243 UINT32 param;
244
245 param = GPIO_CFG_PARAM(id, GMODE_INPUT_PULLDOWN);
246 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ¶m);
247
248 if(ret !=0 )
249 os_printf("gpio config fail\r\n");
250
251 }
252
bk_gpio_input(GPIO_INDEX id)253 __inline static uint32_t bk_gpio_input(GPIO_INDEX id)
254 {
255 UINT32 ret;
256 UINT32 param = id;
257
258 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_INPUT, ¶m);
259
260 return ret;
261 }
262
bk_gpio_config_output(GPIO_INDEX id)263 __inline static void bk_gpio_config_output(GPIO_INDEX id)
264 {
265 UINT32 ret;
266
267 UINT32 param;
268
269 param = GPIO_CFG_PARAM(id, GMODE_OUTPUT);
270 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ¶m);
271 BK_ASSERT(GPIO_SUCCESS == ret);
272 }
273
bk_gpio_output(GPIO_INDEX id,UINT32 val)274 __inline static void bk_gpio_output(GPIO_INDEX id,UINT32 val)
275 {
276 UINT32 ret;
277 UINT32 param;
278
279 param = GPIO_OUTPUT_PARAM(id, val);
280 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_OUTPUT, ¶m);
281 BK_ASSERT(GPIO_SUCCESS == ret);
282 }
283
bk_gpio_output_reverse(GPIO_INDEX id)284 __inline static void bk_gpio_output_reverse(GPIO_INDEX id)
285 {
286 UINT32 ret;
287 UINT32 param = id;
288
289 ret = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_OUTPUT_REVERSE, ¶m);
290 BK_ASSERT(GPIO_SUCCESS == ret);
291 }
292
293 #if ((CONFIG_SOC_BK7231U) || (CONFIG_SOC_BK7251))
294 #define GPIO_USB_DP_PIN GPIO25
295 #define GPIO_USB_DN_PIN GPIO28
296
297 extern void gpio_usb_second_function(void);
298 #elif (CONFIG_SOC_BK7271)
299
300 #if (CONFIG_USB1_PORT)
301 #define GPIO_USB_DP_PIN GPIO0
302 #define GPIO_USB_DN_PIN GPIO1
303 #else
304 #define GPIO_USB_DP_PIN GPIO6
305 #define GPIO_USB_DN_PIN GPIO7
306 #endif
307
308 #elif (CONFIG_SOC_BK7256XX)
309 #define GPIO_USB_DP_PIN GPIO_12
310 #define GPIO_USB_DN_PIN GPIO_13
311
312 #endif
313
314 #if (CONFIG_USB_PLUG_IN_OUT)
315 #define USB_PLUG_NO_EVENT 0
316 #define USB_PLUG_IN_EVENT 1
317 #define USB_PLUG_OUT_EVENT 2
318
319 typedef void (*usb_plug_inout_handler)(void *usr_data, UINT32 event);
320 typedef struct usb_plug_inout {
321 usb_plug_inout_handler handler;
322 void *usr_data;
323 }USB_PLUG_INOUT_ST;
324
325 extern USB_PLUG_INOUT_ST usb_plug;
326 void usb_plug_inout_isr(void);
327 UINT32 usb_is_plug_in(void);
328 #endif
329
330 extern UINT32 gpio_ctrl(UINT32 cmd, void *param);
331 extern UINT32 gpio_input(UINT32 id);
332 extern void gpio_init(void);
333 extern void gpio_exit(void);
334 void gpio_int_disable(UINT32 index);
335 void gpio_int_enable(UINT32 index, UINT32 mode, void (*p_Int_Handler)(unsigned char));
336 void gpio_config( UINT32 index, UINT32 mode ) ;
337 void gpio_output(UINT32 id, UINT32 val);
338
339 #ifdef __cplusplus
340 }
341 #endif
342