请高手用中文注解 vivi(head.S)s3c2440

[复制链接]
4588|3
 楼主| avocationA 发表于 2008-6-8 08:49 | 显示全部楼层 |阅读模式
/*<br />&nbsp;*&nbsp;vivi/arch/s3c2440/head.S:<br />&nbsp;*&nbsp;&nbsp;&nbsp;Initialise&nbsp;hardware<br />&nbsp;*<br />&nbsp;*&nbsp;Copyright&nbsp;(C)&nbsp;2001&nbsp;MIZI&nbsp;Research,&nbsp;Inc.<br />&nbsp;*<br />&nbsp;*&nbsp;This&nbsp;program&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or&nbsp;modify<br />&nbsp;*&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;as&nbsp;published&nbsp;by<br />&nbsp;*&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation;&nbsp;either&nbsp;version&nbsp;2&nbsp;of&nbsp;the&nbsp;License,&nbsp;or<br />&nbsp;*&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.<br />&nbsp;*<br />&nbsp;*&nbsp;This&nbsp;program&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,&nbsp;<br />&nbsp;*&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of<br />&nbsp;*&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;&nbsp;See&nbsp;the&nbsp;<br />&nbsp;*&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.<br />&nbsp;*<br />&nbsp;*&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;<br />&nbsp;*&nbsp;along&nbsp;with&nbsp;this&nbsp;program;&nbsp;if&nbsp;not,&nbsp;write&nbsp;to&nbsp;the&nbsp;Free&nbsp;Software<br />&nbsp;*&nbsp;Foundation,&nbsp;Inc.,&nbsp;59&nbsp;Temple&nbsp;Place,&nbsp;Suite&nbsp;330,&nbsp;Boston,&nbsp;MA&nbsp;&nbsp;02111-1307&nbsp;&nbsp;USA<br />&nbsp;*<br />&nbsp;*<br />&nbsp;*&nbsp;Author:&nbsp;Janghoon&nbsp;Lyu&nbsp;&ltnandy@mizi.com&gt<br />&nbsp;*&nbsp;Date&nbsp;&nbsp;:&nbsp;$Date:&nbsp;2004/02/04&nbsp;06:22:24&nbsp;$<br />&nbsp;*<br />&nbsp;*&nbsp;$Revision:&nbsp;1.1.1.1&nbsp;$<br />&nbsp;*<br />&nbsp;*<br />&nbsp;*&nbsp;History:<br />&nbsp;*<br />&nbsp;*&nbsp;2002-05-14:&nbsp;Janghoon&nbsp;Lyu&nbsp;&ltnandy@mizi.com&gt<br />&nbsp;*&nbsp;&nbsp;&nbsp;-&nbsp;Initial&nbsp;code<br />&nbsp;*<br />&nbsp;*/<br /><br />#include&nbsp;&quot;config.h&quot;<br />#include&nbsp;&quot;linkage.h&quot;<br />#include&nbsp;&quot;machine.h&quot;<br /><br />@&nbsp;Start&nbsp;of&nbsp;executable&nbsp;code&nbsp;<br /><br />ENTRY(_start)<br />ENTRY(ResetEntryPoint)<br /><br />@<br />@&nbsp;Exception&nbsp;vector&nbsp;table&nbsp;(physical&nbsp;address&nbsp;=&nbsp;0x00000000)<br />@<br /><br />@&nbsp;0x00:&nbsp;Reset<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;Reset<br /><br />@&nbsp;0x04:&nbsp;Undefined&nbsp;instruction&nbsp;exception<br />UndefEntryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleUndef<br /><br />@&nbsp;0x08:&nbsp;Software&nbsp;interrupt&nbsp;exception<br />SWIEntryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleSWI<br /><br />@&nbsp;0x0c:&nbsp;Prefetch&nbsp;Abort&nbsp;(Instruction&nbsp;Fetch&nbsp;Memory&nbsp;Abort)<br />PrefetchAbortEnteryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandlePrefetchAbort<br /><br />@&nbsp;0x10:&nbsp;Data&nbsp;Access&nbsp;Memory&nbsp;Abort<br />DataAbortEntryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleDataAbort<br /><br />@&nbsp;0x14:&nbsp;Not&nbsp;used<br />NotUsedEntryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleNotUsed<br /><br />@&nbsp;0x18:&nbsp;IRQ(Interrupt&nbsp;Request)&nbsp;exception<br />IRQEntryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleIRQ<br /><br />@&nbsp;0x1c:&nbsp;FIQ(Fast&nbsp;Interrupt&nbsp;Request)&nbsp;exception<br />FIQEntryPoint:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleFIQ<br /><br />@<br />@&nbsp;VIVI&nbsp;magics<br />@<br /><br />@&nbsp;0x20:&nbsp;magic&nbsp;number&nbsp;so&nbsp;we&nbsp;can&nbsp;verify&nbsp;that&nbsp;we&nbsp;only&nbsp;put&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;0<br />@&nbsp;0x24:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;0<br />@&nbsp;0x28:&nbsp;where&nbsp;this&nbsp;vivi&nbsp;was&nbsp;linked,&nbsp;so&nbsp;we&nbsp;can&nbsp;put&nbsp;it&nbsp;in&nbsp;memory&nbsp;in&nbsp;the&nbsp;right&nbsp;place<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;_start<br />@&nbsp;0x2C:&nbsp;this&nbsp;contains&nbsp;the&nbsp;platform,&nbsp;cpu&nbsp;and&nbsp;machine&nbsp;id<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;ARCHITECTURE_MAGIC<br />@&nbsp;0x30:&nbsp;vivi&nbsp;capabilities&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;0<br />#ifdef&nbsp;CONFIG_PM<br />@&nbsp;0x34:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;SleepRamProc<br />#endif<br />#ifdef&nbsp;CONFIG_TEST<br />@&nbsp;0x38:<br />@&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;hmi<br />#endif<br /><br /><br />@<br />@&nbsp;Start&nbsp;VIVI&nbsp;head<br />@<br />Reset:<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;disable&nbsp;watch&nbsp;dog&nbsp;timer<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#0x53000000<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;disable&nbsp;all&nbsp;interrupts<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#INT_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xffffffff<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oINTMSK]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=0x7ff<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oINTSUBMSK]&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;initialise&nbsp;system&nbsp;clocks<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#CLK_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;mvn&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xff000000<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oLOCKTIME]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#CLK_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;clkdivn_value<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oCLKDIVN]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mrc&nbsp;&nbsp;&nbsp;&nbsp;p15,&nbsp;0,&nbsp;r1,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;read&nbsp;ctrl&nbsp;register&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#0xc0000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Asynchronous&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mcr&nbsp;&nbsp;&nbsp;&nbsp;p15,&nbsp;0,&nbsp;r1,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;ctrl&nbsp;register<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#CLK_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;@ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;mpll_value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;clock&nbsp;default<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=0x7f021&nbsp;&nbsp;&nbsp;&nbsp;@mpll_value_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;clock&nbsp;user&nbsp;set<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oMPLLCON]<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;memsetup<br /><br /><br />#ifdef&nbsp;CONFIG_PM<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Check&nbsp;if&nbsp;this&nbsp;is&nbsp;a&nbsp;wake-up&nbsp;from&nbsp;sleep<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;PMST_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#(PMST_SMR)<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;WakeupStart<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;All&nbsp;LED&nbsp;on<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=0x55aa<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_CON]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xff<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_UP]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br /><br />#if&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;SVC<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;cpsr<br />&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#0xdf<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r0,&nbsp;#0xd3<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;cpsr_all,&nbsp;r1<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;GPIO&nbsp;for&nbsp;UART<br />#ifdef&nbsp;CONFIG_S3C2440_SMDK<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_H<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;gpio_con_uart&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_CON]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;gpio_up_uart<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_UP]&nbsp;&nbsp;&nbsp;&nbsp;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;InitUART<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Print&nbsp;current&nbsp;Program&nbsp;Counter<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'\r'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'\n'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'@'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;pc<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br />#endif<br /><br />#ifdef&nbsp;CONFIG_S3C2440_NAND_BOOT<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;copy_myself<br /><br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;jump&nbsp;to&nbsp;ram<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=on_the_ram<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;r1,&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />on_the_ram:<br />#endif<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_STACK<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;DW_STACK_START<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;get&nbsp;read&nbsp;to&nbsp;call&nbsp;C&nbsp;functions<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;sp,&nbsp;DW_STACK_START&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;setup&nbsp;stack&nbsp;pointer<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;fp,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;no&nbsp;previous&nbsp;frame,&nbsp;so&nbsp;fp=0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;a2,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;argv&nbsp;to&nbsp;NULL&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;call&nbsp;main&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;#FLASH_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;otherwise,&nbsp;reboot<br /><br />@<br />@&nbsp;End&nbsp;VIVI&nbsp;head<br />@<br /><br />/*<br />&nbsp;*&nbsp;subroutines<br />&nbsp;*/<br /><br />@<br />@&nbsp;Wake-up&nbsp;codes<br />@<br />#ifdef&nbsp;CONFIG_PM<br />WakeupStart:<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Clear&nbsp;sleep&nbsp;reset&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;PMST_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#PMST_SMR<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Release&nbsp;the&nbsp;SDRAM&nbsp;signal&nbsp;protections<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;PMCTL1_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#(SCLKE&nbsp;|&nbsp;SCLK1&nbsp;|&nbsp;SCLK0)<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Go...<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;PMSR0_ADDR&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;read&nbsp;a&nbsp;return&nbsp;address<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;r1<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />SleepRamProc:<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;SDRAM&nbsp;is&nbsp;in&nbsp;the&nbsp;self-refresh&nbsp;mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;REFR_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#SELF_REFRESH<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;wait&nbsp;until&nbsp;SDRAM&nbsp;into&nbsp;self-refresh<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#16<br />1:&nbsp;&nbsp;&nbsp;&nbsp;subs&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#1&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;1b<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Set&nbsp;the&nbsp;SDRAM&nbsp;singal&nbsp;protections<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;PMCTL1_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#(SCLKE&nbsp;|&nbsp;SCLK1&nbsp;|&nbsp;SCLK0)<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Sleep...&nbsp;Now&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;PMCTL0_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#SLEEP_ON<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]&nbsp;&nbsp;&nbsp;&nbsp;<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b<br /><br />#ifdef&nbsp;CONFIG_TEST<br />hmi:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;PMCTL0_ADDR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=0x7fff0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;All&nbsp;LED&nbsp;on<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=0x55aa<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_CON]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xff<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_UP]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xe0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b<br />#endif<br /><br />#endif<br /><br />ENTRY(memsetup)<br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;initialise&nbsp;the&nbsp;static&nbsp;memory&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;memory&nbsp;control&nbsp;registers<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#MEM_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;adrl&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;mem_cfg_val<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r1,&nbsp;#52<br />1:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r2],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r1],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;1b<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br /><br /><br />#ifdef&nbsp;CONFIG_S3C2440_NAND_BOOT<br />@<br />@&nbsp;copy_myself:&nbsp;copy&nbsp;vivi&nbsp;to&nbsp;ram<br />@<br />copy_myself:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r10,&nbsp;lr<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;reset&nbsp;NAND<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#NAND_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=(&nbsp;(7&lt&lt12)|(7&lt&lt8)|(7&lt&lt4)|(0&lt&lt0)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=(&nbsp;(1&lt&lt4)|(0&lt&lt1)|(1&lt&lt0)&nbsp;)&nbsp;@&nbsp;Active&nbsp;low&nbsp;CE&nbsp;Control&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONT]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONT]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=(0x6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;RnB&nbsp;Clear<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFSTAT]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFSTAT]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;RESET&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;strb&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCMD]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;wait&nbsp;<br />1:&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#0x1<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#0xa<br />&nbsp;&nbsp;&nbsp;&nbsp;blt&nbsp;&nbsp;&nbsp;&nbsp;1b<br />2:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFSTAT]&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;wait&nbsp;ready<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x4<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;2b<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONT]<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#0x2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Flash&nbsp;Memory&nbsp;Chip&nbsp;Disable<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONT]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;get&nbsp;read&nbsp;to&nbsp;call&nbsp;C&nbsp;functions&nbsp;(for&nbsp;nand_read())<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;sp,&nbsp;DW_STACK_START&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;setup&nbsp;stack&nbsp;pointer<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;fp,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;no&nbsp;previous&nbsp;frame,&nbsp;so&nbsp;fp=0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xe0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;copy&nbsp;vivi&nbsp;to&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=VIVI_RAM_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x20000<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;nand_read_ll<br /><br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xb0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br />#endif<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;ok_nand_read<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />bad_nand_read:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_FAIL<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop&nbsp;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />ok_nand_read:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_OK<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;verify<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=0x33f00000<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x400&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;4&nbsp;bytes&nbsp;*&nbsp;1024&nbsp;=&nbsp;4K-bytes<br />go_next:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r0],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r1],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;teq&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r4<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;notmatch<br />&nbsp;&nbsp;&nbsp;&nbsp;subs&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;done_nand_read&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;go_next<br />notmatch:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_FAIL<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b<br />done_nand_read:<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_OK<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />#endif<br /><br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x70<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;r10<br /><br />@&nbsp;clear&nbsp;memory<br />@&nbsp;r0:&nbsp;start&nbsp;address<br />@&nbsp;r1:&nbsp;length<br />mem_clear:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r5,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r7,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r8,&nbsp;r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r9,&nbsp;r2<br /><br />clear_loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;&nbsp;&nbsp;&nbsp;r0!,&nbsp;{r2-r9}<br />&nbsp;&nbsp;&nbsp;&nbsp;subs&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#(8&nbsp;*&nbsp;4)<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;clear_loop<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br /><br />#endif&nbsp;@&nbsp;CONFIG_S3C2440_NAND_BOOT<br /><br /><br />@&nbsp;Initialize&nbsp;UART<br />@<br />@&nbsp;r0&nbsp;=&nbsp;number&nbsp;of&nbsp;UART&nbsp;port<br />InitUART:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUFCON]<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUMCON]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x3<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oULCON]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=0x245<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUCON]<br />#define&nbsp;UART_BRD&nbsp;((UART_PCLK&nbsp;&nbsp;/&nbsp;(UART_BAUD_RATE&nbsp;*&nbsp;16))&nbsp;-&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#UART_BRD<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUBRDIV]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#100<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x0<br />1:&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#0x1<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;1b<br /><br />#if&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#'U'<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUTXHL]<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r1,&nbsp;#oUTRSTAT]<br />&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#'0'<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUTXHL]<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r1,&nbsp;#oUTRSTAT]<br />&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br /><br /><br />@<br />@&nbsp;Exception&nbsp;handling&nbsp;functions<br />@<br />HandleUndef:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_UNDEF<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />HandleSWI:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_SWI<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />HandlePrefetchAbort:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_PREFETCH_ABORT<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />HandleDataAbort:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_DATA_ABORT<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />HandleIRQ:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />HandleFIQ:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_FIQ<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />HandleNotUsed:<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r12,&nbsp;r14<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_NOT_USED<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintFaultAddr<br />#endif<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br /><br />@<br />@&nbsp;Low&nbsp;Level&nbsp;Debug<br />@<br />#ifdef&nbsp;CONFIG_DEBUG_LL<br /><br />@<br />@&nbsp;PrintFaultAddr:&nbsp;Print&nbsp;falut&nbsp;address<br />@<br />@&nbsp;r12:&nbsp;contains&nbsp;address&nbsp;of&nbsp;instruction&nbsp;+&nbsp;4<br />@<br />PrintFaultAddr:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Print&nbsp;address&nbsp;of&nbsp;instruction&nbsp;+&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br />&nbsp;&nbsp;&nbsp;&nbsp;mrc&nbsp;&nbsp;&nbsp;&nbsp;p15,&nbsp;0,&nbsp;r0,&nbsp;c6,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Read&nbsp;fault&nbsp;virtual&nbsp;address<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br /><br />@&nbsp;PrintHexNibble&nbsp;:&nbsp;prints&nbsp;the&nbsp;least-significant&nbsp;nibble&nbsp;in&nbsp;R0&nbsp;as&nbsp;a<br />@&nbsp;hex&nbsp;digit<br />@&nbsp;&nbsp;&nbsp;r0&nbsp;contains&nbsp;nibble&nbsp;to&nbsp;write&nbsp;as&nbsp;Hex<br />@&nbsp;&nbsp;&nbsp;r1&nbsp;contains&nbsp;base&nbsp;of&nbsp;serial&nbsp;port<br />@&nbsp;&nbsp;&nbsp;writes&nbsp;ro&nbsp;with&nbsp;XXX,&nbsp;modifies&nbsp;r0,r1,r2<br />@&nbsp;&nbsp;&nbsp;TODO&nbsp;:&nbsp;write&nbsp;ro&nbsp;with&nbsp;XXX&nbsp;reg&nbsp;to&nbsp;error&nbsp;handling<br />@&nbsp;&nbsp;&nbsp;Falls&nbsp;through&nbsp;to&nbsp;PrintChar<br />PrintHexNibble:<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;HEX_TO_ASCII_TABLE<br />&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#0xF<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r2,&nbsp;r0]&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;convert&nbsp;to&nbsp;ascii<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />@&nbsp;PrintChar&nbsp;:&nbsp;prints&nbsp;the&nbsp;character&nbsp;in&nbsp;R0<br />@&nbsp;&nbsp;&nbsp;r0&nbsp;contains&nbsp;the&nbsp;character<br />@&nbsp;&nbsp;&nbsp;r1&nbsp;contains&nbsp;base&nbsp;of&nbsp;serial&nbsp;port<br />@&nbsp;&nbsp;&nbsp;writes&nbsp;ro&nbsp;with&nbsp;XXX,&nbsp;modifies&nbsp;r0,r1,r2<br />@&nbsp;&nbsp;&nbsp;TODO&nbsp;:&nbsp;write&nbsp;ro&nbsp;with&nbsp;XXX&nbsp;reg&nbsp;to&nbsp;error&nbsp;handling<br />PrintChar:<br />TXBusy:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUTRSTAT]<br />&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#UTRSTAT_TX_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#UTRSTAT_TX_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;TXBusy&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r1,&nbsp;#oUTXHL]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br /><br />@&nbsp;PrintWord&nbsp;:&nbsp;prints&nbsp;the&nbsp;4&nbsp;characters&nbsp;in&nbsp;R0<br />@&nbsp;&nbsp;&nbsp;r0&nbsp;contains&nbsp;the&nbsp;binary&nbsp;word<br />@&nbsp;&nbsp;&nbsp;r1&nbsp;contains&nbsp;the&nbsp;base&nbsp;of&nbsp;the&nbsp;serial&nbsp;port<br />@&nbsp;&nbsp;&nbsp;writes&nbsp;ro&nbsp;with&nbsp;XXX,&nbsp;modifies&nbsp;r0,r1,r2<br />@&nbsp;&nbsp;&nbsp;TODO&nbsp;:&nbsp;write&nbsp;ro&nbsp;with&nbsp;XXX&nbsp;reg&nbsp;to&nbsp;error&nbsp;handling<br />PrintWord:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;lr<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;shift&nbsp;word&nbsp;right&nbsp;8&nbsp;bits&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;shift&nbsp;word&nbsp;right&nbsp;16&nbsp;bits&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;shift&nbsp;word&nbsp;right&nbsp;24&nbsp;bits&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'\r'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'\n'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;r4<br /><br />@&nbsp;PrintHexWord&nbsp;:&nbsp;prints&nbsp;the&nbsp;4&nbsp;bytes&nbsp;in&nbsp;R0&nbsp;as&nbsp;8&nbsp;hex&nbsp;ascii&nbsp;characters<br />@&nbsp;&nbsp;&nbsp;followed&nbsp;by&nbsp;a&nbsp;newline<br />@&nbsp;&nbsp;&nbsp;r0&nbsp;contains&nbsp;the&nbsp;binary&nbsp;word<br />@&nbsp;&nbsp;&nbsp;r1&nbsp;contains&nbsp;the&nbsp;base&nbsp;of&nbsp;the&nbsp;serial&nbsp;port<br />@&nbsp;&nbsp;&nbsp;writes&nbsp;ro&nbsp;with&nbsp;XXX,&nbsp;modifies&nbsp;r0,r1,r2<br />@&nbsp;&nbsp;&nbsp;TODO&nbsp;:&nbsp;write&nbsp;ro&nbsp;with&nbsp;XXX&nbsp;reg&nbsp;to&nbsp;error&nbsp;handling<br />PrintHexWord:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;lr<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#28<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#24<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#20<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#16<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#12<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#8<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3,&nbsp;LSR&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexNibble<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'\r'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#'\n'<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;r4<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />@<br />@&nbsp;Data&nbsp;Area<br />@<br />@&nbsp;Memory&nbsp;configuration&nbsp;values<br />.align&nbsp;4<br />mem_cfg_val:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBWSCON<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON0<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON1<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON2<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON3<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON4<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON5<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON6<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON7<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vREFRESH<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vBANKSIZE<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vMRSRB6<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vMRSRB7<br /><br /><br />@&nbsp;Processor&nbsp;clock&nbsp;values<br />.align&nbsp;4<br />clock_locktime:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vLOCKTIME<br />@mpll_value:<br />@&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vMPLLCON_NOW<br />mpll_value_USER:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;vMPLLCON_NOW_USER<br />clkdivn_value:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vCLKDIVN_NOW<br /><br />@&nbsp;initial&nbsp;values&nbsp;for&nbsp;serial<br />uart_ulcon:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vULCON<br />uart_ucon:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vUCON<br />uart_ufcon:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vUFCON<br />uart_umcon:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vUMCON<br />@&nbsp;inital&nbsp;values&nbsp;for&nbsp;GPIO<br />gpio_con_uart:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vGPHCON<br />gpio_up_uart:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;vGPHUP<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.align&nbsp;&nbsp;&nbsp;&nbsp;2<br />DW_STACK_START:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;STACK_BASE+STACK_SIZE-4<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br />&nbsp;&nbsp;&nbsp;&nbsp;.align&nbsp;&nbsp;&nbsp;&nbsp;2<br />HEX_TO_ASCII_TABLE:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;0123456789ABCDEF&quot;<br />STR_STACK:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;STKP&quot;<br />STR_UNDEF:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;UNDF&quot;<br />STR_SWI:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;SWI&nbsp;&quot;<br />STR_PREFETCH_ABORT:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;PABT&quot;<br />STR_DATA_ABORT:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;DABT&quot;<br />STR_IRQ:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;IRQ&nbsp;&quot;<br />STR_FIQ:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;FIQ&quot;<br />STR_NOT_USED:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;NUSD&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;.align&nbsp;2<br />STR_OK:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;OK&nbsp;&nbsp;&quot;<br />STR_FAIL:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&nbsp;&nbsp;&quot;FAIL&quot;<br />STR_CR:<br />&nbsp;&nbsp;&nbsp;&nbsp;.ascii&nbsp;&nbsp;&quot;\r\n&quot;<br />#endif<br /><br />.align&nbsp;4<br />SerBase:<br />#if&nbsp;defined(CONFIG_SERIAL_UART0)<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;UART0_CTL_BASE<br />#elif&nbsp;defined(CONFIG_SERIAL_UART1)<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;UART1_CTL_BASE<br />#elif&nbsp;defined(CONFIG_SERIAL_UART2)<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;UART2_CTL_BASE<br />#else<br />#error&nbsp;not&nbsp;defined&nbsp;base&nbsp;address&nbsp;of&nbsp;serial<br />#endif<br /><br />#ifdef&nbsp;CONFIG_PM<br />.align&nbsp;4<br />PMCTL0_ADDR:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;0x4c00000c<br />PMCTL1_ADDR:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;0x56000080<br />PMST_ADDR:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;0x560000B4<br />PMSR0_ADDR:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;0x560000B8<br />REFR_ADDR:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;0x48000024<br />#endif<br />
 楼主| avocationA 发表于 2008-6-8 08:54 | 显示全部楼层

