我正在开发嵌入式系统上的恢复机制。如果用户按下GPIO按钮,我想启动进入恢复模式。恢复模式意味着选择不同的内核和根分区。我坚持在条件命令中使用gpio值。如果我写if gpio input 20; then cmd; fi
cmd
将始终运行,因为gpio返回错误状态而不是GPIO的值。我怎样才能获得价值?
使用U-Boot命令实现引导选择是否可行(我需要将LED闪烁15秒,如果用户按下按钮至少5秒,则切换到恢复)。在C代码中实现这个逻辑会更容易吗?如果是这样在哪里看,有没有例子?
通常,提供恢复系统似乎是嵌入式工程师的常见任务。这种情况下的最佳做法是什么?实现这个的最常见方式是什么?我在网上找不到任何帮助或指导。
答案 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驱动程序(我无法想象它没有)。