Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1332647
  • 博文数量: 92
  • 博客积分: 10389
  • 博客等级: 上将
  • 技术积分: 1918
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-10 16:13
文章存档

2014年(1)

2012年(15)

2009年(6)

2008年(37)

2007年(72)

2006年(54)

我的朋友

分类: LINUX

2007-04-15 22:39:19

uboot at ARM s3c2410
 



uboot 在 ARM s3c2410 上移植过程

总述
u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot 1.0.2,见include/version.h中的定义。
#cvs –dserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
#cvs –z3 –d server:anonymous@cvs.sourceforge.net:/cvsroot/u-boot checkout –P u-boot
本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是:
l CPU:S3C2410
l NOR: 16M,INTEL EP28F128J3A
l SDRAM:64M, MICRON 48LC16M16A2-75 B
l DM9000AVICOM (10/100M) 网卡
l USB HOST一个
配置自已的主板
l 阅读Makefile文件,在Makefile文件中添加两行:
s3c2410_config: unconfig
@./mkconfig $(@:_config=) arm arm920t s3c2410
其中ARM是CPU的种类, arm920t是ARM CPU对应的代码目录,s3c2410是自已主板对应的目录。
l 在board目录中建立s3c2410目录,复制smdk2410目录中的内容(cp smdk2410/* s3c2410)。
l 在include/configs/目录下复制smdk2410.h(cp smdk2410.h s3c2410.h)
l 修改ARM编译器的目录名及前缀
本人ARM编译器的目录是在:/opt/host/armv4l/bin/armv4l-unknown-linux-
把CROSS-COMPILE = arm-linux- 改为实际目录:如
CROSS-COMPILE = /opt/host/armv4l/bin/arm4l-unknown-linux-
l 完成之后,可以测试一下你的配置:
#make s3c2410_config
#make
编译应该在processor.h中出错
l 修改processor.h中:
union debug_insn
{
u32 arm;
u16 thumb;
}
修改成:
union debug_insn
{
u32 arm_mode;
u16 thumb_mode;
}

l 编译成功,编译好的程序同smdk2410一样。
l 注:如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在 examples目录中运行touch命令(不运行touch还会出错,可能uboot Makefile没有写好,没查原因),再编译。
生成最基本的u-boot, 没有功能,只能起动
l 修改程序连接地址:
在board/s3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。
l 为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:在board/s3c2410的memsetup.S中标记符”0:”上加入五句:
l mov r3, pc
l ldr r4, =0x3FFF0000
l and r3, r3, r4 //以上三句得到实际起动的内存地址
l aad r0, r0, r3 //用GO命令调试uboot时,启动地址在RAM
l add r2, r2, r3 //把初始化内存信息的地址,加上实际起动地址
u 0标记符0, 原来存在的标记符)
l 用SJF软件通过jtag口下载编译的u-boot, 启动!读取环境块时CRC出错,然后进入SMDK#。
l 把MIZI vivi中的PrintHexWord, PrintWord拷过来,这样可以在调试汇编时可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldr r0, [r2, r0] 应改为ldrb r0, [r2, r0],这样可以在四字节对齐的系统中使用。
INTEL nor flash操作功能
l INTEL 的28F128,在board目录中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目录代换原来的flash.c。
l cmi中的flash.c在写入时要交换字节,所以删除它的write_short()和wirte_buff()函数,把ep7312主板目录中 flash.c的wirte_word()和wirite_buff()函数复制过来。把flash.c中的FLASH_BASE0_PRELIM改为 CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改为0x20000,(E28F128J3A flash中块的大小是128K)。
l 把s3c2410.h中的flash内容由原来的:
1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
2. #define CFG_FLASH_BASE PHYS_FLASH_1
3. #define CONFIG_AMD_LV400 1
4. #if 0
5. #define CONFIG_AMD_LV800 1
6. #endif

7. #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
8. #ifdef CONFIG_AMD_LV800
9. #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */
10. #define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
11. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
12. #endif
13. #ifdef CONFIG_AMD_LV400
14. #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */
15. #define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */
16. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000)
改为:
1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
2. #define PHYS_FLASH_SIZE 0x01000000 /* 16 MB */
3. ##define CFG_FLASH_PROTECTION
4. define CFG_FLASH_BASE PHYS_FLASH_1
5. #define CFG_MONITOR_BASE PHYS_FLASH_1
6. #define CFG_MAX_FLASH_BANKS 1/* max number of memory banks */
7. #define CFG_MAX_FLASH_SECT 128/* max number of sectors on one chip */
8. #define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout for Flash Erase */
9. #define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */
10. #define CFG_ENV_IS_IN_FLASH 1
11. #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x60000)
12. #define CFG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
l 把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1, 默认以字节显示,更直观,并且不会出现地址对齐错(data abort)。而在do_mem_mw()及mod_mem()中加入:
if(addr2info(addr) != NULL)
{
printf(“can’t wirte or modify in flash! Use cp instead.\n”);
return 0;
}
以使mw和mm命令不能修改flash中的数据,而只开放cp修改flash中的数据。
l 改board/s3c2410/flash.c中的flash_erase(),把start = get_timer(0)移到for(), 以去掉flash_erase timeout 错误。
设置FLASH和SDRAM时序
根据28F128J3A-150,这是一150ns的flash, 所以把flash时序设为最慢。把s3c2410设成202.8MHZ, 并且工作在异步模式, 修改memsetup.S。

