S3C2410的BOOT程序流程

news/2024/11/28 15:44:52/

 

一、      硬件结构

主要涉及的芯片:S3C2410K9S120874LVC16245

采用NAND FLASH做为BOOT程序的存储载体,所以OM[1..0]的值为0b00

系统上电或者复位后,S3C2410K9S1208芯片内读取4KB数据到内部名为SteppingstoneSRAM存储区中,然后芯片执行读取到的指令段,实现全部程序的加载。(BOOT程序可以小于4KB,但是要求FLASH8页只能保存BOOT LOADER程序,多余的存储空间理论上不相关。)

芯片读取指令数据时,每次读取512B,分为8次读取。若打开校验(ECC)功能,则每次只能读取512B

由于NAND FLASH产商保证芯片block0不可能是坏块,所以数值写入时,无需考虑坏块的绕过问题,但BOOT LOADER程序必须建立坏块表来进行正确读写。

S3C2410NAND FLASH接口,无需考虑访问规则的建立,命令、地址、数据各自对应特定的寄存器,在初始化时序等相关寄存器之后就可以直接访问,实现了无缝连接。

二、      BOOT程序功能分析

功能需求方面,程序应该包括以下几点:

(1)       初始化系统。

(2)       提示用户当前状态为程序Loading

(3)       读取主题程序指令数据到特定的存储区。

(4)       运行主体程序。

下面对程序读取NAND FLASH页数据的程序作一分析,代码如下。

int NF_ReadPage(U32 block,U32 page,U8 *buffer)

{

    int i;

    register U8 * bufPt=buffer;                 //指令数据存储区。

    unsigned int blockPage;

    U8 ecc0,ecc1,ecc2;                                   //用于程序校验。

   

    U8 se[16];        

   

    //page=page&0x1f;

    blockPage=(block<<5)+page;                     //块页地址->得到物理地址。

    NF_RSTECC();                              // Initialize ECC,将寄存器的bit121

   

    NF_nFCE_L();                                //改变nFCE电平,使能芯片。

    NF_CMD(0x00);                             //发送读命令到NAND FLASH

    NF_ADDR(0);                                // Column = 0

    NF_ADDR(blockPage&0xff);           //数据线为8位,地址需分多次写入

    NF_ADDR((blockPage>>8)&0xff);   // Block & Page num.

    NF_ADDR((blockPage>>16)&0xff);  //

 

    for(i=0;i<5;i++); //wait tWB(100ns)

   

    NF_WAITRB();                               // Wait tR(max 12us)

//NAND FLASH在收到读取要求后,还需要等待约200us时间,将数据准备好。

 

#if 0

    i=512;

    while(i--!=0)

    {

           *bufPt++=NF_RDDATA();    // Read one page

    }

#elif 0

    //DMA doens't work.

    rSRCPND=BIT_DMA0;

    rDISRC0=0x4e00000c; //NF_RDDATA()

    rDISRCC0=(1<<0); //arc=AHB,src_addr=fix

    rDIDST0=(unsigned)bufPt;

    rDIDSTC0=(0<<0); //dst=AHB,dst_addr=inc;

   rDCON0=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(0<<23)|(1<<22)|(0<<20)|(512/4);

          //Handshake,AHB,interrupt,(4-burst),whole,S/W,no_autoreload,byte,count=512;

    rDMASKTRIG0=(1<<1)|(1<<0);

 

    while(!(rSRCPND & BIT_DMA0));

    rSRCPND=BIT_DMA0;

//上面的#if 0 … #elif 0 …的功能是什么?理论上应该是必定不会被执行的。

//Answer:屏蔽之

#elif 1

    __RdPage512(bufPt);           //读取一页数据,汇编指令在下面分析。

#endif

 

    ecc0=rNFECC0;

    ecc1=rNFECC1;

    ecc2=rNFECC2;                  //读取校验数值

 

    se[0]=NF_RDDATA();

    se[1]=NF_RDDATA();

    se[2]=NF_RDDATA();          //读取数据写入时获得的ECC校验值,与当前值比较。

    NF_RDDATA();

    NF_RDDATA();

    se[5]=NF_RDDATA();          //这里应该是获得0xff

 

    NF_nFCE_H();                 //将芯片使能关闭。

 

    if(ecc0==se[0] && ecc1==se[1] && ecc2==se[2] && se[5]==0xff)

    {

       //Uart_Printf("[ECC OK:%x,%x,%x]/n",se[0],se[1],se[2]);

           return 1;

    }

    else

    {

       //Uart_Printf("[ECC ERROR(RD):read:%x,%x,%x, reg:%x,%x,%x]/n",

              //se[0],se[1],se[2],ecc0,ecc1,ecc2);

           return 0;

    }        

}

其中“__RdPage512(bufPt);”读取一页数据,汇编指令如下。

;*************************************************************

; NAME : NAND FLASH Subroutine for a410 bootstrap

