×
单片机 > 单片机程序设计 > 详情

U-Boot在S3C2410上的移植分析

发布时间:2020-06-09 发布时间:
|

引 言 

BootLoader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。BootLoader还涉及到许多硬件相关的知识,对于普通的嵌入式开发板,它又是不可跳过的步骤,所以做好它的移植工作是必须的,对于后续的开发工作也是有益的。U-Boot是当前比较流行、功能强大的BootLoader,它操作简便,可以支持多种体系结构的处理器,同时提供了完备的命令体系。 S3C2410是三星公司一款基于ARM920T的嵌入式通用处理器。本文的移植平台就是以S3C2410 为核心的HHARM9-EDU-R2开发板,这块开发板的硬件资源配置较为完善。主要硬件资源有:S3C2410处理器;1片Intel TE28f128FLASH ( 16M);2片Hynix HY57V561620 SDRAM(64M);10/100M自适应网络芯片DM9000; USBHost/Device;RS232×2/RS485×1串口;LQ035FLM08L 256K色TFT真彩LCD显示屏;全功能JTAG调试口等。 

U-Boot简介 

U- Boot是Das U-Boot的简称,是由denx软件中心依照GPL 发布的公共软件,作为系统启动的引导模块,U-Boot支持多种处理器架构,比如Power-PC、ARM、MIPS和x86等。目前,U-Boot源代码在sourceforge网站的社区服务器中, Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http://sourceforge.net/ projects/ u-boot。当下载并解压U-Boot 源码包后,会形成如下的目录结构:board,和一些已有开发板有关的文件;common,实现各种U-Boot 命令的C 文件;cpu,CPU相关文件,其中的子目录都是以U-Boot 所支持的CPU命名的;disk,disk驱动的分区处理代码;doc,文档;drivers,通用设备驱动程序;fs,支持文件系统的文件;include,头文件,对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件;net:与网络有关的代码; lib-arm,与ARM体系结构相关的代码;tools,创建S-Record 格式文件和U-Boot Images的工具。 

本文中U-Boot的移植就是根据HHARM9-EDU-R2开发板的硬件资源在以上的目录中修改或者添加相关源文件,并且重新编译的过程。移植工作开始之前,了解U-Boot的运行过程是十分必要的。 

U- Boot 运行过程分析 

U- Boot编译后的代码定义一般不超过100kB,并且这100 kB又分成两个阶段来执行。第一阶段的代码在start.s中定义,大小不超过10 kB,它包括从系统上电后在0x00000000 地址开始执行的部分。这部分代码运行在Flash中,它包括对S3C2410的一些寄存器的初始化和将U-Boot的第二阶段代码从Flash拷贝到 SDRAM中。除去第一阶段的代码,剩下的部分都是第二阶段的代码。第二阶段的起始地址是在第一阶段代码中指定的,被复制到SDRAM后,就从第一阶段跳到这个入口地址开始执行剩余部分代码。第二阶段主要是进行一些BSS 段设置,堆栈的初始化等工作,最后会跳转到main-loop函数中,接受命令并进行命令处理。图1 给出了U-Boot的详细的运行过程包括对内核的设置、装载及调用过程。 

图1 U-Boot运行过程

了解了U-Boot 的运行过程以后,我们还必须确定开发板的地址空间分布,才可以进行源码的修改和移植工作。 地址空间的分布部分依赖于开发板的硬件配置及CPU 的复位地址。 本文中开发板的地址空间如图2 所示。 



图2  开发板地址空间分布 [page]

U-Boot的移植与测试 

为了使移植工作更加快捷,应当选择U-Boot当前发布的最新版本1.1.2 (尽管通过CVS可以得到U-Boot1.1.3,但其正在开发,尚未发布,不宜使用) 。因为最新的版本可以提供尽可能多的处理器核及开发板的支持。 对于U-Boot-1.1.2 而言,它不仅提供对ARM- 920T内核的支持,而且直接提供了对于S3C2410 的板级支持,这使移植工作量相对减少。 