实现网卡功能
本人的网卡是DM9000,在uboot中没有相应的驱动,所以自已写了一个网卡驱动。
1. 把驱动拷到drivers/dm9000.c
2. 在drivers/Makefile中加入dm9000.o
3. 在lib_arm/board.c中修改CS8900=>DM9000
4. 在include/configs/s3c2410中加入以下几句
#define CONFIG_DRIVER_DM9000 1 /* we have a CS8900 on-board */
#define DM9000_BASE 0x08000000
#define DM9000_BUS16 1 /* the Linux driver does accesses as shorts */
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.120
#define CONFIG_SERVERIP 192.168.2.122

实现USB功能
1. 在include/configs/s3c2410中的CONFIG_COMMANDS中加入:
l CFG_CMD_USB |\
l CFG_CMD_FAT |\
2. 并在文件中加入以下设置:
l #define CONFIG_USB_OHCI
l #define CONFIG_USB_STORAGE
l #define CONFIG_USB_KEYBOARD
l #define CONFIG_DOS_PARTITION
l #define CFG_DEVICE_DEREGISTER
l #define CONFIG_SUPPORT_VFAT
l #define LITTLEENDIAN
3. 这时usb start 和 usb info等功能正常,而其它一些功能不正常。
4. 功能fatls 不正常,修改fs/fat/fat.c
l 没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。Uni2ansi(), 增加slot2str()的cp936版, 增加一个toshort()。
l 加入#define cp936
l 在fat_getenv()中有一个对齐错误,修改fat.h使fatbuff字对齐。
l 在do_fat_read()中加入两句,以消除列根目录错误。
l 在board/cmd_fat.c中加入两句,以消除没有usb storage设备时的错误:
if(!dev_desc)
printf(“Not init storage usb device:\n usb start\n usb info\n usb scan\n”);
5. 修改fs/fat/fat.c
get_cluster()函数中加入 if(size / FS_BLOCK_SIZE > 0), 以防读文件时不能成功读出。
引导LINUX
现在我们可以引导LINUX了。
l 要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4M
l 把编译好的LINUX内存,通过uboot/tools/mkimage转换成uboot格式
1. mkimage -A arm -O linux -T kernel -C bzip2 -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux1.bz2 c
2. mkimage -A arm -O linux -T kernel -C gzip -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux.gz b
3. mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n 'init ramdisk' -d ramdisk.image.gz ramdisk
l 在include/configs/s3c2410.h中加入:
1. #define CONFIG_BOOTARGS "initrd=0x30800000,0x200000 root=/dev/ram init=/linuxrc console=ttyS0,115200"
2. #define CONFIG_BOOTFILE "vmlinux_for_uboot.gz"
3. #define CONFIG_BOOTCOMMAND "bootm 0x80000 0x1a0000"
0x80000为内核在flash中的位置。
0x1a0000为ramdisk.image.gz在flash中的内容。
4. #define CFG_LOAD_ADDR 0x30800000 /* default load address */
l 在lib_arm/armlinux.c的do_bootm_linux中加入:
1. memcpy ((char *)CFG_LOAD_ADDR, (char *)data, len);
2. data = CFG_LOAD_ADDR;
把ramdisk复制到0x30800000位置的RAM中
3. 定义以下配置,把信息传入LINUX核心的TAG区
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG

