前几天移植了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
#include
#include
#include
#ifdef (CFG_COMMAND & CFG_CMD_PYBOOT)
..........
do_pyboot(...)
{
............
}
U_BOOT_CMD(
pyboot, 1, 1, do_pyboot,
"Help Infos\n",
"Long Help Infos\n"
);
#endif
do_pyboot是命令的主函数,使用U_BOOT_CMD宏来向系统注册一个命令。
另外值得一提的是,这次使用了source insight来看优龙的代码,这个东西真是不错啊,功能强大,适合用来查看/编辑大型的程序
不管怎么说,终于是弄出来了。TNND这几天累完了,游戏都没玩好
这里是cmd_pyboot.c和pyboot.h
|
文件: | pyboot-code.tar.bz2 |
大小: | 4KB |
下载: | 下载 |
|
阅读(3965) | 评论(8) | 转发(0) |