关于2410nandflash的启动过程的分析,请同行们指教

[复制链接]
 楼主| armfan 发表于 2008-2-21 09:25 | 显示全部楼层 |阅读模式
&nbsp;过程1&nbsp;&nbsp;YLP2410_BIOS.bin——————》nandflash<br />&nbsp;&nbsp;这一过程是用sjf&nbsp;flash烧写工具实现的。<br />&nbsp;<br />过程2&nbsp;nandflash——————》&nbsp;&nbsp;内部SRAM(YLP2410_BIOS.bin前4k的内容)<br />&nbsp;&nbsp;这一过程是硬件自动完成实现的。<br /><br />&nbsp;过程3&nbsp;内部SRAM——————》SDRAM<br />这一过程是怎样实现的??怎样把YLP2410_BIOS.bin移到SDRAM中,是靠DebugRel&nbsp;Settings设置??还是靠本身的代码完成??<br /><br />前两个过程我分析的对吗??
liucy2 发表于 2008-2-22 14:49 | 显示全部楼层

关于2410nandflash的启动过程

nandflash前4K是硬件初始化和启动引导程序。<br />在启动时,1/nandflash---Steppingstone内部缓冲器中,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2/Steppingstone内部缓冲器映射到SDRAM(nGCCS0)中。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3/CPU在Steppingstone内部缓冲器中开始启动代码。<br />使用nandflash启动要进行配置相应控制寄存器。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| armfan 发表于 2008-2-23 15:06 | 显示全部楼层

感谢帮忙,请继续关注

谢谢你的帮助。<br /><br />nandflash前4K是硬件初始化和启动引导程序。<br />在启动时,1/nandflash---Steppingstone内部缓冲器中,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2/Steppingstone内部缓冲器映射到SDRAM(nGCCS0)中。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3/CPU在Steppingstone内部缓冲器中开始启动代码。<br />使用nandflash启动要进行配置相应控制寄存器。<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;“3/CPU在Steppingstone内部缓冲器中开始启动代码&nbsp;&nbsp;&nbsp;&nbsp;”之后的操作呢???<br />是不是有一段复制代码即从nandflash--SDRAM中(假设SDRAM的起始地址是0x30000000)??假设上面的猜想是对的,那么以后又是怎么操作的?<br />&nbsp;&nbsp;&nbsp;再就是能详细讲一下2410的启动过程吗??<br /><br /><br />&nbsp;
dld2 发表于 2008-2-23 15:12 | 显示全部楼层

正确

#include&nbsp;&quot;def.h&quot;<br />#include&nbsp;&quot;option.h&quot;<br />#include&nbsp;&quot;romdef.h&quot;<br />#include&nbsp;&quot;2410addr.h&quot;<br /><br />#define&nbsp;DST_SDRAM_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x30e00000)<br />#define&nbsp;NAND_BLOCK_START&nbsp;&nbsp;&nbsp;&nbsp;(2)<br />#define&nbsp;NAND_BLOCK_NUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(8)<br /><br />extern&nbsp;void&nbsp;NF_Init(void);<br />//extern&nbsp;U16&nbsp;NF_CheckId(void);<br />//extern&nbsp;void&nbsp;K9S1208_Program(U32&nbsp;blockIndex,&nbsp;U32&nbsp;srcAddress,&nbsp;U32&nbsp;fileSize);<br />extern&nbsp;int&nbsp;NF_ReadPage(U32&nbsp;block,U32&nbsp;page,U8&nbsp;*buffer);<br /><br />void&nbsp;(*__SYS)(void);<br />void&nbsp;Main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//U16&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;*dst;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//liuyan&nbsp;060828<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPFCON&nbsp;=&nbsp;0x55aa;<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPFDAT&nbsp;=&nbsp;0x70;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NF_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;//id=NF_CheckId();<br />&nbsp;&nbsp;&nbsp;&nbsp;//if(id!=0xec76)<br />&nbsp;&nbsp;&nbsp;&nbsp;//return;<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK&nbsp;=&nbsp;BIT_ALLMSK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;dst&nbsp;=&nbsp;(unsigned&nbsp;char&nbsp;*)DST_SDRAM_ADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;NAND_BLOCK_START;&nbsp;i&nbsp;&lt&nbsp;(NAND_BLOCK_NUM&nbsp;+&nbsp;NAND_BLOCK_START);&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//dst&nbsp;=&nbsp;(unsigned&nbsp;char&nbsp;*)DST_SDRAM_ADDR&nbsp;+&nbsp;((i&nbsp;-&nbsp;NAND_BLOCK_START)&nbsp;*&nbsp;512);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;32;&nbsp;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NF_ReadPage(i,&nbsp;j,&nbsp;dst);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dst&nbsp;=&nbsp;dst&nbsp;+&nbsp;512;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;__SYS&nbsp;=&nbsp;(void(*)())DST_SDRAM_ADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;(*__SYS)();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}
 楼主| armfan 发表于 2008-2-23 15:43 | 显示全部楼层

谢谢dld2,请继续关注

&nbsp;我是刚刚进入这一行业的,很菜的。问的问题可能太业余了,请多包涵!!<br />&nbsp;<br />&nbsp;上面的代码的大概说的是从nandflash中复制代码到SDRAM中。<br /><br />&nbsp;我想问的是这段代码是在Steppingstone中运行的吧?<br />&nbsp;<br />&nbsp;那么程序什么时候才能跳到SDRAM中?怎么跳到SDRAM??怎么保证程序从Steppingstone跳到SDRAM的无缝连接??
dld2 发表于 2008-2-23 15:48 | 显示全部楼层