常用U-BOOT命令介绍

1. ?得到所有命令列表
2. help: help usb, 列出USB功能的使用说明
3. ping:注:只能开发板PING别的机器
4. setenv: 设置互环境变量:
5. setenv serverip 192.168.0.1
6. setenv ipaddr 192.168.0.56
7. setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’
8. saveenv: 保存环境变量
9. 在设置好环境变量以后, 保存变量值
10. tftp: tftp 32000000 vmlinux, 把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
11. kgo: 起动没有压缩的linux内核,kgo 32000000
12. bootm:起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
13. protect: 对FLASH进行写保护或取消写保护, protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect off 1:0-3取消写保护
14. erase: 删除FLASH的扇区, erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
15. cp: 在内存中复制内容, cp 32000000 0 40000(把内存中0x32000000开始的0x40000字节复制到0x0处)
16. mw: 对RAM中的内容写操作, mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
17. md: 修改RAM中的内容, md 32000000(内存的起始地址)
18. usb:
l usb start: 起动usb 功能
l usb info: 列出设备
l usb scan: 扫描usb storage(u 盘)设备
19. fatls:列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中的文件
20. fatload: 读入FAT中的一个文件,如:fatload usb 0:0 32000000 aa.txt
21. 把USB中的aa.txt 读到物理内存0x32000000处!
22. flinfo: 列出flash的信息
23. loadb: 准备用KERMIT协议接收来自kermit或超级终端传送的文件。
24. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。

 
 U-BOOT
 


引 言:
   本文以U-BOOT为例,介绍了如何在ARM9开发板上移植BootLoader的过程。LH7A400学习板是旋极公司推出的一款高性能嵌入式开发 板,其采用的处理器LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片。该芯片集成了高性能的32位RISC处理器核 ARM922T(运算速度200MHz,总线速度100MHz) ,能使处理速度达到每秒220百万条指令(MIPS),能耗为1.33mW/MIPS,可以在低电压状态下工作(核心1.8V,输入/输出3.3 V),片内带有锁相回路(PLL)和低能耗核心。此外该芯片还包括: 16KB 高速缓存 (Cache), 存储器管理单元(MMU), 80KB 静态存储器(SRAM), 彩色液晶显示控制器(LCD), 直接存储控制器(10通道 DMA), 异步串行口控制器(UART), 同步串行口控制器(SSP), PCMCIA控制器, AC97声音控制器, 智能卡控制器, 多媒体卡控制器, 电池控制器, USB控制器和时钟/供电管理器。值得一提的是,LH7A400是一款宽温芯片,其工作温度范围为-40℃~+85℃(降低时钟频率),可广泛应用于无线 手持设备、智能电话、PDA、家庭娱乐控制器、PocketPC及各种工控设备。
该学习板还包括如下硬件:由2 片16位Flash (32MB)和2片16位的SDRAM(64M)构成32位宽的高速存储器结构;10/100M自适应网络芯片DM9000; Sharp 3.5’TFT LCD彩屏;触摸屏;USB Host/Device;CF卡插槽;全功能JTAG接口等。

1 U-BOOT简介
   U-BOOT是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和 x86。目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页 是::URL::。U-BOOT的最新版本源代码可以在 Sourceforge的CVS服务器中匿名获得。
#cvs -dserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT login
#cvs -z6 -dserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT \ co -P modulename

1.1 U-BOOT源代码目录结构
◆ board:和一些已有开发板有关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的C文件。
◆ cpu: CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定 的子目录中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、设置指令Cache和数据Cache等; interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是U-BOOT 启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆ disk:disk驱动的分区处理代码。
◆ doc:文档。
◆ drivers:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
◆ fs:支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。
◆ net:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
◆ lib_arm:与ARM体系结构相关的代码。
◆ tools:创建S-Record格式文件 和U-BOOT images的工具。

1.2 U-BOOT的特点
  U-BOOT支持SCC/FEC以太网、OOTP/TFTP引导、IP和MAC的预置功能,这一点和其它BootLoader(如BLOB和RedBoot等)类似。但U-BOOT还具有一些特有的功能。

