冯宝祥,邓人铭
(广州粤嵌通信科技股份有限公司,广州 510663)
U-Boot在S5PV210上的分析及移植
冯宝祥,邓人铭
(广州粤嵌通信科技股份有限公司,广州 510663)
U-Boot是一种在嵌入式平台上使用非常广泛的Bootloader,而S5PV210微处理器的启动过程比较复杂。以GEC210为实验平台,分析U-Boot的启动过程,并提出在GEC210平台上的移植方法。应用结果表明,U-Boot在GEC210开发板上运行良好,可以成功地引导Linux2.6.35.7内核。
U-Boot;S5PV210;GEC210;移植
U-Boot是一种通用的Bootloader,是遵循GPL条款的开放源码项目,由德国DENX小组开发。U-Boot支持多种架构的CPU,如X86、ARM、PowerPC、MIPS等;也支持Linux、VxWorks、WinCE等多种嵌入式操作系统。U-Boot代码开源、稳定、可配置性及可移植性强,所以在嵌入式平台中是一种应用比较广泛的启动代码。
GEC210是广州粤嵌通信科技股份有限公司开发的一款基于ARM架构Cortex-A8内核的开发平台,该硬件平台采用三星公司的S5PV210微处理器作为主控芯片,S5PV210是一款高效率、高性能、低功耗的32位RISC微处理器,主频可以工作在1GHz,而且带有丰富的外围接口。GEC210开发板的硬件框架见图1。
在GEC210平台上加载启动嵌入式Linux系统主要分成5个步骤:
①上电自启动执行S5PV210芯片内部iROM中固化的BL0引导程序;
②BL0将Nand Flash中U-Boot的第一阶段代码BL1拷贝到S5PV210内部的iRAM中,并跳转到iRAM中执行BL1,BL1初始化了DDR2内存;
③BL1将Nand Flash中的U-Boot第二阶段代码BL2拷贝到DDR2内存中,并跳转到DDR2内存中执行BL2;
④BL2将Nand Flash中的Linux内核映像拷贝到DDR2内存中,并在DDR2内存中解压及启动内核;
⑤内核加载完毕后,挂载根文件系统,并启动执行默认的Linux应用程序。
图1 GEC210开发板的框架图
S5PV210 CPU内部自带一个64KB的iROM和一个96KB的iRAM,芯片出厂时在iROM中已经固化了一个基本的启动代码,即BL0,BL0不需要用户修改。S5PV210支持多种启动方式,如:Nor Flash、Nand Flash、One Nand,Uart、USB、SD卡等。启动方式通过S5PV210的外部引脚设定,本文讲述的U-Boot移植和分析选择Nand Flash启动方式。S5PV210上电启动时运行BL0,并由BL0判断启动方式。BL0的主要工作内容如下:
①关闭看门狗定时器(watchdog timer)。
②初始化I cache(Instruction cache)。
③初始化iRAM中的栈和堆,注册异常向量表等。
④初始化系统时钟PLL。
⑤判断启动设备。
⑥检查BL1的校验和,如果正确,就从Nand Flash中拷贝U-Boot前16kB的BL1到iRAM中。
⑦执行iRAM中的BL1代码。
U-Boot代码一般分成两个部分,分别为stage1,即BL1和 stage2即 BL2。其中 BL1源码文件为/cpu/ s5pc11x/start.S和/board/samsung/smdkc110/lowlevel_init. S。BL1是使用ARM汇编语言编写的源代码,主要完成CPU级的初始化工作,如:
①关闭看门狗和中断。②初始化系统时钟。
③初始化DDR2内存。
④初始化DDR2内存中的stack。⑤初始化串口。⑥将BSS段清0。
⑦将Nand Flash中的BL2拷贝到DDR2内存。
⑧跳转到DDR2内存中,执行BL2中的start_armboot()函数。
将BL2拷贝到DDR2内存后,在/cpu/s5pc11x/start. S源文件中调用start_armboot()函数,进入U-Boot的第二阶段。BL1跳转到BL2的代码如下:
ldr pc,_start_armboot_start_armboot:.word start_armboot
BL2代码的源文件是/lib_arm/board.c,start_armboot()函数是BL2的入口。主要完成板级的初始化,如:
①初始化U-Boot的两个结构体gd_t和bd_t,用来存放U-Boot的全局信息和GEC210开发板信息。
②初始化网卡。
③初始化LCD显示屏。
④初始化I2C总线接口。
⑤进入main_loop()循环,接收用户输入U-Boot命令,并根据命令进行相应的处理。
⑥用户不输入U-Boot命令,则在默认计时等待时刻到来后执行bootcmd命令,将Linux内核映像uImage 从Nand Flash拷贝到DDR2内存,并解压启动内核。
在include/configs/smdkv210single.h头文件中,设置U-Boot的默认启动命令bootcmd:
#define CONFIG_BOOTCOMMAND "nand read 0x30008000 0x600000 0x500000;bootm 0x30008000"
该bootcmd命令的主要作用是将Nand Flash中0x600000地址开始的uImage(大小不超过5M Byte)拷贝到DDR2内存的0x30008000地址,并启动该地址上的uImage。在U-Boot源码的main_loop()循环中,获取bootcmd命令参数并执行,最后启动uImage。代码如下:
s=getenv("bootcmd");//读取启动命令
run_command(s,0);//执行bootcmd
针对GEC210开发板的U-Boot移植采用三星官方提供的SMDKV210开发平台源码包,移植过程的主要方法是比较GEC210和SMDKV210平台之间的差异,对源代码进行修改。
5.1 配置U-Boot源码
修改U-Boot源码顶层的Makefile文件,设置CPU的架构和交叉工具链:
ifeq($(ARCH),arm)
CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/armnone-linux-gnueabi-
使用三星公司的默认配置文件,对U-Boot源码进行配置:
#make smdkv210single_config
5.2 U-Boot源代码移植
修改include/configs/smdkv210single.h文件:
(1)更改串口控制台
#define CONFIG_SERIAL1 1
(2)更改DDR2内存配置
GEC210开发板设计内存时,采用4片16bits的DDR2 SDRAM,其中每2片并联在一起,分别接到DDR2控制器的通道0和通道1上。内存的配置方法如下:
#define MEMORY_BASE_ADDRESS 0x30000000
#define MEMORY_BASE_ADDRESS1 0x40000000
#define DMC0_MEMCONTROL 0x00202400
#define DMC0_MEMCONFIG_0 0x30F00313
#define DMC0_MEMCONFIG_1 0x00F00313
#define DMC1_MEMCONTROL 0x00202400
#define DMC1_MEMCONFIG_0 0x40F00313
#define DMC1_MEMCONFIG_1 0x00F00313
#define SDRAM_BANK_SIZE 0x10000000
#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS1)
修改DDR2内存的基地址,在board/samsung/smdkc110/smdkc110.c源文件中,将 0x20000000改为0x30000000。
(3)修改DM9000网卡的基地址
#define CONFIG_DM9000_BASE(0x88000000)
#define DM9000_DATA (0x88000000+8)
(4)屏蔽PMIC、SRAM和Nor Flash初始化代码
在GEC210开发板上,并没有使用PMIC、SRAM和Nor Flash等外设芯片,所以将 board/samsung/smdkc110/lowlevel_init.S文件中的 PMIC、SRAM和 Nor Flash的初始化代码屏蔽掉。
5.3 U-boot 编译
在U-Boot的源码目录下执行make,编译完成后得到u-boot.bin文件,该文件是uboot的可执行文件。
5.4 U-Boot 测试
首 先 将 u-boot.bin烧 写 到 Nand Flash的0x00000000地址,启动GEC210平台后,在串口调试终端上会显示U-Boot正常启动信息。U-Boot会根据默认配置的bootcmd参数加载并启动Linux内核。
U-Boot是一种开源的Bootloader,支持多种架构的CPU,并且可以启动多种操作系统,功能强大、应用广泛。本文主要讲述了U-Boot在S5PV210上的启动分析和移植过程,该分析方法和移植过程在其他嵌入式平台上也有一定的借鉴性。
[1]Samsung Electronics Co.,Ltd.S5PV210 RISC Microprocessor User's Manual V1.10.http://samsungsemi.com,2010.
[2]Samsung Electronics Co.,Ltd.S5PV210 iROM Application Note V0.3.http://samsungsemi.com,2009(11).
[3]李洪亮,邵长彬.基于S3C2410的U-Boot移植[J].电子技术,2012(1):12-14.
[4]许伦辉,齐宝岭,黄艳国.U-Boot源码分析及在S3C2440的移植过程[J].科技广场,2009(7):172-174.
Analysis and Transplanting of U-Boot on S5PV210
FENG Bao-xiang,DENG Ren-ming
(Guangzhou Yueqian Communication Technology Co.,Ltd.,Guangzhou 510663)
U-Boot is a kind of Bootloader which is widely used on the embedded platform,but the startup process of S5PV210 microprocessor is more complex.Describes the startup process of U-Boot and the transplanting methods on GEC210 in details.The application result shows that the transplanted U-Boot runs well on the GEC210 development board,and can lead Linux2.6.35.7 kernel successfully.
U-Boot;S5PV210;GEC210;Transplanting
1007-1423(2016)21-0068-04
10.3969/j.issn.1007-1423.2016.21.016
冯宝祥(1978-),男,辽宁沈阳人,硕士研究生,工程师,研究方向为嵌入式Linux技术、物联网应用、自动控制应用邓人铭(1985-),男,广东湛江人,本科,助理工程师,研究方向为嵌入式系统、智能硬件设计、物联网通信开发
2016-05-06
2016-07-15