微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AT91RM9200的UBOOT启动烧写过程

AT91RM9200的UBOOT启动烧写过程

时间:11-19 来源:互联网 点击:
Uboot 烧写过程

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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top