如何从U-Boot引导裸板二进制文件?

3
我们如何从U-Boot中引导独立的裸板二进制文件(不是在U-Boot环境下运行的独立二进制文件,也不是Linux内核)?我的要求是使用我的二进制文件重新初始化板子和驱动程序...
我可以用我的二进制文件替换启动介质(这里是NOR Flash)中的U-Boot,但我的要求是不要删除NOR Flash中的U-Boot,并且我应该使用“tftp”命令从LAN网络加载我的二进制文件。
谢谢和问候, Veerendranath

дҢүз”ЁU-Bootзљ„tftpbootе’Њgoе‘Ң令жқӨ执иҰЊд»»дҢ•з±»еһ‹зљ„独立程еғЏгЂ‚иҮ·еЏ‚иЂѓhttp://stackoverflow.com/questions/15340089/how-to-run-custom-kernel-on-beaglebone/15375308#15375308гЂ‚ - undefined
@sawdust 谢谢你的回复...我知道这些选项。问题在于,当我使用go命令时,我的程序必须使用U-Boot服务函数(我的意思是独立的二进制文件将在U-Boot环境中运行)...但是我想完全控制U-Boot,因为我的二进制文件是自包含的,就像内核一样...但是我的二进制文件不是内核格式,所以无法使用bootm或U-Boot提供的任何其他启动命令进行引导......如果您有任何实现此目标而无需自定义U-Boot的想法,请告诉我。 - undefined
2个回答

4
如何从U-Boot引导裸板二进制文件?
使用U-Boot的"go"命令执行任何类型的独立程序。
我们如何从U-Boot引导独立的裸板二进制文件(不是在U-Boot环境下运行的独立二进制文件,也不是Linux内核)?
使用U-Boot的"go"命令执行任何类型的独立程序。
...我应该使用“tftp”命令从LAN网络加载我的二进制文件。
使用U-Boot的“tftpboot”和“go”命令执行任何类型的独立程序。(缩写的“tftp”命令现已被弃用,现在也有“tftpput”命令。)
问题在于当我使用go命令时,我的程序必须使用U-Boot服务函数(我的意思是独立二进制文件将在U-Boot环境中运行)...
您的信息不准确,没有要求您必须“使用U-Boot服务函数”。独立构建您的程序与U-Boot无关,并且它将完全独立于U-Boot执行。
但是我无法使用bootm或U-Boot提供的任何其他引导命令来启动,因为我的二进制文件不是内核格式。 没有“内核格式”;这就是为什么U-Boot使用mkimage包装器来识别二进制文件的原因。 bootm命令专门设计用于满足操作系统(例如Linux内核)的引导要求(例如包含命令行参数的缓冲区),通过指定二进制文件的特征。 使用U-Boot的go命令执行任何类型的简单独立程序。 如果在使用go命令执行二进制文件时遇到问题,则问题出在您的程序上,例如控制处理器并初始化其C环境。

附录
当我使用术语独立程序时,我指的是通用定义(也称为裸机),而不是与其示例/目录相关的U-Boot特定定义
顺便说一句,我已经使用go命令来编写这两种类型的“独立”程序。
U-Boot将其“独立”描述为

 * "Standalone Programs" are directly runnable in the environment
 *   provided by U-Boot; it is expected that (if they behave
 *   well) you can continue to work in U-Boot after return from
 *   the Standalone Program.

请注意,使用U-Boot环境是可选的。
不需要独立程序来使用U-Boot环境,特别是如果没有返回到U-Boot的意图的话。
在U-Boot中没有任何内容可以检测或限制独立程序的行为。
如果您无法让独立程序与go命令一起工作,那么问题就在于您的程序,而不是go命令。
go命令仅仅是传输控制(即跳转指令到指定的内存位置),对该代码没有任何限制或要求(除了系统操作方面的合理要求)。
使用电路仿真器(ICE)或JTAG调试器解决代码问题,特别是当您的程序不使用现有堆栈时。

附录2
与模糊不清的go命令不同,mkimage包装器提供了standalone镜像类型,可用于bootm命令。
请参见创建裸机引导映像,但不要期望与go命令有不同的结果。
使用包装器和bootm的优点在于已下载的映像(uImage文件)可以:

  • 使用iminfo命令进行识别/验证,
  • 压缩(例如gzip、bzip2、lzo)或未压缩。

我已经尝试使用go命令启动我的二进制文件,但没有成功...而我的二进制文件的主要要求是控制处理器并重新初始化控制器。 关于独立程序,你可以查看这个链接:https://compulab.co.il/workspace/mediawiki/index.php5/U-Boot:_Images - undefined
我的二进制程序的主要要求是控制处理器并重新初始化控制器。请注意,对于您的程序可以“重新初始化”的内容有限制。您的程序已经加载并在DRAM中执行,因此不能修改任何会影响DRAM时序的时钟。 - undefined
1
"我已经尝试使用go命令启动我的二进制文件,但没有成功。" -- 那么你问错了问题。没有其他的U-Boot命令可以产生更好或不同的结果。 事实上,你遇到的是一个关于独立编程的问题,这应该是你的问题所在。既然这确实是一个编程问题,你应该发布你的代码以及如何编译和链接的详细信息。 - undefined

0
  1. 你可以使用fsbl、bitstream、uboot.elf和你的应用程序创建boot.bin文件。然后将其烧录到QSPI闪存中,并选择从中引导。
  2. 或者你可以从TFTP引导。在这种情况下,你只需要使用fsb、bitstream和uboot.elf创建boot.bin文件。你需要修改uboot头文件以强制它从tftp引导,例如tftpboot 0x0 hello.elf。一旦引导成功,它将通过tftp获取elf/bin文件并使用bootelf或go命令引导板子。
  3. 如果有SD卡,你也可以从SD卡引导。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接