在BootLoader中使用gpio--获取gpio的高低电平,以及设置相应的管脚的电平高低

以下以rv1108平台为例:

在项目中,需要实现一个功能,在Linux kernel加载前BootLoader判断一个引脚电平的高低状态,从而决定加载不同的kernel,以及相应的文件系统,以实现双系统的功能。

//判断按键的电平高点状态:
#if 1
    //set gpio3_a4's direction intput
    u32Reg = read_XDATA32(0x10330000 + 0x0004);
    u32Reg &= ~0x10;
    write_XDATA32(0x10330000 + 0x0004, u32Reg);

    //read level
    u32Reg = read_XDATA32(0x10330000 + 0x0050);
    uint32 level = (u32Reg & 0x10);

    if(level)
    {
        boot_sys_flg = 1;
        PRINT_E("now gpio pin is high\n", "");
    }
    else
    {
        boot_sys_flg = 0;
        PRINT_E("now gpio pin is low\n", "");
    }
#endif
//根据按键的不同状态,决定不同的kernel的加载地址:
if(boot_sys_flg==0)
{
    kernel_addr = KERNEL_PART_A;
    PRINT_E("now is load KERNEL_PART_A\n", "");
}
else
{
    kernel_addr = KERNEL_PART_B;
    PRINT_E("now is load KERNEL_PART_B\n", "");
}

 

以下代码是需要满足gpio3_a7的高电平拉低延时1S再拉高的操作,目的是这个引脚接的是WiFi模块的复位引脚,在WiFi模块的驱动代码加载之前需要对这个引脚以此做一下复位的操作。

PRINT_E("start set gpio3_a7\r\n", "");
//set gpio3_a7's direction output
u32Reg = read_XDATA32(0x10330000 + 0x0004);
u32Reg |= 0x80;
write_XDATA32(0x10330000 + 0x0004, u32Reg);

//set gpio3_a7 is high
u32Reg = read_XDATA32(0x10330000 + 0x0000);
u32Reg |= 0x80;
write_XDATA32(0x10330000 + 0x0000, u32Reg);

//set gpio3_a7 is low
u32Reg = read_XDATA32(0x10330000 + 0x0000);
u32Reg &= ~0x80;
write_XDATA32(0x10330000 + 0x0000, u32Reg);

//delay 1 S
u32delay = RkldTimerGetTick()/1000;
while((RkldTimerGetTick()/1000 - u32delay) < 1000)
{
     ;
}

//set gpio3_a7 is high
u32Reg = read_XDATA32(0x10330000 + 0x0000);
u32Reg |= 0x80;
write_XDATA32(0x10330000 + 0x0000, u32Reg);
PRINT_E("gpio3_a7 set success\r\n", "");

 

你可能感兴趣的:(C语言,Linux系统,BootLoader,arm处理器,linux系统)