存档

来源:互联网 发布:java冒泡排序算法教程 编辑:程序博客网 时间:2024/06/10 00:13

一块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 <fileSize)
{
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块的。
 
 
 
问题点数:100 回复次数:16 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复  
 

 加为好友
发送私信
在线聊天
 xqhrs232
 
等级:
可用分等级:富农
总技术分:4610
总技术分排名:4860

 发表于:2009-04-15 18:36:451楼 得分:5
nbootEBOOT都只能通过JTAG。除非已经有EBOOT,并且EBOOT可以跑起来,并且支持更新NBOOT+EBOOT。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 morris88
dataCode
等级:
可用分等级:短工
总技术分:3457
总技术分排名:11088

 发表于:2009-04-15 21:40:382楼 得分:34
        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给截掉了。


以上的都做完的话,基本上应该不会有什么问题了。
 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 liliangbao
简单+安静
等级:
可用分等级:长工
总技术分:2220
总技术分排名:15728

 发表于:2009-04-15 23:19:153楼 得分:1
引用 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
 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-15 23:23:484楼 得分:0
1.      因为要用PB来编译,所以为了能生成.nb0文件,所以一定要在 代码里加上:

        pTOC    DCD  -1

        EXPORT pTOC

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

在哪个文件里加?我直接用ADS编译出NBoot的。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 BEYONDMA
 
等级:
可用分等级:掌柜
总技术分:9675
总技术分排名:2169
3
 发表于:2009-04-16 08:57:065楼 得分:10
MARK一下,这篇有加精的实力!
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-16 10:04:596楼 得分:0
问题有了新发现,用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头丢失了?

 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 yashi
老斩
等级:
可用分等级:小地主
总技术分:12861
总技术分排名:1489
 发表于:2009-04-16 10:19:197楼 得分:20
1.      因为要用PB来编译,所以为了能生成.nb0文件,所以一定要在 代码里加上:

        pTOC    DCD  -1

        EXPORT pTOC

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

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

他说的是用PB编译nboot的时候要这样,你用ADS不适用。
该回复于2009-04-16 10:20:59被版主修改
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-16 11:51:248楼 得分:0
第一个问题解决,MAX3232芯片的问题,换了一块就好了,郁闷中……

第二个问题Eboot烧写到flash中的问题也还在郁闷中,下午再捣鼓捣鼓。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-17 10:36:309楼 得分:0
我感觉问题是Eboot.nb0通过SJF2440.exe烧不进NandFlash的Block2。我在SJF2440.exe烧写过程中选择Input target block number: 2 就应该是把文件烧写进NandFlash的第二块了吧。烧写完成后,用仿真器查看NBoot加载Eboot后内存0x30038000里的内容,发现数据只是以前烧写的内容,并不是Eboot.nb0的内容,Eboot.nb0貌似没有烧到NandFlash的第二块里.有其它的烧写工具吗?
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 liaifeilove
 
等级:
可用分等级:贫农
总技术分:63
总技术分排名:130592

 发表于:2009-04-17 10:50:1910楼 得分:10
能写nand flash的好象只有jflash ,不过有个图形版的.周立功开发的
你的问题有点奇怪,按理来说,就算烧写有错,也不会让你的nboot,也起不来了啊..
你可以只写一个nboot,看看nboot,能否启动,如果可以启动,则说明你的烧写工具应该是没什么问题的.
 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-17 10:57:0411楼 得分:0
Nboot可以启动,SDRAM 0X30038000里有数据,说明NBoot可以把NAND FLASH内容拷贝到0X30038000,查看内存里数据的内容,不是EBoot的数据,那应该就是Eboot没烧进去
 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 liaifeilove
 
等级:
可用分等级:贫农
总技术分:63
总技术分排名:130592

 发表于:2009-04-17 13:06:0412楼 得分:0
有没有启动应该有串口消息的啊.看看到底是什么原因.

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

还有 你说eboot用sjf烧写后,就nboot都不能启动是什么意思?是你的nboot不能自己运行了呢,还是他不能启动 eboot了?
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-17 16:02:0313楼 得分:0
引用 12 楼 liaifeilove 的回复:
有没有启动应该有串口消息的啊.看看到底是什么原因.

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

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

之前Nboot不能启动,串口无信息,重新烧写后,可以启动了。现在是nboot可以运行,但不能引导烧写在Block2里的Eboot
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-17 16:08:0714楼 得分:0
我现在在看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,程序不会返回
}
 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 liaifeilove
 
等级:
可用分等级:贫农
总技术分:63
总技术分排名:130592

 发表于:2009-04-17 16:13:4915楼 得分:20
这是个问题,在eboot没有启动之前,blcok1里边是没有toc的,你这个时候需要自己在nboot中填充toc内容.
主要是要给nboot提供eboot在nand flash的位置,运行的起动地址等,
具体什么样我记得不太清楚了,很久没弄过了
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 zzqccc
 
等级:
可用分等级:中农
总技术分:345
总技术分排名:46591

 发表于:2009-04-17 17:03:4716楼 得分:0
确实是没有TOC的问题,解决了。
 

原创粉丝点击