公告

非常抱歉,由于我们的服务器提供商硬盘出错,数据丢失,网站重建中...
I am so sorry, because of our server's hard disk error, data lost, the website reconstructioning
QQ:512000523
MSN : funchip@hotmail.com

 
首页 arrow 技术文章 arrow pla arrow AT91RM9200的启动过程
AT91RM9200的启动过程 Recommend to my friend via E-mail(推荐给朋友)
作者: Administrator   
2007-11-15

一、AT91RM9200的启动过程
系统上电,检测BMS,选择系统的启动方式,如果BMS为高电平,则系统从片内ROM启动。AT91RM9200的ROM上电后被映射到了0x0和0x100000处,在这两个地址处都可以访问到ROM。由于9200的ROM中固化了一个BOOTLOAER程序。所以PC从0X0处开始执行这个BOOTLOAER(准确的说应该是一级BOOTLOADER)。这个BOOTLOER依次完成以下步骤:
1、PLL SETUP
设置PLLB产生48M时钟频率提供给USB DEVICE。同时DEBUG USART也被初始化为48M的时钟频率。
2、相应模式下的堆栈设置
3、检测主时钟源(Main Oscillator)
4、中断控制器(AIC)的设置
5、C 变量的初始化
6、跳到主函数
完成以上步骤后,我们可以认为BOOT过程结束,接下来的就是LOADER的过程,或者也可以认为是装载二级BOOTLOER。
9200按照DATAFLASH、EEPROM、连接在外部总线上的16位并行FLASH的顺序依次来找合法的BOOT程序,注意的是,虽然手册上写可以从8位并行FLASH,其实是不行的,这是一个硬件的BUG,请参考硬件勘误表。所谓合法的指的是在这些存储设备的开始地址处连续的存放的32个字节,也就是8条指令必须是跳转指令或者装载PC的指令,其实这样规定就是把这8条指令当作是异常向量表来处理。必须注意的是第6条指令要包含将要装载的映像的大小。关于如何计算和写这条指令可以参考用户手册。一旦合法的映像找到之后,则BOOT程序会把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超过16K-3K的大小。当BOOT程序完成了把合法的映像搬到SRAM的任务以后,接下来就进行存储器的REMAP,经过REMAP之后,SRAM从映设前的0X200000地址处被映设到了0X0地址并且程序从0X0处开始执行。而ROM这时只能在0X100000这个地址处看到了。至此9200就算完成了一种形式的启动过程。
如果BOOT程序在以上所列的几种存储设备中找到合法的映像,则自动初始化DEBUG USART口和USB DEVICE口以准备从外部载入映像。对DEBUG口的初始化包括设置参数115200 8 N 1以及运行XMODEM协议。对USB DEVICE进行初始化以及运行DFU协议。现在用户可以从外部(假定为PC平台)载入你的映像了。在PC平台下,以WIN2000为例,你可以用超级终端来完成这个功能,但是还是要注意你的映像的大小不能超过13K。一旦正确从外部装载了映像,接下来的过程就是和前面一样重映设然后执行映像了。
上面是BMS为高电平,9200选择从片内的ROM启动的一个过程。
如果BMS为低电平,则9200会从片外的FLASH启动,这时片外的FLASH的起始地址就是0X0了,接下来的过程和片内启动的过程是一样的,只不过这时就需要自己写启动代码了,至于怎么写,大致的内容和ROM的BOOT差不多,不同的硬件设计可能有不一样的地方,但基本的都是一样的。由于片外FLASH可以设计的大,所以这里编写的BOOTLOADER可以一步到位,也就是说不用像片内启动可能需要BOOT好几级了。
不过,ATMEL提供的u-boot 0.63使用两级加载,先加载loader.bin,通过loader.bin再加载u-boot.bin,并根据需要对其解压缩到SDRAM,最后跳转到SDRAM中U-BOOT的启动地址,才成功启动。所以烧写时候,需要在指定地址烧写两个文件,缺一不可。
目前我们在9200上使用的是u-boot 1.1.2,经过修改,合并了loader.bin和u-boot.bin,编译以后只用一个,只要把这个文件烧写到FLASH的0x00地址就可以了。

 二、U-BOOT 编译
1、建立arm-linux-gcc交叉编译环境
以root用户登录,从光盘上将cross-2.95.3.tar.bz2文件复制到/目录下,
安装:# tar jxvf cross-2.95.3.tar.bz2
这个命令会在你的/usr/local/arm/2.95.3目录下安装 arm-linux-gcc 交叉编译程序。注意,不要在PATH变量中添加一项:/usr/local/arm/2.95.3/bin,这个会和后续我们用来编译linux的编译器冲突的。
测试:# /usr/local/arm/2.95.3/bin/arm-linux-gcc -v
2、 make mrproper  (清理源代码树)
3、 make  at91rm9200dk_config  (产生9200板的配置文件)
4、 make dep  (产生依赖文件)
5、 make all  (编译)

 

