资源描述:
《u-boot在44b0x开发板上的移植以及代码分析》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、U-Boot在44B0X开发板上的移植以及代码分析章永阳2003-10-301.u-boot介绍u-boot是一个opensource的bootloader,目前版本是0.4.0。u-boot是在ppcboot以及armboot的基础上发展而来,虽然宣称是0.4.0版本,却相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。唯一遗憾的是并不支持我们现在学习所用samsung44B0X的开发板。为什么我们需要u-boot?显然可以将ucLinux直接烧入flash,从而不需要额外的引导装载程序(boot
2、loader)。但是从软件升级的角度以及程序修补的来说,软件的自动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。同时,u-boot移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。2.u-boot移植的框架移植u-boot到新的开发板上仅需要修改和硬件相关的部分。在代码结构上:1)在board目录下创建ev44b0ii目录,创建ev44b0ii.c以及flash.c,memsetup.S,u-boot.lds等。不需要从零开始,可选择一个相似
3、的目录,直接复制过来,修改文件名以及内容。我在移植u-boot过程中,选择的是ep7312目录。由于u-boot已经包含基于s3c24b0的开发板目录,作为参考,也可以复制相应的目录。2)在cpu目录下创建arm7tdmi目录,主要包含start.S,interrupts.c以及cpu.c,serial.c几个文件。同样不需要从零开始建立文件,直接从arm720t复制,然后修改相应内容。3)在include/configs目录下添加ev44b0ii.h,在这里放上全局的宏定义等。4)找到u-boot根目录下Makefile修改加入1.ev44
4、b0ii_config:unconfig2.@./mkconfig$(@:_config=)armarm7tdmiev44b0ii5)运行makeev44bii_config,如果没有错误就可以开始硬件相关代码移植的工作3.u-boot的体系结构1)总体结构u-boot是一个层次式结构。从上图也可以看出,做移植工作的软件人员应当提供串口驱动(UARTDriver),以太网驱动(EthernetDriver),Flash驱动(Flash驱动),USB驱动(USBDriver)。目前,通过USB口下载程序显得不是十分必要,所以暂时没有移植USB驱
5、动。驱动层之上是u-boot的应用,command通过串口提供人机界面。我们可以使用一些命令做一些常用的工作,比如内存查看命令md。Kermit应用主要用来支持使用串口通过超级终端下载应用程序。TFTP则是通过网络方式来下载应用程序,例如uclinux操作系统。2)内存分布在flashrom中内存分布图ev44b0ii的flash大小2M(8bits),现在将0-40000共256k作为u-boot的存储空间。由于u-boot中有一些环境变量,例如ip地址,引导文件名等,可在命令行通过setenv配置好,通过saveenv保存在40000-5
6、0000(共64k)这段空间里。如果存在保存好的环境变量,u-boot引导将直接使用这些环境变量。正如从代码分析中可以看到,我们会把flash引导代码搬移到DRAM中运行。下图给出u-boot的代码在DRAM中的位置。引导代码u-boot将从0x00000000处搬移到0x0C700000处。特别注意的由于ev44b0iiuclinux中断向量程序地址在0x0c000000处,所以不能将程序下载到0x0c000000出,通常下载到0x0c080000处。4.start.S代码结构1)定义入口一个可执行的Image必须有一个入口点并且只能有一个
7、唯一的全局入口,通常这个入口放在Rom(flash)的0x0地址。例如start.S中的.globl_start_start:值得注意的是你必须告诉编译器知道这个入口,这个工作主要是修改连接器脚本文件(lds)。2)设置异常向量(ExceptionVector)异常向量表,也可称为中断向量表,必须是从0地址开始,连续的存放。如下面的就包括了复位(reset),未定义处理(undef),软件中断(SWI),预去指令错误(Pabort),数据错误(Dabort),保留,以及IRQ,FIQ等。注意这里的值必须与uclinux的vector_base
8、一致。这就是说如果uclinux中vector_base(在include/armnommu/proc-armv/system.h)定义为0x0c000000,则H