最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

终于用u-boot成功引导Linux内核了

Uboot crifan 1774浏览 0评论

终于用u-boot成功引导Linux内核了[ZT]

前几天移植了u-boot,但是始终无法加载内核。使用的内核是优龙给的现成的,在优龙的bootloader下引导没有问题,但是在u-boot下无法成功引导,每当解压结束之后就halt了。
一连困扰了很多天,一开始以为是参数传不进去就把参数写死到内核了,还是不行,于是想到可能是引导内核前环境设置的不对,而对u-boot的代码不是很懂,不会修改,于是想出了一个方法:参照优龙的bootloader引导内核的代码,向u-boot添加了一个新的命令,用于引导Linux内核。

添加pyboot命令:
上网查了一下资料,了解了一下向u-boot中加命令的方法,首先在include/cmd_confdefs.h中加入新命令对应的宏,该文件中已经有了很多的命令,添加的时候定义的值不要和其他命令重复就行,而且必须是某一位为1,其他都是0的值,这里添加如下:
#define CFG_CMD_PYBOOT   0x8000000000000000ULL

然后在common下新建一个cmd_pyboot.c文件,这个文件是pyboot命令的具体实现代码,在include下新建pyboot.h文件,该文件是cmd_pyboot.c所使用的头文件。之后修改common下的Makefile,在
COBJS = xxxxxxxxx
        xxxxxxxxx
       …….
加入cmd_pyboot.o,让编译的时候编译cmd_pyboot文件。
最后回到开发板的配置文件处(include/configs/py2410.h),在这里的命令列表中加上CFG_CMD_PYBOOT,告诉u-boot编译进pyboot命令。然后make一下,下载到开发板上就可以了。
pyboot能够使用的前提是板子上的kernel以及cramfs都是优龙自带的,自己编译的内核可不可以现在未知。

比较关键的是cmd_pyboot.c文件,里面填充了一个指向0x30000100的params_struct结构体,用来存放内核参数,并且将Nand Flash上的kernel读到内存的0x30200000处,不知道为什么不是0x30008000???
cmd_pyboot.c的框架如下:
#include <common.h>
#include <config.h>
#include <command.h>
#include <pyboot.h>

#ifdef (CFG_COMMAND & CFG_CMD_PYBOOT)
……….
do_pyboot(…)
{
    …………
}

U_BOOT_CMD(
pyboot, 1, 1, do_pyboot,
"Help Infosn",
"Long Help Infosn"
);
#endif
do_pyboot是命令的主函数,使用U_BOOT_CMD宏来向系统注册一个命令。
另外值得一提的是,这次使用了source insight来看优龙的代码,这个东西真是不错啊,功能强大,适合用来查看/编辑大型的程序

不管怎么说,终于是弄出来了。TNND这几天累完了,游戏都没玩好

转载请注明:在路上 » 终于用u-boot成功引导Linux内核了

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
81 queries in 0.160 seconds, using 22.51MB memory