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

        一般在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();     //加载分区磁盘 也就
### RK3566 U-Boot 配置 GPIO 3A1 方法 在 RK3566 平台的 U-Boot 环境下配置 GPIO 口(如 GPIO 3A1),通常涉及硬件寄存器的操作以及软件层面的相关代码实现。以下是具体方法: #### 1. **理解 GPIO 寄存器结构** GPIO 控制主要依赖于以下几个关键寄存器: - 数据方向寄存器 (DDR, Data Direction Register): 定义引脚的方向(输入/输出)。 - 数据寄存器 (DR, Data Register): 设定或读取引脚的状态。 对于 RK3566,这些寄存器的具体地址可以通过芯片手册获取。例如,在某些 Rockchip 芯片中,GPIO 基础地址可能类似于 `0xFF750000`[^2]。 #### 2. **定位 GPIO 3A1 的物理位置** GPIO 名称中的 “3A1” 表示该引脚属于第 3 组 GPIO,并且是组内的第一个引脚。其对应的寄存器偏移量需通过查阅数据手册确认。假设 GPIO 3A1 对应的数据方向寄存器位于基址加上特定偏移的位置,则可以定义如下变量用于访问寄存器: ```c #define GPIO3_BASE_ADDR 0xff7d0000 // 示例基础地址 #define GPIO3_DDR_OFFSET 0x0004 // DDR 寄存器偏移 #define GPIO3_DR_OFFSET 0x0000 // DR 寄存器偏移 volatile unsigned int *gpio3_ddr = (unsigned int *)(GPIO3_BASE_ADDR + GPIO3_DDR_OFFSET); volatile unsigned int *gpio3_dr = (unsigned int *)(GPIO3_BASE_ADDR + GPIO3_DR_OFFSET); ``` #### 3. **设置 GPIO 方向** 为了控制 GPIO 作为输入还是输出,需要写入相应的到 DDR 寄存器。例如,将 GPIO 3A1 设置为输出模式: ```c *gpio3_ddr |= (1 << 1); // 将位 1 设置为输出模式 ``` 此操作会启用 GPIO 3A1 的输出功能。 #### 4. **设定 GPIO 输出状态** 一旦设置了方向,就可以通过修改 DR 寄存器来改变 GPIO 的逻辑电平。例如,将 GPIO 3A1 设置为高电平: ```c *gpio3_dr |= (1 << 1); // 设置 GPIO 3A1 为高电平 ``` 或者将其设为低电平: ```c *gpio3_dr &= ~(1 << 1); // 清零 GPIO 3A1 到低电平 ``` #### 5. **U-Boot 中的应用场景** 在 U-Boot 初始化阶段,可以在板级初始化函数中完成上述配置。例如编辑 `/u-boot/common/board_f.c` 文件并添加类似以下代码片段: ```c #include <linux/io.h> void board_gpio_init(void) { volatile unsigned int *gpio3_ddr; volatile unsigned int *gpio3_dr; gpio3_ddr = (unsigned int *)ioremap(GPIO3_BASE_ADDR + GPIO3_DDR_OFFSET, sizeof(unsigned int)); gpio3_dr = (unsigned int *)ioremap(GPIO3_BASE_ADDR + GPIO3_DR_OFFSET, sizeof(unsigned int)); if (!gpio3_ddr || !gpio3_dr) { printf("Failed to map GPIO registers\n"); return; } *gpio3_ddr |= (1 << 1); // 设置 GPIO 3A1 为输出 *gpio3_dr |= (1 << 1); // 设置 GPIO 3A1 为高电平 } ``` #### 6. **编译与验证** 完成代码修改后重新编译 U-Boot,并确保新版本被正确烧录至目标设备。测试可通过万用表或其他工具测量对应引脚的实际压变化以验证配置效果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值