关于UBOOT中搬移代码到SDRAM的疑问

[复制链接]
3045|1
 楼主| cbqcgq 发表于 2008-8-6 13:42 | 显示全部楼层 |阅读模式
我的硬件平台是S3C2410,NAND&nbsp;FLASH&nbsp;64M,SDRAM&nbsp;64M。研究UBOOT的start.S时发现他本身有一段代码用来复制自身到SDRAM中去的,如下:<br />relocate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;relocate&nbsp;U-Boot&nbsp;to&nbsp;RAM&nbsp;*/<br />&nbsp;adr&nbsp;r0,&nbsp;_start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;r0&nbsp;&lt-&nbsp;current&nbsp;position&nbsp;of&nbsp;code&nbsp;*/<br />&nbsp;ldr&nbsp;r1,&nbsp;_TEXT_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;defined&nbsp;position&nbsp;of&nbsp;code&nbsp;=0x33f8'0000*/<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;test&nbsp;if&nbsp;we&nbsp;run&nbsp;from&nbsp;flash&nbsp;or&nbsp;RAM&nbsp;*/<br />&nbsp;cmp&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;don't&nbsp;reloc&nbsp;during&nbsp;debug&nbsp;*/<br />&nbsp;beq&nbsp;stack_setup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />&nbsp;ldr&nbsp;r2,&nbsp;_armboot_start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;ldr&nbsp;r3,&nbsp;_bss_start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;sub&nbsp;r2,&nbsp;r3,&nbsp;r2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;add&nbsp;r2,&nbsp;r0,&nbsp;r2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />copy_loop:<br />&nbsp;ldmia&nbsp;r0!,&nbsp;{r3-r10}&nbsp;&nbsp;<br />&nbsp;stmia&nbsp;r1!,&nbsp;{r3-r10}&nbsp;&nbsp;<br />&nbsp;cmp&nbsp;r0,&nbsp;r2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;ble&nbsp;copy_loop<br />为什么资料上还要移植vivi中的一大段代码(如下),用来做为复制uboot代码到SDRAM?两个功能有区别吗?<br />#ifdef&nbsp;CONFIG_S3C2410_NAND_BOOT<br />copy_myself:<br />&nbsp;mov&nbsp;r10,&nbsp;lr<br />@&nbsp;reset&nbsp;NAND<br />&nbsp;mov&nbsp;&nbsp;&nbsp;r1,&nbsp;#NAND_CTL_BASE<br />&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;=0xf830&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;initial&nbsp;value<br />&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;#define&nbsp;oNFCONF&nbsp;0x00<br />&nbsp;ldr&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br />&nbsp;bic&nbsp;&nbsp;&nbsp;r2,&nbsp;r2,&nbsp;#0x800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;enable&nbsp;chip<br />&nbsp;str&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCONF]<br />&nbsp;mov&nbsp;&nbsp;&nbsp;r2,&nbsp;#0xff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;RESET&nbsp;command<br />&nbsp;strb&nbsp;&nbsp;r2,&nbsp;[r1,&nbsp;#oNFCMD]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;#define&nbsp;oNFCMD&nbsp;0x04<br />&nbsp;mov&nbsp;&nbsp;&nbsp;r3,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;wait<br />&nbsp;...<br />&nbsp;...
crypt.wind 发表于 2008-8-8 23:40 | 显示全部楼层

nandflash不能直接执行代码

如果是从nandflash启动,那么一开始,IC加电后硬件把nandflash最开头的4k代码复制到内部ram里执行。而nandflash本身不能直接执行代码。所以要继续执行,得把代码拷贝到sdram里。<br />所以head.S里有部分代码的作用就是把nandflash开头的bootloader如uboot或者vivi拷贝到sdram里,然后在sdram里再继续执行。<br />你看vivi代码:<br />#ifdef&nbsp;CONFIG_S3C2410_NAND_BOOT<br />copy_myself:<br />mov&nbsp;r10,&nbsp;lr<br />...<br /><br />这不是说明了吗?如果是配置成从nandflash启动的话
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

53

帖子

1

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