BootloaderVivi源代码分析——基于S3C2410处理器.doc
《BootloaderVivi源代码分析——基于S3C2410处理器.doc》由会员分享,可在线阅读,更多相关《BootloaderVivi源代码分析——基于S3C2410处理器.doc(20页珍藏版)》请在三一文库上搜索。
1、Bootloader(Vivi)源代码分析 -基于S3C2410处理器作者:forkchenEmail:chenjunbupt-QQ:56155986欢迎广大嵌入式之友多多交流目 录1.1 Vivi简介21.2 vivi的配置与编译31.2.1 建立交叉开发环境31.2.2 配置和编译vivi41.3 vivi代码分析41.4 vivi的运行51.4.1 vivi的第一阶段51.4.2 vivi的第二阶段151.5 启动代码执行流程图171.6 vivi的配置文件191.1 Vivi简介Vivi 是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:
2、启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,见下表:命令 功能 Load把二进制文件载入Flash或RAM Part操作MTD分区信息。显示、增加、删除、复位、保存MTD分区 Param设置参数 Boot启动系统 Flash管理Flash,如删除Flash的数据1.2 vivi的配置与编译1.2.1 建立交叉开发环境1、在宿主机上安装标准Linux 操作系统:Redhat 9.0 ( 主机系统为win2000,用虚拟机vmware安装
3、的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/localmkdir arm将光盘提供的cross-2.95.3.tar.bz2解压到/usr/local/arm目录:tar jxvf cross-2.95.3.tar.bz2 C /usr/local/arm然后修改修改PATH 变量:为了可以方便使用a
4、rm-linux-gcc编译器系统, 把arm-linux工具链目录加入到环境变量PATH中:修改/etc/profile文件,添加pathmunge /usr/local/arm/2.95.3/bin即可。# Path manipulationif 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设置环境变量后,最好是重启或注销一下,这样设置的环境
5、变量才能生效。1.2.2 配置和编译vivi如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flash的vivi 二进制映象文件。由于vivi要用到kernel的一些头文件,所以需要kernel的源代码,所以先要把linux的kernel准备好。将vivi和kernel都解到相应目录下(例如我将光盘提供的vivi源代码解压到/home/chenjun目录下,光盘提供的Linux kernel源码kernel-h2410eb.041024.tar.gz也解压到/home/chenjun目录下,解压后的文件名为kerne-h2410eb)。然后需修改/vivi
6、/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
7、/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”文件删掉)进入/
8、vivi目录里,输入“make menuconfig”,开始选择配置。可以Load一个写好的配置文件也可以自己修改试试。注意Exit时一定要选“Yes”保存配置。再输入“make”正式开始编译,一会儿就完了。如果不报错,在/vivi里面就有你自己的“vivi”了。这个就是后面要烧写到flash中的bootloader。1.3 vivi代码分析vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。Vivi主要包括下面几个目录:arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。drivers:其中包括了引导内核需要的
9、设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。1.4 vivi的运行vivi的运行也可以分为两个阶段:1.4.1
10、vivi的第一阶段完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(viviarchs3c2410目录下):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;复位bReset 0x
11、04: Undefined instruction exception;未定义的指令异常UndefEntryPoint:bHandleUndef 0x08: Software interrupt exception;软件中断异常SWIEntryPoint:bHandleSWI 0x0c: Prefetch Abort (Instruction Fetch Memory Abort);内存操作异常PrefetchAbortEnteryPoint:bHandlePrefetchAbort 0x10: Data Access Memory Abort;数据异常DataAbortEntryPoint:
12、bHandleDataAbort 0x14: Not used;未使用NotUsedEntryPoint:bHandleNotUsed 0x18: IRQ(Interrupt Request) exception;慢速中断处理IRQEntryPoint:bHandleIRQ 0x1c: FIQ(Fast Interrupt Request) exception;快速中断处理FIQEntryPoint:bHandleFIQ VIVI magics 0x20: magic number so we can verify that we only put .long 0 0x24:.long 0 0
13、x28: 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:bSleepRamProc#endif#ifdef CONFIG_TEST 0x38:bhmi#endif Start VIV
14、I headReset: disable watch dog timer;禁止看门狗计时器movr1, #0x53000000;WTCON寄存器地址是0x53000000,清0movr2, #0x0strr2, r1#ifdef CONFIG_S3C2410_MPORT3;不符合条件,跳到下面的关中断/* 在/vivi/include/autoconf.h中#undef CONFIG_S3C2410_MPORT3*/movr1, #0x56000000;GPACON寄存器地址是0x56000000movr2, #0x00000005strr2, r1, #0x70;配置GPHCON寄存器mov
15、 r2, #0x00000001strr2, r1, #0x78;配置GPHUP寄存器movr2, #0x00000001str r2, r1, #0x74;配置GPHDAT寄存器#endif disable all interrupts;禁止全部中断movr1, #INT_CTL_BASEmovr2, #0xffffffffstrr2, r1, #oINTMSK;掩码关闭所有中断ldrr2, =0x7ffstrr2, r1, #oINTSUBMSK initialise system clocks;初始化系统时钟movr1, #CLK_CTL_BASEmvnr2, #0xff000000st
16、rr2, r1, #oLOCKTIMEldrr2, mpll_50mhzstrr2, r1, #oMPLLCON#ifndef CONFIG_S3C2410_MPORT1;满足条件,向下执行/* 在/vivi/include/autoconf.h中#undef CONFIG_S3C2410_MPORT1*/ 1:2:4movr1, #CLK_CTL_BASEmovr2, #0x3strr2, r1, #oCLKDIVNmrcp15, 0, r1, c1, c0, 0 read ctrl register orrr1, r1, #0xc0000000 Asynchronous mcrp15, 0
17、, r1, c1, c0, 0 write ctrl register now, CPU clock is 200 Mhz;CPU的频率是200MHzmovr1, #CLK_CTL_BASEldrr2, mpll_200mhzstrr2, r1, #oMPLLCON#else 1:2:2 mov r1, #CLK_CTL_BASE ldr r2, clock_clkdivn str r2, r1, #oCLKDIVN mrc p15, 0, r1, c1, c0, 0 read ctrl register orr r1, r1, #0xc0000000 Asynchronous mcr p15
18、, 0, r1, c1, c0, 0 write ctrl register now, CPU clock is 100 Mhz;CPU的频率是100MHz mov r1, #CLK_CTL_BASE ldr r2, mpll_100mhz str r2, r1, #oMPLLCON#endifblmemsetup;跳转到memsetup函数/*Memsetup函数的实现:ENTRY(memsetup) initialise the static memory set memory control registers;设置内存控制寄存器的初值movr1, #MEM_CTL_BASEadrlr2
19、, mem_cfg_val/* Data Area Memory configuration values.align 4mem_cfg_val:;定义好的13*4=52个字节初值.longvBWSCON;在/vivi/include/platform/smdk2410.h中赋值/* SDRAM从32位变成16位,需要修改vBWSCON的值 */.longvBANKCON0.longvBANKCON1.longvBANKCON2.longvBANKCON3/* 网卡控制器vBANKCON3的值可能需要修改 */.longvBANKCON4.longvBANKCON5.longvBANKCON6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BootloaderVivi 源代码 分析 基于 S3C2410 处理器
链接地址:https://www.31doc.com/p-2366275.html