◆ 在线读写Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支持IDE和DOC的在线读写。
◆ 支持串行口kermit和S-record下载代码,U-BOOT本身的工具可以把ELF32格式的可执行文件转换成为 S-record格式,直接从串口下载并执行。
◆ 识别二进制、ELF32、uImage格式的Image,对Linux引导有特别的支持。U-BOOT对Linux 内核进一步封装为uImage。封装如下:
#{CROSS_COMPILE}-objcopy -O binary -R.note -R.comment -S vmlinux \ linux.bin
#gzip -9 linux.bin
#tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xc0008000 -e\
0xc0008000 -n “Linux-2.4.20” -d linux.bin.gz /tftpboot/uImage
即 在Linux内核镜像vmLinux前添加了一个特殊的头,这个头在include/image.h中定义,包括目标操作系统的种类(比如Linux, VxWorks等)、目标CPU的体系机构(比如ARM、PowerPC等)、映像文件压缩类型(比如gzip、bzip2等)、加载地址、入口地址、映 像名称和映像的生成时间。当系统引导时,U-BOOT会对这个文件头进行CRC校验,如果正确,才会跳到内核执行。如下所示:
WT-ARM9# bootm 0xc1000000
## Checking Image at 0xc100000 ...
Image Name: Linux-2.4.20
Created: 2004-07-02 22:10:11 UTC
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 550196 Bytes = 537 kB = 0 MB
Load Address: 0xc0008000
Entry Point: 0xc0008000
Verifying Checksum ... OK
Uncompressing Kernel Image ……… OK
◆ 单任务软件运行环境。U-BOOT可以动态加载和运行独立的应用程序,这些独立的应用程序可以利用U-BOOT控制台的I/O函数、内存申请和中断服务等。这些应用程序还可以在没有操作系统的情况下运行,是测试硬件系统很好的工具。
◆ 监控(minitor)命令集:读写I/O,内存,寄存器、内存、外设测试功能等
◆ 脚本语言支持(类似BASH脚本)。利用U-BOOT中的autoscr命令,可以在U-BOOT中运行“脚本”。首先在文本文件中输入需要执行的命令,然后用tools/mkimage封装,然后下载到开发板上,用autoscr执行就可以了。
① 编辑如下的脚本example.script。
echo
echo Network Configuration:
echo ----------------------
echo Target:
printenv ipaddr hostname
echo
echo Server:
printenv serverip rootpath
echo
② 用tools/mkimage对脚本进行封装。
# mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "autoscr example script" -d example.script /tftpboot/example.img
Image Name: autoscr example script
Created: Wes Sep 8 01:15:02 2004
Image Type: ARM Linux Script (uncompressed)
Data Size: 157 Bytes = 0.15 kB = 0.00 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0: 149 Bytes = 0 kB = 0 MB
③ 在U-BOOT中加载并执行这个脚本。
WT-ARM9# tftp 100000 /tftpboot/example.img
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.99
Filename '/tftpboot/TQM860L/example.img'.
Load address: 0x100000
Loading: #
done
Bytes transferred = 221 (dd hex)
WT-ARM9# autoscr 100000
## Executing script at 00100000
Network Configuration:
----------------------
Target:
ipaddr=10.0.0.99
hostname=arm
Server:
serverip=10.0.0.2
rootpath=/nfsroot
WT-ARM9#
◆ 支持WatchDog、LCD logo和状态指示功能等。如果系统支持splash screen,U-BOOT启动时,会把这个图像显示到LCD上,给用户更友好的感觉。
◆ 支持MTD和文件系统。U-BOOT作为一种强大的BootLoader,它不仅支持MTD,而且可以在MTD基础上实现多种文件系统,比如cramfs、fat和jffs2等。
◆ 支持中断。由于传统的BootLoader都分为stage1和stage2,所以在stage2中添加中断处理服务十分困难,比如BLOB;而U-BOOT是把两个部分放到了一起,所以添加中断服务程序就很方便。
◆ 详细的开发文档。由于大多数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和网络加载内核和文件系统,为后续开发,特别是驱动程序的开发奠定了良好的基础。
阅读(3192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~