Bootloader的学习.docx

上传人:b****5 文档编号:6337331 上传时间:2023-01-05 格式:DOCX 页数:53 大小:124.21KB
下载 相关 举报
Bootloader的学习.docx_第1页
第1页 / 共53页
Bootloader的学习.docx_第2页
第2页 / 共53页
Bootloader的学习.docx_第3页
第3页 / 共53页
Bootloader的学习.docx_第4页
第4页 / 共53页
Bootloader的学习.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

Bootloader的学习.docx

《Bootloader的学习.docx》由会员分享,可在线阅读,更多相关《Bootloader的学习.docx(53页珍藏版)》请在冰豆网上搜索。

Bootloader的学习.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1