APP下载

U-Boot在S3C2440上的分析和移植

2016-01-12夏礼勇符秀辉

沈阳化工大学学报 2016年2期
关键词:源码开发板网卡

夏礼勇, 符秀辉

(沈阳化工大学 信息工程学院, 辽宁 沈阳 110142)

移植Bootloader的目的是在系统上电后,使用Bootloader初始化系统硬件,构建系统软件环境,最后引导系统跳转到Linux内核继续运行.在不同的嵌入式平台上,需要对于针对特定的硬件配置制作对应的Bootloader.Bootloader种类很多,每种Bootloader都具有平台针对性,其中U-Boot对于ARM架构的芯片支持更加完善.

目前研究U-Boot移植的文献大多数介绍的是在NAND Flash上的移植操作,在文献中没有介绍U-Boot如何引导系统跳转到Linux内核的实现细节,只有移植步骤和实现现象,不能明显体现移植目的.本文通过虚拟机搭建编译环境,分析U-Boot启动流程,并在启动流程第二阶段中具体介绍U-Boot引导系统跳转到Linux内核的实现细节,详细分析U-Boot的移植步骤,最后在NOR Flash上移植U-Boot.文中移植U-Boot的操作是后续嵌入式Linux系统开发的基础,同时文中介绍的U-Boot启动流程和移植步骤也能给类似平台移植Bootloader提供参考.

1 U-Boot简介

U-Boot是一种业界广泛使用的Bootloader,其程序开源,兼容性好,源代码可在互联网上直接下载.U-Boot支持很多架构的CPU,如X86、ARM、MIPS等架构的CPU,能够引导Linux和Wince等嵌入式操作系统.本文基于1.1.6版本的U-Boot进行移植,根据U-Boot源码文件夹下各个目录的特性进行分类,可分为5类,如表1所示.

表1 目录分类

2 U-Boot的移植环境

2.1 硬件环境

移植平台是以S3C2440A为核心的ARM9开发板,S3C2440A芯片内部的CPU型号为ARM920T.S3C2440A内部集成SRAM,具有5级流水线,支持NOR Flash和NAND Flash[1].开发板主要资源如表2所示.

表2 板载主要元器件

Table 2 Plate main components

2.2 软件环境

通过在VMware Workstation虚拟机上运行Ubuntu14.10系统搭建移植软件编译环境,arm-linux-gcc-4.3.2作为编译器,使用JTAG作为下载和调试工具.

3 U-Boot的启动流程分析

U-Boot可以设置从NOR Flash启动,也可以设置从NAND Flash启动,因为NAND Flash容易产生坏块,所以选择从NOR Flash启动,在本文后续的移植过程中将编译生成的uboot.bin文件烧录到NOR Flash中,实现从NOR Flash启动系统程序.

3.1 U-Boot启动流程第一阶段

U-Boot是具有两阶段启动过程的Bootloader,通常用汇编语言实现第一阶段程序,用C语言实现第二阶段程序.在启动第一阶段系统执行start.S和lowlevel_init.S汇编文件,这两个文件分别位于cpu/$(CPU)和board/$(BOARDDIR)目录中,主要完成以下工作:(1)初始化开发板相关的硬件;(2)初始化板载内存芯片;(3)将U-Boot代码拷贝到初始化好的SDRAM中;(4)设置栈;(5)跳到第二阶段C代码中继续执行[2].$(CPU)和$(BOARDDIR)分别代表SoC内部的CPU型号、进行移植的开发板名称,两个变量的值分别为arm920t和my2440.

3.2 U-Boot启动流程第二阶段

U-Boot启动流程第二阶段如图1所示.

图1 U-Boot启动流程第二阶段

在第一阶段第5步中,U-Boot通过ldr指令将第二阶段C语言程序start_armboot函数入口地址赋值给PC寄存器,使系统跳转到第二阶段执行C语言代码.