Re

是在Steppingstone运行的。先拷贝nand中的代码到SDRAM,然后跳转过去。<br /><br />__SYS是一个函数指针。赋值为DST_SDRAM_ADDR。<br />(*__SYS)();就是跳转。这是C语言跳转到固定地址的一般方法。<br /><br />没感觉有“有缝无缝”的问题。<br />
 楼主| armfan 发表于 2008-2-23 15:59 | 显示全部楼层

re

<br /><br /><br />呵呵,问的太业余了,请见谅。<br /><br />“&nbsp;&nbsp;是在是在Steppingstone运行的。先拷贝nand中的代码到SDRAM,然后跳转过去。“<br /><br />跳过去做什么?是执行用户的应用程序吗?<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;那么如果发生中断,那么程序的中断向量表在那里?在Steppingstone还是SDRAM?如果发生复位呢?又是怎么一种情况?<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;
dld2 发表于 2008-2-23 16:05 | 显示全部楼层

re

拷贝的是可执行代码。<br />跳转过去就是执行。会给PC赋值。<br /><br />异常向量表在Steppingstone。此时Steppingstone被映射到GCS0。<br /><br />复位基本等于重新上电。
 楼主| armfan 发表于 2008-2-23 16:15 | 显示全部楼层

re

谢谢<br /><br />&nbsp;&nbsp;&nbsp;但是有一点我还不明白,我以前查找的资料说是copy的内容包含Steppingstone中的代码,如果是那样的话不是又把Steppingstone中的代码又执行一边??<br />&nbsp;&nbsp;&nbsp;但按照你的说法好像是不拷贝Steppingstone中的内容,也就是说Steppingstone中的代码和SDRAM没有重叠的地方。是这样理解吗?<br />
dld2 发表于 2008-2-23 16:23 | 显示全部楼层

re

我参考的实现中,确实没有把Steppingstone中的内容再拷贝到SDRAM。<br /><br />但是:<br />Steppingstone和被拷贝的应用程序,都包含有一个相同的初始化代码。在我这里源程序是2410init.s。
 楼主| armfan 发表于 2008-2-23 16:26 | 显示全部楼层

感谢dld2的耐心回答,祝工作顺利

  
dld2 发表于 2008-2-23 16:27 | 显示全部楼层

:)

  
LIUCY2 发表于 2008-2-25 13:33 | 显示全部楼层

ARM硬件启动程序

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ARM硬件启动程序的工作有:<br />1,分配中断向量表。<br />2,初始化存储器系统。<br />3,初始化7种模式下的堆盏。<br />4,初始化有有要求的硬件。<br />5,初始化用户程序的执行环境。<br />6,切换CPU的工作模式。<br />7,调用应用程序。<br /><br />这个程序包涵10楼说的源程序2410init.s/<br />其中有映射程序(搬家),将Steppingstone内部缓冲器映射到SDRAM(nGCCS0)中。<br />Steppingstone的位置SRAM重新分配,系统再复位时会指向SDRAMDE&nbsp;的启动程序。<br /><br />
 楼主| armfan 发表于 2008-2-25 15:20 | 显示全部楼层

re

你的意思是复位不等于重新上电??<br /><br />“&nbsp;Steppingstone的位置SRAM重新分配&nbsp;”这是什么意思?<br />Steppingstone映射的不是SRAM(nGCCS0)吗?
liucy2 发表于 2008-2-26 10:35 | 显示全部楼层

ARM启动

1/Steppingstone的位置SRAM重新分配是指初始化后,在执行用户程序后SRAM将被重新分配。<br />2/Steppingstone映射的是SRAM(nGCCS0),<br />3/复位不等于重新加电,是按复位按扭。
liucy2 发表于 2008-2-26 10:36 | 显示全部楼层

网管干吗呢?发不上去

1/Steppingstone的位置SRAM重新分配是指初始化后,在执行用户程序后SRAM将被重新分配。<br />2/Steppingstone映射的是SRAM(nGCCS0),<br />3/复位不等于重新加电,是按复位按扭。
 楼主| armfan 发表于 2008-2-26 11:22 | 显示全部楼层

re

<br /><br />“系统再复位时会指向SDRAMDE&nbsp;的启动程序”<br /><br />&nbsp;&nbsp;复位后的程序不是指向0x00吗?如果初始化后Steppingstone的位置SRAM重新分配,那么中断向量表在哪?还在Steppingstone吗?<br /><br />&nbsp;&nbsp;系统再复位时会指向SDRAMDE&nbsp;&nbsp;&nbsp;&nbsp;SDRAMDE的起始地址0x30000000,复位后不是指向00吗?
liucy2 发表于 2008-2-26 14:55 | 显示全部楼层

再谈ARM启动

1/复位后的PC是指向0x00,中断向量表在0x00.<br />2/在nGCS0的映像文件也有一个中断向量表,用于用户的异常中断入口。<br />3/你的用户程序可以重新定义复位的入口指向SDRAM的启动。<br />4/如果你什么应用程序都没有,复位和加电是一样的,每次在NAND&nbsp;FLASH开始。
 楼主| armfan 发表于 2008-2-26 16:06 | 显示全部楼层

re

3/你的用户程序可以重新定义复位的入口指向SDRAM的启动。<br /><br /><br />你所说的“重新定义复位的入口指向SDRAM的启动”是不是地址重新映射的代码?我分析的对吗?如果我说的对,那么地址映射是怎么实现的?和mmu有关系吗?<br />
liucy2 发表于 2008-2-27 10:25 | 显示全部楼层

ARM启动

可以用CP15的快速切换实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

114

帖子

0

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