【发布时间】:2016-09-10 21:51:58
【问题描述】:
我有一个运行 Yocto (Jethro) 的定制板,并且想运行一个 u-boot 命令 preboot。显然,用空间打破引导顺序并手动运行它是可行的。如何让它自动运行?更具体地说,默认情况下,启动命令序列在哪里?
编辑:另外,我知道我可以在运行时编辑环境。但是,我正在尝试将此更改构建到图像中,以便分发它。
【问题讨论】:
我有一个运行 Yocto (Jethro) 的定制板,并且想运行一个 u-boot 命令 preboot。显然,用空间打破引导顺序并手动运行它是可行的。如何让它自动运行?更具体地说,默认情况下,启动命令序列在哪里?
编辑:另外,我知道我可以在运行时编辑环境。但是,我正在尝试将此更改构建到图像中,以便分发它。
【问题讨论】:
当你在 uboot 环境中时。输入printenv,会列出uboot使用的环境变量。
有一个变量名bootcmd。目前,我的包含一堆 if else 命令。同样,在此处添加您的首选功能以进行引导。
在它完成和测试之后。使用saveenv 存储编辑
这是 uboot 的 syntax。
编辑:
U-Boot 允许将命令或命令序列存储在纯文本文件中。使用
mkimage工具,您可以将此文件转换为可以使用U-Boot 的autoscr命令执行的脚本映像。 U-boot Scripting Capabilities
【讨论】:
通常,您的 U-Boot 配方将为单台机器构建 U-Boot,在这种情况下,我通常只需修补已编译的默认 U-Boot 环境以执行正确的操作。这是通过
实现的 SRC_URI_machine += "file://mydefenv.patch"
或者(甚至更好)使用你自己的 git 树。这还有一个额外的好处,即您的系统可能能够启动并获得一些有用的东西,即使环境会完全损坏。
另一种可能性是像查尔斯在对另一个答案的评论中建议的那样做,离线创建一个环境,并让 U-Boot 加载它,请参阅denx.de/wiki/view/DULG/UBootScripts
第三种可能性,我有时也使用过,是离线构建环境(可能使用与上面链接中相同或相似的机制),以及在正常闪存编程过程中闪存环境.不过,大部分时间我都是在 AT91 上完成的,使用类似于 at91 Sam-Ba TCL script 的 tcl 脚本
无论您选择哪种方法,U-Boot 中的bootcmd 变量都应该保存您的启动脚本。
【讨论】:
一般的答案是 bootcmd 是默认运行的,如果有持久化环境,你可以更改命令和 'saveenv' 使其保留。
【讨论】:
修改上述bootcmd是最简单的,反正都会执行。
作为修补内核的替代方法,可以覆盖 u-boot 中的命令。
创建一个文件,例如platform-top.h 在您放置补丁文件(它可能已经存在)的同一位置并覆盖 CONFIG_BOOTCOMMAND。
结果将如下所示:
/* ... */
/* replace the memory write with any other valid command */
#define CONFIG_BOOTCOMMAND "mw 0x1 0x1 && run default_bootcommand"
不要忘记在您的 bbapend SRC_URI = "file://platform-top.h" 中公开该文件
【讨论】: