0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AT91RM9200的UBOOT启动烧写过程详解

电子工程师 作者:工程师陈翠 2018-06-18 14:41 次阅读

不同厂商的出的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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AT91RM9200
    +关注

    关注

    1

    文章

    55

    浏览量

    14779
  • Uboot
    +关注

    关注

    4

    文章

    123

    浏览量

    27873
收藏 人收藏

    评论

    相关推荐

    TCP/IP协议在AT91RM9200上的实现

    TCP/IP协议在AT91RM9200上的实现 摘要:介绍了AT91RM9200[1]芯片与DM9161E[2]的硬件接口电路设计以及驱动程序开发。在此基础上讨论了TCP/IP[3]
    发表于 12-08 10:43 1288次阅读

    at91rm9200定时器

    请问at91rm9200的linux驱动程序如何访问定时器/计数器模块相关的寄存器?如访问PIO使能寄存器,驱动语句为:AT91_SYS->PIOA_PER |= 1;那访问定时器0的TC通道模式寄存器TC_CMR驱动语句该是怎样的?需要哪些内核头文件?谢谢!
    发表于 11-13 09:51

    S1D13506显示控制器与AT91RM9200的接口设计

    设计,在此基础上详细阐述了μC/GUI移植到AT91RM9200过程,并给出一个应用实例。1 S1D13506和AT91只M9200介绍AT9lRM
    发表于 12-21 08:37

    μCGUI移植到AT91RM9200过程及接口设计

    介绍了AT91RM9200处理器和S1D13506显示控制器的接口设计,在此基础上详细阐述了μC/GUI移植到AT91RM9200过程,并给出一个应用实例。1 S1D13506和AT91
    发表于 05-31 05:00

    AT91RM9200移植u-boot串口一直停留在显示

    运行,再利用u-boot.bin将boot.bin和uboot.bin.gz下载到NorFlash中,断电从NorFlash中启动AT91RM9200会利用NorFlash中的boot.bin
    发表于 06-21 05:45

    怎么实现OLED显示模块与AT91RM9200的接口设计?

    本文介绍了OLED显示模块P13501与AT91RM9200的接口电路设计,以及在嵌入式Linux下OLED驱动程序的编写、编译和加载。
    发表于 06-08 06:05

    AT91RM9200中文手册 AT91RM9200中文资料

    AT91RM9200是完全围绕ARM920T ARM Thumb处理器构建的系统。它有丰富的系统与应用外设及标准的接口,从而为低功耗、低成本、高性能的计算机宽范围应用提供一个单片解决方案。AT9
    发表于 04-22 13:20 358次下载

    MiniGUI在AT91RM9200开发板上的移植

    MiniGUI在AT91RM9200开发板上的移植
    发表于 03-28 09:52 18次下载

    MiniGUI 在AT91RM9200 开发板上的移植

    简要介绍Atmel 公司生产的基于ARM9 内核的AT91RM9200 开发板的结构及其部分特性;详细介绍如何将MiniGUI 图形用户界面移植到AT91RM9200 开发板上的全过程
    发表于 05-16 14:16 26次下载

    AT91RM9200简明手册.pdf

    AT91RM9200简明手册.pdf 基于ARM920T的嵌入式微控制器——AT91RM9200总体特性:· 内嵌ARM920TTM ARM® Thumb®微处理器- 180MHz/200MIPS- 16KB数据Cache、16KB指令
    发表于 03-01 15:47 43次下载

    at91rm9200启动过程教程

    at91rm9200启动过程教程 系统上电,检测BMS,选择系统的启动方式,如果BMS为高电平,则系统从片内ROM启动AT91RM9200
    发表于 03-08 15:57 44次下载

    基于AT91RM9200的手持设备的低功耗设计

    本文以基于AT91RM9200 的手持设备为例,分析了手持设备的低功耗设计的原理,同时给出了AT91RM9200 手持设备上基于Linux 操作系统的电源管理模块的初步实现
    发表于 12-16 14:42 66次下载
    基于<b class='flag-5'>AT91RM9200</b>的手持设备的低功耗设计

    AT91RM9200用户手册

    AT91RM9200用户手册有需要的朋友下来看看
    发表于 01-11 14:05 7次下载

    AT91RM9200 说明书

    AT91RM9200 说明书
    发表于 09-29 11:36 7次下载
    <b class='flag-5'>AT91RM9200</b> 说明书

    AT91RM9200的手持设备的低功耗设计

    AT91RM9200的手持设备的低功耗设计
    发表于 10-15 10:42 12次下载
    <b class='flag-5'>AT91RM9200</b>的手持设备的低功耗设计