◆ 详细的开发文档。由于大多数BootLoader都是开源项目,所以文档都不是很充分。U-BOOT的维护人员意识到了这个问题,充分记录了开发文档,所以它的移植要比BLOB等缺少文档的BootLoader方便。
2 对U-BOOT-1.1.0的修改
为了使U-BOOT-1.1.0支持新的开发板,一种简便的做法是在U-BOOT已经支持的开发板中选择一种接近的进行修改。由于U-BOOT-1.10不支持ARM-922T内核,所以选择基于ARM-920T内核的SMDk2400为模板。相关的源代码在board/smdk2400/下。
2.1 支持ARM-922T内核的代码修改
修改以下代码,使U-BOOT支持arm-922t内核。
① 在include/目录下新建文件arm922t.h,内容如下:
#ifndef __ARM922T_H__
#define __ARM922T_H__
#endif
② 在include/目录下新建文件wt-arm9.h,该文件描述了ARM922T中Timer、UART等寄存器的结构及若干宏定义。具体内容要参考相关处理器手册。
③ 在cpu/目录下新建目录arm922t,将目录arm920t下的内容复制后,参考手册分别修改cpu.c、interrupts.c和serial.c,其它文件不修改。
2.2 开发板的支持
建立自己开发板的目录和相关文件。
① 在include/configs目录中添加头文件lh7a400.h。这个文件是lh7a400开发板的配置文件,它包括开发板的CPU、系统时钟、RAM、Flash系统及其它相关的配置信息。其格式可参考include/configs/smdk2400.h。
② 在board/目录下新建wt-arm9目录,创建如下文件:flash.c、lhMEMSetup.c、wt- arm9.c、Makefile和u-boot.lds。
◆ flash.c。U-BOOT 读、写和删除Flash设备的源代码文件。由于不同开发板中Flash存储器的种类各不相同,所以,修改flash.c时需参考相应的Flash芯片手册。它包括如下几个函数:
unsigned long flash_init (void ),Flash初始化;
void flash_print_info (flash_info_t *info),打印Flash信息;
int flash_erase (flash_info_t *info, int s_first, int s_last),Flash擦除;
volatile static int write_dword (flash_info_t *info, ulong dest, ulong data),Flash写入;
int write_buff (flash_info_t *info, uchar *SRC, ulong addr, ulong cnt),从内存复制数据。
◆ lhmEMSetup.c。初始化时钟、SMC控制器和SDRAM控制器。
◆ wt-arm9.c。设置各种总线时钟,打开数据Cache和指令Cache,并设置相关内存参数。
◆ Makefile。直接拷贝board/smdk2400/Makefile,作如下修改:
OBJS := wt-arm9.o flash.o lhmemsetup.o
◆ u-boot.lds。设置U-BOOT中各个目标文件的连接地址,直接拷贝 board/smdk2400/u-boot.lds,作如下修改:
.text
{
cpu/arm922t/start.o (.text)
*(.text)
}
2.3 添加网口设备控制程序
在drivers/目录中添加网口设备控制程序dm9000.c 和dm9000.h,其中dm9000.c 主要包括以下函数:
int eth_init (bd_t *bd),初始化网络设备;
void eth_halt (void),关闭网络设备;
int eth_send (volatile void *PACket,int len),发送数据包;
int eth_rx (void) 接收数据包。
用中断方式处理数据包的收发,因此还定义了另外两个函数:
void InitInterrupt (void) ,中断初始化;
void dm9000_IRQ (void) ,中断处理。
以上两个函数在cpu/arm922t/interrupts.c中被调用,最后在drivers/Makefile中加入dm9000.o。
2.4 修改Makefile
在u-boot-1.1.0/Makefile中加入
lh7a400_config : unconfig
@./mkconfig $(@:_config=) arm arm922t wt-arm9
其中“arm”是CPU的种类, arm922t 是ARM CPU对应的代码目录,wt-arm9是自己开发板对应的目录。
交叉编译器安装在/opt/arm/3.3/bin/目录下,所以把CROSS_COMPILE设置成相应的路径:
export CROSS_COMPILE = /opt/arm/3.3/bin/arm-elf-
2.5 生成目标文件
先运行make clean,
[zeng@LOCalhost u-boot-1.1.0]$make clean
然后运行make lh7a400_config,
[zeng@localhost u-boot-1.1.0]$ make lh7a400_config
Configuring for lh7a400 board...
再运行make,
[zeng@localhost u-boot-1.1.0]$make
之后会生成三个文件:
u-boot——ELF格式的文件,可以被大多数Debug程序识别;
u-boot.bin——二进制bin文件,纯粹的U-BOOT二进制执行代码,不保存ELF格式和调试信息。这个文件一般用于烧录到用户开发板中;
u-boot.srec——Motorola S-Record格式,可以通过串行口下载到开发板中。
2.6 测 试
通过JTAG口将u-boot.bin烧写到Flash的零地址,复位后执行u-boot。若运行正常,会从串口返回如下信息:
U-Boot 1.1.0 (Aug 21 2004 ?18:44:37)
U-BooT code: C3F80000 -> C3FA51A0 BSS: -> C3FA96EC
IRQ Stack: c3f1ff7c
FIQ Stack: c3f1ef7c
RAM Configuration:
Bank #0: c0000000 8 MB
Bank #1: c1000000 8 MB
……
Flash: 32 MB
In: serial
Out: serial
Err: serial
WT-ARM9 #
输入help得到所有命令列表,help command 列出该命令的功能。紧接着测试Flash和网卡,如果都正常工作的话,表明移植U-BOOT的工作基本完成,可以接着调试内核和文件系统。
结 语
BootLoader是操作系统和硬件的枢纽,它为操作系统内核的启动提供了必要的条件和参数。在移植过程中,开发人员除了要掌握BootLoader的结构和工作流程外,还要对相关硬件有一定的了解。目前,笔者移植的U-BOOT已经能够稳定地运行在开发板上,而且可以通过Flash和网络加载内核和文件系统,为后续开发,特别是驱动程序的开发奠定了良好的基础。
上一页 [1] [2]
本文关键字:嵌入式 程序 嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术