2440 bootloader

  • 格式:pdf
  • 大小:304.10 KB
  • 文档页数:4

第24卷 第15期2008年8月甘肃科技Gansu Science and T echnolo gyV ol.24 N o.15A ug. 2008基于S3C2440的Bootloader的设计与实现于云松,由德凯,孙其芳(沈阳化工学院,辽宁沈阳110000)摘 要:Boot loader(引导加载程序)是嵌入式系统开发的一个重要环节,它把操作系统和硬件平台衔接起来,对嵌入式系统的后继软件开发十分重要。

U-boot是一个功能十分强大的Boot loader,本文深入研究了U-boot的运行原理,在基于以三星公司S3C2440微处理器为核心的开发板为背景,分析、探讨并且实现了基于U-boo t的系统引导加载程序的构建。

关键词:嵌入式系统;Bo otloader;S3C2440;u-boo t中图分类号:T P3681 引言Boo tloader(引导加载程序)就是在操作系统内核运行之前运行的一段小程序。

通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境[2]。

嵌入式系统中的Boo tlo ader是嵌入式系统开发的难点之一,同时是系统运行的一个前提条件,没有这段和硬件紧密相关的代码,多么精悍的内核也不能发挥作用[3]。

Bo otloader是严重地依赖于硬件而实现的,特别是在嵌入式系统中,不同体系结构的处理器需要不同的Bootloader,即使是基于同一种处理器构建的不同开发板,通常也需要进行Boo tlo ader 移植工作。

因此,在嵌入式系统中建立一个通用的Boo tloader几乎是不可能的,所以本文是实现针对以S3C2440微处理器为核心的特定目标板的Bo ot loader的开发。

Boo tloader的启动流程一般分为两个阶段stage1和stage2:Boo tloader的stage1通常包括以下步骤:1)硬件设备初始化。

2)为加载Boo tlo ader的stage2准备RAM空间。

3)拷贝Boo tlo ader的stage2到RAM空间中。

4)设置好堆栈。

5)跳转到stage2的C入口点。

Boo tloader的stag e2通常包括以下步骤:1)初始化本阶段要使用到的硬件设备。

2)检测系统内存映射(memory m ap)。

3)将kernel映像和根文件系统映像从flash上读到RA M空间中。

4)为内核设置启动参数。

5)调用内核[1]。

2 U-boot及其启动流程U-Boo t(U niv ersal Bootloader),是德国DENX小组开发的嵌入式CPU的Bootloader引导程序,是遵循GPL条款的开放源码项目。

它是在PPC-Bo ot的基础上进化而来的。

它支持多种嵌入式操作系统内核,支持多个处理器系列,具有较高的可靠性、稳定性和丰富的设备驱动源码。

U-boo t的启动流程也分为stag e1和stag e2两个阶段,主要体现在cpu/arm920t/start.S、lib_ arm/board.c和co mmo n/m ain.c这三个文件上。

U-boo t代码区(T EXT_BASE=0x33F80000)定义在bo ar d/smdk2440/config.mk文件中。

(1)stag e1U-boo t的stage1一般通过start.S来实现,它是用汇编语言写成的。

由于一个可执行的Im ag e必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本文件u-boo t.lds来完成,u-boot.lds 文件用来设置U-bo ot中各个目标文件的连接地址,通过ENT RY(_start)指定汇编程序入口点,从而进入汇编程序start.S。

start.S开始的一段代码是处理器的异常处理向量表,接下来系统复位。

Stag e1的流程图如图1所示:(2)stag e2Board.c 文件中的start _armboot 函数是C 代码部分开始的函数,该函数首先通过初始函数表完成一系列系统的初始化操作,包括以下内容:CPU 的基本设置,开发板的基本初始化,初始化中断,初始化环境变量,初始化波特率,串口通讯初始化,控制台初始化第一阶段,通知代码已经运行到该处,配制可用的内存区。

Stage2有流程图如图2所示:完成上述初始化后,进入的命令了循环,通过一个fo r 循环实现,for 循环中调用m ain.c 文件中的main_loop 函数[4-5]。

U-boo t 是自由的软件,其源代码开放,其源代码可以从其项目主页上免费获得。

本文采用的版本为u-boot-1.1.6图1 stage 1流程3 目标板Bootloader 的设计与实现U-boo t 支持很多种目标系统板的类型,为了减少移植开发的工作量,可以选择一种和目标开发板相近的类型对其进行修改。