支持ARM- 920T内核的代码修改 

由于U-Boot-1.1.2 提供对ARM-920T 内核的直接支持,所以本步骤不需要做任何工作,本文为了让读者了解BootLoder 移植的通用模式,在此只是稍加提示。 

配置自己的开发板 

建立自己开发板的目录和相关文件。 

1) 在include/ configs目录中以smdk2410.h为模板添加头文件S3C2410. h(cp smdk2410.h S3C2410.h) 。 这个文件是开发板的配置文件,它包括开发板的CPU、系统时钟、RAM、Flash系统及其它相关的配置信息。 

2) 在board/目录下创建S3C2410目录。拷贝smdk2410目录下所有文件到S3C2410目录下,共有如下六个文件:flash.c、 memsetup.c、S3C2410.c、Makefile、U-Boot .lds 和config.mk,根据开发板实际情况对各个文件进行修改。 

◆flash.c.U-Boot读、写和删除Flash 设备的源代码文件。由于不同开发板中Flash 存储器的种类各不相同,所以,修改flash.c时需参考相应的Flash 芯片手册。它包括如下几个函数: 

unsigned long flash-init (void ),Flash初始化;
int flash-erase (flash-info-t *info,ints-first,ints -last),Flash擦除;
volatile static int write- hword (flash-info-t *info,ulong dest , ulong data) ,Flash 写入;
int write-buff (flash-info-t *info,uchar *src ,ulong addr,ulong cnt),从内存复制数据。 

由于本文开发板所用flash芯片为IntelTE28f128,在board/ cmi目录中有此flash.c,只需对其稍加修改即可使用。 

◆memsetup.c.初始化时钟、SMC控制器和SDRAM控制器。为了以后能用U-Boot的GO命令执行修改过的用loadb或tftp下载的U-Boot.在标记符“0:”上加入五句:
   
mov r3,pc
ldr r4,= 0x3FFF0000
and r3,r3,r4 / /以上三句得到实际起动的内存地址
aad r0,r0,r3 / /用GO 命令调试uboot时,启动地址在RAM
add r2,r2,r3 / /把初始化内存信息的地址,加上实际起动地址 

◆S3C2410.C.设置各种总线时钟,打开数据Cache和指令Cache,并设置相关内存参数。 

◆Makefile.修改:OBJS := S3C2410.o flash.omemsetup.o 

◆U-Boot.lds.作如下修改: 

 .text 

 cpu/ arm920t/ start.o ( .text) 
* (.text) 


◆config.mk.用于设置程序连接的起始地址,因为会在U-Boot 中增加功能,所以留下6M 的空间,修改33F80000 为33A00000。 

实现网卡的驱动程序 

在drivers/目录中以dm9000x.c和dm9000x.h为模板添加网口设备控制程序dm9000.c和dm9000.h,其中dm9000.c主要包括以下函数: 

        int eth-init (bd-t *bd),初始化网络设备; 
        int eth-send(volatile void *,int),发送数据包; 
        int eth-rx(void),接收数据包。 
        void eth-halt (void),关闭网络设备; 

        为了方便网络设备的数据读写操作,还定义了如下函数: 

        static int dm9000-probe (void),搜索DM9000芯片,分配空间并登记之; 
        static u16 phy-read(int),从Phyxcer寄存器读取一个字; 
        static void phy-write ( int,u16),写一个字到Phyxcer 寄存器; 
        static u16 read-srom-word (int),从SROM 读取一个字数据; 
        static u8 DM9000-ior (int),从I/ O 口读取一个字节; 
        static void DM9000-iow(int reg,u8 value),写一个字节到I/ O 口; 
        最后在drivers/Makefile中加入dm9000.o。 

        修改Makefile 文件     
        在U-Boot-1.1.2/Makefile中ARM92xT Systems注释下面加入以下两行: 
        S3C2410-config :unconfig
  @./ mkconfig $( @:-config = ) arm arm920tS3C2410     [page]

