基于vxWorks的BSP启动过程实例分析文档格式.docx
- 文档编号:20385577
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:23
- 大小:94.06KB
基于vxWorks的BSP启动过程实例分析文档格式.docx
《基于vxWorks的BSP启动过程实例分析文档格式.docx》由会员分享,可在线阅读,更多相关《基于vxWorks的BSP启动过程实例分析文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
I/O编址微观上表现为CPU操作device的寄存器、宏观上表现为具体操作的含义。
register
r/w
驱动程序与VxWorks的接口、驱动程序与Component的接口有三层含义:
I/O管理、操作类型规整及参数规整。
二、MPC8260ADSBoardBSP工作流程
系统在上电之后,第一个执行的为romInit模块代码,该段代码单独存为一个文件:
romInit.s。
romInit.s是一个汇编级的程序,主要完成系统最基本的硬件初始化工作。
RomInit模块分析:
这个模块为VxWorksBootRom的入口代码,程序的入口点romInit处是上电后首先执行的代码,他设置BOOT_COLD参数,该参数将被传送到romStart()程序。
当程序sysToMonitor()运行时,它会跳到romInit处后8字节的地方开始执行,来实现一次“热启动”。
下面为冷启动与热启动的具体实现:
_romInit:
romInit:
blcold/*jumptothecoldbootinitialization*/
nop/*到这条指令结束,两条指令共占用了8个字节*/
blstart/*jumptothewarmbootinitialization*/
cold:
……
start:
下面我们来看一看在cold段里,程序作了那些工作:
blstart/*jumptothewarmbootinitialization*/
lir3,BOOT_COLD/*setcoldbootasstarttype*/
/*根据前面的注释,BOOT_COLD将会被传送到romStart()程序中去*/
addisr4,0,0x0F01/*R4holdstheIMMRbaseaddress*/
addisr5,0,0x0000/*Clearoutallmaskbits*/
orir5,r5,0x0836
stwr5,0x0104(r4)/*optionregisterforbank0*/
isync/*synchronize*/
/*这段代码的目的是初始化寄存器Optionregisterbank0,将0x0836写入该寄存器*/
/*
*initializetheIMMRregisterbeforeanynon-coreregisters
*modification.ThedefaultIMMRbaseaddresswas0x0F000000,
*asoriginallyprogrammedintheHardResetConfigurationWord.
*/
lisr4,HIADJ(INTERNAL_MEM_MAP_ADDR)
addir4,r4,LO(INTERNAL_MEM_MAP_ADDR)
addisr8,0,0x0F01/*IMMRwasat0x0f000000*/
stwr4,0x01a8(r8)/*IMMRnowat0x04700000*/
isync
/*这段代码的目的是修改寄存器IMMR的值,重新设定内部内存的基址,有了这段代码,我们在修改该基址的时候,就可以直接通过修改INTERNAL_MEM_MAP_ADDR的值就可以完成,无需修改这段代码。
*/
*WhenthePowerPC8260ispoweredon,theprocessorfetchesthe
*instructionslocatedattheaddress0x100.Weneedtojump
*fromtheaddress0x100totheFlashspace.
lisr4,HIADJ(start)/*loadr4withtheaddress*/
addir4,r4,LO(start)/*ofstart*/
lisr5,HIADJ(romInit)/*loadr5withtheaddress*/
addir5,r5,LO(romInit)/*ofromInit()*/
lisr6,HIADJ(ROM_TEXT_ADRS)/*loadr6withtheaddress*/
addir6,r6,LO(ROM_TEXT_ADRS)/*ofROM_TEXT_ADRS*/
subr4,r4,r5/**/
addr4,r4,r6
mtsprLR,r4/*savedestinationaddress*/
/*intoLRregister*/
blr/*jumptoflashmemaddress*/
/*这段代码的目的是计算flashspace的地址,然后程序跳转到该地址处执行。
这里面用到了宏ROM_TEXT_ADRS,该宏在头文件config.h里定义。
在该文件中我们可以看到:
#defineFLASH_ADRS0xff800000/*baseaddressofflash*/
#defineROM_BASE_ADRSFLASH_ADRS/*baseaddressofROM*/
#defineROM_TEXT_ADRSROM_BASE_ADRS+0x100
#defineROM_WARM_ADRS(ROM_TEXT_ADRS+8)/*warmrebootentry*/
这里定义的热启动的入口点为ROM_TEXT_ADRS+8,显然冷启动的入口点为ROM_TEXT_ADRS,即romInit所在的位置为ROM_TEXT_ADRS,上面一段代码实现的是,用start所在的地址减去romInit所在的地址,然后再加上ROM_TEXT_ADRS,得到flashspace的地址,即:
Addr(flashspace)=Addr(start)–Addr(romInit)+ROM_TEXT_ADRS
根据config.h中的地址定义,flashspace的地址实际上就是start的地址,也就是说,程序最终还是跳到了start处执行,而start其实就是跳转指令的下一条指令,究竟为什么还要如此计算一番,目前还没有搞清楚。
但是不管怎样,系统在冷启动之后执行了前面的一段代码之后,就开始转入start处,从start处开始,冷启动和热启动就没有什么差别了。
下面分析在start段里,系统所做的工作:
/*settheMSRregistertoaknownstate*/
xorr0,r0,r0/*clearregisterR0*/
isync/*synchronize*/
mtmsrr0/*cleartheMSRregister*/
/*清零MSR寄存器*/
/*programtheSCCR:
normaloperation*/
lisr5,HIADJ(M8260_SCCR_DFBRG_16)
addir5,r5,LO(M8260_SCCR_DFBRG_16)
lisr6,HIADJ(M8260_SCCR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_SCCR(INTERNAL_MEM_MAP_ADDR))
stwr5,0(r6)
/*设置SCCR寄存器*/
/*SYPCR-turnoffthesystemprotectionstuff*/
addir5,r5,LO(M8260_SYPCR_SWTC|M8260_SYPCR_BMT\
|M8260_SYPCR_PBME|M8260_SYPCR_LBME)
lisr6,HIADJ(M8260_SYPCR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_SYPCR(INTERNAL_MEM_MAP_ADDR))
/*设置SYPCR寄存器*/
/*programtheBCR*/
addisr5,0,0x100c
lisr6,HIADJ(M8260_BCR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_BCR(INTERNAL_MEM_MAP_ADDR))
/*设置BCR寄存器*/
/*programthePPC_ACR*/
addir5,0,0x0002
lisr6,HIADJ(M8260_PPC_ACR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_PPC_ACR(INTERNAL_MEM_MAP_ADDR))
/*设置PPC_ACR寄存器*/
/*programthePPC_ALRH*/
addisr5,0,0x0126
orir5,r5,0x7893
lisr6,HIADJ(M8260_PPC_ALRH(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_PPC_ALRH(INTERNAL_MEM_MAP_ADDR))
/*设置PPC_ALRH寄存器*/
/*programtheSIUMCR*/
addisr5,0,0x0820
orir5,r5,0x0000
lisr6,HIADJ(M8260_SIUMCR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_SIUMCR(INTERNAL_MEM_MAP_ADDR))
/*设置SIUMCR寄存器*/
/*programtheTESCR1*/
addisr5,0,0x0000
orir5,r5,0x4000
lisr6,HIADJ(M8260_TESCR1(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_TESCR1(INTERNAL_MEM_MAP_ADDR))
/*设置TESCR1寄存器*/
/*programtheLTESCR1*/
lisr6,HIADJ(M8260_LTESCR1(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_LTESCR1(INTERNAL_MEM_MAP_ADDR))
/*设置LTESCR1寄存器*/
*Mapthebank0totheflasharea-OntheADSboardatresettime
*thebank0isalreadyusedtomaptheflash.
/*loadthebaseregister*/
lisr5,HIADJ((ROM_BASE_ADRS&
M8260_BR_BA_MSK)|\
M8260_BR_PS_32|M8260_BR_V)
addir5,r5,LO((ROM_BASE_ADRS&
lisr6,HIADJ(M8260_BR0(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_BR0(INTERNAL_MEM_MAP_ADDR))
/*loadtheoptionregister*/
lisr5,HIADJ((0xff800000&
M8260_OR_AM_MSK)|M8260_OR_EHTR_8\
|M8260_OR_CSNT_EARLY|M8260_OR_SCY_3_CLK)
addir5,r5,LO((0xff800000&
lisr6,HIADJ(M8260_OR0(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_OR0(INTERNAL_MEM_MAP_ADDR))
/*mapthebank1totheBCSRs*/
lisr5,HIADJ((0xffff8000&
M8260_OR_AM_MSK)\
|M8260_OR_SCY_1_CLK)
addir5,r5,LO((0xffff8000&
lisr6,HIADJ(M8260_OR1(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_OR1(INTERNAL_MEM_MAP_ADDR))
/*writethepropervaluetothebaseregister*/
lisr5,HIADJ(BCSR0|M8260_BR_PS_32|M8260_BR_V)
addir5,r5,LO(BCSR0|M8260_BR_PS_32|M8260_BR_V)
lisr6,HIADJ(M8260_BR1(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_BR1(INTERNAL_MEM_MAP_ADDR))
/*内存初始化*/
SdramInit:
/*programtheMPTPR*/
addir5,0,0x4000
lisr6,HIADJ(M8260_MPTPR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_MPTPR(INTERNAL_MEM_MAP_ADDR))
sthr5,0x0(r6)/*storeupperhalf-word*/
/*programthePSRT*/
addir5,0,0x0010/*load0x10or16*/
lisr6,HIADJ(M8260_PSRT(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_PSRT(INTERNAL_MEM_MAP_ADDR))
stbr5,0x0(r6)/*storebyte-bits[24-31]*/
/*loadOR2*/
lisr5,HIADJ((0xff000000&
M8260_OR_AM_MSK)|\
M8260_OR_SDRAM_ROWST_9\
|M8260_OR_SDRAM_NUMR_11|M8260_OR_SDRAM_PM_NORM)
addir5,r5,LO((0xff000000&
lisr6,HIADJ(M8260_OR2(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_OR2(INTERNAL_MEM_MAP_ADDR))
/*loadBR2*/
lisr5,HIADJ(LOCAL_MEM_LOCAL_ADRS|M8260_BR_PS_64|\
M8260_BR_MS_SDRAM_60X|M8260_BR_V)
addir5,r5,LO(LOCAL_MEM_LOCAL_ADRS|M8260_BR_PS_64|\
M8260_BR_MS_SDRAM_60X|M8260_BR_V)
lisr6,HIADJ(M8260_BR2(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_BR2(INTERNAL_MEM_MAP_ADDR))
/*
*programthePSDMRasexplainedbelow:
*PBIissettozero,sincepage-basedinterleavingisnot
*supportedonearlysiliconrevisions
*Refreshservicesareofffornow
*OPselectsthe"
Prechargeallbanks"
command
*SDAM=b001
*BSMAselectsA15-A17asbankselectlines
*A9isselectedascontrolpinforSDA10onSDRAM
*7-clockrefreshrecoverytime
*precharge-to-activateintervalis3-clocktime
*activate-to-read/writeintervalis2-clocktime
*Burstlenghtis4
*lastdataouttoprechargeis1clock
*writerecoverytimeis1clock
*noexternaladdressmultiplexing
*normaltimingforthecontrollines
*CASlatencyis2
addisr5,0,0x296E
orir5,r5,0xB452
lisr6,HIADJ(M8260_PSDMR(INTERNAL_MEM_MAP_ADDR))
addir6,r6,LO(M8260_PSDMR(INTERNAL_MEM_MAP_ADDR))
addisr0,0,0
/*doasinglewritetoanarbitrarylocation*/
addir5,0,0x00FF/*Load0x000000FFintor5*/
stbr5,0(r0)/*Write0xFFtoaddress0-bits[24-31]*/
/*issuea"
CBRRefresh"
commandtoSDRAM*/
addisr5,0,0x096E
/*Loop8times,writing0xFFtoaddress0*/
addir7,0,0x0008
mtspr9,r7/*LoadsprCTRwith8*/
addir8,0,0x00FF/*Load0x000000FFintor8*/
SdramWrLoop:
stbr8,0(r0)/*Write0xFFtoaddress0*/
bc16,0,SdramWrLoop/*DecrementCTR,andpossiblybranch*/
ModeRegisterWrite"
addisr5,0,0x196E
addir8,0,0x00FF/*Load0x000000FFintor8*/
stbr8,0(r0)/*Write0xFFtoaddress0-bits[24-31]*/
/*enablerefreshservicesandputSDRAMintonormaloper
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 vxWorks BSP 启动 过程 实例 分析