您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > s3c2410的Bootloader(Vivi)源代码分析
s3c2410的Bootloader(Vivi)源代码分析----基于S3C2410处理器作者:forkchenEmail:chenjun@bupt-bcnl.comQQ:56155986欢迎广大嵌入式之友多多交流目录1.1Vivi简介...21.2vivi的配置与编译...31.2.1建立交叉开发环境...31.2.2配置和编译vivi41.3vivi代码分析...41.4vivi的运行...51.4.1vivi的第一阶段...51.4.2vivi的第二阶段...151.5启动代码执行流程图...171.6vivi的配置文件...191.1Vivi简介Vivi是韩国mizi公司开发的bootloader,适用于ARM9处理器。Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,见下表:命令功能Load把二进制文件载入Flash或RAMPart操作MTD分区信息。显示、增加、删除、复位、保存MTD分区Param设置参数Boot启动系统Flash管理Flash,如删除Flash的数据1.2vivi的配置与编译1.2.1建立交叉开发环境1、在宿主机上安装标准Linux操作系统:Redhat9.0(主机系统为win2000,用虚拟机vmware安装的Redhat9.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/localmkdirarm将光盘提供的cross-2.95.3.tar.bz2解压到/usr/local/arm目录:tarjxvfcross-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即可。#Pathmanipulationif[`id-u`=0];thenpathmunge/sbinpathmunge/usr/sbinpathmunge/usr/local/sbinpathmunge/usr/local/arm/2.95.3/binfipathmunge/usr/X11R6/binafter设置环境变量后,最好是重启或注销一下,这样设置的环境变量才能生效。1.2.2配置和编译vivi如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flash的vivi二进制映象文件。由于vivi要用到kernel的一些头文件,所以需要kernel的源代码,所以先要把linux的kernel准备好。将vivi和kernel都解到相应目录下(例如我将光盘提供的vivi源代码解压到/home/chenjun目录下,光盘提供的Linuxkernel源码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目录执行makedistclean。(目的是确保编译的有效性,在编译之前将vivi里所有的“*.o”和“*.o.flag”文件删掉)进入/vivi目录里,输入“makemenuconfig”,开始选择配置。可以Load一个写好的配置文件也可以自己修改试试。注意Exit时一定要选“Yes”保存配置。再输入“make”正式开始编译,一会儿就完了。如果不报错,在/vivi里面就有你自己的“vivi”了。这个就是后面要烧写到flash中的bootloader。1.3vivi代码分析vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。Vivi主要包括下面几个目录:arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。drivers:其中包括了引导内核需要的设备的驱动程序(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.4vivi的运行vivi的运行也可以分为两个阶段:1.4.1vivi的第一阶段完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(\vivi\arch\s3c2410目录下):Head.S:#includeconfig.h#includelinkage.h#includemachine.h@StartofexecutablecodeENTRY(_start)ENTRY(ResetEntryPoint)@@Exceptionvectortable(physicaladdress=0x00000000);异常向量表物理地址@@0x00:Reset;复位bReset@0x04:Undefinedinstructionexception;未定义的指令异常UndefEntryPoint:bHandleUndef@0x08:Softwareinterruptexception;软件中断异常SWIEntryPoint:bHandleSWI@0x0c:PrefetchAbort(InstructionFetchMemoryAbort);内存操作异常PrefetchAbortEnteryPoint:bHandlePrefetchAbort@0x10:DataAccessMemoryAbort;数据异常DataAbortEntryPoint:bHandleDataAbort@0x14:Notused;未使用NotUsedEntryPoint:bHandleNotUsed@0x18:IRQ(InterruptRequest)exception;慢速中断处理IRQEntryPoint:bHandleIRQ@0x1c:FIQ(FastInterruptRequest)exception;快速中断处理FIQEntryPoint:bHandleFIQ@@VIVImagics@@0x20:magicnumbersowecanverifythatweonlyput.long0@0x24:.long0@0x28:wherethisviviwaslinked,sowecanputitinmemoryintherightplace.long_start@0x2C:thiscontainstheplatform,cpuandmachineid.longARCHITECTURE_MAGIC@0x30:vivicapabilities.long0#ifdefCONFIG_PM;vivi考虑不需要使用电源管理@0x34:bSleepRamProc#endif#ifdefCONFIG_TEST@0x38:bhmi#endif@@StartVIVIhead@Reset:@disablewatchdogtimer;禁止看门狗计时器movr1,#0x53000000;WTCON寄存器地址是0x53000000,清0movr2,#0x0strr2,[r1]#ifdefCONFIG_S3C2410_MPORT3;不符合条件,跳到下面的关中断/****在/vivi/include/autoconf.h中#undefCONFIG_S3C2410_MPORT3******/movr1,#0x56000000;GPACON寄存器地址是0x56000000movr2,#0x00000005strr2,[r1,#0x70];配置GPHCON寄存器movr2,#0x00000001strr2,[r1,#0x78];配置GPHUP寄存器movr2,#0x00000001strr2,[r1,#0x74];配置GPHDAT寄存器#endif@disableallinterrupts;禁止全部中断movr1,#INT_CTL_BASEmovr2,#0xffffffffstrr2,[r1,#oINTMSK];掩码关闭所有中断ldrr2,=0x7ffstrr2,[r1,#oINTSUBMSK]@initialsystemtime;初始化系统时钟movr1,#CLK_CTL_BASEmvnr2,#0xff000000strr2,[r1,#oLOCKTIME]@ldrr2,mpll_50mhz@strr2,[r1,#oMPLLCON]#ifndefCONFIG_S3C2410_MPORT1;满足条件,向下执行/****在/vivi/include/autoconf.h中#undefCONFIG_S3C2410_MPORT1******/@1:2:4movr1,#CLK_CTL_BASEmovr2,#0x3strr2,[r1,#oCLKDIVN]mrcp15,0,r1,c1,c0,0@readctrlregisterorrr1,r1,#0xc0000000@Asynchronousmcrp15,0,r1,c1,c0,0@writectrlregister@now,CPUclockis200Mhz;CPU的频率是200MHzmovr1,#CLK_CTL_BASEldrr2,mpll_200mhzstrr2,[r1,#oMPLLCON]#else@1:2:2movr1,#CLK_CTL_BASEldrr2,clock_clkdivnstrr2,[r1,#oCLKDIVN]mrcp15,0,r1,c1,c0,0@readctrlregisterorrr1,r1,#0xc0000000@Asynchronousmcrp15,0,r1,c1,c0,0@writectrlregister@now,CPUclockis100Mhz;CPU的频率是100MHzmovr1,#CLK
本文标题:s3c2410的Bootloader(Vivi)源代码分析
链接地址:https://www.777doc.com/doc-12265 .html