u-boot基于GPIO状态选择启动分区

时间:2015-06-10 17:36:59

标签: embedded embedded-linux boot gpio u-boot

我正在开发嵌入式系统上的恢复机制。如果用户按下GPIO按钮,我想启动进入恢复模式。恢复模式意味着选择不同的内核和根分区。我坚持在条件命令中使用gpio值。如果我写if gpio input 20; then cmd; fi cmd将始终运行,因为gpio返回错误状态而不是GPIO的值。我怎样才能获得价值?

使用U-Boot命令实现引导选择是否可行(我需要将LED闪烁15秒,如果用户按下按钮至少5秒,则切换到恢复)。在C代码中实现这个逻辑会更容易吗?如果是这样在哪里看,有没有例子?

通常,提供恢复系统似乎是嵌入式工程师的常见任务。这种情况下的最佳做法是什么?实现这个的最常见方式是什么?我在网上找不到任何帮助或指导。

1 个答案:

答案 0 :(得分:5)

恢复可能取决于您的系统可用的内容以及您需要的强大程度。记住要始终保留只读的所有内容,并将其与可写入的内容分开。将可写内容保存在NAND或其他任何地方的不同分区中。如果内核/ FS不好,上面描述的方法将使您恢复正常运行。这可能是你所需要的。如果您计划允许更新U-Boot本身,那么您可能还需要考虑U-Boot在重写时有可能损坏并有办法恢复。

很多嵌入式处理器都有一个引脚定义的引脚顺序,你可以在启动时单向拉出另一个引脚。我最喜欢的方法是将一个按钮连接到其中一个按钮,用户可以在通电时保持更改启动顺序(例如从NAND到SD),然后从另一个可以恢复系统的设备启动。

根据您的情况,绝对可以从U-Boot检查gpio,闪烁LED等。您可以使用U-Boot命令:

if gpio input 63; then 
    gpio toggle 52; "
    sleep 1; 
    gpio toggle 52; 
    sleep 1;
fi;

或者,如果您愿意,可以直接在U-Boot C代码中执行此操作,例如在您自己的U-Boot命令中使用U-Boot进行编译:

gpio_request(GPIO_LED2, "ind_led2");
gpio_request(GPIO_LED3, "ind_led3");
while(1) {
    gpio_direction_output(GPIO_LED1, 1);
    gpio_direction_output(GPIO_LED2, 0);
    gpio_direction_output(GPIO_LED3, 1);
    udelay (500000);        //Wait 500ms
    gpio_direction_output(GPIO_LED1, 0);
    gpio_direction_output(GPIO_LED2, 1);
    gpio_direction_output(GPIO_LED3, 0);
    udelay (500000);        //Wait 500ms
}

如果从U-Boot运行gpio命令时出错,请确保启用了gpio命令,并在配置文件中添加以下内容:

#define CONFIG_CMD_GPIO

如果它仍然无法正常工作,那么请确保U-Boot为您提供GPIO驱动程序(我无法想象它没有)。