Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2728531
  • 博文数量: 102
  • 博客积分: 1444
  • 博客等级: 中尉
  • 技术积分: 13891
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-29 10:58
文章分类

全部博文(102)

文章存档

2014年(29)

2013年(14)

2012年(59)

分类: 嵌入式

2014-09-13 00:43:55








可以看到,默认的环境变量值都是通过相应的宏来设置的,接下来我们设置一下我们自己的环境变量,去掉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 内核。

阅读(5000) | 评论(0) | 转发(13) |
给主人留下些什么吧!~~