打印

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

[复制链接]
4300|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
armfan|  楼主 | 2008-2-21 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 过程1  YLP2410_BIOS.bin——————》nandflash
  这一过程是用sjf flash烧写工具实现的。
 
过程2 nandflash——————》  内部SRAM(YLP2410_BIOS.bin前4k的内容)
  这一过程是硬件自动完成实现的。

 过程3 内部SRAM——————》SDRAM
这一过程是怎样实现的??怎样把YLP2410_BIOS.bin移到SDRAM中,是靠DebugRel Settings设置??还是靠本身的代码完成??

前两个过程我分析的对吗??

相关帖子

沙发
liucy2| | 2008-2-22 14:49 | 只看该作者

关于2410nandflash的启动过程

nandflash前4K是硬件初始化和启动引导程序。
在启动时,1/nandflash---Steppingstone内部缓冲器中,
          2/Steppingstone内部缓冲器映射到SDRAM(nGCCS0)中。
          3/CPU在Steppingstone内部缓冲器中开始启动代码。
使用nandflash启动要进行配置相应控制寄存器。
      

使用特权

评论回复
板凳
armfan|  楼主 | 2008-2-23 15:06 | 只看该作者

感谢帮忙,请继续关注

谢谢你的帮助。

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


 

使用特权

评论回复
地板
dld2| | 2008-2-23 15:12 | 只看该作者

正确

#include "def.h"
#include "option.h"
#include "romdef.h"
#include "2410addr.h"

#define DST_SDRAM_ADDR        (0x30e00000)
#define NAND_BLOCK_START    (2)
#define NAND_BLOCK_NUM        (8)

extern void NF_Init(void);
//extern U16 NF_CheckId(void);
//extern void K9S1208_Program(U32 blockIndex, U32 srcAddress, U32 fileSize);
extern int NF_ReadPage(U32 block,U32 page,U8 *buffer);

void (*__SYS)(void);
void Main(void)
{
    //U16 id;
    int i,j;
    unsigned char *dst;
    
    //liuyan 060828
    rGPFCON = 0x55aa;
    rGPFDAT = 0x70;
    
    NF_Init();
    //id=NF_CheckId();
    //if(id!=0xec76)
    //return;
    rINTMSK = BIT_ALLMSK;     
    
    dst = (unsigned char *)DST_SDRAM_ADDR;
    for (i = NAND_BLOCK_START; i < (NAND_BLOCK_NUM + NAND_BLOCK_START); i++)
    {
        //dst = (unsigned char *)DST_SDRAM_ADDR + ((i - NAND_BLOCK_START) * 512);
        for (j = 0; j < 32; j++)
        {
            NF_ReadPage(i, j, dst);
            dst = dst + 512;
        }
    }
    __SYS = (void(*)())DST_SDRAM_ADDR;
    (*__SYS)();        

    while(1);
}

使用特权

评论回复
5
armfan|  楼主 | 2008-2-23 15:43 | 只看该作者

谢谢dld2,请继续关注

 我是刚刚进入这一行业的,很菜的。问的问题可能太业余了,请多包涵!!
 
 上面的代码的大概说的是从nandflash中复制代码到SDRAM中。

 我想问的是这段代码是在Steppingstone中运行的吧?
 
 那么程序什么时候才能跳到SDRAM中?怎么跳到SDRAM??怎么保证程序从Steppingstone跳到SDRAM的无缝连接??

使用特权

评论回复
6
dld2| | 2008-2-23 15:48 | 只看该作者

Re

是在Steppingstone运行的。先拷贝nand中的代码到SDRAM,然后跳转过去。

__SYS是一个函数指针。赋值为DST_SDRAM_ADDR。
(*__SYS)();就是跳转。这是C语言跳转到固定地址的一般方法。

没感觉有“有缝无缝”的问题。

使用特权

评论回复
7
armfan|  楼主 | 2008-2-23 15:59 | 只看该作者

re




呵呵,问的太业余了,请见谅。

“  是在是在Steppingstone运行的。先拷贝nand中的代码到SDRAM,然后跳转过去。“

跳过去做什么?是执行用户的应用程序吗?
    
    那么如果发生中断,那么程序的中断向量表在那里?在Steppingstone还是SDRAM?如果发生复位呢?又是怎么一种情况?
   
   

使用特权

评论回复
8
dld2| | 2008-2-23 16:05 | 只看该作者