转网上的()望高手在完善下.

Vivi&nbsp;是韩国mizi&nbsp;公司开发的bootloader,&nbsp;适用于ARM9处理器。&nbsp;Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,见下表:&nbsp;<br />&nbsp;<br /><br />命令&nbsp;<br />&nbsp;功能<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;Load<br />&nbsp;把二进制文件载入Flash或RAM<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;Part<br />&nbsp;操作MTD分区信息。显示、增加、删除、复位、保存MTD分区<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;Param<br />&nbsp;设置参数<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;Boot<br />&nbsp;启动系统<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;Flash<br />&nbsp;管理Flash,如删除Flash的数据<br />&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />1.2&nbsp;vivi的配置与编译<br />1.2.1&nbsp;建立交叉开发环境<br />1、在宿主机上安装标准Linux&nbsp;操作系统:Redhat&nbsp;9.0&nbsp;(&nbsp;主机系统为win2000,用虚拟机vmware安装的Redhat&nbsp;9.0,内核版本为2.4.18)&nbsp;。<br /><br />2、宿主机上安装交叉编译器。<br /><br />我这边的2410开发板提供的光盘上已附交叉编译器工具:arm-linux-gcc-2.95.3(源码为cross-2.95.3.tar.bz2)。<br /><br />先以root&nbsp;用户的身份登陆到linux&nbsp;下。<br /><br />进入/usr/local&nbsp;目录,创建名为arm的目录:<br /><br />cd&nbsp;/usr/local<br /><br />mkdir&nbsp;arm<br /><br />将光盘提供的cross-2.95.3.tar.bz2解压到/usr/local/arm目录:<br /><br />tar&nbsp;jxvf&nbsp;cross-2.95.3.tar.bz2&nbsp;–C&nbsp;/usr/local/arm<br /><br />&nbsp;<br /><br />然后修改修改PATH&nbsp;变量:为了可以方便使用arm-linux-gcc编译器系统,&nbsp;把arm-linux工具链目录加入到环境变量PATH中:<br /><br />修改/etc/profile文件,添加pathmunge&nbsp;/usr/local/arm/2.95.3/bin即可。<br /><br />#&nbsp;Path&nbsp;manipulation<br /><br />if&nbsp;[&nbsp;`id&nbsp;-u`&nbsp;=&nbsp;0&nbsp;];&nbsp;then<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathmunge&nbsp;&nbsp;/sbin<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathmunge&nbsp;&nbsp;/usr/sbin<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathmunge&nbsp;&nbsp;/usr/local/sbin<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathmunge&nbsp;&nbsp;/usr/local/arm/2.95.3/bin&nbsp;<br /><br />fi<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />pathmunge&nbsp;/usr/X11R6/bin&nbsp;after<br /><br />设置环境变量后,最好是重启或注销一下,这样设置的环境变量才能生效。<br /><br />&nbsp;<br /><br />1.2.2&nbsp;配置和编译vivi<br />如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flash的vivi&nbsp;二进制映象文件。<br /><br />由于vivi要用到kernel的一些头文件,所以需要kernel的源代码,所以先要把linux的kernel准备好。将vivi和kernel都解到相应目录下(例如我将光盘提供的vivi源代码解压到/home/chenjun目录下,光盘提供的Linux&nbsp;kernel源码kernel-h2410eb.041024.tar.gz也解压到/home/chenjun目录下,解压后的文件名为kerne-h2410eb)。<br /><br />然后需修改/vivi/Makefile里的一些变量设置:<br /><br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LINUX_INCLUDE_DIR&nbsp;=&nbsp;/kernel/include/<br /><br />(LINUX_INCLUDE_DIR&nbsp;为kernel/include的对应目录,我的是/home/chen/kerne-h2410eb&nbsp;/include/)<br /><br />因此修改为:<br /><br />LINUX_INCLUDE_DIR&nbsp;=&nbsp;/home/chenjun/&nbsp;kerne-h2410eb/include/<br /><br />&nbsp;<br /><br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CROSS_COMPILE&nbsp;&nbsp;&nbsp;=&nbsp;/usr/local/arm/2.95.3/bin/arm-linux-&nbsp;<br /><br />(CROSS_COMPILE&nbsp;为arm-linux安装的相应目录,我的是/usr/local/arm/2.95.3/bin/arm-linux-)<br /><br />因此修改为:<br /><br />CROSS_COMPILE&nbsp;&nbsp;&nbsp;=&nbsp;/usr/local/arm/2.95.3/bin/arm-linux-<br /><br />&nbsp;<br /><br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ARM_GCC_LIBS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3<br /><br />(需根据你arm-linux的安装目录修改,我的是/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3)<br /><br />&nbsp;<br /><br />进入/vivi目录执行make&nbsp;distclean。(目的是确保编译的有效性,在编译之前将vivi里所有的“*.o”和“*.o.flag”文件删掉)<br /><br />进入/vivi目录里,输入“make&nbsp;menuconfig”,开始选择配置。可以Load一个写好的配置文件也可以自己修改试试。注意Exit时一定要选“Yes”保存配置。<br /><br />再输入“make”正式开始编译,一会儿就完了。如果不报错,在/vivi里面就有你自己的“vivi”了。这个就是后面要烧写到flash中的bootloader。<br /><br />1.3&nbsp;vivi代码分析<br />vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。<br /><br />Vivi主要包括下面几个目录:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />1.4&nbsp;vivi的运行<br />vivi的运行也可以分为两个阶段:<br /><br />1.4.1&nbsp;vivi的第一阶段<br />完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(\vivi\arch\s3c2410目录下):<br /><br />Head.S:<br /><br />&nbsp;<br /><br />#include&nbsp;&quot;config.h&quot;<br /><br />#include&nbsp;&quot;linkage.h&quot;<br /><br />#include&nbsp;&quot;machine.h&quot;<br /><br />&nbsp;<br /><br />@&nbsp;Start&nbsp;of&nbsp;executable&nbsp;code&nbsp;<br /><br />&nbsp;<br /><br />ENTRY(_start)<br /><br />ENTRY(ResetEntryPoint)<br /><br />&nbsp;<br /><br />@<br /><br />@&nbsp;Exception&nbsp;vector&nbsp;table&nbsp;(physical&nbsp;address&nbsp;=&nbsp;0x00000000)&nbsp;&nbsp;;异常向量表物理地址<br /><br />@<br /><br />&nbsp;<br /><br />@&nbsp;0x00:&nbsp;Reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;复位<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br /><br />&nbsp;<br /><br />@&nbsp;0x04:&nbsp;Undefined&nbsp;instruction&nbsp;exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;未定义的指令异常<br /><br />UndefEntryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleUndef<br /><br />&nbsp;<br /><br />@&nbsp;0x08:&nbsp;Software&nbsp;interrupt&nbsp;exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;软件中断异常<br /><br />SWIEntryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleSWI<br /><br />&nbsp;<br /><br />@&nbsp;0x0c:&nbsp;Prefetch&nbsp;Abort&nbsp;(Instruction&nbsp;Fetch&nbsp;Memory&nbsp;Abort)&nbsp;&nbsp;;内存操作异常<br /><br />PrefetchAbortEnteryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandlePrefetchAbort<br /><br />&nbsp;<br /><br />@&nbsp;0x10:&nbsp;Data&nbsp;Access&nbsp;Memory&nbsp;Abort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;数据异常<br /><br />DataAbortEntryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleDataAbort<br /><br />&nbsp;<br /><br />@&nbsp;0x14:&nbsp;Not&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;未使用<br /><br />NotUsedEntryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleNotUsed<br /><br />&nbsp;<br /><br />@&nbsp;0x18:&nbsp;IRQ(Interrupt&nbsp;Request)&nbsp;exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;慢速中断处理<br /><br />IRQEntryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleIRQ<br /><br />&nbsp;<br /><br />@&nbsp;0x1c:&nbsp;FIQ(Fast&nbsp;Interrupt&nbsp;Request)&nbsp;exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;快速中断处理<br /><br />FIQEntryPoint:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleFIQ<br /><br />&nbsp;<br /><br />@<br /><br />@&nbsp;VIVI&nbsp;magics<br /><br />@<br /><br />&nbsp;<br /><br />@&nbsp;0x20:&nbsp;magic&nbsp;number&nbsp;so&nbsp;we&nbsp;can&nbsp;verify&nbsp;that&nbsp;we&nbsp;only&nbsp;put&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;0<br /><br />@&nbsp;0x24:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;0<br /><br />@&nbsp;0x28:&nbsp;where&nbsp;this&nbsp;vivi&nbsp;was&nbsp;linked,&nbsp;so&nbsp;we&nbsp;can&nbsp;put&nbsp;it&nbsp;in&nbsp;memory&nbsp;in&nbsp;the&nbsp;right&nbsp;place<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;_start<br /><br />@&nbsp;0x2C:&nbsp;this&nbsp;contains&nbsp;the&nbsp;platform,&nbsp;cpu&nbsp;and&nbsp;machine&nbsp;id<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;ARCHITECTURE_MAGIC<br /><br />@&nbsp;0x30:&nbsp;vivi&nbsp;capabilities&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;0<br /><br />#ifdef&nbsp;CONFIG_PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;vivi考虑不需要使用电源管理<br /><br />@&nbsp;0x34:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SleepRamProc<br /><br />#endif<br /><br />#ifdef&nbsp;CONFIG_TEST<br /><br />@&nbsp;0x38:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hmi<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />@<br /><br />@&nbsp;Start&nbsp;VIVI&nbsp;head<br /><br />@<br /><br />Reset:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;disable&nbsp;watch&nbsp;dog&nbsp;timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;禁止看门狗计时器<br /><br />mov&nbsp;r1,&nbsp;#0x53000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;WTCON寄存器地址是<br /><br />0x53000000,清0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1]<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_S3C2410_MPORT3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;不符合条件,跳到下面的关中断<br /><br />/****&nbsp;在/vivi/include/autoconf.h中#undef&nbsp;&nbsp;CONFIG_S3C2410_MPORT3******/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#0x56000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;GPACON寄存器地址是<br /><br />0x56000000<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x00000005<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#0x70]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;配置GPHCON寄存器<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x00000001<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#0x78]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;配置GPHUP寄存器<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x00000001<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#0x74]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;配置GPHDAT寄存器<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;disable&nbsp;all&nbsp;interrupts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;禁止全部中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#INT_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0xffffffff<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oINTMSK]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;掩码关闭所有中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;=0x7ff<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oINTSUBMSK]&nbsp;&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;initialise&nbsp;system&nbsp;clocks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;初始化系统时钟<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#CLK_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mvn&nbsp;r2,&nbsp;#0xff000000<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oLOCKTIME]<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;mpll_50mhz<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oMPLLCON]<br /><br />#ifndef&nbsp;CONFIG_S3C2410_MPORT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;满足条件,向下执行<br /><br />/****&nbsp;在/vivi/include/autoconf.h中#undef&nbsp;&nbsp;CONFIG_S3C2410_MPORT1******/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;1:2:4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#CLK_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oCLKDIVN]<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mrc&nbsp;p15,&nbsp;0,&nbsp;r1,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;read&nbsp;ctrl&nbsp;register&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;r1,&nbsp;r1,&nbsp;#0xc0000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Asynchronous&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcr&nbsp;p15,&nbsp;0,&nbsp;r1,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;ctrl&nbsp;register<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;now,&nbsp;CPU&nbsp;clock&nbsp;is&nbsp;200&nbsp;Mhz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;CPU的频率是200MHz<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#CLK_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;mpll_200mhz<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oMPLLCON]<br /><br />#else<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;1:2:2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#CLK_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;clock_clkdivn<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#oCLKDIVN]<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mrc&nbsp;p15,&nbsp;0,&nbsp;r1,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;read&nbsp;ctrl&nbsp;register<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;r1,&nbsp;r1,&nbsp;#0xc0000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Asynchronous<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mcr&nbsp;p15,&nbsp;0,&nbsp;r1,&nbsp;c1,&nbsp;c0,&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;write&nbsp;ctrl&nbsp;register<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;now,&nbsp;CPU&nbsp;clock&nbsp;is&nbsp;100&nbsp;Mhz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;CPU的频率是100MHz<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#CLK_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,&nbsp;mpll_100mhz<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;r2,&nbsp;[r1,&nbsp;#oMPLLCON]<br /><br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;memsetup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;跳转到memsetup函数<br /><br />/*****************************<br /><br />Memsetup函数的实现:<br /><br />ENTRY(memsetup)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;initialise&nbsp;the&nbsp;static&nbsp;memory&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;memory&nbsp;control&nbsp;registers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置内存控制寄存器的初值<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#MEM_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adrl&nbsp;r2,&nbsp;mem_cfg_val<br /><br />/*******************<br /><br />@<br /><br />@&nbsp;Data&nbsp;Area<br /><br />@<br /><br />@&nbsp;Memory&nbsp;configuration&nbsp;values<br /><br />.align&nbsp;4<br /><br />mem_cfg_val:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;定义好的13*4=52个字节初值<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBWSCON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;在/vivi/include/platform/smdk2410.h中赋值<br /><br />/******&nbsp;&nbsp;&nbsp;SDRAM从32位变成16位,需要修改vBWSCON的值&nbsp;******/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON3<br /><br />/**********&nbsp;&nbsp;网卡控制器vBANKCON3的值可能需要修改&nbsp;&nbsp;**************/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON5<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON6<br /><br />/******&nbsp;SDRAM从32位变成16位,可能需要修改vBANKCON6的值&nbsp;******/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKCON7<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vREFRESH<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBANKSIZE<br /><br />/******&nbsp;SDRAM从64MB变成32MB,需要修改vBANKSIZE的值&nbsp;******/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vMRSRB6<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vMRSRB7<br /><br />********************/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r3,&nbsp;r1,&nbsp;#52<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r4,&nbsp;[r2],&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r4,&nbsp;[r1],&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r1,&nbsp;r3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;循环操作,直到13个寄存器赋值完成<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;pc,&nbsp;lr<br /><br />*******************************/<br /><br />#ifdef&nbsp;CONFIG_PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;vivi考虑不需要使用电源管理<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Check&nbsp;if&nbsp;this&nbsp;is&nbsp;a&nbsp;wake-up&nbsp;from&nbsp;sleep&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;PMST_ADDR<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;[r1]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#(PMST_SMR)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;WakeupStart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;查看状态,判断是否需要跳转到WakeupStart<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_S3C2410_SMDK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;SMDK开发板使用<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;All&nbsp;LED&nbsp;on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;点亮开发板上的LED<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;LED使用GPIOF组的管脚<br /><br />ldr&nbsp;&nbsp;&nbsp;r2,=0x55aa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;使能EINT0,EINT1,EINT2,EINT3,<br /><br />;另四个管脚配置成输出,屏蔽EINT4,5,6,7<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_CON]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0xff<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_UP]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;disable&nbsp;the&nbsp;pull-up&nbsp;function<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x00<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_DAT]<br /><br />#endif<br /><br />&nbsp;<br /><br />#if&nbsp;0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;SVC<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;r0,&nbsp;cpsr<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#0xdf<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;r1,&nbsp;r0,&nbsp;#0xd3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;cpsr_all,&nbsp;r1<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;GPIO&nbsp;for&nbsp;UART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置串口<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#GPIO_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r1,&nbsp;r1,&nbsp;#oGPIO_H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置GPIO_H组管脚为串口<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;gpio_con_uart&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_CON]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;gpio_up_uart<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oGPIO_UP]&nbsp;&nbsp;<br /><br />/*************************<br /><br />@&nbsp;inital&nbsp;values&nbsp;for&nbsp;GPIO<br /><br />gpio_con_uart:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vGPHCON&nbsp;&nbsp;&nbsp;;vGPHCON在/vivi/include/platform/smdk2410.h中赋值<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;#define&nbsp;vGPHCON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0016faaa<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;GPIO_H配置为nCTS0,nRTS0,&nbsp;RXD0,TXD0,&nbsp;RXD1,<br /><br />;TXD1,nCTS1,nRTS1,<br /><br />&nbsp;<br /><br />/****&nbsp;&nbsp;三个串口都使能,可能需要修改#define&nbsp;vGPHCON&nbsp;0x0016aaaa&nbsp;&nbsp;&nbsp;****/<br /><br />&nbsp;<br /><br />gpio_up_uart:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vgphup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;同上#define&nbsp;vGPHUP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000007ff<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;The&nbsp;pull-up&nbsp;function&nbsp;is&nbsp;disabled.<br /><br />************************/<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;InitUART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;跳转到InitUART串口初始化函数<br /><br />/****************************************************<br /><br />@&nbsp;Initialize&nbsp;UART<br /><br />@<br /><br />@&nbsp;r0&nbsp;=&nbsp;number&nbsp;of&nbsp;UART&nbsp;port<br /><br />InitUART:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />/*******************<br /><br />.align&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;缺省情况下在vivi中只初始化了UART0<br /><br />SerBase:<br /><br />#if&nbsp;defined(CONFIG_SERIAL_UART0)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;UART0_CTL_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;基地址在/vivi/include/s3c2410.h中定义<br /><br />#elif&nbsp;defined(CONFIG_SERIAL_UART1)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;UART1_CTL_BASE<br /><br />#elif&nbsp;defined(CONFIG_SERIAL_UART2)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;UART2_CTL_BASE<br /><br />#else<br /><br />#error&nbsp;not&nbsp;defined&nbsp;base&nbsp;address&nbsp;of&nbsp;serial<br /><br />#endif<br /><br />********************/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUFCON]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUMCON]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oULCON]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;=0x245<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUCON]<br /><br />#define&nbsp;UART_BRD&nbsp;((50000000&nbsp;/&nbsp;(UART_BAUD_RATE&nbsp;*&nbsp;16))&nbsp;-&nbsp;1)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#UART_BRD<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUBRDIV]<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r3,&nbsp;#100<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x0<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#0x1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;1b<br /><br />&nbsp;<br /><br />#if&nbsp;0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#'U'<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUTXHL]<br /><br />&nbsp;<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r3,&nbsp;[r1,&nbsp;#oUTRSTAT]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#'0'<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oUTXHL]<br /><br />&nbsp;<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r3,&nbsp;[r1,&nbsp;#oUTRSTAT]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;r3,&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;#UTRSTAT_TX_EMPTY<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;pc,&nbsp;lr<br /><br />****************************************************/<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;打印调试信息,缺省未定义<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;Print&nbsp;current&nbsp;Program&nbsp;Counter<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,&nbsp;#'\r'<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,&nbsp;#'\n'<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,&nbsp;#'@'<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintChar<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,&nbsp;pc<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_BOOTUP_MEMTEST<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;simple&nbsp;memory&nbsp;test&nbsp;to&nbsp;find&nbsp;some&nbsp;DRAM&nbsp;flaults.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;memtest<br /><br />#endif<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_S3C2410_NAND_BOOT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;从NAND&nbsp;Flash启动<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;copy_myself&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;跳转到copy_myself函数<br /><br />/**********************************************<br /><br />@<br /><br />@&nbsp;copy_myself:&nbsp;copy&nbsp;vivi&nbsp;to&nbsp;ram<br /><br />@<br /><br />copy_myself:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r10,&nbsp;lr<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;reset&nbsp;NAND<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,&nbsp;#NAND_CTL_BASE<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;=0xf830&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;initial&nbsp;value<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#0x800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;enable&nbsp;chip<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0xff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;RESET&nbsp;command<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strb&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCMD]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r3,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;wait&nbsp;<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r3,&nbsp;r3,&nbsp;#0x1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r3,&nbsp;#0xa<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blt&nbsp;&nbsp;&nbsp;1b<br /><br />2:&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFSTAT]&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;wait&nbsp;ready<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0x1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;2b<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#0x800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;disable&nbsp;chip<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;get&nbsp;read&nbsp;to&nbsp;call&nbsp;C&nbsp;functions&nbsp;(for&nbsp;nand_read())<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;sp,&nbsp;DW_STACK_START&nbsp;&nbsp;@&nbsp;setup&nbsp;stack&nbsp;pointer<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;fp,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;no&nbsp;previous&nbsp;frame,&nbsp;so&nbsp;fp=0<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;copy&nbsp;vivi&nbsp;to&nbsp;RAM<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;=VIVI_RAM_BASE<br /><br />/*********在/vivi/linux/platform/smdk2410.h中定义<br /><br />#define&nbsp;VIVI_RAM_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(DRAM_BASE&nbsp;+&nbsp;DRAM_SIZE&nbsp;-&nbsp;VIVI_RAM_SIZE)<br /><br />***************************************/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;#0x0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x20000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;0x20000-〉128k字节<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;nand_read_ll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;nand_read_ll在/vivi/arch/s3c2410/nand_read.c中定义<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;r0,r1,r2分别为函数的三个参数<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;从NANDFlash的0地址拷贝128k到SDRAM指定处<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;#0x0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;ok_nand_read<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br /><br />bad_nand_read:&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_FAIL<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop&nbsp;<br /><br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />ok_nand_read:<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_OK<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;verify<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,&nbsp;#0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;=0x33f00000<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r2,&nbsp;#0x400&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;4&nbsp;bytes&nbsp;*&nbsp;1024&nbsp;=&nbsp;4K-bytes<br /><br />go_next:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r3,&nbsp;[r0],&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r4,&nbsp;[r1],&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;teq&nbsp;&nbsp;r3,&nbsp;r4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;notmatch<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;done_nand_read&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bne&nbsp;&nbsp;go_next<br /><br />notmatch:<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_FAIL<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br /><br />#endif<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b<br /><br />done_nand_read:<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_OK<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;pc,&nbsp;r10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;vivi拷贝到SDRAM完成,函数返回<br /><br />*********************************/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;jump&nbsp;to&nbsp;ram<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;=on_the_ram<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;pc,&nbsp;r1,&nbsp;#0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop<br /><br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop<br /><br />&nbsp;<br /><br />on_the_ram:<br /><br />#endif<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_DEBUG_LL<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r1,&nbsp;SerBase<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;STR_STACK<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintWord<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;r0,&nbsp;DW_STACK_START<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;PrintHexWord<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;get&nbsp;read&nbsp;to&nbsp;call&nbsp;C&nbsp;functions<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;sp,&nbsp;DW_STACK_START&nbsp;&nbsp;@&nbsp;setup&nbsp;stack&nbsp;pointer<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;fp,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;no&nbsp;previous&nbsp;frame,&nbsp;so&nbsp;fp=0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a2,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;set&nbsp;argv&nbsp;to&nbsp;NULL&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;call&nbsp;main&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;pc,&nbsp;#FLASH_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;otherwise,&nbsp;reboot<br /><br />&nbsp;<br /><br />@<br /><br />@&nbsp;End&nbsp;VIVI&nbsp;head<br /><br />@<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />1.4.2&nbsp;vivi的第二阶段<br />vivi的第二阶段是从main()函数开始,同一般的C语言程序一样,该函数在/init/main.c文件中,总共可以分为8个步骤。<br /><br />(1)&nbsp;&nbsp;&nbsp;&nbsp;函数开始,通过putstr(vivi_banner)打印出vivi的版本。Vivi_banner在/init/version.c文件中定义<br /><br />(2)&nbsp;&nbsp;&nbsp;&nbsp;对开发板进行初始化(board_init函数),board_init是与开发板紧密相关的,这个函数在/arch/s3c2410/smdk.c文件中。开发板初始化主要完成两个功能,时钟初始化(init_time())和通用IO口设置(set_gpios())。<br /><br />void&nbsp;set_gpios(void)<br /><br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPACON&nbsp;&nbsp;=&nbsp;vGPACON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPBCON&nbsp;&nbsp;=&nbsp;vGPBCON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPBUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPBUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPCCON&nbsp;&nbsp;=&nbsp;vGPCCON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPCUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPCUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPDCON&nbsp;&nbsp;=&nbsp;vGPDCON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPDUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPDUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPECON&nbsp;&nbsp;=&nbsp;vGPECON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPEUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPEUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPFCON&nbsp;&nbsp;=&nbsp;vGPFCON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPFUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPFUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPGCON&nbsp;&nbsp;=&nbsp;vGPGCON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPGUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPGUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPHCON&nbsp;&nbsp;=&nbsp;vGPHCON;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPHUP&nbsp;&nbsp;&nbsp;=&nbsp;vGPHUP;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT0&nbsp;=&nbsp;vEXTINT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT1&nbsp;=&nbsp;vEXTINT1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT2&nbsp;=&nbsp;vEXTINT2;<br /><br />}<br /><br />其中,GPIO口在smdk2410.h(\vivi\include\platform\目录下)文件中定义。<br /><br />(3)&nbsp;&nbsp;&nbsp;&nbsp;内存映射初始化和内存管理单元的初始化工作:<br /><br />mem_map_init();<br /><br />mmu_init();<br /><br />这两个函数都在/arch/s3c2410/mmu.c文件中。<br /><br />void&nbsp;mem_map_init(void)<br /><br />{<br /><br />#ifdef&nbsp;CONFIG_S3C2410_NAND_BOOT<br /><br />&nbsp;&nbsp;mem_map_nand_boot();<br /><br />#else<br /><br />&nbsp;&nbsp;mem_map_nor();<br /><br />#endif<br /><br />&nbsp;&nbsp;cache_clean_invalidate();<br /><br />&nbsp;&nbsp;tlb_invalidate();<br /><br />}<br /><br />&nbsp;<br /><br />如果配置vivi时使用了NAND作为启动设备,则执行mem_map_nand_boot(),否则执行mem_map_nor()。这里要注意的是,如果使用NOR启动,则必须先把vivi代码复制到RAM中。这个过程是由copy_vivi_to_ram()函数来完成的。代码如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;copy_vivi_to_ram(void)<br /><br />{<br /><br />&nbsp;&nbsp;putstr_hex(&quot;Evacuating&nbsp;1MB&nbsp;of&nbsp;Flash&nbsp;to&nbsp;DRAM&nbsp;at&nbsp;0x&quot;,&nbsp;VIVI_RAM_BASE);<br /><br />&nbsp;&nbsp;memcpy((void&nbsp;*)VIVI_RAM_BASE,&nbsp;(void&nbsp;*)VIVI_ROM_BASE,&nbsp;VIVI_RAM_SIZE);<br /><br />}<br /><br />VIVI_RAM_BASE、VIVI_ROM_BASE、VIVI_RAM_SIZE这些值都可以在smdk2410.h中查到,并且这些值必须根据自己开发板的RAM实际大小修改。这也是在移植vivi的过程中需要注意的一个地方。<br /><br />mmu_init()函数中执行了arm920_setup函数。这段代码是用汇编语言实现的,针对arm920t核的处理器。<br /><br />&nbsp;<br /><br />(4)&nbsp;&nbsp;&nbsp;&nbsp;初始化堆栈,heap_init()。(定义在\vivi\lib\heap.c文件中)<br /><br />int&nbsp;heap_init(void)<br /><br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;mmalloc_init((unsigned&nbsp;char&nbsp;*)(HEAP_BASE),&nbsp;HEAP_SIZE);&nbsp;<br /><br />}<br /><br />(5)&nbsp;&nbsp;&nbsp;&nbsp;初始化mtd设备,mtd_dev_init()。<br /><br />int&nbsp;mtd_init(void)<br /><br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret;<br /><br />&nbsp;<br /><br />#ifdef&nbsp;CONFIG_MTD_CFI<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;cfi_init();<br /><br />#endif<br /><br />#ifdef&nbsp;CONFIG_MTD_SMC<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;smc_init();<br /><br />#endif<br /><br />#ifdef&nbsp;CONFIG_S3C2410_AMD_BOOT<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;amd_init();<br /><br />#endif<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mymtd&nbsp;=&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br /><br />}<br /><br />这几个函数可以在/drivers/mtd/maps/s3c2410_flash.c里找到。<br /><br />(6)&nbsp;&nbsp;&nbsp;&nbsp;初始化私有数据,init_priv_data()。(定义在\vivi\lib\priv_data\rw.c文件中)<br /><br />(7)&nbsp;&nbsp;&nbsp;&nbsp;初始化内置命令,init_builtin_cmds()。<br /><br />通过add_command函数,加载vivi内置的几个命令。<br /><br />(8)&nbsp;&nbsp;&nbsp;&nbsp;启动boot_or_vivi()。<br /><br />启动成功后,将通过vivi_shell()启动一个shell(如果配置了CONFIG_SERIAL_TERM),此时vivi的任务完成。<br /><br />
walnutcy 发表于 2008-6-9 01:37 | 显示全部楼层

看起来头晕,,

  
Ice_River 发表于 2008-6-10 17:22 | 显示全部楼层

搜索VIVI 开发笔记!

会有收获的~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

123

主题

934

帖子

0

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