跳至主要内容

【转】Bootloader(Vivi)源代码分析

Bootloader(Vivi)源代码分析

----基于S3C2410处理器

1.1 Vivi简介

Vivi 是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,见下表:

命令

功能

Load

把二进制文件载入FlashRAM

Part

操作MTD分区信息。显示、增加、删除、复位、保存MTD分区

Param

设置参数

Boot

启动系统

Flash

管理Flash,如删除Flash的数据

1.2 vivi的配置与编译

1.2.1 建立交叉开发环境

1、在宿主机上安装标准Linux 操作系统:Redhat 9.0 ( 主机系统为win2000,用虚拟机vmware安装的Redhat 9.0,内核版本为2.4.18)

2、宿主机上安装交叉编译器。

我这边的2410开发板提供的光盘上已附交叉编译器工具:arm-linux-gcc-2.95.3(源码为cross-2.95.3.tar.bz2)。

先以root 用户的身份登陆到linux 下。

进入/usr/local 目录,创建名为arm的目录:

cd /usr/local

mkdir arm

将光盘提供的cross-2.95.3.tar.bz2解压到/usr/local/arm目录:

tar jxvf cross-2.95.3.tar.bz2 C /usr/local/arm

然后修改修改PATH 变量:为了可以方便使用arm-linux-gcc编译器系统, arm-linux工具链目录加入到环境变量PATH中:

修改/etc/profile文件,添加pathmunge /usr/local/arm/2.95.3/bin即可。

# Path manipulation

if [ `id -u` = 0 ]; then

pathmunge /sbin

pathmunge /usr/sbin

pathmunge /usr/local/sbin

pathmunge /usr/local/arm/2.95.3/bin

fi

pathmunge /usr/X11R6/bin after

设置环境变量后,最好是重启或注销一下,这样设置的环境变量才能生效。

1.2.2 配置和编译vivi

如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flashvivi 二进制映象文件。

由于vivi要用到kernel的一些头文件,所以需要kernel的源代码,所以先要把linuxkernel准备好。将vivikernel都解到相应目录下(例如我将光盘提供的vivi源代码解压到/home/chenjun目录下,光盘提供的Linux kernel源码kernel-h2410eb.041024.tar.gz也解压到/home/chenjun目录下,解压后的文件名为kerne-h2410eb)。

然后需修改/vivi/Makefile里的一些变量设置:

? LINUX_INCLUDE_DIR = /kernel/include/

LINUX_INCLUDE_DIR kernel/include的对应目录,我的是/home/chen/kerne-h2410eb /include/

因此修改为:

LINUX_INCLUDE_DIR = /home/chenjun/ kerne-h2410eb/include/

? CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-

(CROSS_COMPILE arm-linux安装的相应目录,我的是/usr/local/arm/2.95.3/bin/arm-linux-)

因此修改为:

CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-

? ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3

(需根据你arm-linux的安装目录修改,我的是/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3

进入/vivi目录执行make distclean。(目的是确保编译的有效性,在编译之前将vivi里所有的"*.o""*.o.flag"文件删掉)

进入/vivi目录里,输入"make menuconfig",开始选择配置。可以Load一个写好的配置文件也可以自己修改试试。注意Exit时一定要选"Yes"保存配置。

再输入"make"正式开始编译,一会儿就完了。如果不报错,在/vivi里面就有你自己的"vivi"了。这个就是后面要烧写到flash中的bootloader

1.3 vivi代码分析

vivi的代码包括archinitlibdriversinclude等几个目录,共200多条文件。

Vivi主要包括下面几个目录:

arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。

drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分mapnandnor三个目录。

init:这个目录只有main.cversion.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。

lib:一些平台公共的接口代码,比如time.c里的udelay()mdelay()

include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。

1.4 vivi的运行

vivi的运行也可以分为两个阶段:

1.4.1 vivi的第一阶段

完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(\vivi\arch\s3c2410目录下)

Head.S

#include "config.h"

#include "linkage.h"

#include "machine.h"

@ Start of executable code

ENTRY(_start)

ENTRY(ResetEntryPoint)

@

@ Exception vector table (physical address = 0x00000000) ;异常向量表物理地址

@

@ 0x00: Reset ;复位

b Reset

@ 0x04: Undefined instruction exception ;未定义的指令异常

UndefEntryPoint:

b HandleUndef

@ 0x08: Software interrupt exception ;软件中断异常

SWIEntryPoint:

b HandleSWI

@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort) ;内存操作异常

PrefetchAbortEnteryPoint:

b HandlePrefetchAbort

@ 0x10: Data Access Memory Abort ;数据异常

DataAbortEntryPoint:

b HandleDataAbort

@ 0x14: Not used ;未使用

NotUsedEntryPoint:

b HandleNotUsed

@ 0x18: IRQ(Interrupt Request) exception ;慢速中断处理

IRQEntryPoint:

b HandleIRQ

@ 0x1c: FIQ(Fast Interrupt Request) exception ;快速中断处理

FIQEntryPoint:

b HandleFIQ

@

@ VIVI magics

@

@ 0x20: magic number so we can verify that we only put

.long 0

@ 0x24:

.long 0

@ 0x28: where this vivi was linked, so we can put it in memory in the right place

.long _start

@ 0x2C: this contains the platform, cpu and machine id

.long ARCHITECTURE_MAGIC

@ 0x30: vivi capabilities

.long 0

#ifdef CONFIG_PM vivi考虑不需要使用电源管理

@ 0x34:

b SleepRamProc

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总...

【转】GPIO编程模拟I2C入门

ARM编程:ARM普通GPIO口线模拟I2C  请教个问题: 因为需要很多EEPROM进行点对点控制,所以我现在要用ARM的GPIO模拟I2C,管脚方向我设 置的是向外的。我用网上的RW24C08的万能程序修改了一下,先进行两根线的模拟,SDA6, SCL6,但是读出来的数不对。我做了一个简单的实验,模拟SDA6,SCL6输出方波,在示波 器上看到正确方波,也就是说,我的输出控制是没问题的。 哪位大哥能指点一下,是否在接收时管脚方向要设为向内?(不过IOPIN不管什么方向都可 以读出当前状态值的阿) 附修改的RW24C08()程序: #define  SomeNOP() delay(300); /**/ /* *********************************  RW24C08   **************************************** */ /**/ /* ----------------------------------------------------------------------------- ---  调用方式:void I2CInit(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CInit( void ) ... {  IO0CLR  =  SCL6;      // 初始状态关闭总线  SomeNOP();  // 延时   I2CStop();  // 确保初始化,此时数据线是高电平 }   /**/ /* ---------------------------------------------------------------------------- ----  调用方式:void I2CSta...

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如...