; DATE : 18.FEB.2002

; DESC :

;  02.18.2002:purnnamu: modified for A410

;  04.24.2002:purnnamu: optimized for NAND flash bootstrap

;*************************************************************

 

A410_BASE_ADDR      EQU       0x2000000

 

       MACRO                //宏程序

       LDR4STR1 $src,$tmp1,$tmp2    

       ldrb  $tmp1,[$src]

       ldrb  $tmp2,[$src]

       orr   $tmp1,$tmp1,$tmp2,LSL #8

       ldrb  $tmp2,[$src]

       orr   $tmp1,$tmp1,$tmp2,LSL #16

       ldrb  $tmp2,[$src]

       orr   $tmp1,$tmp1,$tmp2,LSL #24

       MEND

 

       AREA |C$$code|, CODE, READONLY

      

       EXPORT __RdPage512

__RdPage512

       ;input:a1(r0)=pPage

       stmfd      sp!,{r1-r11}   //保护r1—r11寄存器。

 

       ldr   r1,=0x4e00000c  //NFDATA即将r1指向NAND FLASH的数据寄存器。

       mov r2,#0x200              //一共要读取的字节数。

0    

       LDR4STR1 r1,r4,r3      //r1寄存器中读取4B数据,依次保存在r4寄存器中,

                                          //保存的顺序为D C B A。以下类推。

       LDR4STR1 r1,r5,r3

       LDR4STR1 r1,r6,r3

       LDR4STR1 r1,r7,r3

       LDR4STR1 r1,r8,r3

       LDR4STR1 r1,r9,r3

       LDR4STR1 r1,r10,r3

       LDR4STR1 r1,r11,r3

       stmia       r0!,{r4-r11}    //将数据保存到C程序提供的存储区中。

       subs r2,r2,#32

       bne  %B0                     //是否读取完毕?

 

       ldmfd      sp!,{r1-r11}   //出栈

       mov pc,lr                      //返回

 

       END


from:http://jianli9188.bokee.com/viewdiary.13737210.html

 


http://www.ppmy.cn/news/358116.html

相关文章

电脑联网打不开网页只能用qq和微信

当你发现你的电脑连接了wifi&#xff0c;却只能上微信和qq&#xff0c;打不开网页的时候请点开这个链接&#xff1b; https://jingyan.baidu.com/article/9c69d48f49566b52c9024e83.html

解决电脑打不开网页问题

点击电脑右下角网络标识&#xff0c;“网络与共享中心”&#xff0c;“internet选项”&#xff0c;“连接”&#xff0c;“局域网设置”&#xff0c;把“代理服务器”前面的勾选取消。

解决win10系统网络连接正常,但是网页打不开的问题

1、打开“控制面板” -》 “网络和Internet”选项 2、点击“Internet选项” 3、 在弹出的Internet属性中&#xff0c;选择上方的“连接”选项&#xff0c;点击下方的“局域网设置” 4、在弹出的“局域网&#xff08;LAN&#xff09;设置”中的代理服务器设置上&#xff0c;取消…

开机后,电脑所有浏览器都打不开网页,无法使用网络,但是其它设备比如tim可以正常使用的解决方法

电脑每一个浏览器都打不开网页&#xff0c;但是其它设备比如tim可以正常使用。 解决方法&#xff1a; 电脑在关机的时候“梯子”没有关闭。 再次打开梯子&#xff0c;然后刷一刷网页&#xff0c;就可以打开了&#xff0c;然后再关闭梯子。 之后就可以正常上网了。 关机&#…

电脑连上热点打不开网页

从网页找了很多解决办法都不行&#xff0c;后来找朋友问说&#xff0c;在电脑中找【代理】&#xff08;直接在开始菜单搜索&#xff09;&#xff0c;关闭【使用设置脚本】【使用代理服务器】&#xff0c;之后就可以正常访问网页了

电脑明明有网络可以上网,但是浏览器网页就是打不开

电脑明明有网络可以上网&#xff0c;但是浏览器网页就是打不开 网上好多种办法都试了都没有用&#xff0c;tmd&#xff0c;最后发现直接把“使用代理服务器”关掉就行了。 浪费了好多时间。

电脑连接了网络却打不开网页

晚上学习的时候电脑连接了wifi&#xff0c;但是却一直打不开网页。应该是DNS解析有问题&#xff0c;清除一下DNS缓存就搞定啦。 ①WINR打开对话框&#xff0c;输入cmd再回车 ②输入命令“ ipconfig /flushdns ” 就可以正常打开网页啦

电脑连接WiFi,浏览器打不开网页

浏览器经常打不开网页&#xff0c;右击任务栏的wifi图标&#xff0c;打开“网络和Internet”设置&#xff0c; 接着打开网络和共享中心 选择WLAN 选择属性 选择这个Internet&#xff0c;然后点击属性 把获取DNS地址全部改为自动&#xff0c;之后浏览器就能正常使用了。