1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2019-03-19     ZYH          first version
9  */
10 
11 #include <rtthread.h>
12 #include <fpioa.h>
13 #include <drv_io_config.h>
14 #include <sysctl.h>
15 
16 #define HS_GPIO(n) (FUNC_GPIOHS0 + n)
17 
18 #define IOCONFIG(pin,func)  {pin, func, #func}
19 
20 static struct io_config
21 {
22     int io_num;
23     fpioa_function_t func;
24     const char * func_name;
25 } io_config[] =
26 {
27 #ifdef BSP_USING_LCD
28     IOCONFIG(BSP_LCD_CS_PIN, FUNC_SPI0_SS0),                 /* LCD CS PIN */
29     IOCONFIG(BSP_LCD_WR_PIN, FUNC_SPI0_SCLK),                /* LCD WR PIN */
30     IOCONFIG(BSP_LCD_DC_PIN, HS_GPIO(LCD_DC_PIN)),           /* LCD DC PIN */
31 #if BSP_LCD_RST_PIN >= 0
32     IOCONFIG(BSP_LCD_RST_PIN, HS_GPIO(LCD_RST_PIN)),         /* LCD RESET PIN */
33 #endif
34 #if BSP_LCD_BACKLIGHT_PIN >= 0
35     IOCONFIG(BSP_LCD_BACKLIGHT_PIN, HS_GPIO(LCD_BACKLIGHT_PIN)),    /* LCD BACKLIGHT PIN */
36 #endif
37 #endif
38 
39 #ifdef BSP_USING_CAMERA
40     IOCONFIG(BSP_CAMERA_SCCB_SDA_PIN, FUNC_SCCB_SDA),
41     IOCONFIG(BSP_CAMERA_SCCB_SCLK_PIN, FUNC_SCCB_SCLK),
42     IOCONFIG(BSP_CAMERA_CMOS_RST_PIN, FUNC_CMOS_RST),
43     IOCONFIG(BSP_CAMERA_CMOS_VSYNC_PIN, FUNC_CMOS_VSYNC),
44     IOCONFIG(BSP_CAMERA_CMOS_PWDN_PIN, FUNC_CMOS_PWDN),
45     IOCONFIG(BSP_CAMERA_CMOS_XCLK_PIN, FUNC_CMOS_XCLK),
46     IOCONFIG(BSP_CAMERA_CMOS_PCLK_PIN, FUNC_CMOS_PCLK),
47     IOCONFIG(BSP_CAMERA_CMOS_HREF_PIN, FUNC_CMOS_HREF),
48 #endif
49 
50 #ifdef BSP_USING_SPI1
51     IOCONFIG(BSP_SPI1_CLK_PIN, FUNC_SPI1_SCLK),
52     IOCONFIG(BSP_SPI1_D0_PIN, FUNC_SPI1_D0),
53     IOCONFIG(BSP_SPI1_D1_PIN, FUNC_SPI1_D1),
54 #ifdef BSP_USING_SPI1_AS_QSPI
55     IOCONFIG(BSP_SPI1_D2_PIN, FUNC_SPI1_D2),
56     IOCONFIG(BSP_SPI1_D3_PIN, FUNC_SPI1_D3),
57 #endif
58 #ifdef BSP_SPI1_USING_SS0
59     IOCONFIG(BSP_SPI1_SS0_PIN, HS_GPIO(SPI1_CS0_PIN)),
60 #endif
61 #ifdef BSP_SPI1_USING_SS1
62     IOCONFIG(BSP_SPI1_SS1_PIN, HS_GPIO(SPI1_CS1_PIN)),
63 #endif
64 #ifdef BSP_SPI1_USING_SS2
65     IOCONFIG(BSP_SPI1_SS2_PIN, HS_GPIO(SPI1_CS2_PIN)),
66 #endif
67 #ifdef BSP_SPI1_USING_SS3
68     IOCONFIG(BSP_SPI1_SS3_PIN, HS_GPIO(SPI1_CS3_PIN)),
69 #endif
70 #endif
71 
72 #ifdef BSP_USING_UART1
73     IOCONFIG(BSP_UART1_TXD_PIN, FUNC_UART1_TX),
74     IOCONFIG(BSP_UART1_RXD_PIN, FUNC_UART1_RX),
75 #endif
76 #ifdef BSP_USING_UART2
77     IOCONFIG(BSP_UART2_TXD_PIN, FUNC_UART2_TX),
78     IOCONFIG(BSP_UART2_RXD_PIN, FUNC_UART2_RX),
79 #endif
80 #ifdef BSP_USING_UART3
81     IOCONFIG(BSP_UART3_TXD_PIN, FUNC_UART3_TX),
82     IOCONFIG(BSP_UART3_RXD_PIN, FUNC_UART3_RX),
83 #endif
84 };
85 
print_io_config()86 static int print_io_config()
87 {
88     int i;
89     rt_kprintf("IO Configuration Table\n");
90     rt_kprintf("+-------+------------------------+\n");
91     rt_kprintf("|Pin    |Function                |\n");
92     rt_kprintf("+-------+------------------------+\n");
93     for(i = 0; i < sizeof io_config / sizeof io_config[0]; i++)
94     {
95         rt_kprintf("|%-2d     |%-24.24s|\n", io_config[i].io_num, io_config[i].func_name);
96     }
97     rt_kprintf("+-------+------------------------+\n");
98     return 0;
99 }
100 MSH_CMD_EXPORT_ALIAS(print_io_config, io, print io config);
101 
io_config_init(void)102 int io_config_init(void)
103 {
104     int count = sizeof(io_config) / sizeof(io_config[0]);
105     int i;
106 
107     sysctl_set_power_mode(SYSCTL_POWER_BANK0, SYSCTL_POWER_V18);
108     sysctl_set_power_mode(SYSCTL_POWER_BANK1, SYSCTL_POWER_V18);
109     sysctl_set_power_mode(SYSCTL_POWER_BANK2, SYSCTL_POWER_V18);
110 #ifdef BSP_USING_UART2
111     // for IO-27/28
112     sysctl_set_power_mode(SYSCTL_POWER_BANK4, SYSCTL_POWER_V33);
113 #endif
114 #if  defined(BSP_USING_UART1) || defined(BSP_USING_UART3)
115     // for IO-20~23
116     sysctl_set_power_mode(SYSCTL_POWER_BANK3, SYSCTL_POWER_V33);
117 #endif
118 
119     for(i = 0; i < count; i++)
120     {
121         fpioa_set_function(io_config[i].io_num, io_config[i].func);
122     }
123 
124 #if defined(BSP_USING_CAMERA) || defined(BSP_USING_LCD)
125     sysctl_set_spi0_dvp_data(1);
126 #endif
127 
128 }
129 INIT_BOARD_EXPORT(io_config_init);
130 
131