首页 技术文章 pla AT91RM9200的启动过程
|
|
AT91RM9200的启动过程 |
|
|
作者: 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启动不了。
|
|
最近更新 ( 2007-11-18 )
|
|