三、U-BOOT 修改
主要修改include/configs/at91rm9200dk.h,这个头文件是板子的配置文件,所有软件和硬件的相关的配置,如JFFFS2支持,系统时钟设置,默认参数,外部flash芯片参数等都在这里设置,这些都没有具体的文档,可以参考改目录下的其他板子的配置文件和grep源代码来解决。
修改u-boot-1.0.0部分源代码实例:
a. 更改以太网芯片驱动程序。
原版u-boot的网口I/O配置不符合自产板要求,更换文件
# /u-boot/cpu/at91rm9200/at91rm9200_ether.c
可根据网口芯片选型情况,采用at91rm9200_ether(dvcom).c 或
at91rm9200_ether(lxt971).c进行替换。详情见文件内注释。
b. 添加flash驱动及命令
若采用Intel的flash芯片,
将 #/u-boot/common/cmd_mem.c 用cmd_mem(intel).c 文件进行替
换。使其具备对intel flash的通过”fl”命令,写及删除能力。
若使用mem29lv160芯片,可将
/u-boot/board/at91rm9200dk/flash.c
文件用flash(fuji).c 文件替换。此时用u-boot 本身具备的命令
(”cp”,”erase”等)进行flash操作。
c. 加入ping命令
将/u-boot/include/configs/at91rm9200dk.h
用at91rm9200dk(liqi)进行替换,以配置mac 地址、ip 地址及系统
其他相应参数。
d. 加入linux参数传递函数及linux引导代码
将/u-boot/common/main.c
用at91rm9200dk(liqi)进行替换,以加入引导代码
e. 根据本板情况划分内存空间
根据本板属性更改/u-boot/include/configs/at91rm9200dk.h文件
使用64MB SDRAM内存配置参考如下:
#define COMMAND_LINE "initrd=0x20800000,32M root=/dev/ram
init=/linuxrc console=ttyS0"
#define CONFIG_BOOTARGS "initrd=0x20800000,64M
root=/dev/ram init=/linuxrc console=ttyS0,115200"
#define BOOT_COMMAND "go 20c00000"
#define INITRD_START 0x20400000
#define INITRD_LEN 0x00400000
#define FLASH_UBOOT_START 0x10020000
#define FLASH_KERNEL_START 0x10040000
#define FLASH_RAMDISK_START 0x10140000
#define FLASH_BASEBOOT_LEN 0x00020000
#define FLASH_UBOOT_LEN 0x00020000
#define FLASH_KERNEL_LEN 0x00100000
#define FLASH_RAMDISK_LEN INITRD_LEN
#define RAM_UBOOT_START 0x21f00000
#define RAM_KERNEL_LOAD_START 0x23000000
#define RAM_RAMDISK_START INITRD_START
使用16MB SDRAM内存配置参考如下:
#define COMMAND_LINE "initrd=0x20400000,8M root=/dev/ram
init=/linuxrc console=ttyS0"
#define CONFIG_BOOTARGS "initrd=0x20400000,8M
root=/dev/ram init=/linuxrc console=ttyS0,115200"
#define BOOT_COMMAND "go 20c00000"
#define INITRD_START 0x20400000
#define INITRD_LEN 0x00400000
#define FLASH_UBOOT_START 0x10020000
#define FLASH_KERNEL_START 0x10040000
#define FLASH_RAMDISK_START 0x10140000
#define FLASH_BASEBOOT_LEN 0x00020000
#define FLASH_UBOOT_LEN 0x00020000
#define FLASH_KERNEL_LEN 0x00100000
#define FLASH_RAMDISK_LEN INITRD_LEN
#define RAM_UBOOT_START 0x20f00000
#define RAM_KERNEL_LOAD_START 0x20c00000
#define RAM_RAMDISK_START INITRD_START
f.修改U-boot传递给内核的参数
在/u-boot/include/configs/at91rm9200dk.h 28行中修改U-boot传递
给内核的参数:
#define COMMAND_LINE “initrd=0x20800000,0x1377c4 root=/dev/ram
init=/linuxrc console=ttyS0,115200”
注意:在2.6内核中, initrd=后的格式为 “start_address,size”
其中size为Ramdisk.gz大小,否则在启动后导致shell启动不了。

评论 (0)Add Comment

输入评论内容
quote
bold
italicize
underline
strike
url
image
quote
quote
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley

security code
输入验证码


busy
最近更新 ( 2007-11-18 )
 
< 上一篇   下一篇 >

© 2008 杭州福芯电子 浙ICP备05040812号
Joomla!是基于GNU/GPL许可发行的免费软件.