Nboot下载eboot有问题

paraller   2009-4-15 18:25 楼主
一块2440开发板烧写了NBoot,然后通过串口下载Eboot.nb0,
void ComDownload()
{
        int i,tmp;
        unsigned short checkSum=0,dnCS;
        unsigned long  DownloadFileSize,fileSize=10;
        unsigned char *downPt,*comloadaddress;
        comloadaddress = (unsigned char *)LOAD_ADDRESS_PHYSICAL - 4;
        downPt=comloadaddress;
        Uart_SendString("\ndownload and run\n");
        tmp=RdURXH1(); //To remove overrun error state.
       
        i=0;   
        while(i         {
        while(!(rUTRSTAT1&0x1));
        *(downPt+i)=RdURXH1();
        if(i==3)
        {
        fileSize=*((unsigned char *)(comloadaddress+0))+
        (*((unsigned char *)(comloadaddress+1))<<8)+
        (*((unsigned char *)(comloadaddress+2))<<16)+
        (*((unsigned char *)(comloadaddress+3))<<24);
        }
        if((i%4000)==0)
        WrUTXH1('#');
        i++;
        }

下载的过程中应该打印出的“#”字符变成了“??”问号,Eboot不能运行。测试串口接收RdURXH1(),我不下载Eboot,只通过键盘输入字符,可以正常打印出#字符,说明串口接收发送都是正常的。想到可能是Eboot.nb0的问题,但是同一个Eboot.nb0文件我用另一块2004开发板是可以通过Nboot正常下载运行的,只是这块开发板比上一块开发板少了Norflash、GPRS等,但是像串口、SDRAM、Nandflash用的芯片都是一样的,原理图上的接法也是一样的。想不出哪里出的问题了,请大伙指点。

另外还有个关于Nboot和eboot的烧进flash的问题,把Nboot烧进NandFlash的第0块,然后把eBoot烧进第2块,Nboot就应该可以引导Eboot了
Nboot中的定义:
dwSector=16*2;//从block:2 page:0开始存放eboot
        dwLength=512;//一共12个block;block2-14;256K容量;如果eboot文件大于256K,需要修改该代码
        dwRAM=0x30038000;//eboot load Start address;把NAND FLASH内容拷贝到0X30038000

我在用SJF2440烧Eboot时,在“Input target block number:”输入2 ,结果是连Nboot也跑不起来了,Nboot我是烧在第0块的。

回复评论 (18)

nbootEBOOT都只能通过JTAG。除非已经有EBOOT,并且EBOOT可以跑起来,并且支持更新NBOOT+EBOOT。
点赞  2009-4-15 18:36
        nboot是从NAND flash读image到内存并执行,eboot是从以太网(用tftp)下载image到内存并执行。将nboot.nb0烧到第0块,将eboot.nb0烧到第2块。启动时nboot从flash读出eboot并执行之,如何就可以通过pb把nk.bin下载到目标板上执行了,开发机和目标板可以用交叉线直接连接。

       nboot是nand flash bootloader的意思。S3C2410可以直接从nand flash 启动,但是不能超过4k。nboot是系统启动后最先执行的代码,它有两种,一种是跳转到eboot;一种是跳转到nk。 主要的功能其实是在eboot里。

Nboot (Nand flash bootloader) 主要的作用就是初始化硬件,把后面的功能比较完善的引导程序像eboot之类的映像拷贝到SDRAM中让后跳到SDRAM中继续跑eboot。

为什么要有nboot这个东西呢,其实主要是因为现在的soc上考虑到成本的问题,基本是都是自带一个nand flash的控制器并支持开机nand flash引导来取代相对来说昂贵的nor flash。


一般来说nand flash的控制器都会内置一个SRAM之类的buffer来支持nand flash的开机引导,在nand启动的方式下,板子上电的时候,nand控制器会自动把nand flash最前面的buffer大小的数据自动拷贝到buffer中然后让pc指针可以从buffer中直接读取指令。一般来说这个buffer不会很大,2410的芯片是4k,而像freescale的imx21更是只有2k,所以由于这个局限性,我们只能把bootloader拆分成两部分,前面一部分来完成基本初始化功能,而后面一部分来完成比较完善的功能,让控制器自动拷贝前一部分,然后前一部分再拷贝后一部分到RAM中,这样引导程序就可以做任何它想做的事情了。


其实,实现一个nboot并没有多大难度,以下是一个大概流程:

1.       当然是配置时钟了,没这个系统跑不起来啊 o(∩_∩)o…


2.       不用说SDRAM的配置也是少不了,不然我们怎么把程序拷贝到SDRAM中。


3.       就是flash控制器的配置了,一般来说就是GPIO和相应的控制器寄存器配一下。


4.       拷贝文件从nand到SDRAM中,nand flash读的话一般来说都是先拉片选位,然后发命令,接着是地址,最后就是读数了。


上面几步做完,其实整个nboot也就差不多了,不过在WinCE下开发的话有几个点需要特别注意:

1.       因为要用PB来编译,所以为了能生成.nb0文件,所以一定要在 代码里加上:

        pTOC    DCD   -1

        EXPORT pTOC

     这个是让ROMIMG.exe做image时用的.



2.       生成.nb0文件,bib文件也是不能少的。


3.       因为微软编译器的原因,导致了我们按一般方法来编译.nb0时,前面的4K都是空的,所以如果直接把编译出来的.nb0烧进去的话是不能用的,所以的在bib改一下:

把: NBOOT 00000000 00002000 RAMIMAGE 这个定义成8k的大小,然后后面的

ROMSTART=00001000

ROMSIZE=1000

   把start地址往后移一下,然后大小改为4k,这样出来的nb0就会 把前面空的4k给截掉了。


以上的都做完的话,基本上应该不会有什么问题了。
点赞  2009-4-15 21:40
引用: 引用 2 楼 morris88 的回复:
        nboot是从NAND flash读image到内存并执行,eboot是从以太网(用tftp)下载image到内存并执行。将nboot.nb0烧到第0块,将eboot.nb0烧到第2块。启动时nboot从flash读出eboot并执行之,如何就可以通过pb把nk.bin下载到目标板上执行了,开发机和目标板可以用交叉线直接连接。

      nboot是nand flash bootloader的意思。S3C2410可以直接从nand flash 启动,但是不能超过4k。nboot是系统启动后最先执行的代码,它有两种,…

up
点赞  2009-4-15 23:19
1.      因为要用PB来编译,所以为了能生成.nb0文件,所以一定要在 代码里加上:

        pTOC    DCD  -1

        EXPORT pTOC

    这个是让ROMIMG.exe做image时用的.

在哪个文件里加?我直接用ADS编译出NBoot的。
点赞  2009-4-15 23:23
MARK一下,这篇有加精的实力!
点赞  2009-4-16 08:57
问题有了新发现,用UltraEdit打开Eboot.nb0,查看里面的数据:
FE 03 00 EA 00 …… 00 45 43 45 43 E8 CA 04 80 E8 4A 01 00……

用仿真器仿真,在AXD里查看2440开发板的内存0x30038000都写进了什么进去,发现写进去的数据是
03 00 EA 00 …… 00 45 43 45 43 E8 CA 04 80 E8 4A 01 00……

那个FE头跑哪去了?是什么造成FE头丢失了?

点赞  2009-4-16 10:04
1.      因为要用PB来编译,所以为了能生成.nb0文件,所以一定要在 代码里加上:

        pTOC    DCD  -1

        EXPORT pTOC

    这个是让ROMIMG.exe做image时用的.

在哪个文件里加?我直接用ADS编译出NBoot的。

他说的是用PB编译nboot的时候要这样,你用ADS不适用。
点赞  2009-4-16 10:21
第一个问题解决,MAX3232芯片的问题,换了一块就好了,郁闷中……

第二个问题Eboot烧写到flash中的问题也还在郁闷中,下午再捣鼓捣鼓。
点赞  2009-4-16 11:51
我感觉问题是Eboot.nb0通过SJF2440.exe烧不进NandFlash的Block2。我在SJF2440.exe烧写过程中选择Input target block number: 2 就应该是把文件烧写进NandFlash的第二块了吧。烧写完成后,用仿真器查看NBoot加载Eboot后内存0x30038000里的内容,发现数据只是以前烧写的内容,并不是Eboot.nb0的内容,Eboot.nb0貌似没有烧到NandFlash的第二块里.有其它的烧写工具吗?
点赞  2009-4-17 10:36
能写nand flash的好象只有jflash ,不过有个图形版的.周立功开发的
你的问题有点奇怪,按理来说,就算烧写有错,也不会让你的nboot,也起不来了啊..
你可以只写一个nboot,看看nboot,能否启动,如果可以启动,则说明你的烧写工具应该是没什么问题的.
点赞  2009-4-17 10:50
Nboot可以启动,SDRAM 0X30038000里有数据,说明NBoot可以把NAND FLASH内容拷贝到0X30038000,查看内存里数据的内容,不是EBoot的数据,那应该就是Eboot没烧进去
点赞  2009-4-17 10:56
有没有启动应该有串口消息的啊.看看到底是什么原因.

你发下串口的打印消息看看.还有如果你能正常烧写nboot,那你就要考虑下是不是flash芯片上是否有些块坏掉了有问题了

还有 你说eboot用sjf烧写后,就nboot都不能启动是什么意思?是你的nboot不能自己运行了呢,还是他不能启动 eboot了?
点赞  2009-4-17 13:05
引用: 引用 12 楼 liaifeilove 的回复:
有没有启动应该有串口消息的啊.看看到底是什么原因.

你发下串口的打印消息看看.还有如果你能正常烧写nboot,那你就要考虑下是不是flash芯片上是否有些块坏掉了有问题了

还有 你说eboot用sjf烧写后,就nboot都不能启动是什么意思?是你的nboot不能自己运行了呢,还是他不能启动 eboot了?


之前Nboot不能启动,串口无信息,重新烧写后,可以启动了。现在是nboot可以运行,但不能引导烧写在Block2里的Eboot
点赞  2009-4-17 16:01
我现在在看eboot的启动流程,看到下面一段话

OEMPlatformInit,这个函数也在eboot的main.c里面可以找到,主要是初始化你的硬件平台,包括设置RTC时钟,初始化一下你的NANDflash,然后就是读TOC (table of contents),一般TOC都会烧到nand的block1里面,如果读TOC失败,就会用默认的参数重写TOC。

我的Nboot没有TOC,会是这个原因吗?如果是因为没有TOC的原因。那这句话“一般TOC都会烧到nand的block1里面,如果读TOC失败,就会用默认的参数重写TOC”怎么理解?既然Eboot会用默认的参数重写TOC,那么NandFlash里Block1里没有TOC也应该可以启动啊,被迷惑了,请指点。

我的NBoot中加载Eboot的函数如下,这不能加载Nandflash中的Eboot吗?

void LoadEboot(void)
{
        DWORD dwSector, dwLength,dwRAM;         // Start Sector & Length
       
        dwSector=16*2;//从block:2 page:0开始存放eboot
        dwLength=512;//一共12个block;block2-14;256K容量;如果eboot文件大于256K,需要修改该代码
        dwRAM=0x30038000;//eboot load Start address;把NAND FLASH内容拷贝到0X30038000
               
        while (dwLength)
        {
                FMD_ReadSector(dwSector,(LPBYTE)dwRAM,NULL, 1);
                dwSector++;
                dwLength--;
                dwRAM += SECTOR_SIZE;
        }
        Launch(0x30038000);//跳转到eboot,启动eboot,程序不会返回
}
点赞  2009-4-17 16:08
这是个问题,在eboot没有启动之前,blcok1里边是没有toc的,你这个时候需要自己在nboot中填充toc内容.
主要是要给nboot提供eboot在nand flash的位置,运行的起动地址等,
具体什么样我记得不太清楚了,很久没弄过了
点赞  2009-4-17 16:13
确实是没有TOC的问题,解决了。
点赞  2009-4-17 17:03
AAAA
点赞  2010-1-30 10:43
MARK,此贴解我困惑。
点赞  2011-5-24 10:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复