ARM启动过程分析.docx
- 文档编号:12907550
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:33
- 大小:121.74KB
ARM启动过程分析.docx
《ARM启动过程分析.docx》由会员分享,可在线阅读,更多相关《ARM启动过程分析.docx(33页珍藏版)》请在冰豆网上搜索。
ARM启动过程分析
ARM启动过程的理解:
第一篇参考文章
1.在板子上电的一开始,首先自动判断是否是autoboot模式(这是由硬件设计阶段,由硬件工程师对mcu的引脚连线决定的),我所使用的s3c2410是带有nandflash的,并切被设置成autoboot,从nandflash开始启动.
2.在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着bootloader的最前面4k代码)拷贝到samsung所谓的"steppingstone"里面(实际上是一块4k大小的SRAM).这一过程完全由硬件自动实现,不需软件控制.
3.在拷贝完前4k代码后,nandflash控制器自动将"steppingstone"映射到arm地址空间0x00000000开始的前4k区域.
4.在映射过程完成后.nandflash控制器将pc指针直接指向arm地址空间的0x00000000位置,准备开始执行"steppingstone"上的代码.
5.而"steppingstone"上从nandflash拷贝过来的4k代码,是程序员写的bootloader的前4k代码.这个bootloader在之前写好,并已经被烧写到nandflash的0x00000000开始的最前面区域..而这"steppingstone"上的4k代码就是bootloader的前4k代码.
6.在pc指向arm地址空间的0x00000000后,系统就开始执行指令代码.这4k代码的任务是:
初始化硬件,设置中断向量表,设置堆栈,然后一个很重要的任务是,将nandflash的最前面区域的bootloader(包含4k启动代码)拷贝到SDRAM中去,bootloader代码的大小是写好bootloader就确定的.然后只需要确定bootloader想映射到SDRAM的起始位置就ok.
7.在完成对nandflash上的bootloader搬移后,找到4k代码的搬移代码最后一个指令的下一个指令在SDRAM的bootloader的地址,然后跳转到该位置,继续执行bootloader的剩余代码(引导系统).
现在有这么几个问题:
在启动启动完成后,steppingstone会被映射到其他地方,可以作为一般存储使用;
为加快终端响应,需要将sdram开始的代码重新映射到0x00000000开始的一段区域,这样两个虚拟地址空间映射到一个物理内存区域;
本文来自CSDN博客,转载请标明出处:
第二篇
系统初始化流程如下:
禁止看门狗——》在中断控制器中屏蔽所有中断——》系统时钟设置——》初始化端口——》DMA设置——》cashe和总线设置——》存储器设置,初始化SDRAM——》初始化堆栈——》设置IRQ和FIQ的入口——》地址重映射
通常系统初始化有两个阶段组成,分别为汇编和C写成。
汇编应尽量简单一些,把更多的任务交给C来做,这样可增加整个程序的可读性和灵活性。
必须由汇编来完成的任务有:
异常中断向量表的设置、IRQ向量表(向量模式)或ISR初始化(非向量模式)、二级ISR地址表的定义、Flash和SDRAM的设置(否则系统无法加载代码)、堆栈设置和模式切换、拷贝RW和ZI代码、设置系统时钟等。
而端口初始化、cashe和总线的设置、DMA配置以及其它控制器如LCD、UART、SIO、IP等可以在C中第二阶段初始化程序完成,另外也可以继续更改时钟或存储器配置等。
下面是几个关键步骤配置的注意事项。
看门狗设置
watchdog即可以作为普通的timer以产生周期性的中断,也可以周期性的产生reset信号(如果每隔一定时间不被清除的话),以防治程序跑飞。
系统时钟的初始化:
至少设置三个寄存器:
LOCKTIME,PLLCON,LOCKCON。
LOCKTIME,地址0x01D8000C。
用于指定PLL的初始化时间,在PLL初始化时,系统时钟为晶振输入或外部时钟直接提供,即MCLK=Fin;初始化完成后,切换,MCLK=Fout。
初始值为0xfff=4095个输入时钟周期。
一般将其设为初始值。
PLLCON,,地址0x01D80000。
设置MDIV,PDIV,SDIV三个值,用于确定Fout和Fin的频率分配比值:
Fout=(m*Fin)/(p*2s),其中
m=(MDIV+8),p=(PDIV+2),s=SDIV
典型的几个值如下:
No.FinFoutMDIVPDIVSDIV
110Mhz40Mhz0x480x30x2
210500x2a0x30x1
310600x340x30x1
44600x340x00x1
53600x480x00x1
610750x3a0x30x1
CLKCON,地址0x01D80004。
用于设置是否向外设提供时钟,一般设为默认值0x7ff8,即所有外设提供时钟。
存储器初始化(尤其是SDRAM):
ARM7TDMI的地址映射如下:
(在ARM体制中,所有的各种内、外存储器,外设,寄存器,cashe,writebuffer,通用IO口等全都采用统一编址)
注:
0x10000000~0x100047f0为内部cashe/sram及其Tag和LRU的地址。
BANK0~BANK5为ROM/SRAM/FLASH,
BANK6~BANK7为SDRAM/ROM/SRAM/FLASH
要设置的寄存器如下:
BWSCON:
BANK0~BANK7的UB/LB使能、Wait信号使能、数据线宽度;
BANKCON0~BANKCON5:
各bank(flash或Sram)的访问时序控制。
flash或Sram主要参数如下所示:
Tacs[14:
13]Addressset-upbeforenGCSn
Tcos[12:
11]Chipselectionset-upnOE
Tacc[10:
8]Accesscycle
Toch[7:
6]ChipselectionholdonnOE
Tcah[5:
4]AddressholdingtimeafternGCSn
Tpac[3:
2]Pagemodeaccesscycle@Pagemode
PMC[1:
0]Pagemodeconfiguration
不同厂家、性能、速度的器件设置有所不同。
BANKCON6~BANKCON7:
主要用于SDRAM,当然也可以是Flash或SRAM。
SDRAM的时序控制稍微复杂,还有:
Trcd[3:
2]RAStoCASdelay
SCAN[1:
0]Columnaddressnumber
当然也可用于DRAM。
REFRESH地址:
0x01C80024,DRAM/SDRAM的更新控制寄存器;
MRSRB6~MRSRB7:
DRAM/SDRAM的模式控制寄存器,这个寄存器在系统初始时,即SDRAM使用前必须被有效地的设置。
这几个寄存器的设置比较复杂,应仔细阅读Samsang(page168)的数据手册和相关存储器的资料。
一个典型的配置如下:
ldrr0,=SMRDATA
ldmiar0,{r1-r13}
ldrr0,=0x01c80000;BWSCONAddress
stmiar0,{r1-r13}
SMRDATADATA
DCD0x11222220;BWSCONBank0=OM[1:
0],8bits宽Bank1~Bank5=32bit,Bank6~Bank=16bit,不使用UB/LB信号,WAITdisable;使用littleEndian存储格式
DCD0x000056A8;GCS0:
Tacs=2clk;Tcos=2clk;Tacc=10clk;
Toch=2clk;Tcah=2clk;Tpac=4clk;PMC=normal(1data)
DCD0x00000700;GCS1除了Accesscycle为14个clk外,其它均为0clk
DCD0x00000700;GCS2
DCD0x00000700;GCS3
DCD0x00000700;GCS4
DCD0x00000700;GCS5
DCD0x00018005;GCS6,SDRAM;RAStoCASdelay2clk;Columnaddressnumber:
9bits
DCD0x0001002a;GCS7,EDODRAM(Trcd=3,Tcas="2",Tcp="1",CAN="10bit")
DCD0x00870441;Refreshenable;AutoRefresh;Trp="3",Trc="5",Tchr="3";
刷新计数:
1019
DCD0x17;SCLKpowerdownmodeenable;Bank6&7Size,16MB/16MB
DCD0x20;MRSR6:
CASLatency="2clk";bursttype为线性(不支持交织访问);
burstnumber:
1bit(不支持促发读写)
DCD0x20;MRSR7(CL=2)
注:
三星的实验板中在nGCS0外接Flash,型号为SST39VF160,其datasheet中有其读写时序的详细说明和各种时间值的最大或最小值,但均以ns为单位,且各时间值的名称也与寄存器的要求不完全相同。
要使Flash达到最优设置,必须读懂其时序并按其推荐值设置寄存器。
显然这并不是件容易的事情。
在本次实验板的boot程序中,其各时序值均是最大值给出。
参见memcfg.h文件。
三星的实验板中在nGCS6外接SDRAM,型号为IC42S16800-7T,(4096ROW*512COLUM*4Bank*16bits=128Mbits=16MB)
由上面的例子可以看出需要设置的参数为:
1.Banksize,UB/LB,WAITenable/disable,large/littleEndian;
2.RAStoCASdelay,Columnaddressnumber;
3.Refreshenable/disable,Auto/selfrefresh,SDRAMRASpre-chargeTime,SDRAMRCminimumTime,RefreshCounter;
4.powerdownmode,banksize;
4.CASLatency,bursttype,burstnumber。
Refreshcounter的设置:
Refreshperiod=(211-refresh_count+1)/MCLK
Ex)Ifrefreshperiodis16usandMCLKis60MHz,
therefreshcountisasfollows;
refresh_count=211+1-60x16=1089
上面的例子只是对Flash和SDRAM的一个经验设置值,可能不是最优的。
最优设置还必须参考器件的数据手册。
尤其是对于SDRAM的RAStoCASdelay、SDRAMRASpre-chargeTime、SDRAMRCminimumTime三个时序值。
特别注意:
在线调试阶段,在AXD软件中必须引入对SDRAM初始化的seesion文件或ini文件,或者在commandinterface中敲入所需的配置命令(在loadimage之前完成),并且最后注释掉reset汇编程序中的初始化SDRAM的命令。
否则程序就可能跑飞。
而生成要下载的flash程序代码时,则系统reset时就必须完成此功能。
端口初始化
ARM的大部分信号在同一端口是功能复用的。
为此初始化时必须指定各PA~PG口的各管脚的功能。
在实验板根据外围器件的选择对各端口做如下配置:
PA(10bits):
全部用作高端地址线;PCONA=0x3ff
PB(11bits):
全部用作存储器控制信号;PCONB=0x7ff
PC(16bits):
4~7用于LCD的VD4~VD7;12,13用于UART的TXD1,RXD1(注意:
这里的UART没有使用CTS、RTS信号,只用了TX、RX);其它全部用于通用IO口,GPC0~3用于IIS;GPC10和14用于NANDFlash;GPC15用于USBDevice;GPC8、9用于LCD;GPC11暂时没用。
PCONC=0x5f55ff55.(这里假定IO口全为output,实际应用时再确认一下是In或是out)
PD(8bits):
全部用于LCD的控制信号。
PCOND=0xaaaa。
PE(9bits):
8用于Endian,确定存储器格式;1,2分别为TXD0,RXD0;0,3~7用于通用IO口(暂定output),PE3用于蜂鸣器;PE4~7用于LED显示。
PCONE=0x05569。
PF(9bits):
0、1用于IIC总线的SCK、SDA信号;其它均为通用IO口(暂定output),其中GPF2~4用于IDE,GPF5~8用于触摸屏。
PCONF=0x09255a。
PG(8bits):
全部用于外部中断EXINT0~7。
PCONG=0xffff。
注意:
上述端口分配是S3C44b0x测试板(勤研电子)的分配情况。
文章出处:
第三篇
系统上电前,外部硬线NANDBOOT开关选择从NANDFLASH启动。
芯片设计时,默认DMA占有系统总线,DMA按照配置寄存器的默认值工作,其源地址指向NANDFLASH,目标地址指向片上SRAM,NANDFLASH控制器在NANDBOOT选中的情况下,默认向NANDFLASH的首页发出读命令。
即上电后,DMA控制器以及NANDFLASH控制器默认的把FLASH存储器中的第一页搬到了片上SRAM中。
一直到DMA的工作完成前,ARM核无法占用总线。
此时零地址映射在片上SRAM,DMA完成搬运后,ARM开始执行程序。
此段代码完成的工作包括对SDRAM控制器的初始化,从NANDFLASH搬运核心代码至SDRAM,配置地址重映射寄存器至零地址处,最后将PC指向零地址的SDRAM。
在SDRAM执行的代码开始真正启动系统。
NANDFLASH系统启动的新方法
一般情况下,片上存储器在作为启动代码转移阶石的同时,往往在启动后也有其特殊的作用。
可以作为特殊的程序区,譬如在进行MP3解码过程中,核心解码函数作为频繁调用的程序,可以安排在片上SRAM中,以提高读取速度,提升系统性能。
在SoC芯片开发过程中,在整体架构以及模块功能的变化之后,这块内嵌的SRAM失去了原来的作用,而仅作为NANDFLASH启动时的代码跳板,对于整个芯片而言,付出的代价比较大。
于是提出了在没有片上存储器的架构下,从NANDFLASH启动的一种新模式。
在上述一般模式启动过程中,片上SRAM所起到的作用,就是执行NANDFLASH中第一页的代码,将真正的启动代码引入到SDRAM,最后将PC指针指向SDRAM。
在失去片上SRAM的支持后,可以在控制器的FIFO中去执行此段代码,这需要在硬件以及软件代码中作出适当的改变。
(1)首先需要改变的是地址映射的机制,系统上电后,ARM即从零地址开始执行指令,零地址映射到NANDFLASH的FIFO入口地址,地址的译码过程由AMBA总线模块完成。
在外部硬线NANDBOOT拉高的条件下,AMBA从设备地址译码模块在启动过程中,将零地址的设备选择权给到缓冲FIFO。
在第一页的指令执行完毕后,PC指针也指向SDRAM。
(2)其次是NANDFLASH控制器在启动过程中,对数据的读取方式。
鉴于NANDFLASH大批量数据读写的特性,往往采用DMA方式对数据进行操作。
启动过程中,由ARMcore直接向FIFO读取数据,在FIFO读空的情况下,将从没备READY信号拉低,等待NAND中的数据读出。
并且在此读取过程中,DMA的请求被屏蔽。
(3)NANDFLASH型号类型众多,从每页容量大小、数据宽度、地址级数以及各型号芯片不同的时序参数,决定了一个控制器接口的兼容性要求相当的高。
为了兼容从不同的NANDFLASH启动,设置了4根硬线作为选择。
NANDBOOT选择是否从NANDFLASH启动;PAGESIZE选择每页大小,支持512B/page,2kB/page;IOWIDE选择数据端口的宽度,支持8位、16位;AD-DRESSCYCLE选择发送地址级数,支持3级、4级、5级地址。
时序参数的配置值可以采用默认的宽松值,在读取首页信息之后,将配置值根据当前的时钟频率以及芯片类型,选择舍适的时序值以达到最佳的性能。
(4)存储器首页的代码是在缓冲FIFO中执行的,FIFO的入口地址是一个高24位的选通地址,因此当系统启动时,零地址开始增加,对FIFO中读出的指令而言,低8位地址的变化是无关的,FIFO始终被选通。
指令的输出是默认的顺序输出。
这就要求首页的代码中不可以出现循环、跳转等语句,并且要求在128条指令内完成需要的操作。
6启动代码和流程的分析
上述的汇编程序即是存放在NANDFLASH首页的启动代码,启动的流程如下:
(1)配置DMA控制器的4个寄存器,通道使能后,等待FLASH发出的搬运请求;
(2)配置NANDFLASH控制器的3个寄存器,选择适合的地址、时序参数与所用的FLASH芯片吻合;
(3)分别在r8~r11中放入程序需要的备用值;
(4)将需要在SDRAM中运行的4条指令搬入SDRAM0x30000000处;
(5)执行Nop指令,Nop指令用于填充一页NANDFLASH中的剩余空间;
(6)执行在页末的指令,将PC指针指向SDRAM的0x30000000处;(7)执行SDRAM中的指令,首先启动NANDFLASH的数据传输,将程序搬往SDRAM的0x30001000处。
其次执行一个循环语句,等待第一页的程序搬完,之后将PC指针指向0x30001000处,启动程序从0x30001000处正式开始执行。
第四篇
2410支持从nandflash启动。
通过将flash中最开始的4k代码拷贝到,2410片内的一块不用初始化的sram中运行,该拷贝过程完全由硬件支持,无需软件操作。
NandFlash控制器有一个特殊的功能,在S3C2410上电后,NandFlash控制器会自动的把NandFlash上的前4K数据搬移到4K内部RAM中,并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动。
这个过程不需要程序干涉。
程序员需要完成的工作,是把最核心的启动程序放在NandFlash的前4K中。
u-boot源码不支持从nandflash启动,可是s3c2410支持从nandflash启动,开发板(sbc-2410x)加电后s3c2410将nandflash的前4k(保存有u-boot的部分功能--拷贝功能--把nandflash中的内容拷贝到SDRAM)拷贝到sram(s3c2410芯片内的sram),即nGCS0,映射地址为0x00000000。
这就需要修改u-boot源码,增加u-boot的功能:
使u-boot在得到执行权后能够将其自身拷贝到开发板上SDRAM中,以便处理器能够执行u-boot。
NandFlash的命令、地址、数据都通过I/O口发送,管脚复用,这样做做的好处是,可以明显减少NANDFLASH的管脚数目,将来如果设计者想将NANDFLASH更换为更高密度、更大容量的,也不必改动电路板。
NANDFLASH不能够执行程序,本人总结其原因如下:
1.
NANDFLASH本身是连接到了控制器上而不是系统总线上。
CPU启动后是要取指令执行的,如果是SROM、NORFLASH等之类的,CPU
发个地址就可以取得指令并执行,NANDFLASH不行,因为NANDFLASH是管脚复用,它有自己的一套时序,这样CPU无法取得可以执行的代码,也就不能初始化系统了。
例如:
strr0,[r1],该命令包含了目的地址和源寄存器,按照cpu的时序将寄存器中的数据保存到内存中。
如果想把数据存储到nandflash上,必须按照nandflash的读写时序进行,如先写NFCONF,然后NFCMD,NFADDR,最后读NFDATA。
2.
NANDFLASH是顺序存取设备,不能够被随机访问,读写访问以页为单位,程序就不能够分支或跳转,这样你如何去设计程序。
bootloader
bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化CPU、堆栈、初始化存储器系统等,其功能类似于PC机的BIOS。
从NAND闪存启动U-BOOT的设计思路
如果S3C2410被配置成从NAND闪存启动,上电后,S3C2410的NAND闪存控制器会自动把NAND闪存中的前4K数据搬移到内部RAM中,并把0x00000000设置为内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动。
因此要把最核心的启动程序放在NAND闪存的前4K中。
由于NAND闪存控制器从NAND闪存中搬移到内部RAM的代码是有限的,所以在启动代码的前4K里,必须完成S3C2410的核心置,并把启动代码的剩余部分搬到RAM中运行。
在U-BOO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 启动 过程 分析