AT91RM9200的U-BOOT启动烧写过程【转】

时间:2022-01-08 12:41:41

关于启动过程

1. 一开始令BMS=1(拔掉跳线),则系统从片内ROM中启动。内部启动程序初始化调试串口和USB设备接口从外部载入启动程序。在Windows平台下,启动超级终端,发送文件loader.bin和u-boot.bin到SDRAM,成功启动u-boot.

2. 启动了u-boot后就利用u-boot的功能,发送boot.bin和u-boot.gz到SDRAM,然后再拷贝到FLASH,那么FLASH里面就固化了启动程序boot.bin和u-boot.gz。

3. 烧写FLASH的过程如下:

U-Boot>protect off all (注:清除Flash全部块的写保护)

U-Boot>erase all (注:擦除Flash全部块的内容)

U-Boot>loadb 20000000 (注:用KERMIT协议接收boot.bin到SDRAM)

U-Boot>cp.b 20000000 10000000 5fff (注:拷贝boot.bin到Flash)

U-Boot>loadb 21000000 (注:用KERMIT协议接收u-boot.gz)

U-Boot>cp.b 21000000 10010000 ffff(注:拷贝u-boot.gz到Flash)

U-Boot>protect on all (注:设置Flash全部块的写保护)

4. 这时,插上跳线,令BMS=0,然后重启,那么系统就从FLASH启动了,启动u-boot.

5. 启动了u-boot之后,就可以利用它来下载内核文件zImage和Ramdisk.gz映象文件到SDRAM,然后用命令启动linux。

6. 在linux下,利用u-boot的工具程序mkimage将内核映象文件zImage.gz(通过命令:gzip -9 zImage>zImage.gz 压缩成zImage.gz)和Ramdisk.gz映象文件封装成u-boot格式的映象文件:uImage和uramdisk,然后将他们一起烧写入FLASH,然后就可以实现从FLASH启动u-boot,再启动linux。

7. 烧写完FLASH之后一定要插上跳线,即令BMS=0,使系统再重启动时从FLASH启动。
8. 系统从FLASH启动时,系统先启动boot,然后解压缩u-boot.gz,然后启动u-boot.

再进一步解析:

      uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从http://sourceforge.net/projects/u-boot 下载。
       在9200上,为了启动uboot,还有两个boot软件包,分别是loader和boot。分别完成从sram和flash中的一级boot。其源码可以从atmel的官方网站下载。
       我们知道,当9200系统上电后,如果bms为高电平,则系统从片内rom启动,这时rom中固化的boot程序初始化了debug口并向其发送'c',这时我们打开超级终端会看到ccccc...。这说明系统已经启动,同时xmodem协议已经启动,用户可以通过超级终端下载用户的 bootloader。
       作为第一步,我们下载 loader.bin .loader.bin 将被下载到片内的sram中。这个loder完成的功能主要是初始化时钟,sdram和xmodem协议,为下载和启动uboot做准备。当下载了loader.bin 后,超级终端会继续打印:ccccc....。这时我们就可以下在uboot了。uboot将被下载到sdram中的一个地址后并把pc指针调到此处开始执行uboot。
       接着我们就可以在终端上看到uboot的shell启动了,提示符uboot>,用户可以uboot>help 看到命令列表和大概的功能。uboot的命令包含了对内存、flash、网络、系统启动等一些命令。
       如果系统上电时bms为低电平,则系统从片外的flash启动。为了从片外的flash启动uboot,我们必须把 boot.bin 放到0x0地址出,使得从flash启动后首先执行boot.bin ,而要烧写boot.bin 。

      要先完成上面我们讲的那些步骤,首先开始从片内rom启动uboot。然后再利用uboot的功能完成把boot.bin 和uboot.gz烧写到flash中的目的,假如我们已经启动了uboot,可以这样操作:
       uboot>protect off all
       uboot>erase all
       uboot>loadb 20000000
       uboot>cp.b 20000000 10000000 5fff
       uboot>loadb 21000000
       uboot>cp.b 210000000 10010000 ffff

       然后系统复位,就可以看到系统先启动boot,然后boot解压缩uboot.gz,然后启动uboot。注意,这里uboot必须压缩成.gz文件,否则会出错。


       怎么编译这三个源码包呢,首先要建立一个arm的交叉编译环境,关于如何建立,此处不予说明。建立好了以后,分别解压源码包,然后修改Makefile中的编译器项目,正确填写你的编译器的所在路径。
       对于loader和boot,直接make。
       对于uboot:
       第一步:make_at91rm9200dk
       第二步:make。这样就会在当前目录下分别生成*.bin文件,对uboot.bin,我们还要压缩成.gz文件。

       也许有的人对loader和boot搞不清楚为什么要两个,有什么区别吗?有区别。
       boot主要完成从flash中启动uboot的功能,他要对uboot的压缩文件进行解压,除此之外,他和loader并无大的区别,你可以把boot理解为在loader的基础上加入了解压缩.gz的功能而已。所以这两个并无多大的本质不同,只是他们的使命不同而已。
       特别说明的是这三个软件包都是开放源码的,所以用户可以根据自己的系统的情况修改和配置以及裁减,打造属于自己系统的bootloder。

烧写过程:

1.内部启动

2. 下载loader.bin 到 内部SRAM

3. 下载uboot.bin  到 外部的SDRAM 并把pc指针调到此处开始执行uboot。

4. 利用uboot的功能完成把boot.bin 和uboot.gz烧写到flash中。

       uboot>protect off all
       uboot>erase all
       uboot>loadb 20000000
       uboot>cp.b 20000000 10000000 5fff
       uboot>loadb 21000000
       uboot>cp.b 210000000 10010000 ffff

启动过程:

 1.选择片外启动

 2.boot.bin初始化硬件, 将uboot.gz解压到sdram中

 3.启动uboot