• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &param);
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, &param);
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, &param);
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, &param);
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, &param);
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, &param);
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, &param);
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