Bootloader的学习.docx
《Bootloader的学习.docx》由会员分享,可在线阅读,更多相关《Bootloader的学习.docx(53页珍藏版)》请在冰豆网上搜索。
Bootloader的学习
Bootloader 的学习
Bootload:
在操作系统内核运行前运行的一段程序,相当于PC机上的BIOS,用于初始化硬件设备,和建立内存空间的映射,从而将系统的软硬件环境带到一个合适的状态。
复位后,从地址0x00000000处取它第一条指令。
典型的嵌入式系统Bootload有Blob(bootloadobject)和U-boot(universalbootloader)
其中U-boot支持ARM,MIPS,X86,Nios,可启动VxWorks,QNX,Linux
在flash里,首先存放bootload,其次启动参数,是内核和根文件系统
bootloader分两个部分,stage1和stage2:
stage1:
汇编部分执行简单的硬件初始化.
1.硬件设备初始化
2.为加载bootloader的stage2准备RAM空间
3.设置好堆栈
4.跳转到stage2的C入口
stage2:
C语言部分负责复制数据,设置启动参数和串口通信等
1.初始化本阶段使用到的硬件设备
2.检测系统内存映像
3.将kernel映像和根文件映像从flash读到RAM中
4.为内核设置启动参数
5.调用内核
------------------------------------
Mini2440的Bootloader结构分析
1. Importsomeheadfiles.
GEToption.inc;GET=include
GETmemcfg.inc
GET2440addr.inc
option.inc顾名思义是可以改变的配置选项,其中包括一些起始地址,初始状态,总线宽度,时钟频率。
如果以后对系统的设置有变化,直接修改”option.inc”中的配置即可,无需大量改动bootloader.
对mini2440中option.inc分析如下:
_STACK_BASEADDRESSEQU0x33ff8000;STACK的起始地址
_MMUTT_STARTADDRESSEQU0x33ff8000;定义MMU表基地址
_ISR_STARTADDRESSEQU0x33ffff00;
补充MMU知识:
a. 什么是MMU
MMU–MemoryManagementUnit缩写,用来管理virtualmemory和physicalmemory的控制线路。
一台256M的32bitx86主机来说,virtualmemory范围为0~0x(2^32-1)=0xFFFFFFFF(4G),而physicalmemory范围为0~0xFFFFFFF(256M)
在没有使用virtualmemory的机器上,address被送到内存总线上,是具有同地址的physicalmemory被读写;而使用了virtualmemory的情况下,address不是直接被送到内存addressbus上,而是送到了memorymanagementunit(MMU),把virtualaddress映射到physicaladdress上。
大多数使用virtualmemory的系统都使用一种称为分页(paging)机制。
Virtualaddressspace划分成page的单位,而相应的physicaladdressspace也被进行划分,单位是页帧().Page和的大小必须相同。
如上一例256M32bit的机器虽然只有256M的physicaladdress,但是可以运行4G的program,但该program不能一次性调入内存运行。
首先,这台机器必须有一个大到可以存放4G的程序外部存储器(如flash),以保证程序片段在需要时可以被调用。
如此例,page大小为4K,与page相同,因为内存和外围存储器之间的传输总是以page为单位的。
对应的4G的virtualaddress存储器和256M的physicaladdress存储器,分别包含了1Mpage和4K。
b. MMU的功能
TranslatingvirtualaddresstoPhysicaladdress
现代的多用户,多进程的操作系统,需要MMU,才能使每个用户进程都能拥有自己独立的地址空间。
使用MMU,操作系统划分一段地址区域,在这块地址区域中,每个进程看到的内容都不一样。
例如MICROSOFTWINDOWSOperatingsystem将地址范围4M-2G划分为用户地址空间,进程A在地址0x400000(4M)映射了可执行文件,进程B在相同地址映射可执行文件。
如果进程A读地址0x400000,读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0x400000时,读到的是B的可执行文件映射到RAM的内容。
这就是MMU在进行地址转换所起的作用。
---------------------------------------
Option.inc还包括:
设置初始值:
PLL_ON_START;设置PLL初始状态
ENDIAN_CHANGE;选择ENDIAN,具体值应该根据硬件的设置来定
ENTRY_BUS_WIDTH;配置入口总线宽度
BUSWIDTH;配置GPIO的总线宽度
CPU_SEL;配置ARMchipID
UCLK;配置USBclock(见芯片手册214页)
XTAL_SEL;配置晶振频率
FCLK;配置FLCK
CLKDIV_VAL;设置CLOCK DIVISION
根据设置CPU_SEL,UCLK,XTAL_SEL,FCLK,CLIKDIV_VAL是用“if”语句来配置相应的参数如M_MDIV,M_PDIV,M_SDIV,U_MIDV,U_PDIV,U_SDIV
公式如下:
Mpll=(2*m*Fin)/(p*2^s)
m=M(thevaluefordividerM)+8,p=P(thevaluefordividerP)+2
CLOCKandPOWERMANAGEMENT知识补充(见芯片手册208页):
参考:
a. Overview
i. TheClock&Powermanagementblockconsistsofthreeparts:
clockcontrol,USBcontrol,andPowerControl.
ii. S3C2440A有两个PLL(phaselockedloop,锁相环,可以实现倍频,S3C2440的高频就是由此电路产生).其中一个PLL,即MPLL(mainPLL),用来产生三种时钟信号:
FCLK(给CPU核供给的时钟信号,也就是我们所说的S3C2440的CPU主频,相应的,1/FCLK即为CPU实践中周期),HCLK(为AHBbusperipherals供给时钟信号,AHB为advancedhigh-performancebus),PCLK(为APBbusperipherals供给时钟信号).另一个PLL用来产生USBBlock(48MHz).在这里,需要了解一下AMBAsystemarchitecture了,可以到下载相关资料。
简单来说,AMBA使一种协议,这种协议成为片上组织通信的事实上的标准。
英文描述如下:
TheAMBAprotocolisanopenstandard,on-chipbusspecificationthatdetailsastrategyfortheinterconnectionandmanagementofalblocksthatmakesupasystem-on-chip(SoC).Itfacilitates“right-first-time”developmentofembeddedprocessorswithoneormoreCPU/signalprocessorsandmultipleperipherals.TheAMBAprotocolenhancesareusabledesignmethodologybydefiningacommonbackboneforSoCmodules.
需要知道的是,AMBA总线是ARM提出的一种结局方案,它并非唯一的规范,但是因为ARM的广泛使用,AMBA总线也就是事实上的规范了。
现在AMBA总线最新为AMBA3specification版本,包括了AMBA3AXIinterface,AMBA3AHBinterface,AMBA3APBinterface,AMBA3ATBinterface.而S3C2440A还只能支持AMBA2specification,这个版本包括含AMBA2AHBinterface,AMBA2APBinterface.也就是在S3C2440A的框图中看到的良好总总线接口。
需要注意的是,这两种总线所连接的外设是有区别的。
AHB总线连接高速外设,低俗外设这通过APB总线相互结节。
显然,对不同的总线上的外设,应该使用不同的时钟信号,AHB总线度应HCLK,APB总线对应PCLK。
那么实现就应该弄清楚,每条总线对应的外设有哪些,这样在设置好时钟信号后,对应外设的初始化值就要依此而确定了。
AHBbus上的外设有LCDcontroller(CONT代表controller,控制器),USBHostCONT,ExtMaster,NandCONT和Nandflashbootloader,busCONT,interruptCONT,powermanagement,memoryCONT(SRAM/NOR/SDRAM等)
APBbus上的外设有UART,USBdevice,SDI/MMC,WatchDogTimer,busCONT,SPI,IIC,IIS,GPIO,RTC,ADC,Timer/PWM.
iii. 主时钟源来自外部晶振或者外部时钟。
复位后,MPLL虽然默认启动,但是如果不向MPLLCON中写入value,那么外部晶振直接作为系统时钟,即便是使用默认值或者保持值不变,在复位后,必须软件写入同一个值。
EDUKIT-III的外部晶振有两个,一个用于系统时钟,为12MHz;一个哟功能RTC,为2.768KHz.以前试验没有像MPLLCON写入数据,所以系统时钟都是12MHz。
从这里可以发现一个问题,如果晶振开始没有焊上,那么系统是无法正常启动的。
因为按照上述规则,复位后还没有写入MPLLCON,这是又没有可以使用的时钟源,所以不会启动。
也就是硬件完成后,这个12MHz的晶振时一定要焊上的,才能进行后续的硬件测试工作。
iv. USBClockControl
USBhostinterfaceandUSBdeviceinterfaceneeds48MHzclock.IntheS3C2440A,theUSBdedicatedPLL(UPLL)generates48MHzforUSB.UCLKdoesnotfeduntilthePLL(UPLL)isconfigured.
b. CLOCK配置
Power-OnReset(XTIpll)
Figure7-4showstheclockbehaviorduringthepower-onresetsequence.Thecrystaloscillatorbeginsoscillationwithinseveralmilliseconds.WhennRESETisreleasedafterthestabilizationofOSC(XTIpll)clock,thePLLstartstooperateaccordingtothedefaultPLLconfiguration.However,PLLiscommonlyknowntobeunstableafterpower-onreset,soFinisfeddirectlytoFCLKinsteadoftheMpll(PLLoutput)beforethesoftwarenewlyconfiguresthePLLCON.EveniftheuserdoesnotwanttochangethedefaultvalueofPLLCONregisterafterreset,theusershouldwritethesamevalueintoPLLCONregisterbysoftware.
ThePLLrestartsthelockupsequencetowardthenewfrequencyonlyafterthesoftwareconfiguresthePLLwithanewfrequency.FCLKcanbeconfiguredasPLLoutput(Mpll)immediatelyafterlocktime.
这个主要是基于PLL的特点。
简单的描述就是,上电复位后,几个ms后晶振起振。
当OSC时钟信号稳定之后,nRESET电平拉高(这是硬件自动检测过程)。
这个时候,PLL开始按照默认的PLL配置开始工作,但是特苏醒就在于PLL在上电复位后开始时不稳定的,所以S3C2440设计为把Fin在上电复位后直接作为FCLK,这时MPLL时不起作用的。
如果想要使MPLL起作用,那么就要写入MPLLCON寄存器的值,然后等待LOCKTIME时间后,新的FCLK开始工作。
下面把这些步骤分开来描述,软件步骤部分结合程序进行。
I. 上电几个ms后,晶振输出稳定。
FCLK=晶振频率。
nRESET恢复高电平后,cpu开始执行指令,这完全是硬件操作,不需要软件设置。
II. 第一步软件工作:
设置PMSdividercontrol,也就是设置MPLLCON寄存器。
关于PMS,可以看到Figure7-2寄存器MPLLCON的设置,其实有一定规则的,并非你想要的每个FCLK频率都可以得到。
官方推荐了一个表PLLVALUESELECTIONTABLE,要按照这个进行。
否则的话,就需要自己按照公式推算,但是mizi公司并不保证你的设置合适的。
所以,如果要工作在200MHz,还是按照vivi的推荐值即可。
-------------------------------------
然后再看memcfg.inc
配置ARMmemory寄存器
BANK1~BANK7的BWSCON
B1_BWSCON
B1_Tacs
B1_Tcos
B1_Tacc
B1_Tcoh
B1_Tah
B1_Tacp
B1_PMC
如果是SDRAM,则还需设置REFRESH寄存器
ARMmemorycontrol知识补充:
a) OverviewFeature
-Little/Bigendian(selectedbysoftware)
-Addressspace:
128Mbytesperbank(total1GB/8banks)
-Programmableaccesssize(8/16/32-bit)forallbanksexceptbank0(16/32-bit)
-Total8memorybanks
SixmemorybanksforROM,SRAM,etc.
RemainingtwomemorybanksforROM,SRAM,SDRAM,etc.
-Sevenfixedmemorybankstartaddress(BANK0~BANK6)
-Oneflexiblememorybankstartaddressandprogrammablebanksize(BANK7)
-Programmableaccesscyclesforallmemorybanks
-Externalwaittoextendthebuscycles
-Supportingself-refreshandpowerdownmodeinSDRAM
学过8051的都还有印象,片内有ROM和RAM的存储器,并且ROM和RAM都是分别从0地址开始,还可以外接存储器,用movx命令读取数据。
而ARM则不同了,ARM只是处理器,自身不带存储器,都是外接存储器,不管是ROM还是RAM,统一编址,地址都是从连续的,从0地址开始,而不是分别从0地址开始,到0x40000_0000,分为8个bank,.每个bank挂上一个存储器,7个bank的起始地址是固定的。
ARM开机后从地址0开始运行。
b) BWSCONregister分析
BWSCON是一个32位的register,对应了BANK0-BANK7,每个BANK使用4位。
这4位分别表示:
STx:
启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1。
WSx:
是否使用存储器的WAIT信号,通常设为0
DWx:
设置存储器的BUSWIDTH,00=8-bit,01=16-bit,10=32-bit,11=reserved
BANK0对应的4位,是由硬件跳线决定,read-only
c) SDRAM知识补充
DRAM(DynamicRandomAccessMemory)需要不断Refresh才能保住数据,因此它是DRAM最终的要的操作。
那么要隔多长时间重复一次刷新呢?
目前公认的标准是,存储体中的电容的数据有效保存期是64ms,也就说每一行刷新的循环周期是64ms。
这样刷新的速度是:
行数量/64ms.刷新操作分为两种:
自动刷新(AutoRefresh,简称AR)与自刷新(SelfRefresh,简称SR)。
不论是何种刷新方式,都不需要外部提供地址信息,因为这是一个内部的自动操作。
对于AR,SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。
由于刷新涉及所有的L-BANK,因此在刷新过程中,所有L-BANK都停止工作,而每次刷新所占用9个时钟周期,之后就可进入正常的工作状态,也就是说在这9个时钟时期内,所有工作指令只能等待而无法执行。
SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是STR(SuspendtoRAM,休眠挂起于内存)。
在发出AR命令时,将CKE置于无效状态,就进入SR模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。
d) BANKCON0~BANKCON5寄存器设置
Tacs:
Addressset-uptimebeforenGCSn
Tcos:
Chipselectionset-uptimebeforenOE
Tacc:
Accesscycle
Tcoh:
ChipselectionholdtimeafternOE
Tcah:
ChipselectionholdtimeafternOE
Tacp:
Pagemodeaccesscycle@Pagemode
PMC:
Pagemodeconfiguration
注释:
Tacs,Tcos,Tacc,Tcoh,Tcah,Tacp,PMC值是由存储器的datasheet决定的,里面有各时钟的极限值;顺便说说nWAIT引脚,WSn是设定该管教是否起作用的,如果起作用必须将储存器(或者其他设备)相应的信号输入给nWAIT,如果年WAIT引脚没有用到时,必须接上,否则会将处理器琐死。
BANKCON6~BANKCON7寄存器设置则不同,首先需要确定memory的type
MT:
Determinethememorytype
如果设置ROM或者SRAM,则设置Tacs,Tcos,Tacc,Tcoh,Tcah,Tacp,PMC
如果设置SDRAM,则设置
Trcd:
RAStoCASdelay
SCAN:
Columnaddressnumber
REFRESH寄存器,用于SDRAMrefreshcontrolregister
最后一个headfile是特殊寄存器的地址定义
MemoryControl,Clock&PowerManagement,Interrupt,I/Oport,WatchDogTimer
-----------------------------------
又找到好的文章,哈哈,不用自己一句一句地写了
转贴:
DreamChaser修改并添加
工程里面的头文件2410Init.s包括了板子上电后的初始话,具体有几个步骤:
讲述S3C2410启动程序设计
1. 屏蔽所有中断,关看门狗。
2. 根据工作频率设置PLL寄存器
3. 初始化存储控制相关寄存器
4. 初始化各模式下的栈指针
5. 设置缺省中断处理函数
6. 将数据段拷贝到RAM中,将零初始化数据段清零
7. 跳转到C语言Main入口函数中
要看懂这个头文件是比较难的,我跟DVD视频的教程看了两遍,弄懂了一些,视频上讲的是ARM7S3C44B0的Init.s但我觉得和2410的差不多。
我将这个程序注释了一下。
可能有些地方不是很正确,只提供参考。
;=========================================
;NAME:
2410INIT.S
;DESC:
Cstartupcodes
; Configurememory,ISR,st