您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 基于S3C2410开发板的BootLoader实现
3.3基于S3C2410开发板的BootLoader实现本节将以实例讲述基于S3C2410开发板的BootLoader的具体实现,主要分两个方面进行介绍,一是介绍基于U-Boot的移植,二是介绍DIY方式开发BootLoader。要移植或开发BootLoader首先要清楚具体的硬件系统,在这里就是要了解我们使用的目标板——S3C2410开发板。3.3.1S3C2410开发板介绍本书中所设计的开发板相关的实例都是基于S3C2410开发板设计和测试的。S3C2410开发板是非常通用的一款ARM9开发板,读者使用任何类型的ARM9开发板都能参考书中的实例。S3C2410开发板的基本配置如下:●CPU采用三星的S3C2410ARM920T,主频203MHz。集成有SDRAM内存控制器、NANDFlash控制器、SD卡控制器、USBHost和USBDevice控制器、LCD控制器、IIC总线控制器、IIS控制器、SPI接口等多种接口。●存储器64MB的SDRAM;64MB的NANDFlash[注1]。*●以太网控制器10MB网口、CS8900Q3、带联接和传输指示灯。●串行接口系统提供两个串行收发DB9母口连接器,上面分别表示COM0、COM1。●USBHost接口两个USB1.1HOST接口;一个USB1.1Device接口。●存储接口一个SD卡接口;一个十针的AD接口;一个IDE接口。●LCD和触摸屏接口一个50芯LCD接口引出了LCD控制器和触摸屏的全部信号。提供TFT真彩LCD的接口,LCD模块不需要外接电源等,插入该接口直接可以使用。接口另外还带触摸屏的接口。●调试及下载接口20针Multi-ICE标准JTAG接口,支持SDT2.51和ADS1.2调试。●音频接口采用IIS接口芯片UDA1341,一路立体声音频输出接口可接耳机或音箱;支持录音,开发板自带主机体话筒可直接录音,另有一路话筒输入接口可接麦克风。●电源接口5V电源供电,带电源开关和指示灯。●操作系统支持Linux2.4或以上系统,支持WindowsCE4.2.net。开发板上包括1片64M×8位数据宽度的NANDFlash(K9F1208)和2片16M×16位数据宽度的SDRAM,地址范围为0x30000000~0x34000000。S3C2410将系统的存储空间分为8组(Bank),每组大小为128MB,共1GB。Bank0到Bank5之间的开始地址是固定的,用于ROM或SRAM;Bank6和Bank7用于ROM、SRAM或SDRAM,这两个组是可编程且大小相同的。S3C2410具有3种启动方式,通过OM[1:0]管脚进行选择。①OM[1:0]=00时,处理器通过NANDFlash启动;②OM[1:0]=01时,处理器通过16位宽的ROM启动;③OM[1:0]=10时,处理器通过32位宽的ROM启动。由于NANDFlash有容量大,比NorFlash便宜等优势,所以经常选择NANDFlash启动。当从NorFlash启动时,要把Flash芯片的首地址映射到0x00000000位置,系统启动后,启动程序本身把自己从Flash搬运到RAM中去。当从NANDFlash启动时,S3C2410会自动把NANDFlash的前4KB数据搬到自己内部的RAM中去,并把内部RAM的首地址设为0x00000000,CPU从0x00000000地址开始运行。本章选择的实现启动方式就是通过NANDFlash启动。如图3.1所示为通过NorFlash启动和NANDFlash启动两种方式存储空间的分配,图(a)是nGCS0片选的NorFlash启动模式存储分配图;图(b)是NANDFlash启动模式的存储分配图。其中SFR为SpecialFunctionRegister的缩写,即特殊功能寄存器。3.3.2U-Boot分析与移植本节以应用非常广泛的U-Boot为例讲述基于S3C2410开发板的BootLoader分析与移植。解压u-boot-1.1.6.tar.bz2包,查看其目录结构如下所示:#tree–L1-d.|--board|--common|--cpu|--disk|--doc|--drivers|--dtt|--examples|--fs|--include|--lib_arm|--lib_avr32|--lib_blackfin|--lib_generic|--lib_i386|--lib_m68k|--lib_microblaze|--lib_mips|--lib_nios|--lib_nios2|--lib_ppc|--nand_spl|--net|--post|--rtc`--tools26directories(a)(b)图3.1两种启动方式内存映射的比较(a)NotusingNANDFlashforbootingROM;(b)UsingNANDFlashforbootingROM大多数BootLoader都包含“启动加载”模式和“下载”模式,U-Boot作为一款强大的Boot-Loader也支持这两种工作模式,并且允许用户在这两种模式之间切换。同时U-Boot也分为Stage1和Stage2两个阶段,其中依赖于CPU体系结构的代码通常都放在Stage1里,并且通常用汇编语言实现;Stage2通常用C语言实现,可以实现更复杂的功能,并且有更好的移植性和可读性。1.U-BootStage1分析U-Boot的Stage1通常是在start.S文件中实现的,并且都是用汇编语言编写的。一个可执行性image文件必须有一个入口点,并且只能有一个全局入口点,通常这个入口点的地址放在ROM(Flash)0x0位置,因此必须使编译器知道这个入口地址,该过程通常通过修改连接器的脚本文件来完成。由于S3C2410开发板与smdk2410开发板的配置接近,所以此处参考smdk2410的U-Boot实现程序。打开board/smdk2410/u-boot.lds文件,该脚本文件的内容如下所示:OUTPUT_FORMAT(elf32-littlearm,elf32-littlearm,elf32-littlearm)OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{.=0x00000000;.=ALIGN(4);.text:{cpu/arm920t/start.o(.text)*(.text)}.=ALIGN(4);.rodata:{*(.rodata)}.=ALIGN(4);.data:{*(.data)}.=ALIGN(4);.got:{*(.got)}.=.;__u_boot_cmd_start=.;.u_boot_cmd:{*(.u_boot_cmd)}__u_boot_cmd_end=.;.=ALIGN(4);__bss_start=.;.bss:{*(.bss)}_end=.;}其中,ENTRY(_start)在cpu/arm920t/start.S文件定义了入口点,入口地址为0x00000000。在cpu/arm920t/config.mk文件中定义了代码区基地址TEXT_BASE=0x33F80000。接下来分析U-Boot的Stage1的核心文件start.S。(1)设置异常向量表ARM处理器一般包括复位、未定义指令、SWI、预取终止、数据终止、IRQ、FIQ等异常,关于ARM处理器这些异常在后面会有专门的介绍,其中U-Boot中关于异常向量的定义如下,当发生异常时执行cpu/arm920t/interrupts.c文件。.globl_start_start:bresetldrpc,_undefined_instructionldrpc,_software_interruptldrpc,_prefetch_abortldrpc,_data_abortldrpc,_not_usedldrpc,_irqldrpc,_fiq(2)设置CPU模式为SVC模式Reset即复位,在系统中经常会用到,该操作是异常处理的第一个操作,其主要目的是设置CPU模式为SVC模式。在此有必要介绍一下ARM处理器的7种工作模式。●用户模式(usr)ARM处理器正常的程序执行状态;●快速中断模式(fiq)用于高速数据传输或通道处理;●外部中断模式(irq)用于通用的中断处理;●管理模式(svc)操作系统使用的保护模式;●数据访问终止模式(abt)当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护;●系统模式(sys)运行具有特权的操作系统任务;●未定义指令中止模式(und)当未定义的指令执行时进入该模式,可用于支持协处理器的软件仿真。ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决于微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R0~R14、程序计数器PC、一个或两个状态寄存器都是可访问的。通用寄存器包括R0~R15,可以分为3类。●未分组寄存器R0~R7在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途。因此,在中断或异常处理进行运行模式转换时,由于不同处理器的运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。●分组寄存器R8~R14对于分组寄存器,它们每一次所访问的物理寄存器与处理器当前的运行模式有关。对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。●程序计数器PC(R15)在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1]用于保存PC。虽然可以用作通用寄存器,但是有一些指令在使用R15时有一些特殊限制,若不注意,执行的结果将是不可预料的。在ARM状态下,PC的0和1位是0,在Thumb状态下,PC的0位是0。注意,Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。同时,在每一种特权模式下都有一组SP、LR和SPSR。设置CPU模式为SVC模式操作的具体实现代码如下,其中CPSR是CurrentProgramStatusRegister的缩写,即当前程序状态寄存器,寄存器R16用作CPSR,CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR是SavedProgramStatusRegister的缩写,即备份程序状态寄存器,当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。与CPU相关的寄存器设置需要参考S3C2410的用户手册来实现。mrsr0,cpsrbicr0,r0,#0x1forrr0,r0,#0xd3msrcpsr,r0(3)关闭看门狗看门狗即watchdogtimer,是一个定时器电路,一般有一个输入叫喂狗,一个输出到MCU(MicroControllerUnit,多点控制单元)的RST端(复位端)。MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给WDT(watchdogtimer的简写)清零,如果超过规定的时间不喂狗,一般在程序跑飞时WDT定时超过,就会给出一个复位信号到MCU,然后MCU复位。看门狗的作用就是防止程序发生死循环,或者说程序跑飞。根据S3C2410的用户手册,关闭看门狗的具体实现如下:#ifdefine
本文标题:基于S3C2410开发板的BootLoader实现
链接地址:https://www.777doc.com/doc-17012 .html