基于S3C2440的u-boot的移植

发布者:花开堂前最新更新时间:2016-04-20 来源: eefocus关键字:S3C2440  u-boot  移植 手机看文章 扫描二维码
随时随地手机看文章
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和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助

关键字:S3C2440  u-boot  移植 引用地址:基于S3C2440的u-boot的移植

上一篇:ARM处理器9种基本寻址方式
下一篇:触摸屏的移植(s3c2410)

推荐阅读最新更新时间:2024-03-16 14:51

S3C2440 Linux驱动移植——NAND驱动
开发板:TQ2440 内核:Linux 2.6.32 PC OS:Ubuntu 11.04 本文将对NAND驱动的移植进行简单介绍。其中,将对NAND控制器所需要的参数进行详细说明。 1. 修改分区表 打开文件arch/arm/plat-s3c24xx/common-smdk.c,修改mtd_partition结构体数组。 修改后如下: static struct mtd_partition smdk_default_nand_part = { = { .name = Uboot , .size = 0x00040000, .offset = 0x00000000,
[单片机]
<font color='red'>S3C2440</font> Linux驱动<font color='red'>移植</font>——NAND驱动
linux +qt4.7+opencv2.2移植到tq2440开发板
以下操作在Fedora下使用超级用户进行 我已经安装了交叉编译器arm-linux-gcc 4.3.3和qt4.5的x86和arm版本 在目录/opt/EmbedSky下。 修改配置文件/etc/profile 添加 pathmunge /opt/EmbedSky/4.3.3/bin 安装CMake OpenCV 2.1的版本,必须使用CMake创建Makefile。我使用的CMake版本是2.6-Linux-i386的,是fedora通过软件添加和载卸功能添加的(这个cmake要重新安装,而且要添加bin进去路径) 编译OpenCV: 1、解压OpenCV 2.1到/opt/EmbedSky/OpenCV-2.1.0目录下
[单片机]
s3c2440裸机-I2c编程-3.i2c程序框架
1.iiC设备的功能 很显然,IIC控制器提供了传输数据的能力,至于数据有什么含义,IIC控制器并不知道,数据的含义有外部i2c从设备,我们需要阅读芯片手册,才知道IIC控制器应该发出怎样的数据。 下图是AT24cxx的操作方法: 2.I2c程序框架 显然我们的程序应该分为两层(IIC设备层,IIC控制器层),框架如下图所示: 最上层是i2c_test层,用来对i2c的功能进行测试和验证。 第2层是i2c设备层,用来对具体某一型号的从设备进行i2c读写 第3层是通用i2c控制器层,用来提供对具体某一型号的i2c主控进行管理操作 最底层是i2c控制器具体的型号层 在通用i2c控制层,我们提供一个统一的接口i2c_transf
[单片机]
<font color='red'>s3c2440</font>裸机-I2c编程-3.i2c程序框架
S3C2440之MMU驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出自己写的S3C2440 MMU代码库。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。 该源码结构简单明了,原始工程下载地址: 点击打开链接 Register 0, ID code register: unsigned int MMU_ReadID(void) { unsigned int id; __asm( mrc p15, 0, id, c0, c0, 0 ); return id; } Register 0, cache type register: unsigned int
[单片机]
STM32笔记之二十:四步,从IAR4移植到IAR5
起因:一直用豆皮的小容量单片机,同学需要使用DA,所以换大容量。炳哥哥推荐调试大容量换IAR5,经过此高人指点,总结移植步骤如下。 步骤0,准备原版程序库,也就是说需要移植的程序是2.03则准备官方原版2.03库。 步骤一:把原版库里面project下的EWARMv5下所有文件拷贝到需要移植的IAR4程序文件夹里,覆盖所有同名文件 步骤二:用IAR5打开覆盖好的工程,删除FWLib和user下的所有文件,并重新加入这些文件。因为eww文件被覆盖后,这些文件的位置会错误。 步骤三:重新整理系统寻找的文件夹位置ProjectOption C/C++ CompilerPreprocessorAdditional include d
[单片机]
华人软件工程师移植Android系统入驻上网本
  如果你想体验Google手机操作系统Android的神奇魅力,但不愿意花几千元钱购买昂贵的Android手机,那Android的PC移植版本可能是不错的一个选择。   大家可能还记得之前媒体刚刚公布有人成功的在华硕上网本上安装了Android系统时的新闻,但对于普通用户来说,那还只是一个实验性的产品。要真正安装上,还有巨大的困难和工作。   不过,在几位华人软件工程师的努力下,中国的用户已经可以享受到真正在上网本上可以安装使用的Android了,这就是孙翊、黄志伟和CorentinChary和其他几位活跃的开发人员正在参与的Android-x86开源项目。此外,还有其他的开发人员如Kelly2。Blue、WuHaiGang
[手机便携]
05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动
一、前面的工作: (1)从头移植3.4.2内核,修改分区,制作jffs2文件系统 http://blog.csdn.net/fengyuwuzu0519/article/details/69802922 (2)修改内核支持yffs2、制作yffs2文件系统、内核裁剪、制作补丁 http://blog.csdn.net/fengyuwuzu0519/article/details/70162666 (3)移植内核支持DM9000C网卡驱动(可以使用mount nfs)、支持三路串口 http://blog.csdn.net/fengyuwuzu0519/article/details/72846205 到此我
[单片机]
05-S3C2440学习之内核(<font color='red'>移植</font>)linux3.4.2<font color='red'>移植</font>(4)支持LED驱动、按键驱动
S3C2440 块设备驱动之框架详细分析
本节目的: 通过分析2.6内核下的块设备驱动框架,知道如何来写驱动 1、之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠标、键盘等。 2、接下来本届开始学习块设备驱动 块设备: 块设备是i/o设备中的一类,当我们的应用层对该设备读写时,是按扇区大小来读写数据,若读写的数据小于扇区的大小,就会需要缓存区,可以随机读写设备的任意位置处的数据,例如 普通文件(*txt,*.c等),硬盘,U盘,SD卡 3、块设备结构: 段(S
[单片机]
<font color='red'>S3C2440</font> 块设备驱动之框架详细分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved