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);
}
以上是at91rm9200发动并进入u-boot的碑文流剖析。后边u-boot还会将uImage解压到特定的方位并开端碑文内核代码。
三. 总述
总归, 不同厂商的出的Soc片子在发动方法大都供给片内和片外发动两种方法,一般都是在片内固化一段小程序
方便于程序开发罢了,在其DataSheet文档中有顶替的描绘。若是对at92rm9200有爱好或玩过的朋友,能够与我一起讨论彼此学习。
再进一步解析:
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