电子说
不同厂商的出的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
全部0条评论
快来发表一下你的评论吧 !