AT91RM9200的UBOOT启动烧写过程详解

不同厂商的出的soc片子在启动方式大都提供片内和片外启动两种方式,一般都是在片内固化一段小程序方便于程序开发而已。
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.
二.loader.bin, boot.bin, u-boot.bin代码执行流分析。
以上三个文件时at91rm9200启动所需要的三个bin,他们的实现代码并不难。
如果是你是采用at91rm9200的评估版,应该能得到其源码。
2.1 loader.bin 执行流程,这个文件主要在片内启动从串口下载代码时会用到
loader/entry.s init cpu
b main ---》 crt0.s
--》 copydata --》 clearbss --》 b boot
main.c --》 boot --》
/*get internel rom service address*/
/* init of rom services structure */
pat91 = at91c_rom_boot_address;
/* xmodem initialization */
--》 pat91-》opensbuffer
--》 pat91-》opensvcxmodem
/* system timer initialization */
---》 at91f_aic_configureit
/* enable st interrupt */
at91f_aic_enableit
at91f_dbgu_printk(“xmodem: download u-boot ”);
jump.s
// jump to uboot baseaddr exec
jump((unsigned int)at91c_uboot_base_address)
2.2 boot.bin执行流程 该文件会在从片内启动时被下载到板子上,以后还会被烧写到片外flash中,以便在片外启动时
用它来引导并解压u-boot.gz,并跳转到u-boot来执行。
boot/entry.s
b main --》 crt0.s --》 copydata --》 clearbss --》 b boot
t91f_dbgu_printk(“ ”);
at91f_dbgu_printk(“ ”);
at91f_dbgu_printk(“ welcome to at91rm9200 ”);
at91f_dbgu_printk(“ ”);
boot/misc.s /* unzip uboot.bin.gz */
----》 decompress_image(src,dst,len) --》 gunzip
//jump to ubootbaseaddr exec 这里跳转到解压u-boot.gz的地址处直接开始执行u-boot
asm(“mov pc,%0” : : “r” (dst));
2.3 uboot.bin执行流程
u-boot/cpu/at91rm9200/start.s
start ---》reset
---》 copyex ---》 cpu_init_crit
---》 /* set up the stack */ --》 start_armboot
u-boot/lib_arm/board.c
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
dram_init, /* configure available ram banks */
display_dram_config,
checkboard,
null,
};
---》 start_armboot ---》 call init_sequence
---》 flash_init --》 display_flash_config
---》 nand_init ---》 at91f_dataflashinit
---》 dataflash_print_info --》 env_relocate
---》 drv_vfd_init --》 devices_init --》 jumptable_init
---》 console_init_r --》 misc_init_r --》 enable_interrupts
---》 cs8900_get_enetaddr --》 board_post_init --》
u-boot/common/main.c
for (;;)
{ /* shell parser */
main_loop () --》 u_boot_hush_start --》 readline
--》 abortboot
--》printf(“hit any key to stop autoboot: %2d ”, bootdelay);
}
以上是at91rm9200启动并进入u-boot的执行流分析。后面u-boot还会将uimage解压到特定的位置并开始执行内核代码。
三。 综述
总之, 不同厂商的出的soc片子在启动方式大都提供片内和片外启动两种方式,一般都是在片内固化一段小程序方便于程序开发而已。
再进一步解析:
uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从 下载。
在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

助听器(电池)小常识
对于convolutional layer、TensorFlow和整体CNN结构详细分析
通讯连接器隐形龙头 创新业务前景可期
杉岩:破解海量小文件存储的大难题
海大机器人:科技创新赋能专精特新企业高质量发展 奏响数智化“四重奏”
AT91RM9200的UBOOT启动烧写过程详解
Avago砸370亿美元并购博通 创芯片业最高纪录
焊接机器人的未来重工业的发展
三星S8又来新设计图,外形与华为magic相比要漂亮的多
关于电化学甲醛传感器的组成
GD32E230C-FOC电机控制解决方案
2013年中国(西部)电子展6月登陆成都
cob显示屏价格
Telechips在高级汽车应用中选用Arteris FlexNoC互连技术
!租售/收购/维修HP8563E频谱分析仪HP8563E!小
摩尔线程与百度合作为客户及开发者提供自主创新的软硬件解决方案
华为云数据库GaussDB(for Influx)揭秘:数据分级存储
环路供电智能变送器的功率限制
劳斯莱斯表示由于发动机引擎的问题全球已有35架787飞机停飞
太克误码率分析仪支援100G网路测试