当前位置: 首页 > 工具软件 > RK Boot > 使用案例 >

rk3288 _7.1_在U-boot上电时设置GPIO的电平值

宰父宾实
2023-12-01

        一般在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,
 };

        如何确定自己设置的引脚是否成功,可以通过串口打印信息确定代码是否跑了,然后通过示波器读取引脚时序图,查看是否达到自己设置的效果。

        最后,感谢你能阅读到这里。希望能对你有帮助。

 类似资料: