一般在U-boot上就设置电平值,适用于电源的复位,MIPI、LVDS、GVI之类的屏幕控制上电时序,当然,也适用任何模块以及任何引脚。
注意:如果该区域的引脚存在电源域的保护机制,需要先解除保护。
通常情况下, 在 u-boot/common/board_f.c 文件上,都能设置GPIO引脚的电平值。今天讲一下不一样的设置方式。在rk3288_7.1/u-boot/board/rockchip/rk32xx/rk32xx.c的文件中,这个文件是板子初始化的文件,其中 board_late_init 函数是进行一些硬件初始化。代码如下
//自己写的函数
void set_down_up_GPIO(void)
{
printf("set_down_up GPIO5C2 GPIO7A3 \n");
gpio_direction_output(GPIO_BANK5|GPIO_C2, 0); // 设置GPIO5_C2 引脚的电平值为 0
gpio_direction_output(GPIO_BANK7|GPIO_A3, 0); // 设置GPIO7_A3 引脚的电平值为 0
msleep(500);
msleep(500);
gpio_direction_output(GPIO_BANK5|GPIO_C2, 1); // 设置GPIO5_C2 引脚的电平值为 1
gpio_direction_output(GPIO_BANK7|GPIO_A3, 1); // 设置GPIO7_A3 引脚的电平值为 1
}
//初始化函数
int board_late_init(void)
{
debug("board_late_init\n");
board_init_adjust_env(); //调整环境
load_disk_partitions(); //加载分区磁盘 也就是解析 parameter 参数
debug("rkimage_prepare_fdt\n");
rkimage_prepare_fdt(); //
....
....
//调用我们写的函数 注意格式
set_down_up_GPIO();
....
return 0;
}
在 board_late_init() 函数中,load_disk_partitions() 函数就是用来解析 parameter.txt 文件参数的,也就是我们烧录的parameter.txt文件。调用printf函数打印信息,是为了调试用的。gpio_direction_output();是驱动通用的GPIO输出电平。GPIO_BANKx 是瑞芯微宏定义的一个参数,表示GPIOx组的意思。GPIO_XX表示一个组的第几号引脚的意思。具体设置需要根据需求以及原理图来设定。
举例:设置GPIO1_A3 == GPIO_BANK1 | GPIO_A3 以此类推。
顺便提一下 u-boot/common/board_f.c 下的启动文件,初始化序列在 init_seuence_f[] 。参考一下补丁吧。注意格式就可以了。
diff --git a/common/board_f.c b/common/board_f.c
old mode 100644
new mode 100755
index c1825d8..53fb652
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -836,6 +836,24 @@ static int initf_dm(void)
return 0;
}
+static int my_set_gpio(void)
+{
+//gpio2_B1
+ gpio_direction_output((GPIO_BANK2 | GPIO_B1), 1);
+
+//gpio2_A5
+ gpio_direction_output((GPIO_BANK2 | GPIO_A5), 1);
+
+//gpio2_A4
+ gpio_direction_output((GPIO_BANK2 | GPIO_A4), 1);
+
+//gpio2_B4
+ gpio_direction_output((GPIO_BANK2 | GPIO_B4), 1);
+
+//gpio2_B2
+ gpio_direction_output((GPIO_BANK2 | GPIO_B2), 1);
+}
+
static init_fnc_t init_sequence_f[] = {
#ifdef CONFIG_SANDBOX
setup_ram_buf,
@@ -1030,6 +1048,7 @@ static init_fnc_t init_sequence_f[] = {
#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
jump_to_copy,
#endif
+ my_set_gpio, //@add for gpio
NULL,
};
如何确定自己设置的引脚是否成功,可以通过串口打印信息确定代码是否跑了,然后通过示波器读取引脚时序图,查看是否达到自己设置的效果。
最后,感谢你能阅读到这里。希望能对你有帮助。