6410 wince6.0 Eboot无法跳转到NK

一介布衣萧萧 2012-09-27 03:24:42
坏境:6410板子,wince6.0系统,4G MLC Nandflash
情况描述:
1、SD启动方式下,可以进行stepldr、Eboot、NK等下载,下载完后,可Launch进入到系统
2、拨到Nandflash启动,插入SD卡,可进入到Eboot,有NK的情况下,可引导进入升级NK,升级完后,可Launch进入到系统(Eboot已实现读取SD卡中是否有NK,有NK则进行升级,该功能在2G的Nandflash下测试通过)。
若不插入SD卡,或SD卡中没有NK,则应该直接从Eboot那边Launch到NK。但发现到了跳转的那个地方就停住了。

调试信息如下:
System ready!
Preparing for download...
waitforconnect
INFO: using TOC[1] dwJumpAddress: 0x80157a2c
INFO: OEMLaunch: Jumping to Physical Address 0x50157A2Ch (Virtual Address 0x80157A2Ch)...

使用ViewBin工具查看NK,看到跳转的地址是0x80157a2c,长度为0x027c8c6c
config.bib中的部分配置如下:
#define NKNAME NK
;#define NKSTART 80100000
;#define NKSTART 80105000
#define NKSTART 80150000 ; gjl 80145400
;
;#define NKLEN 03F00000 ; 63MB (Max size, to match image_cfg.* files. This will be auto-sized)
;#define NKLEN 02800000 ; 40MB
#define NKLEN 027FB000 ; 40MB


#define RAMNAME RAM

;#define RAMSTART 83200000 ; 84000000
;#define RAMLEN 05000000 ; 05000000--OK 01D00000 29MB (Will be auto-sized from the end of NK)

#define RAMSTART 86800000 ;88000000--ok
#define RAMLEN 09800000 ; 09800000 08000000--OK 08000000 128MB


从上述情况来看,跳转地址没错,NK大小也没有超过定义的最大值。理论上应该是可以的,但实际却是不行。
SD的IROM固化程序是自己移植的,一直在怀疑这个创建分区部分有问题,其中代码如下:
hPart = BP_OpenPartition( (IMAGE_START_BLOCK+1)*PAGES_PER_BLOCK, // next block of MBR
0x19000, //SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK, // align to block
PART_BINFS,
TRUE,
PART_OPEN_ALWAYS);
这个调用时WriteOSImageToBootMedia()函数里面的。

请大家帮忙分析下,这个到底是怎么回事?为什么无法由Eboot跳转到NK(Nandflash启动方式下直接进入系统)

...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
akaterry 2012-12-12
  • 打赏
  • 举报
回复
很好。楼主好人。同类问题正在调试之中。
一介布衣萧萧 2012-10-08
  • 打赏
  • 举报
回复
问题已经解决!

最终还是Nandflash驱动出了问题。由于这个Nandflash驱动是基于飞凌给的那个修改过来的,飞凌提供的这个源码有点问题。经过多出定位修改已经解决了这个无法由Eboot引导跳到NK的问题。

情况是:在从Nandflash中拷贝NK到RAM的时候,拷贝了部分就卡住了,把卡住的while屏蔽掉之后就OK了。
一介布衣萧萧 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
引用 3 楼 的回复:

既然LZ排除了NK的问题和跳转地址的问题,那么LZ可以看看跳转的时候是否有跳到NK的startup.s那里。如果没有跳到这里的话,说明在Eboot那边从Nandflash中读取NK到RAM中就有问题了。


已经确认没有跳到NK的startup.s那里,添加的点灯没有反应。看来是Eboot那里的问题了,正在调试中。。。


很……
[/Quote]

上周,已经确认是拷贝NK到RAM的时候,发现到某个位置卡住了,不会动,导致无法正常的往下跑。过两天上班回去调调。

这个应该是Nandflash驱动的问题,看到里面调用FMD的函数卡住的问题,这个需要仔细调调才行。
一介布衣萧萧 2012-09-28
  • 打赏
  • 举报
回复
既然都不是上述的原因,有可能是NK下载的位置不正确。在Eboot进行Launch之前添加以下代码:

{
DWORD* pp = (DWORD*)dwPhysLaunchAddr;
int i=0;
OALMSG(TRUE, (TEXT(">> dwPhysLaunchAddr:0x%x\r\n"), dwPhysLaunchAddr));
for(i=0; i<0x8000; i++){
OALMSG(TRUE, (TEXT("%02x "), *pp++));
if((i+1)%16 == 0) OALMSG(TRUE, (TEXT("\r\n") ));
}
OALMSG(TRUE, (TEXT("\r\n") ));
}

Nandflash启动直接进入系统,上述的打印全都是00

这个是不是意味著NK烧写到Nandflash的位置不正确??
如果是烧写的位置不正确,那这个烧写NK的地址又在哪里控制??

有知道的吗?能否给点提示?
Lmtily 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

既然LZ排除了NK的问题和跳转地址的问题,那么LZ可以看看跳转的时候是否有跳到NK的startup.s那里。如果没有跳到这里的话,说明在Eboot那边从Nandflash中读取NK到RAM中就有问题了。


已经确认没有跳到NK的startup.s那里,添加的点灯没有反应。看来是Eboot那里的问题了,正在调试中。。。
[/Quote]

很大可能是你的NK没有从Nandflash中拷贝到RAM中,所以你跳转到RAM的地址就没反应了。这也就能解释为什么你打印跳转地址的那一段内存都是00的问题
一介布衣萧萧 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

既然LZ排除了NK的问题和跳转地址的问题,那么LZ可以看看跳转的时候是否有跳到NK的startup.s那里。如果没有跳到这里的话,说明在Eboot那边从Nandflash中读取NK到RAM中就有问题了。
[/Quote]

已经确认没有跳到NK的startup.s那里,添加的点灯没有反应。看来是Eboot那里的问题了,正在调试中。。。
Lmtily 2012-09-28
  • 打赏
  • 举报
回复
既然LZ排除了NK的问题和跳转地址的问题,那么LZ可以看看跳转的时候是否有跳到NK的startup.s那里。如果没有跳到这里的话,说明在Eboot那边从Nandflash中读取NK到RAM中就有问题了。

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