Chinaunix首页 | 论坛 | 博客
  • 博客访问: 489476
  • 博文数量: 153
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1724
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 11:55
文章分类

全部博文(153)

文章存档

2011年(1)

2010年(55)

2009年(88)

2008年(9)

我的朋友

分类: LINUX

2009-01-20 10:49:04


Atmel与启动相关的一个重要特性就是Remap,At91系列也不例外。但是在实际应用中,这并不是一个强制性规定,完全可以根据需要灵活应用;否则要是完全按照手册遵循Remap的方法来调试和开发,可能会离问题的解决越来越远。笔者在一例基于At91sam9261上的开发时曾对此作了详细分析,故写此文以记录也供其他在做类似开发的朋友参考交流!

1. 目标板简介
       CPU: at91mam9261   
       SDRAM: 64M   
       DataFlash for Boot via SPI interface: 2M with DataFlashBoot.bin and Bootloader.bin
       NandFlash with Kernel & FS Image: 64M
       Image download through DBGU or USB
       J2 control BMS(Boot Mode Selection): 1
       J0 control boot from there: SAM-BA or DataFlash
       BootRom image burning tool: SAM-BA

2. At91sam9261的引导理论
2.1 启动程序流程框图

显然,向DataFlash中烧写image要断开J0使其执行SAMBA Boot,正常启动要连接J0使其执行DataFlash Boot.

按手册所言,DataFlashBoot Program将向找SPI Dataflash,如果在其中找到一有效的程序,那这程序将被载入SRAM并从remap后的0x0地址执行;并且,复位后,internal ROM映射为地址0x0和0x40,0000.
同时,将装至SRAM映像的第六个ARM向量表中包含着此映像的实际大小即size.
2.2 At91sam9261 Internal Memory Mapping
一般嵌入式系统都从0x0地址启动。从上图中可以看出,决定系统启动位置的有两个参数:BMS 和 REMAP(RCB0),也即启动位置有以下3种:
  • Internal ROM
  • EBI NCS0
  • Internal RAM C (Remap 前通过0x300000访问,Remap后在0x0地址)
而在我们的实际系统中,NCS0的地址为0x2000,0000,所以真正的启动位置为Internal ROM 或Internal RAM C. 因为RAM C的地址与Remap有关,通过Bus Matrix Master Configuration Register的RCB0来控制,下面说明At91sam9261的Remap.

2.3 At91sam9261 Remap
图中,可以明显地看出,映射前后地址分别为:
Internal ROM 为: 0x0 --> 0x40,0000
Internal SRAM为: 0x30,0000 --> 0x00.

3. At92sam9261目标板的引导及分析
3.1目标板中的映像及烧写地址
目标板中与引导相关的映像有:DataFlashBoot.bin 和 bootloader.bin (u-boot),都存储在DataFlash中,通过SAMB烧写至DataFlash中的起始地址分别为:0x0, 0x8000 (32K).

3.2 Internal ROM
因为DataFlash并不在系统的0x0地址处,启动不可能从DataFlash中启动DataFlashBoot.bin,一定要借助辅助手段来装载DataFlash中的程序并使其执行,这个任务将由复位后即在0x0处的Internal ROM 中的代码来负责,因为目标板中的BMS=1,结合图2.2不难看出肯定从internal ROM 开始执行。那么把DataFlashBoot装至何处、装载后是否会执行Remap呢?

3.3 DataFlashBoot.bin的链接地址
通过对DataFlashBoot.bin的代码分析发现在生成映射文件时的目标链接地址为0x30,0000,不是0x0也不是0x40,0000,而Internal SRAM在复位后也在0x30,0000处(Remap后将不为此址)。这个信息可以回复3.2中的疑问,DataFlashBoot.bin被装在0x30,0000处,并且并没有执行Remap而是直接跳到0x30,0000处执行。

综上所述,我们基于At91sam9261的目标板的引导过程是:Internal ROM中的代码搜索DataFlash中的代码并把DataFlashBoot.bin下载到Internal SRAM(映射地址为0x30,0000,而DataFlashBoot.bin在链接时把Entry亦设为0x30,0000)中,然后不进行Remap而是直接跳到0x30,0000处运行,直至最后把u-boot.bin搬至内存0x23f0,0000并最终交由u-boot执行;再下来的就和别的系统引导没什么两样了:bootload-->loading compressed kernel-->uncompressing kernel blahblahblah....

=======EOF================
阅读(1089) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~