记录一下自己在mini2440上面 使用uboot的曲折的经历
2017-04-17 15:43
260 查看
转】记录一下自己在mini2440上面 使用uboot的曲折的经历。
(2014-08-19 20:20:24)转载▼
首先是使用了买板子时自带的代码: u-boot-1.1.6。但是编译时,总是提示有错误。也不知道这个版本是不是tekk的那个版本,自己修改了一些地方,但是感觉uboot的编译体系与一般的开源软件不相同,编译时,总是提示 有函数的实现找不到,即undefined reference to _,,,,网上说需要在makefile中添加 nostdlib等选项,但依然无法编译通过。
后来下载了 tekk的版本,貌似大家用的都是他的版本。
先说一下supervivi和uboot的区别。
在mini2440在norflash中烧写的是supervivi,supervivi使用起来非常方便,但是supervivi有一个缺点是 不支持从nfs启动,虽然它支持将nfs的根文件系统启动,但是不支持nfs的内核启动。也就是说将根文件系统放在nfs服务器上是可以的,但是supervivi不支持将编译好的内核放在nfs服务器上。
通常来讲,我们在做驱动等开发时候,其实有很多时候是需要修改内核,然后重新编译的。因此,如果使用supervivi就需要 配合dnw烧写内核。这个其实不太方便。
个人觉得uboot比supervivi的优势就在这里,就是uboot支持加载nfs服务器上的内核,这样的话,每次我们修改内核之后,就不需要用dnw进行烧写了,uboot会自动帮我们完成这个工作。因此我决定 编译uboot,并烧写到nandflash,而在norflash中保留了 supervivi。
另外,supervivi和uboot支持的内核格式是不相同的。用supervivi烧写内核时,烧写的是zImage文件,而用uboot烧写时经过处理后的image文件:zImage.img,这个文件与zImage相比是多了一个文件头部,是zImage文件经过uboot的mkimage工具而生成的。所以,supervivi和uboot不能加载相同的内核文件。
我是从这个链接下载的uboot代码:https://github.com/tekkamanninja/U-boot-2009.11_tekkaman。 为此还研究了github的使用方法,现在依然没有弄清楚怎么样在github上面搜索开源的代码,搜索好像没有sourceforge作得那么直观。目前一直想找找内核方面的项目做,但是自己没有合适的项目。希望看到博客的盆友们可以给推荐几个。
下载之后,放在虚拟机中解压,并编译,代码需要放在linux自己的磁盘中,而不能是共享的windows的磁盘。编译前需要修改Makefile,将变量CrossCompile设置为arm-linux-。 编译uboot的指令如下:make distclean; make mini2440_config; make。
需要先修改crosscompile变量,然后在进行编译,否则会出错。
编译完成之后,就可以用supervivi进行烧写,然后测试了。
在用uboot的过程中,主要解决了两个问题:
1. uboot的环境变量不能保存的问题。在uboot的界面中用setenv 和saveenv可以修改环境变量。因为tekk将环境变量设置为从nfs启动,而且ip地址都是hardcode在代码中的,因此,需要在uboot中修改这些环境变量。结果每次修改完之后,发现在启动系统时,都会出现 bad
CRC or NAND, using default environment 这样的提示,也就是说修改之后的环境变量并没有起作用。
经过认真分析 flash的分区,在mini2440的linux内核代码中,flash的分区表在文件mach-mini2440.c中,;
static struct mtd_partition mini2440_default_nand_part[] = {
[0] = {
.name = "supervivi", ;这里是 bootloader 所在的分区,可以放置 u-boot, supervivi 等内容,对应
/dev/mtdblock0
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param", ;这里是 supervivi 的参数区,其实也属于 bootloader 的一部分,如果 u-boot 比较
大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
.offset = 0x00040000,
.size = 0x00020000,
}, [2] = {
.name = "Kernel", ;内核所在的分区,大小为 5M,足够放下大部分自己定制的巨型内核了,比如内核
使用了更大的 Linux Logo 图片等,对应/dev/mtdblock2
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root", ;文件系统分区,友善之臂主要用来存放 yaffs2 文件系统内容,对应/dev/mtdblock3
.offset = 0x00560000,
相关文章推荐
- 抽出一段时间,记录一下自己的成长经历
- 在使用WeifenLuo Suite时遇到的问题,自己记录一下,备忘
- 记录一下自己使用sed遇到的问题
- 记录一下自己总结出来的,在内网环境下使用maven打包的各种方法,包括各种常用的打包方式(一)
- mini2440 uboot的使用经历
- 记录一下Oracle 9i Client中SQL Plus的使用经验
- 开始自己的blog之旅,记录一下自己的工作中的一点感受
- 记录一下,每次都不记得自己排名变化没有
- 学习使用VS2005+ORACLE,感觉乱糟糟的,在此记录一下
- 注册一个月了,一直没有来,今天开始决定记录一下自己的所见所学所感!
- 自己正在使用的工具,备注一下
- 对开源,并以自己的经历和认知发表一下自己的看法
- 顺便记录一下groupwise使用gaim
- 咱们在讨论的时候能不能先确定一个明确的范围呢?最好能把自己的经历简单说一下。
- 咱们在讨论的时候能不能先确定一个明确的范围呢?最好能把自己的经历简单说一下。
- 开始写点东西,记录一下自己学习 .net
- 由于自己开发的项目需要正则表达式,这里记录一下,以便查阅
- 自己写的一个JSP小游戏21点,记录一下
- 整理了一下网上关于选购笔记本的小窍门,自己做个记录,备用
- 最近在为界面库中增加一个单独的换肤功能,自己记录下GDI渐变色的使用方法