u_boot移植(九)之引导Linux 内核

5080阅读 0评论2014-09-13 草根老师
分类:嵌入式








可以看到,默认的环境变量值都是通过相应的宏来设置的,接下来我们设置一下我们自己的环境变量,去掉uboot中默认的环境变量。修改include/configs/fsc100.h文件如下: 

(1)注释掉一下内容





输入print命令,效果如下:


可以看到我们设置的默认环境变量,但是开发板启动的时候依然有警告说CRC校验错误,使用默认的环境变量。原因在于uboot启动的时候会先从Nand Flash中读取环境变量的内容,然后做一个CRC校验,如果校验错误就输出了警告信息。需要知道的是我们并没有在Nand Flash中保存环境变量,所以开发板启动的时候做CRC校验的时候就错误了。 

怎么解决这个问题呢?

做法很简单,我们只需要输入save命令将当前默认的环境变量保存到Nand Flash即可。做法如下:

可以看到uboot默认将环境变量保存在Nand Flash的0x40000起始地址。需要注意的是,你的uboot大小一定不能超过0x40000
即256Byte,否则在save保存环境变量的时候,就会把uboot的内容破坏掉,最后出现的效果就是你在uboot中输入任何命令都无法识别。

如果想修改环境变量的值怎么办呢?
通过命令"setenv  环境变量名   内容"进行设置就可以了,设置成功之后用save命令保存一下就可以了。

貌似到目前为止,我们都没有用uboot启动内核,接下来我们就用我们的uboot来启动内核。

五、uboot 引导 Linux 内核的两种方式

1. uboot 通过网络引导Linux 内核


从上图可以看到,uboot 运行起来后,通过网络服务将Linux 内核从PC机上下载到开发板的内存中,然后在跳到内核所在的内存地址去执行。 做法如下: 

<1>通过 tftp 20008000 zImage 命令下载内核镜像zImage到内存地址20008000 
<2>通过go  20008000命令跳到20008000地址运行Linux 内核。 

需要注意的是,我们的go命令已经做过修改了哦,如果没有做过修改是不能正常引导Linux 内核的,原因你懂得。

效果如下: 
 


通过网络的方式引导Linux 内核,多用于开发调试阶段,这样我们只需要将编译好的Linux 内核拷贝到PC主机的TFTP服务的工作目录中,然后在开发板那边用tftp命令下载到开发板的内存中运行就可以测试 Linux 内核是否OK。

2.uboot 从Nand Flash 中引导Linux 内核

从上面我们可以看到,我们已经将嵌入式系统完全烧写到 Nand Flash 中,当开发板一上电启动的时候,uboot 会先运行起来,接着uboot 会用nand read 命令从Nand Flash中将Linux 内核读到内存的某个地址,然后跳到Linux 内核所在的地址去运行。 

我们先将Linux 内核烧写到Nand Flash ,做法如下: 
<1>tftp 20008000 zImage
<2>nand erase 20000000   300000
<3>nand write 20008000   20000000  300000

效果如下: 



接下来我们从Nand Flash引导Linux 内核,做法如下: 
<1>nand read 20008000  200000  300000
<2>go 20008000
效果如下: 

uboot 从Nand Flash 中引导Linux 内核这种方式, 用于最终在产品发布的时候。

以上操作需要注意的一点是,如果操作的是uImage,则需要用bootm命令引导Linux 内核。

上一篇:u_boot移植(八)之支持dm9000网卡续
下一篇:got段与-fpic详解