Bootloader在AT91RM9200系统中的实现
程序,也可以开发裸机应用程序[3]。GNU工具都运行在Linux下,开发者需要1台运行Linux的PC作为宿主机,开发后下载到板子上。U-boot,vivi等都利用了这些工具。为开发者的开发提供了很好的范例。一般地,基于GNU工具的程序开发流程如下:(1)编写C、C++或者汇编源程序;(2)用相关编译器生成目标文件;(3)编写连接脚本;(4)用连接器生成最终文件(elf格式);(5)用二进制转换工具生成可下载的二进制代码。
编写适用于本系统的Bootloader以完成最基本的引导操作系统的功能为目的。作为引导程序的基本功能应该包括:(1)对硬件的初始化,如设置异常向量,设置CPU的速度、时钟频率和中断控制寄存器,初始化内存控制器,初始化堆栈等;(2)支持文件的下载,串口的Kermit协议下载或者支持tftp 协议的网口下载,后者实现相对复杂,但是速度快,可以根据情况选择;(3)对Flash的操作;(4)最好支持下载和自举两种工作模式;(5)解压内核,配置参数等。其中功能(1)直接涉及硬件,实现时应该使用GNU汇编。不同于ADS环境下的ARM汇编程序编写,这种汇编语言有其特点,支持预处理,可以使用#include>和C语言风格的注释,文件的扩展名是大写的S(编译器以此区分是否预处理汇编程序),开发者可以参考GNU提供的资料,以及U-boot的源代码。
3 U-boot的移植
3.1 源代码分析
U-BOOT(Universe Bootloader),是Sourceforge网站的开放源代码项目,支持PowerPC、ARM、MIPS和x86等多种体系结构,代码便于移植[4]。本人开发中采用了U-Boot1.1.2的源代码,GCC编译器版本是2.95.3。开发者首先要了解代码的结构和功能。在此基础上分析代码的运行顺序和相互调用关系。
图2 U-boot的执行顺序
U-Boot的运行过程如图2所示,程序从cpu/at91rm9200/start.S开始,start.S中用.globl _start定义了入口,之后设置了处理器的状态,初始化了中断和内存时序并且确定是否需要对整个U-Boot代码重定位,跳转到 star_armboot()运行,这个函数在/lib_asm/board.c中定义,完成了一些初始化工作,之后便循环调用commmon /main.c中的main_loop()函数。开发时可以按这个次序阅读代码。在代码的board目录下,可以找到与自己的芯片相同的开发板对应目录,此处选择的是目录at91rm9200dk,移植时修改工作也多在此处。
3.2 移植要点
进行移植主要关注并进行修改的代码文件有和相应的修改要点如下:
(1) include/commom.h。代码中用很多的条件编译包含了一些头文件,并且声明了一系列的基本函数,这个头文件被很多文件包含。了解这个文件的内容对理解、修改代码很有帮助。
(2) include/configs/at91rm9200dk.h。这个文件中是针对本电路板的详细设置信息,关键的设置有时钟设置,终端选择(GDBU、 USART0、USART1),SDRAM的起始地址PHYS_SDRAM和大小PHYS_SDRAM_SIZE,Flash存储器的起始地址 PHYS_FLASH_1和大小PHYS_FLASH_SIZE,以及Flash中U-Boot的环境变量的存储地址CFG_ENV_ADDR和大小 CFG_ENV_SIZE,以及U-Boot的起始地址CFG_U_BOOT_BASE和大小CFG_U_BOOT_SIZE。其他的参数可以根据开发者的需要进行修改。以上的参数要根据实际情况修改。
根据开发经验,容易忽略的是FLASH中环境变量的存储地址CFG_ENV_ADDR和大小CFG_ENV_SIZE的设置。U-boot中的 saveenv命令执行时会将setenv命令设置的环境变量存储在Flash,要求起始地址是Flash的一个段(section)的边界,项目中根据 AM29LV160DB芯片的手册以及电路原理图上Flash的地址线的连接对本文件做以下修改:
#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0xe000)
#define CFG_ENV_SIZE 0x2000 /* 0x8000 */
修改为:
#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x8000)
#define CFG_ENV_SIZE 0x8000 /*0x8000 */
Flash存储器的地址分配情况可以参见图1。
(3) board/at91rm9200dk/config.mk。这里面将TEXT_BASE设置为0x21f00000,与本文第1部分中提到的Boot程序的DST参数设置一致。
(4) board/at91rm9200dk/flash.c。由于Flash芯片选用的与源代码所针对的Flash芯片不同,首先要在include /flash.h中加入下面的宏:#define AMD_ID_LV160DB 0x22492249,这是AM29LV160DB芯片的设备ID号,为了在flash_identification()函数中正确地识别。另外在本文件中还要加入定义
OrgDef OrgAMDLV160DB[] ={
{ 1, 16*1024 },
/* 1 * 16 kBytes sectors */
{ 2, 8*1024 },
/* 2 * 8 kBytes sectors */
{ 1, 32*1024 },
/* 1 * 32 kBytes sectors */
{ 31, 64*1024 },
/* 31 * 64 kBytes sectors */
};
这个OrgDef数组
bootloader U-boot AT91RM9200 相关文章:
- WinCE系统下BootLoader的开发(04-10)
- 嵌入式linux启动信息完全注释(04-24)
- PIC18单片机的一种新颖的Bootloader设计(03-28)
- 基于WinCE的嵌入式图像采集系统设计(04-20)
- BLOB启动流程分析及引导程序可移植性研究(07-25)
- ARM处理器的位置无关程序设计(09-19)