3.1 硬件平台表1 目标板硬件平台硬件类型CP U 处理器SA M SU N G S3C2440A LSD RA M 内存SDR AM HY 57V 561620板载64M B FLASH 存储器板载64MB Nand Flash K9F1208U0M-YIB0板载2MB Nor Flash AM29LV160DB -90EI 网卡芯片D M 9000-DS-F03-041906图2 stage 2流程3.2 建立对目标板board 的支持在board 目录下的新建smdk2440文件夹,并将sm dk2410目录下文件复制到sm dk2440目录下,将sm dk2410.c 重命名为smdk2440.c,主要修改的文件包括low level _init.S 、flash.c 、sm dk2410.c 、Makefile 文件。

low level_init.S 文件是内存区的配置情况,参照芯片手册[6]第五章修改宏REFCNT 为0x 4f4/*period=7.8125us,H CLK=100M hz,(2048+1-7.8125*100)*/sm dk2440.c 文件主要是GPIO 和PLL 的配置,通过修改宏M _MDIV 、M _PDIV 、M_SDIV 和U _M _M DIV 、U _M _PDIV 、U _M _SDIV 的值,修改CLKDIVN,M PLLCON,U PLLCON 寄存器,相应的值为如下。

CLKDIVN 寄存器值为0x05/*FCLK:H CLK:PCLK =1:4:8*/;MPLLCON 寄存器值为(0x 7f<<12)|(0x 02<<4)|(0x 01)/*(M_M DIV <<12)+(M _PDIV <<4)+M_SDIV*/UPLLCON 寄存器值为(0x 38<<12)|(0x02<<4)|(0x02)/*(U_M _M DIV <<12)+(U_M_PDIV <<4)+U_M _SDIV*/Makefile 文件增加对smdk2440.c 的依赖关系COBJS:=smdk2440.o flash.o25第15期 于云松等:基于S3C2440的Bo otloader 的设计与实现3.3 CPU/Arm920t目录下CPU相关代码修改在start.S文件中设置CLKDIVN寄存器:ldrr0,=CLKDIV Nmovr1,#5/*FCLK:H CLK:PCLK=1:4:8 */strr1,[r0]参照芯片手册第七章修改s3c24x0子目录下speed.c文件中,将get_PLLCLK函数的返回值改为return((CONFIG_SYS_CLK_FREQ*m* 2)/(p<<s));修改g et_H CLK函数的返回值,增加的代码如下:unsig ned long clkdiv;unsig ned long camdiv;int hdiv=1;clkdiv=clk_pow er->CLKDIVN;camdiv=clk_pow er->CAMDIVN;sw itch(clkdiv&0x6){case0:hdiv=1;break;case2:hdiv=2;break;case4:hdiv=(camdiv&0x100)?8:4;break;case6:hdiv=(camdiv&0x200)?6:3;break;}return g et_FCLK()/hdiv;get_PCLK函数的返回值可参照g et_H CLK函数做相应的修改。

3.4 相关头文件修改include目录下的s3c2410.h、s3c24x0.h、复制include/config s\目录下的sm dk2410.h,并重命名为sm dk2440.h。

由于本开发板采用的是网卡是DM9000,所以需要将CS8900的部分改为以下所示:#define CONFIG_DRIVER_DM90001#define CONFIG_DM9000_BASE0x20000300#define DM9000_IO CONFIG_DM9000_ BASE#define DM9000_DATA\(CONFIG_DM9000_BASE+4)#define CONFIG_DM9000_U SE_16BIT修改如下宏:网卡M ac地址(CONFIG_ETH ADDR),IP地址(CONFIG_IPADDR),宿主机IP地址(CONFIG_SERVERIP),更改u-boo t起动后的提示符,#define CFG_PROM PT"SM DK2440#"在s3c2410.h文件中增加函数:static inline S3C2440_NAN D*const\S3C2440_GetBase_NAN D(vo id){return(S3C2440_NA ND*const)\S3C2410_NAND_BASE;}参见S3C2440芯片手册[6]第六章内容在s3c24x0.h中增加一个S3C2440_NAND结构体。

3.5 Makefile文件修改根本录下的Makefile文件,为目标板sm dk2440增加编译项sm dk2440_co nfig:unco nfig@$(M KCONFIG)$(@:_co nfig=)arm arm920t\sm dk2440NU LL s3c24x0其中各项的意思为:ar m:CPU的架构(ARCH)ar m920t:CPU的类型(CPU)sm dk2440:开发板的型号(BOARD)NULL:开发者(vender)s3c24x0:片上系统(SOC)3.6 目标文件的生成及测试当对源代码修改完毕后,进入U-boo t目录下输入:make smdk2440_co nfigmake之后会生成五个文件:u-boo t、u-boot.bin、u -boot.srec、u-boot.map、System.map。