u-boot-2009.11在mini2440上面的移植


最近在学习u-boot,通过一周的不停的捣鼓,终于成功移植u-boot到mini2440开发板上,我承认我很菜。中间走了很多弯路,先是烧写Norflash失败,导致原厂u-boot丢失,自己的U-boot也无法烧写。后是移植u-boot-1.16失败。u-boot的移植成功与否与很多因素有关系,与开发板,编译工具链,U-boot版本等等。对于菜鸟来说,网上的移植文档茫茫多,通常会把自己弄晕过去,即使你的开发板,编译工具链,还有u-boot版本全都一样,你按照他的步骤也未必能成功,因为我们菜鸟通常都还不具备u-boot的代码分析能力和修改能力,只能按着别人的代码修改。查了很多移植文档后来发现有个牛人,用过mini2440的人应该都知道这个人-tekkaman,这哥们居然成功移植各种版本的u-boot到mini2440,而且分析透彻,完全原创。后来在友善之臂的官网上找到了一份官方的u-boot移植文档,这份文档就是友善之臂联系tekkaman编写的,看来tekkaman真乃神人也!通过这个文档的指点,我终于顺利的移植u-boot 2009.11到mini2440。为了让以后得哥们少走一些弯路,我写下此文,希望能够给他人提供一点帮助,先声明此贴是基于Mini2440的移植文档的,下载U-BOOT移植S3C2440完全手册。

我的开发板平台:board:mini2440; cpu:s3c2440;sdram:64M; nor:2M; nand:128M

交叉工具链:arm-linux-gcc-4.3.2

u-boot版本:u-boot-2009.11

第一部分:u-boot基础知识(推荐阅读《bootloader技术内幕》)

         如果你已经了解了基础知识,请无视这部分。

u-boot是最简单的概括就是类似于windows的bios,我想只要亲手装过系统的哥们应该都知道这个bios是干嘛的。最只要的作用还是引导系统的。同样u-boot的作用也是一样,不过他在引导系统之前还有对硬件资源进行一些初始化,比如说cpu内部寄存器初始化,内存初始化等等。

一个嵌入式的存储设备通过通常包括四个分区,第一分区存放的当然是u-boot,第二个分区存放着u-boot要传给系统内核的参数,第三个分区是系统内核(kernel),第三个分区则是根文件系统。

嵌入式使用的存储设备一般都是flash闪存,flash又分两种,一种是norflash,一种是nandflash,它们的区别在于:nor是十六位数据线一次可以传16位数据,它可以用cpu的地址线寻址,读取数据比较快,但是价格比较昂贵,而nand则是8位数据线,一次只能传8位的数据,读取数据相对比较慢一点,但是他价格比较便宜,比较受欢迎。Nand不是通过cpu的地址总线来寻址的,nand是直接与cpu相连的,通过对cpu内部的寄存器的控制来访问nand。Nand不是线性寻址方式,因为他不是通过分字节访问的,一个nand的最小单位是页(page),很多个page又组成一个块(block),最后所以的block组成了nandflash,所以要对nand进行访问,得知道通过指定block和page来访问。Nand又分大页nand和小页nand,结构上有一点点细微的差别。

这个是K9F1G08U0B大页flash的结构,可以看出它的一个block是有64个page组成的,整个nand是由1024个block组成的。

         U-boot的主要任务及典型结构框架

         u-boot的任务分为两个阶段(stage1,stage2)(按执行的先后顺序列出):

第一阶段:主要在cpu/xxx/start.S和和lowlevel_init.S两个汇编文件中完成

1,  硬件设备的初始化,包括中断,cpu速度和时钟,ram,led,内部指令、数据 cache。

2,  为加载bootloader的stage2准备ram空间,计算stage2代码所需空间大小,和设置stage2代码起始地址在ram空间的位置。注意此处的ram是sdram内存,不要和arm内部的4k ram混淆了。

3,  拷贝stage2的代码到ram空间

4,  设置好堆栈

5,  跳转到stage2的c程序入口点

第二阶段:主要在/board/board.c和/common/main.c 中完成

1,  初始化本阶段要用到的硬件设备,串口(用来使用打印),Led(用来指示U-boot的运行),等等。

2,   检测系统内存映射,检测系统哪些地址被实际对应到外部的sdram

3,  将kernel映像 和根文件系统映像从flash上读到ram空间

4,  为内核设置启动参数,包括存储设备参数,命令行参数,RAMDISK参数,INITRD参数等等。

5,  调用内核

第二部分u-boot移植

我用的ARM芯片是S3C2440,由于U-BOOT移植没有提供对S3C2440的支持,我们只有选择对S3C2410的代码的修改来完成s3c2440的移植。首先我们要了解S3C2410和S3C2440的区别才能知道应该对哪些部分进行修改

S3C2440和S3C2410的区别主要是2440的主频更高,接口方面增加了摄像头接口和AC’97音频接口,寄存器方面,出了新增模块寄存器外nand flash的控制寄存器有了较大的变化,芯片的时钟频率控制寄存器有一定的变化,其他寄存器是兼容的,综上所述,我们要的的时钟频率和NAND FLASH底层驱动。另外根据SDRAM芯片不同还需修改SDRAM刷新频率和SDRAM RAS充电速度。再者要想u-boot在nor,sdram,nand都可以运行,还得修改代码的定向文件。

以下移植步骤是我基于tekkaman的移植文档修改的,tekkaman的移植步骤大而全,完善了u-boot的所有功能,但是操作比较复杂,不适合初学者,我秉着最简单,最容易理解的原则做了修改,希望能给初学者一些帮助。

因此我们主要需要修改的文件有:

/cpu/arm920t/start.S

在此文件中修改cpu时钟频率,和代码重定向代码,同时为了支持nand启动,我们还需要添加nand_read.c的nand驱动。

/board/sbc240x/lowlevel_init.S

在此文件中修改SDRAM相关寄存器

/board/Samsung/mini2440/mini2440.c

再此文件中修改cpu时钟频率,肯定会有人奇怪,为什么在start.S文件中修改了cpu时钟频率,这里还要该一次呢?因为第二阶段的代码mini2440.c又会重新设置时钟频率,如不修改。就变成了s3c2410的时钟设置了,结果是跑不起来。

  • 1
  • 2
  • 下一页

相关内容