其中“arm”是CPU的种类,arm920t是ARM CPU对应的代码目录,S3C2410是自己开发板对应的目录。 

交叉编译器安装在:/ path/ armv4l-unknown -linux-目录下,所以把CROSS-COMPILE 设置成相应的路径: CROSS-COMPILE = / path/ arm4l-unknown-linux - 

        生成目标文件并进行测试 
        依次运行以下命令:     

        # make clean 
        # make S3C2410-config 
        # make 

之后会生成三个文件: 

U-Boot ——ELF 格式的文件, 可以被大多数Debug 程序识别; 
U-Boot.bin ——二进制文件,纯粹的U-Boot 

二进制执行代码,不保存ELF 格式和调试信息。 这个文件一般用于烧录到用户开发板中;U-Boot .srec ——Motorola S-Record格式,可以通过串行口下载到开发板中。 

测试与应用 

1) 测试 

利用编制好的Flash烧写程序,通过JTAG口将生成的二进制文件U-Boot。bin烧入Flash的零地址。 烧录成功后,拔掉JTAG调试线并复位开发板,从Minicom终端输出如下信息: 

        U-Boot 1.1.2 (Jul 20 2005-09 :34 :21) 
        U-Boot code : 33F00000-> 33F1952C BSS:-> 33F1D870         
        RAM Configuration : 
        Bank # 0 : 30000000 64 MB 
        Flash Memory Start 0x0000000 
        Device ID of the Flash is 18 
        Flash : 16 MB 
        Write 18 to Watchdog and it is 18 now 
        In : serial 
        Out : serial 
        Err : serial 
        SMDK2410 # 

串口输出的以上信息表明,CPU和串口已正常工作。通过U-Boot提供的命令flinfo和mtest可以测试Flash和RAM。经过测试,可以正确地读出Flash信息及读写RAM,表明Flash 和DRAM 已正确初始化。用tftp命令传输宿主机tftpboot目录下任一小文件到RAM成功,说明网卡芯片也成功驱动。 

2) 简单应用 

U- Boot的主要作用是用来引导内核。因此,通过U-Boot引导一个特定的内核,可以进一步测试其移植的稳定性。而使用U-Boot引导内核有两种不同的方法。第一种方法是直接将内核映象文件和根文件系统烧写入Flash,使用此方法,U-Boot在启动时将 Flash中的内核映象及根文件系统读入RAM指定位置并从同一位置启动内核。第二种方法是将内核映象文件和根文件系统下载至RAM中直接启动(而不是从Flash中读入RAM) ,此种方法不需要烧写Flash。笔者为了减少烧写Flash的次数,在本文中采用第二种方法,其步骤如下: 

        SMDK2410 # tftp 30008000 zImage 
        SMDK2410 # tftp 30800000 ramdisk.Image.gz         
        SMDK2410 # go 30008000 

上述指令执行的过程中,未出现异常,内核成功启动,并最终进入Shell提示符“ # ”。在Shell提示符下输入内核编译时定制的各个命令,均可以正常运行。另外编写简单C程序,并用交叉编译器编译之,最终生成的可执行文件能够在开发板上正常运行。上述事实说明内核经过U-Boot引导已稳定运行在开发板上。此次应用,进一步验证了U-Boot移植的稳定性。至此,移植工作告一段落。 

结 语 

目前,笔者移植的U-Boot已经能稳定地运行在开发板上,这使得Linux内核的调试脱离了BDM调试器,节约了大量的开发时间,大大提高了效率,是对后续嵌入式开发的有力支持。当然,U-Boot只是一款好用的BootLoader,嵌入式Linux的开发存在很多技术细节,只有根据实际情况不断修改、调试、总结,才能获得更大的成功。

关键字:U-Boot  S3C2410  移植  BootLoader 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址