在第二阶段启动过程中,程序初始化系统时钟、初始化定时器、初始化串口模块,检测Flash上环境参数是否设置.完成上述步骤后,start_armboot函数继续初始化NOR Flash,将存储在NOR Flash上的环境参数读入SDRAM,初始化网卡模块,调用main_loop()函数.

在main_loop()函数中,系统会检测U-Boot环境参数bootdelay和bootcmd的值是否定义,如果没有定义系统会不断检测串口输入,并解析执行串口输入的命令;如果已经定义bootdelay和bootcmd,系统则会倒数bootdelay秒;若在bootdelay秒内串口有输入,系统会进入读取串口输入命令、执行命令的循环中;若没有输入,系统会执行环境参数bootcmd中定义的命令,环境参数bootcmd中定义了系统内核的读取指令和启动内核指令[3],执行bootcmd命令后便成功跳转到Linux内核中继续运行.

4 U-Boot在S3C2440上的移植步骤

4.1 下载U-Boot-1.1.6源码包解压缩

本文的移植平台是S3C2440开发板,要在此硬件平台上移植U-Boot,需要根据板载硬件修改U-Boot源码.首先从互联网下载1.1.6版本的U-Boot源码压缩包,把源码压缩包放入到Ubantu14.10主机的/work/system目录下,在Linux主机上进入/work/system目录下,在终端命令行中执行“tar xjf U-Boot-1.1.6.tar.bz2”命令,待命令执行完毕后,可以得到已经解包解压缩的U-Boot-1.1.6文件夹.

4.2 创建工程相应目录和文件

目前1.1.6版本的U-Boot源码已经能够支持大部分的2410开发板,本文基于smdk2410的U-Boot程序对S3C2440开发板移植U-Boot.在解压好的u-boot-1.1.6文件夹中的board目录下存在smdk2410文件夹,首先进行以下6步操作:

(1) 在U-Boot源码根目录board文件夹下新建my2440文件夹;

(2) 将smdk2410目录下的所有文件拷贝到my2440文件夹中;

(3) 在include/configs目录下新建my2440.h文件;

(4) 复制相同目录下smdk2410.h中的全部内容到my2440.h中;

(5) 在U-Boot源码根目录下的Makefile中添加如下配置命令[4]:

my2440_config:unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t my2440 NULL s3c24x0

(6) 修改board目录下my2440目录中的Makefile,将Makefile文件中的“COBJS:=”项后smdk2410.o修改为my2440.o.

4.3 修改系统时钟设置

查阅芯片数据手册可知S3C2410A主频为200 MHz,S3C2440A主频为400 MHz.从S3C2440A数据手册中得知系统频率MPLL和USB控制器频率UPLL计算公式如下[5]:

MPLL=(2×m×fin)/(p×2s)

(1)

UPLL=(m×fin)/(p×2s)

(2)

在公式(1)和(2)中,m=MDIV+8,p=PDIV+2,s=SDIV,fin为外接晶振频率.本文的移植平台上外接晶振为12 MHz,所以fin的值是12 MHz.在系统晶振输入为12 MHz的情况下,要改变系统时钟频率和USB控制器频率,需要在系统时钟的宏定义中给PLLCON寄存器赋值.根据S3C2440A数据手册可知PLLCON寄存器分为MDIV,PDIV,SDIV三个部分,要使系统频率倍频到400 MHz,需要将MDIV,PDIV,SDIV分别赋值为0x5c,0x01,0x01;要使USB控制器频率变成48 MHz,需要将MDIV,PDIV,SDIV分别赋值0x38,0x02,0x02.

综合上述分析,在board_init函数中添加如下宏定义:

#define S3C2440_MPLL_TO_400 MHz

((0x5c≪12)|(0x01≪4)|(0x01))

#defineS3C2440_UPLL_TO_48 MHz

((0x38≪12)|(0x02≪4)|(0x02))

其中,board_init函数定义于my2440目录下的my2440.c文件中.完成上述设置后,还需要设置时钟分频比,根据S3C2440A数据手册给CLKDIVN寄存器赋值0x05,实现FCLK、HCLK、PCLK的分频比为1∶4∶8.具体步骤为在my2440.c文件中继续添加如下宏定义:

