[ZLG-ARM] U-Boot源代码阅读笔记(二) —— 对lowlevel_init.S的分析

[复制链接]
 楼主| xamic 发表于 2009-6-3 13:42 | 显示全部楼层 |阅读模式
本文主要分析与U-Boot启动过程相关的汇编代码lowlevel_init.S,目标平台以PXA270为例。<br />文件位于board/myboard/lowlevel_init.S,主要执行内存相关的初始化&nbsp;把链接寄存器LR(即R14)的值转存到寄存器R10中,以便lowlevel_init完成后恢复执行&nbsp;按顺序初始化GPIO寄存器:&nbsp;GPSR&nbsp;GPCR&nbsp;GRER&nbsp;GFER&nbsp;GPDR&nbsp;GAFR&nbsp;PSSR&nbsp;/*&nbsp;Set&nbsp;up&nbsp;GPIO&nbsp;pins&nbsp;first&nbsp;*/<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;=GPSR0<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;&nbsp;=CFG_GPSR0_VAL<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;.....初始化内存控制器&nbsp;/*&nbsp;Initlialize&nbsp;Memory&nbsp;Controller&nbsp;*/<br />&nbsp;&nbsp;&nbsp;@&nbsp;skip&nbsp;memory&nbsp;init&nbsp;if&nbsp;we're&nbsp;run&nbsp;in&nbsp;ram(must&nbsp;be&nbsp;a&nbsp;JTAG&nbsp;run)<br />&nbsp;&nbsp;&nbsp;mov&nbsp;r0,&nbsp;pc<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r1,&nbsp;=0xa0000000<br />&nbsp;&nbsp;&nbsp;and&nbsp;r0,&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;把当前PC寄存器的值与0xa0000000逻辑与*/<br />&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;如果结果等于0xa0000000,说明uboot是从RAM启动的&nbsp;*/<br />&nbsp;&nbsp;&nbsp;beq&nbsp;mem_init_done&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;那么就需要跳过RAM初始化,&nbsp;直接跳转到mem_init_done执行&nbsp;*/<br /><br />/*&nbsp;具体的初始化操作与目标板有很大相关性,下面以我的PXA270开发板为例&nbsp;*/<br /><br />mem_init:<br />&nbsp;&nbsp;&nbsp;@&nbsp;get&nbsp;memory&nbsp;controller&nbsp;base&nbsp;address<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;=MEMC_BASE&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;内存控制器基地址&nbsp;*/<br />初始化内存控制器&nbsp;Step&nbsp;1&nbsp;<br />@****************************************************************************<br />@&nbsp;&nbsp;Step&nbsp;1<br />@<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;1a<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Initlialize&nbsp;Static&nbsp;Memory&nbsp;Control&nbsp;register&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;初始化MSCx寄存器需要设置&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;RBUFFx&nbsp;——&nbsp;Return&nbsp;Data&nbsp;Buffer&nbsp;vs.&nbsp;Streaming&nbsp;Behavior&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;RRRx&nbsp;——&nbsp;ROM/SRAM&nbsp;Recovery&nbsp;Time&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;RDNx&nbsp;——&nbsp;ROM&nbsp;Delay&nbsp;Next&nbsp;Access&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;RDFx&nbsp;——&nbsp;The&nbsp;ROM&nbsp;Delay&nbsp;First&nbsp;Access&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;RBWx&nbsp;——&nbsp;ROM&nbsp;Bus&nbsp;Width&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;RTx&nbsp;——&nbsp;ROM&nbsp;Type&nbsp;*/<br />&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;msc0,&nbsp;read&nbsp;back&nbsp;to&nbsp;ensure&nbsp;data&nbsp;latches<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;=CFG_MSC0_VAL<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;[r1,&nbsp;#MSC0_OFFSET]<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;[r1,&nbsp;#MSC0_OFFSET]&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Ensure&nbsp;that&nbsp;the&nbsp;new&nbsp;value&nbsp;has&nbsp;been&nbsp;accepted&nbsp;and&nbsp;programmed&nbsp;*/<br />&nbsp;&nbsp;&nbsp;......<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;1b<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;配置PCMCIA和CF需要设置下面这些寄存器&nbsp;*/<br />&nbsp;&nbsp;&nbsp;@&nbsp;MECR&nbsp;——&nbsp;Expansion&nbsp;Memory&nbsp;(PC&nbsp;Card/CompactFlash)&nbsp;Bus&nbsp;Configuration&nbsp;register&nbsp;<br />&nbsp;&nbsp;&nbsp;@&nbsp;MCMEMx&nbsp;——&nbsp;PC&nbsp;Card&nbsp;Interface&nbsp;Common&nbsp;Memory&nbsp;Space&nbsp;Socket&nbsp;0/1&nbsp;Timing&nbsp;Configuration&nbsp;register<br />&nbsp;&nbsp;&nbsp;@&nbsp;MCATTx&nbsp;——&nbsp;PC&nbsp;Card&nbsp;Interface&nbsp;Attribute&nbsp;Space&nbsp;Socket&nbsp;0/1&nbsp;Timing&nbsp;Configuration&nbsp;register<br />&nbsp;&nbsp;&nbsp;@&nbsp;MCIOx&nbsp;——&nbsp;PC&nbsp;Card&nbsp;Interface&nbsp;I/O&nbsp;Space&nbsp;Socket&nbsp;0/1&nbsp;Timing&nbsp;Configuration&nbsp;register<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;1c<br />&nbsp;&nbsp;&nbsp;@&nbsp;fly-by-dma&nbsp;is&nbsp;defeatured&nbsp;on&nbsp;this&nbsp;part<br />&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;flycnfg&nbsp;——&nbsp;Fly-by&nbsp;DMA&nbsp;DVAL&lt1:0&gt&nbsp;polarities<br />&nbsp;&nbsp;&nbsp;@ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;=CFG_FLYCNFG_VAL<br />&nbsp;&nbsp;&nbsp;@str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1,&nbsp;#FLYCNFG_OFFSET]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;1d<br />&nbsp;&nbsp;&nbsp;@&nbsp;fetch&nbsp;platform&nbsp;value&nbsp;of&nbsp;mdcnfg&nbsp;——&nbsp;SDRAM&nbsp;Configuration&nbsp;register<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;=CFG_MDCNFG_VAL<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;disable&nbsp;all&nbsp;sdram&nbsp;banks<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;r2,&nbsp;&nbsp;#(MDCNFG_DE0&nbsp;|&nbsp;MDCNFG_DE1)<br />&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;r2,&nbsp;&nbsp;#(MDCNFG_DE2&nbsp;|&nbsp;MDCNFG_DE3)<br />&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#MDCNFG_OFFSET]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;1e<br />&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;MDREFR&nbsp;——&nbsp;SDRAM&nbsp;Refresh&nbsp;Control&nbsp;register<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,&nbsp;=&nbsp;CFG_MDREFR_VAL<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;=&nbsp;0xFFF&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;DRI&nbsp;mask&nbsp;*/<br />&nbsp;&nbsp;&nbsp;and&nbsp;r3,&nbsp;r3,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r4,&nbsp;[r1,&nbsp;#MDREFR_OFFSET]&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;reset&nbsp;value&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r4,&nbsp;r4,&nbsp;r2&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;clear&nbsp;DRI&nbsp;field&nbsp;&nbsp;——&nbsp;SDRAM&nbsp;Refresh&nbsp;Interval&nbsp;for&nbsp;All&nbsp;Partitions&nbsp;*/<br />&nbsp;&nbsp;&nbsp;orr&nbsp;r4,&nbsp;r4,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;orr&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_K0RUN&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SDCLK0&nbsp;Run&nbsp;Control/Status&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_K0DB2&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SDCLK0&nbsp;Divide&nbsp;by&nbsp;2&nbsp;Control/Status&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_K0DB4&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SDCLK0&nbsp;Divide&nbsp;by&nbsp;4&nbsp;Control/Status&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_K2FREE&nbsp;&nbsp;&nbsp;/*&nbsp;SDCLK&lt2&gt&nbsp;Free-Running&nbsp;Control&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_K1FREE<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_K0FREE<br />&nbsp;&nbsp;&nbsp;orr&nbsp;r4,&nbsp;r4,&nbsp;#MDREFR_SLFRSH&nbsp;&nbsp;/*&nbsp;SDRAM&nbsp;Self-Refresh&nbsp;Control/Status,&nbsp;Self-refresh&nbsp;enabled&nbsp;*/<br />&nbsp;&nbsp;&nbsp;/*&nbsp;write&nbsp;back&nbsp;MDREFR&nbsp;*/<br />&nbsp;&nbsp;&nbsp;str&nbsp;r4,&nbsp;[r1,&nbsp;#MDREFR_OFFSET]<br />初始化内存控制器&nbsp;Step&nbsp;2&nbsp;初始化内存控制器&nbsp;Step&nbsp;3<br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;3<br />&nbsp;&nbsp;&nbsp;@&nbsp;Configure&nbsp;SDRAM<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;=CFG_MDREFR_VAL<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r2,&nbsp;#MDREFR_APD&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SDRAM/Synchronous&nbsp;Static&nbsp;Memory&nbsp;Auto-Power-Down&nbsp;Enable&nbsp;*/<br />&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#MDREFR_OFFSET]<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,&nbsp;[r1,&nbsp;#MDREFR_OFFSET]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;read&nbsp;back&nbsp;to&nbsp;make&nbsp;sure&nbsp;write&nbsp;action&nbsp;completed<br /><br />初始化内存控制器&nbsp;Step&nbsp;4<br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;4<br />&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;initial&nbsp;value&nbsp;of&nbsp;mdcnfg,&nbsp;w/o&nbsp;enabling&nbsp;sdram&nbsp;banks<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;=CFG_MDCNFG_VAL<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r2,&nbsp;&nbsp;r2,&nbsp;&nbsp;#(MDCNFG_DE0&nbsp;|&nbsp;MDCNFG_DE1)<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r2,&nbsp;&nbsp;r2,&nbsp;&nbsp;#(MDCNFG_DE2&nbsp;|&nbsp;MDCNFG_DE3)<br />&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#MDCNFG_OFFSET]<br /><br />&nbsp;&nbsp;&nbsp;@ldr&nbsp;r2,&nbsp;=&nbsp;CFG_MDREFR_VAL<br />&nbsp;&nbsp;&nbsp;@str&nbsp;r2,&nbsp;[r1,&nbsp;#MDREFR_OFFSET]<br />初始化内存控制器&nbsp;Step&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;5<br />&nbsp;&nbsp;&nbsp;@&nbsp;pause&nbsp;for&nbsp;200&nbsp;uSecs<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,&nbsp;=OSCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;reset&nbsp;the&nbsp;OS&nbsp;Timer&nbsp;Count&nbsp;to&nbsp;zero<br />&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0<br />&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r3]<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r4,&nbsp;=0x300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;really&nbsp;0x2E1&nbsp;is&nbsp;about&nbsp;200usec,&nbsp;so&nbsp;0x300&nbsp;should&nbsp;be&nbsp;plenty&nbsp;——3.25MHz&nbsp;clock<br />1:<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;[r3]&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;r2读OS&nbsp;Timer&nbsp;Count*/<br />&nbsp;&nbsp;&nbsp;cmp&nbsp;r4,&nbsp;r2&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;比较OS&nbsp;Timer&nbsp;Count和r4&nbsp;*/<br />&nbsp;&nbsp;&nbsp;bgt&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;如果时间没到就循环&nbsp;*/<br />初始化内存控制器&nbsp;Step&nbsp;6<br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;6<br />&nbsp;&nbsp;&nbsp;@&nbsp;Disable&nbsp;XScale&nbsp;Data&nbsp;Cache<br />&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#0x78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@turn&nbsp;everything&nbsp;off<br />&nbsp;&nbsp;&nbsp;mcr&nbsp;&nbsp;&nbsp;&nbsp;p15,&nbsp;0,&nbsp;r0,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@(caches&nbsp;off,&nbsp;MMU&nbsp;off,&nbsp;etc.)&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置协处理器P15&nbsp;*/<br />初始化内存控制器&nbsp;Step&nbsp;7&nbsp;-&nbsp;11<br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;7<br />&nbsp;&nbsp;&nbsp;@&nbsp;Access&nbsp;memory&nbsp;*not&nbsp;yet&nbsp;enabled*&nbsp;for&nbsp;CBR&nbsp;refresh&nbsp;cycles&nbsp;(8)&nbsp;*NOTE:&nbsp;hardware&nbsp;reset&nbsp;only<br />&nbsp;&nbsp;&nbsp;@&nbsp;-&nbsp;CBR&nbsp;is&nbsp;generated&nbsp;for&nbsp;all&nbsp;banks<br /><br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=CFG_DRAM_BASE<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r2]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;8<br />&nbsp;&nbsp;&nbsp;@&nbsp;Enable&nbsp;data&nbsp;cache<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;9<br />&nbsp;&nbsp;&nbsp;@&nbsp;Enable&nbsp;SDRAM<br /><br />&nbsp;&nbsp;&nbsp;@fetch&nbsp;current&nbsp;mdcnfg&nbsp;value<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;&nbsp;[r1,&nbsp;#MDCNFG_OFFSET]<br />&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;&nbsp;r3,&nbsp;&nbsp;#MDCNFG_DE0&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;enable&nbsp;sdram&nbsp;bank0&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;@write&nbsp;back&nbsp;mdcnfg,&nbsp;enabling&nbsp;the&nbsp;sdram&nbsp;bank(s)<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;&nbsp;[r1,&nbsp;#MDCNFG_OFFSET]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;10<br />&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;mdmrs&nbsp;——&nbsp;SDRAM&nbsp;Mode&nbsp;Register&nbsp;Set&nbsp;Configuration&nbsp;Register<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;=CFG_MDMRS_VAL<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1,&nbsp;#MDMRS_OFFSET]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Step&nbsp;11<br />&nbsp;&nbsp;&nbsp;@&nbsp;Enable&nbsp;MDREFR[APD]&nbsp;optionally<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;=CFG_MDREFR_VAL<br />&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#MDREFR_OFFSET]<br />Done&nbsp;Memory&nbsp;Init&nbsp;mem_init_done:<br /><br />&nbsp;&nbsp;&nbsp;@********************************************************************<br />&nbsp;&nbsp;&nbsp;@&nbsp;Disable&nbsp;(mask)&nbsp;all&nbsp;interrupts&nbsp;at&nbsp;the&nbsp;interrupt&nbsp;controller<br />&nbsp;&nbsp;&nbsp;@<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;clear&nbsp;the&nbsp;interrupt&nbsp;level&nbsp;register&nbsp;(use&nbsp;IRQ,&nbsp;not&nbsp;FIQ)<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#0<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;=ICLR<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;[r2]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;Set&nbsp;interrupt&nbsp;mask&nbsp;register<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;=CFG_ICMR_VAL&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;set&nbsp;ICMR&nbsp;=&nbsp;0,&nbsp;no&nbsp;interrupts&nbsp;enabled&nbsp;*/<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;=ICMR<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;[r2]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;********************************************************************<br />&nbsp;&nbsp;&nbsp;@&nbsp;Disable&nbsp;the&nbsp;peripheral&nbsp;clocks,&nbsp;and&nbsp;set&nbsp;the&nbsp;core&nbsp;clock<br />&nbsp;&nbsp;&nbsp;@<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Turn&nbsp;Off&nbsp;ALL&nbsp;on-chip&nbsp;peripheral&nbsp;clocks&nbsp;for&nbsp;re-configuration<br />&nbsp;&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;=CKEN&nbsp;&nbsp;&nbsp;&nbsp;/*clock&nbsp;enable&nbsp;register&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;core&nbsp;clocks<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;=CCCR&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;core&nbsp;clock&nbsp;configuration&nbsp;register&nbsp;*/<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1,&nbsp;#0]<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,&nbsp;=(CCCR_L_MASK&nbsp;|&nbsp;CCCR_2N_MASK)<br />&nbsp;&nbsp;&nbsp;bic&nbsp;r2,&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Run-Mode-to-Oscillator&nbsp;Ratio&nbsp;(L)&nbsp;creates&nbsp;the&nbsp;nominal&nbsp;run&nbsp;mode&nbsp;frequency&nbsp;by&nbsp;multiplying&nbsp;the&nbsp;13-MHz&nbsp;processor&nbsp;oscillator&nbsp;by&nbsp;L.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Turbo-Mode-to-Run-Mode&nbsp;Ratio&nbsp;(N)&nbsp;creates&nbsp;the&nbsp;nominal&nbsp;turbo-mode&nbsp;frequency&nbsp;by&nbsp;multiplying&nbsp;the&nbsp;run-mode&nbsp;frequency&nbsp;by&nbsp;N.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;/*&nbsp;core&nbsp;freq:&nbsp;Normal&nbsp;208MHz,&nbsp;Turbo&nbsp;312MHz&nbsp;*/<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,&nbsp;=(16&nbsp;|&nbsp;3&lt&lt7)&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turbo-Mode-to-Run-Mode&nbsp;Ratio,&nbsp;N&nbsp;=&nbsp;3/2&nbsp;*/<br />&nbsp;&nbsp;&nbsp;orr&nbsp;r2,&nbsp;r2,&nbsp;r3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;Run-Mode-to-Oscillator&nbsp;Ratio&nbsp;=&nbsp;16*13&nbsp;MHz,&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1]<br /><br />#ifdef&nbsp;ENABLE32KHZ<br />&nbsp;&nbsp;&nbsp;@&nbsp;enable&nbsp;the&nbsp;32Khz&nbsp;oscillator&nbsp;for&nbsp;RTC&nbsp;and&nbsp;PowerManager<br />&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;=OSCC&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;oscillator&nbsp;configuration&nbsp;register&nbsp;*/<br />&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;#OSCC_OON&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;32.768kHz&nbsp;OON&nbsp;(write-once&nbsp;only&nbsp;bit)&nbsp;*/<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1]<br /><br />&nbsp;&nbsp;&nbsp;@&nbsp;NOTE:&nbsp;&nbsp;spin&nbsp;here&nbsp;until&nbsp;OSCC.OOK&nbsp;get&nbsp;set,<br />&nbsp;&nbsp;&nbsp;@&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;meaning&nbsp;the&nbsp;PLL&nbsp;has&nbsp;settled.<br />&nbsp;&nbsp;&nbsp;@<br />60:<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1]<br />&nbsp;&nbsp;&nbsp;ands&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#1&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;r2&nbsp;=&nbsp;r2&nbsp;&&nbsp;0x1,&nbsp;取出最低位数据&nbsp;*/<br />&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60b<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Turn&nbsp;on&nbsp;needed&nbsp;clocks<br />&nbsp;&nbsp;&nbsp;&nbsp;@<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;=CKEN<br />&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;=CFG_CKEN_VAL<br />&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;[r1]<br />lowlevel_init完成&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;pc,&nbsp;r10&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;恢复链接寄存器的值到PC,返回start.S调用lowlevel_init处继续执行&nbsp;*/<br /><br />@&nbsp;End&nbsp;lowlevel_init<br /><br />&nbsp;<br /> &nbsp;&nbsp;<br />
lpczcy 发表于 2009-6-3 14:04 | 显示全部楼层

好帖,顶一个

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部