您的位置 首页 FPGA

根据S3C2440的u-boot的移植

1Bootloader及u-boot简介Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从…

1 Bootloader及u-boot简介

Bootloader代码是芯片复位后进入操作体系之前履行的一段代码,首要用于完结由硬件发动到操作体系发动的过渡,从而为操作体系供给根本的运转环境,如初始化CPU、仓库、存储器体系等。Bootloader代码与CPU芯片的内核结构、详细类型、运用体系的装备及运用的操作体系等要素有关,其功用类似于PC机的BIOS程序。因为Bootloader和CPU及电路板的装备状况有关,因此不行能有通用的bootloader ,开发时需求用户依据详细状况进行移植嵌入式Linux体系中常用的bootloader有armboot、redboot、blob、u-boot 等,其间u-boot是当时比较盛行,功用比较强壮的bootloader,能够支撑多种体系结构,但相对也比较杂乱。Bootloader的完结依赖于 CPU的体系结构,大多数bootloader都分为stage 1和stage2两大部分。Bootloader的根本原理见参阅文献。u-boot是sourceforge网站上的一个敞开源代码的项目。它可对 PowerPC MPC5XX、MPC8XX、MPC82XX、 MPC7XX、MPC74XX、ARM(ARM7、ARM9、StrongARM、VxWorks、NetBSD、QNX、RTEMS、ARTOS、 LynxOS等,首要用来开发嵌入式体系初始化代码bootloader。软件的主站点是http://sourceforge.net/projects/u-boot。u-boot开端是由denx的PPC-boot开展而来的,它对PowerPC系列处理器的支撑最完善,对Linux操作体系的支撑最好。源代码敞开的U-boot软件项目常常更新。

当时最新版本是NOV.2.2006 Update的U-boot-1.1.6。

2 u-boot体系发动流程

大多数bootloader都分为stage1和stage2两大部分,u-boot也不破例。依赖于cpu体系结构的代码(如设备初始化代码等)一般都放在stage1且能够用汇编言语来完结,而stage2则一般用C言语来完结,这样能够完结杂乱的功用,而且有更好的可读性和移植性。

2.1 stage1 (start.s代码结构)

u-boot的stage1代码一般放在start.s文件中,它用汇编言语写成,其首要代码部分如下:

(1)界说进口。因为一个可履行的Image有必要有一个进口点,而且只能有一个大局进口,一般这个进口arm结构的cpu放在ROM(Flash)的0x00地址(MIPS放在0xBFC00000),因此,有必要告诉编译器以使其知道这个进口,该作业可经过修正衔接器脚原本完结。

(2)设置反常向量(Exception Vector)。

(3)设置CPU的速度、时钟频率及中止操控寄存器。

(4)初始化内存操控器。

(5)将ROM中的程序仿制到RAM中。

(6)初始化仓库。

(7)转到RAM中履行,该作业可运用指令ldrpc来完结。

2.2 stage2 C言语代码部分

lib_arm/board.c中的start_armboot是C言语开端的函数,也是整个发动代码中C言语的主函数,一起仍是整个u-boot(armboot)的主函数,该函数首要完结如下操作: (Line236)

(1)调用一系列的初始化函数。

(2)初始化Flash设备。

(3)初始化体系内存分配函数。

(4)假如方针体系具有NAND设备,则初始化NAND设备。

(5)假如方针体系有显现设备,则初始化该类设备。

(6)初始化相关网络设备,填写IP、MAC地址等。

(7)进入指令循环(即整个boot的作业循环),承受用户从串口输入的指令,然后进行相应的作业。

3移植实例

友善之臂QQ2440V3开发板

本体系开发板首要由S3C2440嵌入式微处理器、16MB的Flash (AM29LV160)、64MB的Nand Flash((K9F1208U0)、64MB的SDRAM(Hy57v561620)、网卡驱动IC(CS8900A)以及ARM JTAG接口组成。

3.1 u-boot文件下载

u-boot文件的下载有两种办法,第一种是在Linux环境下经过CVS下载最新的文件,办法是:

$cvs-dpserver anonymous@cvs.sourceforge.net/cvsroot/u-boot login

当要求输入匿名登录的暗码时,可直接按回车键

$cvs-z6-dpserver anonymous@cvs.sourceforge.net/cvsroot/u-boot\co.Pmodulename

第二种是经过ftp//ftp.denx.de/pub/u-boot/下载正式发布的压缩文件。

3.2 u-boot文件的结构

初度下载的文件有许多,解压后存放在u-boot文件目录下,详细内容已在readme文件中做了详细的介绍,其间与移植相关的首要文件夹有:

(1)CPU它的每个子文件夹里都有如下文件:

makefile

config.mk

cpu.c和处理器相关的代码

interrupts.c中止处理代码

serial.c串口初始化代码

start.s大局开端发动代码

(2)Board它的每个子文件夹里都有如下文件:

makefile

config.mk

smdk2410.c和板子相关的代码(以smdk2410为例)

flash.c Flash操作代码

memsetup.s初始化SDRAM代码

u-boot.lds对应的衔接文件

(3) lib_arm体系结构下的相关完结代码,比方memcpy等的汇编言语的优化完结。

3.3 穿插编译环境的树立

要得到下载到方针板的u-boot二进制发动代码,还需求对下载的u-boot-1.1.6 进行编译。u-boot的编译一般在Linux体系下进行,可用arm-linux-gcc进行编译。一步一步树立穿插编译环境一般比较杂乱,最简略的办法是运用他人编译好的穿插编译东西,办法如下:

(1)在http//handhelds.org/download/toolchai下载arm-linux-gcc-3.4.5.tar.bz2

(2)以用户名root登录,将arm-linux-gcc-3.4.5.tar.bz2解压到 /root目录下

#tar jxvf arm-linux-gcc-3.4.5.tar.bz2

(3)在http//handhelds.org/download/toolchai下载arm-linux-toolchain-post-2.2.13.tar.gz仅仅用了它的头文件罢了,首要来自内核/linux-x.x/include下

(4)将arm-linux-toolchain-post-2.2.13.tar.gz解压到/skiff/local/下

#tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz

(5)仿制头文件到/root/usr/3.4.5/arm-linux/下 然后删去/skiff

#cp –dR/skiff/local/arm-linux/include/root/usr/3.3.2/arm-linux#rm -fr/skiff

这样就树立了arm-linux穿插编译环境。

(6)增加/root/usr/local/arm/3.4.5/bin到途径环境变量

Path=$path:/root/usr/local/arm/3.4.5/bin能够检查途径变量是否设置正确。#echo $path

3.4 移植的预先编译

移植u-boot到新的开发板上仅需求修正与硬件相关的部分即可。首要包含两个层面的移植,第一层是针对cpu的移植,第二层是针对Board的移植。因为u-boot-1.1.6里边现已包含S3C2410的移植,而S3C2410与 S3C2440的寄存器根本相同,所以我对板子QQ2440的移植首要是针对board的移植。移植之前需求仔细阅读u-boot目录下的readme文件,其间对怎么移植做了扼要的介绍。为了削减移植的作业量,能够在include/config目录下选一个和要移植的硬件类似的开发板,以便于我手上的 QQ2440V3开发板参数根本匹配,我选的是smdk2410开发板。详细过程如下:

3.4.1 u-boot-1.1.6下的CPU文件夹里现已包含了/arm920t/s3c24x0的目录,其下现已有start.s 、 interrupts.c以及cpu.c、serial.c几个文件,因此不需求树立与CPU相关的目录。

而在后边设置串口波特率时需求获取体系时钟,在U-Boot的第二阶段,lib_arm/board.c中start_armboot函数调用serial_init函数是,会调用到在cpu/arm920t /s3c24x0/speed.c中界说的get_PCLK,get_HCLK,get_PLLCLK等函数,所以要对speed.c做修正。(进程略)

3.4.2 在board目录下创立QQ2440目录以及QQ2440.c、flash.c、memsetup.s和u-boot.lds等文件。不需求从零开端创立,只需挑选一个类似的目录(smdk2410)直接仿制过来,然后修正文件名及内容即可。我在移植u-boot进程中挑选的是u-boot- 1.1.6/board/smdk2410目录。

3.4.2_1 修正makefile(/board/QQ2440/makefile)方针文件名

line28:COBJS := smdk2410.o flash.o

改为:

line28:COBJS := QQ2440.o flash.o //中间代码文件名

3.4.2_2 修正lowlevel_init.s(/board/QQ2440/lowlevel_init.s)

line126:#define REFCNT 1113

改为:

line126:#define REFCNT 0x4f4 //SDRAM的时钟频率不同

3.4.2_3 修正QQ2440.c(/board/QQ2440/QQ2440.c)中board_init函数

#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))

#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))

#define S3C2440_CLKDIV 0x05

#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))

#define S3C2410_UPLL_48MHZ ((0x28<<12)|(0x01<<4)|(0x02))

#define S3C2410_CLKDIV 0x03

so:

计划1:直接在本来的基础上修正寄存器地址和相应的公式。

计划2:经过读取GSTATUS1的值来判别当时的SOC,并一起调用条件子程序。(引荐,进程略)

3.4.2_4 因为QQ2440V3的板子nor flash是AM29LV160DB,而u-boot1.1.6的/board/QQ2440/flash.c下只需AM29LV400DB和 AM29LV800DB的支撑,欲开flash容量,不行避免的要对flash.c文件做些小修正。(修正ID,shell输出信息,CFG_MAX_FLASH_BANKS等)

3.4.3在include/configs目录下增加QQ2440.h,在这儿可放入大局的宏界说等也不需求从头创立,能够在include/configs目录下寻觅类似的CPU的头文件进行仿制,这儿俺用的是smdk2410.h文件来进行相关的修正。

3.4.3_1修正/include/configs/QQ2440.h以调用3.4.2_4,这儿直接把AM29LV400DB的参数改为AM29LV160的参数,并在flash.c中做相应的修正即可。

留意:在/include/flash.h中有相应的宏界说要修正;在/include/configs/QQ2440.h中有对CONFIG_AMD_LV400等一些详细参数(sector,ID,address)的设置

3.4.4 修正u-boot根目录下的makefile文件,参加对板子的声明。

Line1881:QQ2440_config : unconfig

@./(MKCONFIG) $(@:_config=) arm arm920t QQ2440 NULL s3c24x0

对应联系: ARCH cpu开发板Vendor SOC

3.4.5 运转make clobber,删去过错的depend文件。

3.4.6 运转make QQ2440 config。

3.4.7 履行到此处即标明整个软件的makefile已树立,这时可修正生成的makefile中的穿插编译选项,然后翻开makefile文件,并找到其间的句子:

Ifeq($ARCH),arm)

CROSS_COMPILE=arm-linux-endif

接着将其改成

Ifeq($ARCH),arm)