#define S3C2440_CLKDIVN 0x05

4.4 设置支持DM9000网卡

在嵌入式Linux系统中,网络功能很重要.U-Boot-1.1.6已经支持smdk2410开发板板载的CS8900网卡,S3C2440开发板板载的是DM9000网卡,要实现网络支持,首先需要在include/configs文件夹下的my2440.h文件中删除如下所示的支持CS8900网卡的宏定义[6]:

#define CONFIG_DRIVER_CS8900 1

#define CS8900_BASE 0x19000300

#define CS8900_BUS16 1

S3C2440开发板中DM9000网卡连接在存储控制器的BANK4,从数据手册得知DM9000网卡的地址为0x20000000,设置支持DM9000网卡需要在my2440.h文件中添加如下宏定义:

#define CONFIG_DRIVER_DM9000 1

#define CONFIG_DM9000_IO_BASE 0x20000000

#define DM9000_DATA

(CONFIG_DM9000_IO_BASE+4)

4.5 编译U-Boot在my2440平台上烧录

在完成上面一系列步骤后,U-Boot编译前的修改源码工作已经完成.此时在虚拟机上运行Ubuntu系统,进入U-Boot根目录下,在终端命令行中输入“make my2440_config”配置命令,对U-Boot源码进行针对移植平台的配置操作,待配置操作完成后,在终端命令行中输入make命令编译U-Boot.

在编译结束后,系统会生成uboot.bin二进制文件,使用JTAG工具将uboot.bin文件烧录到移植平台上,在烧录过程中既可以烧录到NAND Flash中,也可以烧录到NOR Flash中,因为NAND Flash易产生坏块,为保证U-Boot的稳定性,本文将uboot.bin文件烧录到NOR Flash中.当成功烧录后,为开发板重新上电启动系统,通过Secure CRT工具可以查看到开发板串口上输出的U-Boot和开发板相关的信息,如图2所示.至此成功实现U-Boot在S3C2440开发板NOR Flash上的移植.

图2 串口输出信息

5 结束语

选用U-Boot作为移植对象,从互联网下载U-Boot源码,通过虚拟机搭建开发环境,对源码压缩包进行解包解压缩,基于smdk2410的U-Boot 源码针对S3C2440开发板硬件资源修改源码,得到适合在S3C2440上移植的U-Boot代码,通过编译环境和编译器对U-Boot代码进行编译,最后将编译得到的uboot.bin文件烧录到S3C2440开发板板载的NOR Flash中,成功完成S3C2440开发板的移植工作.在特定嵌入式硬件平台上移植U-Boot是进行嵌入式Linux开发工作的基础,通过本文的移植工作,为后续工作做好铺垫,也能为类似嵌入式平台移植Bootloader提供一定的参考作用.

[1] 杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003:8-9.

[2] 张进,姜威.u-boot的启动流程分析及移植步骤[J].电力自动化设备,2005,25(7):68-71.

[3] 韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008:261-264.

[4] 申爽.基于S3C2440的Uboot分析与移植[J].计算机系统应用,2012,21(5):222-225.

[5] Samsung Electronics.S3C2440A 32-Bit Risc Micro controller User′s Manual Revision 0.12[EB/OL].(2004-03-15)[2013-07-19].http://www.docin.com/p-679498723.html.

[6] 冯林琳,耿恒山.基于S3C6410的Uboot分析与移植[J].计算机与现代化,2013(1):119-121.

猜你喜欢

源码开发板网卡
面向数据可靠传输的高译码率带反馈的LT码
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
浅谈开源操作系统的历史
企业如何保护源码
Server 2016网卡组合模式
浅析单片机开发板的设计与制作
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证
挑战Killer网卡Realtek网游专用Dragon网卡
Mouser为您呈上开发关键之STMicroelectronics Nucleo开发板
Arduino和Atmel发布Arduino Zero开发板