re

拷贝的是可执行代码。
跳转过去就是执行。会给PC赋值。

异常向量表在Steppingstone。此时Steppingstone被映射到GCS0。

复位基本等于重新上电。

使用特权

评论回复
9
armfan|  楼主 | 2008-2-23 16:15 | 只看该作者

re

谢谢

   但是有一点我还不明白,我以前查找的资料说是copy的内容包含Steppingstone中的代码,如果是那样的话不是又把Steppingstone中的代码又执行一边??
   但按照你的说法好像是不拷贝Steppingstone中的内容,也就是说Steppingstone中的代码和SDRAM没有重叠的地方。是这样理解吗?

使用特权

评论回复
10
dld2| | 2008-2-23 16:23 | 只看该作者

re

我参考的实现中,确实没有把Steppingstone中的内容再拷贝到SDRAM。

但是:
Steppingstone和被拷贝的应用程序,都包含有一个相同的初始化代码。在我这里源程序是2410init.s。

使用特权

评论回复
11
armfan|  楼主 | 2008-2-23 16:26 | 只看该作者

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

使用特权

评论回复
12
dld2| | 2008-2-23 16:27 | 只看该作者

:)

使用特权

评论回复
13
LIUCY2| | 2008-2-25 13:33 | 只看该作者

ARM硬件启动程序

                   ARM硬件启动程序的工作有:
1,分配中断向量表。
2,初始化存储器系统。
3,初始化7种模式下的堆盏。
4,初始化有有要求的硬件。
5,初始化用户程序的执行环境。
6,切换CPU的工作模式。
7,调用应用程序。

这个程序包涵10楼说的源程序2410init.s/
其中有映射程序(搬家),将Steppingstone内部缓冲器映射到SDRAM(nGCCS0)中。
Steppingstone的位置SRAM重新分配,系统再复位时会指向SDRAMDE 的启动程序。

使用特权

评论回复
14
armfan|  楼主 | 2008-2-25 15:20 | 只看该作者

re

你的意思是复位不等于重新上电??

“ Steppingstone的位置SRAM重新分配 ”这是什么意思?
Steppingstone映射的不是SRAM(nGCCS0)吗?

使用特权

评论回复
15
liucy2| | 2008-2-26 10:35 | 只看该作者

ARM启动

1/Steppingstone的位置SRAM重新分配是指初始化后,在执行用户程序后SRAM将被重新分配。
2/Steppingstone映射的是SRAM(nGCCS0),
3/复位不等于重新加电,是按复位按扭。

使用特权

评论回复
16
liucy2| | 2008-2-26 10:36 | 只看该作者

网管干吗呢?发不上去

1/Steppingstone的位置SRAM重新分配是指初始化后,在执行用户程序后SRAM将被重新分配。
2/Steppingstone映射的是SRAM(nGCCS0),
3/复位不等于重新加电,是按复位按扭。

使用特权

评论回复
17
armfan|  楼主 | 2008-2-26 11:22 | 只看该作者

re



“系统再复位时会指向SDRAMDE 的启动程序”

  复位后的程序不是指向0x00吗?如果初始化后Steppingstone的位置SRAM重新分配,那么中断向量表在哪?还在Steppingstone吗?

  系统再复位时会指向SDRAMDE    SDRAMDE的起始地址0x30000000,复位后不是指向00吗?

使用特权

评论回复
18
liucy2| | 2008-2-26 14:55 | 只看该作者

再谈ARM启动

1/复位后的PC是指向0x00,中断向量表在0x00.
2/在nGCS0的映像文件也有一个中断向量表,用于用户的异常中断入口。
3/你的用户程序可以重新定义复位的入口指向SDRAM的启动。
4/如果你什么应用程序都没有,复位和加电是一样的,每次在NAND FLASH开始。

使用特权

评论回复
19
armfan|  楼主 | 2008-2-26 16:06 | 只看该作者

re

3/你的用户程序可以重新定义复位的入口指向SDRAM的启动。


你所说的“重新定义复位的入口指向SDRAM的启动”是不是地址重新映射的代码?我分析的对吗?如果我说的对,那么地址映射是怎么实现的?和mmu有关系吗?

使用特权

评论回复
20
liucy2| | 2008-2-27 10:25 | 只看该作者

ARM启动

可以用CP15的快速切换实现

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

114

帖子

0

粉丝