CROSS_COMPILE=/root/usr/local/3.4.5/bin/arm-linux-endif

这一步和上面的设置环境变量只需有一个就能够了。

履行make,陈述有一个过错,修正myboard/flash.c中的#include“../commond/flash.c”为“#u-boot/board/dave/common/flash.c”,从头编译即可经过。

4 移植时的详细修正关键

若预先编译没有过错就能够开端硬件相关代码的移植,首要有必要要对移植的硬件有清楚地了解,如CPU、CPU的操控寄存器及发动各阶段程序在Flash SDRAM中的布局等。

我在移植进程中先修正/include/config/my-board.h头文件中的大部分参数(大部分的宏界说都在这儿设置),然后依照u-boot的发动流程逐渐修正。修正时应了解ARM汇编言语和C言语,一起也应对u-boot发动流程代码有深化的了解。QQ2440板的CPU频率为400MHz、Nor Flash为16Mbit、SDRAM为64Mbit、串口波特率为115200bit/s、环境变量放在EEPROM中。依据两个开发板的不同,需求修正的有:CPU的频率、Flash和SDRAM容量的巨细、环境变量的方位等。因为参阅板现已有了大部分的代码,因此只需求针对my-board进行相应的修正就能够了。

与之相关的文件有

/include/config/myboard.h(大部分的宏界说都在这儿设置)、

/board/myboard/flash.c Flash的驱动序 、

/board/myboard/myboard.c(SDRAM的驱动程序)、

/CPU/S3C2440/serial.c(串口的驱动使能部分)等。

/include/config/myboard.h是大局宏界说的当地,首要的修正有:

将#defineCONFIG QQ2440 CLOCKSPEED 75改为

#defineCONFIG QQ2440 CLOCK SPEED 400;

将#define PHYS SDRAM 1 SIZE 0x01000000 改为

#define PHYS SDRAM 1 SIZE 0x00800000;

将#define PHYS FLASH 1 SIZE 0x00400000改为

#define PHYS FLASH 1 SIZE 0x00200000;

将#define CFG MAX FLASH SECT 256改为

#define CFG MAX FLASH SECT 35 ;

将#define CFG ENV IS EEPROM 1 改为

#define CFG ENV IS IN FLASH 1

其它(如仓库的巨细等)可依据需求修正。

因为Flash、SDRAM的容量会发生变化,故应对发动阶段程序在Flash、SDRAM中的方位从头作出组织。笔者将Flash中的u-boot代码放在0x0开端的当地,而将仿制到SDRAM中的u-boot代码组织在0xc700000开端的当地。

Flash的修正不只和容量有关,还和详细类型有关,Flash存储器的烧写和擦除一般不具有通用性,应检查厂家的运用说明书,针对不同类型的存储器作出相应的修正。修正进程中,需求了解Flash擦写特定寄存器的写入地址、数据指令以及扇区的巨细和方位,以便进行正确的设置。

SDRAM要修正的当地首要是初始化内存操控器部分,由start.s文件中的 cpuinitcrit完结CPUcache的设置,并由board/myboard/memsetup.s中的memsetup完结初始化SDRAM。 QQ2440供给有SDRAM操控器,与一些CPU需求UPM表编程比较,它只需进行相关寄存器的设置修正即可,因此降低了开发的难度。

串口波特率不需求修正(都是115200bit/s),直接用QQ2440板的串口驱动即可。串口的设置首要包含初始化串口部分,值得留意的是:串口的波特率与时钟MCLK有很大联系,详见CPU用户手册。

装备好今后,便能够从头编译u-boot代码。将得到的u-boot.bin经过JTAG口下载到方针板后,假如能从串口输出正确的发动信息,就标明移植根本成功。实践进程中会因为考虑不周而需求屡次修正。移植成功后,也能够增加一些其它功用(如LCD驱动等),在此基础上增加功用相对比较简单。

5 结束语

u-boot是一个功用强壮的bootloader开发软件,适用的cpu渠道及支撑的嵌入式操作体系许多。本文是笔者在实践开发进程中依据相关材料进行探索,并在成功移植了u-boot的基础上总结出来的。关于不同的CPU和开发板,其根本的办法和过程是相同的,期望能对相关嵌入式体系的规划人员有所协助

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/262661.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部