11544|33

91

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440板子换K9F1G08 NAND FLASH后WINCE启动不了 [复制链接]

优龙的板子,原来是64M FLASH, 想换成K9F1G08 128M的FLASH,BOOTLOADER已经解决,FMD驱动是参照坛里前辈们的杰作修改的,WINCE启动到中间就死掉,已经被困两周了,找遍各大论坛,有见到TX说遇到相同的问题并且解决了的,但就没有人讲得详细点问题到底出在哪里并且是怎么解决的。如果这次我的问题能解决,结贴后一定把详细过程发上来,以便让后来的TX不重蹈我的覆辙。

下面是调试版本的DNW输出,粗体部分是自己加的消息。FLASH分区见下面,WINCE装在第4个分区,装WINCE后的剩余空间做RESIDENT DISK(为了调试方便,测试版只用了FLASH最后4个BLOCK做DISK)。

从串口消息看,看来是系统把每一个空闲BLOCK都识别并标记为坏块了,导致最后没有可用的BLOCK而使文件系统初始化失败。跟踪过FMD_ReadSector,对SPARE区读出来的原始数据都为0xFF,系统凭什么判断该BLOCK为坏块呢?因为没有EBOOT,也没法做单步的踪调试。想贴FMD驱动源代码上来的,不知什么原因提示“上传文件发生未知错误”。有帮忙检查的TX烦请告知邮箱,直接发给各位。

恳请各位高手出手相助,不胜感激!!!
=============================================================================
FLASH分区:

{0,              0x00040000, "boot"},   //256K
{0x00040000, 0x001c0000, "kernel"},
{0x00200000, 0x01e00000, "rootfs"}, //30M
{0x02000000, 0x06000000, "ext-fs1"},//96M
{0,             0         , 0}
=============================================================================
DEBUG版的DNW输出:

Windows CE Kernel for ARM (Thumb Enabled) Built on Jun 24 2004 at 18:21:58
ProcessorType=0920  Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 80216e18
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
InitDisplay:480*272
Error Reporting Memory Reserved, dump size = 00020000
Booting Windows CE version 5.00 for (ARM)
&pTOC = 80209c1c, pTOC = 81b20cbc, pTOC->ulRamFree = 82029000, MemForPT = 00000000

Old or invalid version stamp in kernel structures - starting clean!
Configuring: Primary pages: 7604, Secondary pages: 0, Filesystem pages = 3802

Booting kernel with clean memory configuration:
Memory Sections:
[0] : start: 8202a000, extension: 00002000, length: 01db4000
Sp=ffffc7cc
ARMInit done.
Windows CE KernelInit
Updated eptr->e32_vsize to = 000a6000
Scheduling the first thread.
0x83ddf024: KernelInit2: pCurThread=83ddf024 hCurThread=03ddf266 hCurProc=03ddf002, KernelInit = 80225118
0x83ddf024: Detecting VFP...0x83ddf024:  VFP Not Found!
0x83ddf024: first = 01eb0000, last = 02000000, SharedDllBase = 02500000
0x83ddf024: OEMIoControl: Unsupported Code 0x10100b4 - device 0x0101 func 45
0x83dc5000: CertMod.dll not found, using old OEM Trust Model
0x83dc5000: FileSystem Starting - starting with clean file system
0x83dc5000: ERROR: OEMSetRealTime: RTC cannot support a year greater than 2079 or less than 1980 (value 56)
0x83dc5000: FS: initializing ROM/RAM file system
0x83dc5000: SC_CreateAPIHandle: pvData == NULL
0x83dc5000: FS: Registering file system ROM, index 2, flags 0x00000031
0x83dc5000: FS: Mount complete (ROM, index 2, flags 0x00000031)
0x83dc5000: OEMIoControl: Unsupported Code 0x101008c - device 0x0101 func 35
0x83dc5000: FSVOL: Opening existing volume
0x83dc5000: FSVOL: Volume heap already initialized
0x83dc5000: FSREG: Mounted ROM portion of boot registry
0x83dc5000: FSVOL: Creating clean virtual volume
0x83dc5000: FSVOL: Initializing volume heap
0x83dc5000: FSREG: Mounted RAM portion of boot registry
0x83dc5000: FS: Creating signal event SYSTEM/DevMgrApiSetReady
0x83dc5000: FS: Creating signal event SYSTEM/PowerManagerReady
0x83dc5000: FS: Creating signal event SYSTEM/GweApiSetReady
0x83dc5000: FS: Creating signal event SYSTEM/BatteryAPIsReady
0x83dc5000: FS: Creating signal event SYSTEM/NLedAPIsReady
0x83dc5000: FILESYS: Starting storage manager.
0x83dc5000: FS: Registering file system StoreMgr, index 3, flags 0x00000001
0x83dc5000: InitSharedHeap: 44200000 10000 c
0x83dc5000:   InitSharedHeap: return 44200060
0x83dc5000: FILESYS: Restarting storage manager.
0x83dc5000: FMD_Init Done, FlashID = 0xecf1
0x83dc5000: PageSize:0x800, NumBlocks:0x4, SectorsPerBlock:0x40,BytesPerBlock:0x20000
0x83dc5000: FLASHDRV.DLL:BuildupMappingInfo() - Enter.
0x83dc5000: SetBlockStatus: Block:0x0 Status:0x0
0x83dc5000: SetBlockStatus: Block:0x1 Status:0x0]
0x83dc5000: SetBlockStatus: Block:0x2 Status:0x0
0x83dc5000: SetBlockStatus: Block:0x3 Status:0x0
0x83dc5000: Loading partition driver mspart.dll hModule=83D94C7C
0x83dc5000: Driver mspart.dll loaded
0x83dc5000: FLASHDRV.DLL:L2P_GetPhysicalSectorAddr() - Secondary table doesn't exist for logical sector 0x0!!!
0x83dc5000: FLASHDRV.DLL:ReadFromMedia() - Unable to determine physical sector address for logical sector 0x00000000
0x83dc5000: Opened the store hStore=000C3740
0x83dc5000: FLASHDRV.DLL:L2P_GetPhysicalSectorAddr() - Secondary table doesn't exist for logical sector 0x0!!!
0x83dc5000: FLASHDRV.DLL:ReadFromMedia() - Unable to determine physical sector address for logical sector 0x00000000
0x83dc5000: NumSec=128 BytesPerSec=2048 FreeSec=0 BiggestCreatable=0
0x83dc5000: SetBlockStatus: Block:0x0 Status:0x0
0x83dc5000: EraseBlocks: erase didn't set all bits high (marking block 0x0 bad).
0x83dc5000: SetBlockStatus:blockID 0x0 Status 0x2
0x83dc5000: SetBlockStatus:Mark 0x0 as Bad Block Succeed
0x83dc5000: SetBlockStatus: Block:0x1 Status:0x0
0x83dc5000: EraseBlocks: erase didn't set all bits high (marking block 0x1 bad).
0x83dc5000: SetBlockStatus:blockID 0x1 Status 0x2
0x83dc5000: SetBlockStatus:Mark 0x1 as Bad Block Succeed
0x83dc5000: SetBlockStatus: Block:0x2 Status:0x0
0x83dc5000: EraseBlocks: erase didn't set all bits high (marking block 0x2 bad).
0x83dc5000: SetBlockStatus:blockID 0x2 Status 0x2
0x83dc5000: SetBlockStatus:Mark 0x2 as Bad Block Succeed
0x83dc5000: SetBlockStatus: Block:0x3 Status:0x0
0x83dc5000: EraseBlocks: erase didn't set all bits high (marking block 0x3 bad).
0x83dc5000: SetBlockStatus:blockID 0x3 Status 0x2[/b]
0x83dc5000: SetBlockStatus:Mark 0x3 as Bad Block Succeed
0x83dc5000: FLASHDRV.DLL:CP_StartCompactor() - There aren't any DIRTY sectors left; the compactor can't be started
0x83dc5000: FLASHDRV.DLL:SM_GetNextFreeSector() - Unable to start compactor in critical situation!!!
0x83dc5000: FLASHDRV.DLL:SM_GetNextFreeSector() - Unable to reclaim any free sectors in a critical compaction stage.  Media must be full.
0x83dc5000: FLASHDRV.DLL:WriteToMedia() - Unable to get next free physical sector address for writing!  The media is full...
0x83dc5000: FLASHDRV.DLL:WriteToMedia() failed.
0x83dc5000: FLASHDRV.DLL:L2P_GetPhysicalSectorAddr() - Secondary table doesn't exist for logical sector 0x0!!!
0x83dc5000: FLASHDRV.DLL:ReadFromMedia() - Unable to determine physical sector address for logical sector 0x00000000
0x83dc5000: FILESYS: Starting device and waiting for boot file system.
0x83d8a1f8: InitSharedHeap: 44200000 0 c
0x83d8a1f8:   InitSharedHeap: return 44200060
0x83d8a1f8: *** DLL_PROCESS_ATTACH - Current Process: 0x42, ID: 0x3d8a45e ***
0x83d8a1f8: +InitDeviceFileSystems
0x83d8a1f8: FS: Registering file system $device, index 4, flags 0x00000001
0x83d8a1f8: FS: Registering file system $bus, index 5, flags 0x00000001
0x83d8a1f8: -InitDeviceFileSystems: status is 1
0x83d8a1f8: Ceddk!CalibrateStallCounter: Enter
0x83d8a1f8: Ceddk!CalibrateStallCounter: Could not find stall counter
0x83d8a1f8: Ceddk!BeginCalibration: min(251) max(278)
0x83d8a1f8: Ceddk!BeginCalibration: Elapsed is 276
0x83d8a1f8: Ceddk!BeginCalibration: Delay is 20
0x83dc5000: FS: Waiting for device to signal BootPhase1 completion
0x83d8a1f8: DEVICE!DevloadInit
0x83d8a1f8: DEVICE!InitDevices: Root Key is Drivers\BuiltIn.
0x83d8a1f8: DEVICE!RegReadActivationValues RegQueryValueEx(Drivers\BuiltIn\Prefix) returned 2
0x83d8a1f8: DEVICE!RegReadActivationValues RegQueryValueEx(Drivers\BuiltIn\BusPrefix) returned 2
0x83dc5000: FILESYS: Starting device and waiting for boot file system.
启动到这里挂了!
=====================================================================================================
此帖出自WindowsCE论坛

最新回复

我也在想把我的QQ2440的nand flash改成K9F1G08U0M或k9f2g08u0m,不知道楼主搞定这个问题了没有。分享一下经验  详情 回复 发表于 2012-3-31 21:42
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
估计是文件系统的问题
你之前是不是用的hive ?

整个格式化一下看看
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在系统里试过加或不加Hive,都不行。
WINCE还没有完全跑起来,应该怎么格式化?
BOOTLOADER只能擦除FLASH分获,没法做格式化。
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
据我所知,这个flash驱动可以不要都可以启动wince的。咋搞上去不行了呢?
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
Gooogleman兄是高手,帮忙看一下,发邮件给你FMD源码和注册表配置。

单为这一个问题卡了两周,跳楼的心都有了。
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
你去驱动开发网那里下载一个郑牛人的驱动就可以了

512/1G 都支持的。

你的是优龙的bootloader,注意注册表以及flash驱动的坏块标记。这里讨论很多了,你搜索看看,我的博客也有说明,

哈哈,我自己也找不到了。
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
EraseBlocks: erase didn't set all bits high (marking block 0x0 bad).
因为无法将所有的bit都擦除成0xFF,所以该block被标志成Bad Block。这是nand的坏块判断标准。
而你提供的DBG信息也显示了,0-3,4个block都无法完整擦除,都被标记成坏块了。

奇怪,你这里所指示的4个,是从物理的0开始的4个吗?物理的前4个应该是放nboot/stepldr的,怎么会出错呢?出错的话根本起不来的。
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
哈哈,shuiyan看了都奇怪了。

因为楼主使用的是优龙的bootloader,并没有把NK和bootloader占用的block标记。——使用eboot是有标记功能的。

所以在FMD驱动中必须把这些块标记为坏块。这样才不会去擦除NK和bootloader。

也有些人会在第一次启动之后就不能启动也是这个原因。
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
哈哈,shuiyan看了都奇怪了。

因为楼主使用的是优龙的bootloader,并没有把NK和bootloader占用的block标记。——使用eboot是有标记功能的。

所以在FMD驱动中必须把这些块标记为坏块。这样才不会去擦除NK和bootloader。

也有些人会在第一次启动之后就不能启动也是这个原因。
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

10
 
#define START_BLOCK (NAND_BLOCK_CNT-(0x80000/NAND_BLOCK_SIZE)) //Reserved space for resident flash 4 Blocks
#define START_PAGE  (START_BLOCK*NAND_PAGE_CNT)

FMD里面有定义RESIDENT DISK的起始BLOCK,DEBUG信息里看到的0-3应该是逻辑BLOCK,实际是上面定义的FLASH的最后4个物理BLOCK。在FMD里面所有相关函数都加上了上面定义的START_BLOCK和START_PAGE,系统扫描空闲BLOCK是能够找到正确的起如物理地址的,所以并不会擦除NK或者BOOTLOADER。但是为什么系统就不能把分出来的BLOCK识别成好块并正确地写入磁盘信息呢?

不知道出现EraseBlocks: erase didn't set all bits high (marking block 0x0 bad)这个操作是在哪里调用的,在FMD_EraseBlock函数里放的跟踪消息显示每次擦除操作都能正常完成,不知道为什么又提示这个信息?

用SJF工具检查过,在写入NK后,指定用来做DISK的BLOCK肯定是没有问题的,但是WINCE启动一遍后那几个BLOCK就被标记为坏块了。

BOOTLOADER中FLASH操作部分和FMD中对K9F1G08坏块标记都已经改到了SPARE区的第一个字节,应该是没有问题的。

怎么能上传附件呀?想请大家帮忙看一下源码。
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
那还是驱动问题了,如果驱动可以,第一次是会启动的。如果是保留块以及注册表没有配置好,一般会发现不了盘符,或者第一次启动之后不能再启动。这个flash驱动也不是我写的。我使用驱动开发网的郑胜杰的来用,基本上一用就起来,最多之前编译不通过,或者不能出现盘符,自己改动一下子。就OK了。弄这个要自己写还是很要心思的。比较多的细节要考虑的。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
Mark!
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
好东西,关注一下
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
帮顶,我也在学习这一块的知识,楼主搞定了希望能分享一下。我现在正在搞eboot下载nk呢,完了就是1g08的flash了。我有那个郑高手的源码,要的话说一声
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
估计是 Nand 驱动 的大小页问题
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

16
 
又一周过去,已经彻底蹦溃了。如果不加Hive,系统可以启动,但是不能发现Flash Disk。一旦加了,就如上面提到的一样,死在中间。
郑高手的代码也试过,结果一样。现在开始怀疑是不是优龙的BSP有什么问题。优龙原始的BSP有个三星第3方的flash驱动,但是并没有被加在Platform里面,它的Hive貌似由下面的注册表实现,它的eboot和bootloader里都没有实现BinFS的代码和格式化功能,晕啊。看来一切还是都只能靠自己了。

; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
   "SYSTEMHIVE"="system.hv"
    "Start DevMgr"=dword:1
   "RegistryFlags"=dword:1

[HKEY_LOCAL_MACHINE\init\BootVars]
   "DefaultUser"="default"

[HKEY_LOCAL_MACHINE\Drivers\BlockDevice\SMFLASH]
  "Prefix"="DSK"
  "Dll"="smflash.dll"
  "Order"=dword:0
  "Ioctl"=dword:4
  "Profile"="SMFLASH"
  "FriendlyName"="MS Flash Driver"
  "MountFlags"=dword:11
  "BootPhase"=dword:1
  "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
  "DriverPath"="Drivers\\BlockDevice\\SMFLASH"
  "LoadFlags"=dword:1
  "MountFlags"=dword:11
  "BootPhase"=dword:1
  "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH]
  "DefaultFileSystem"="FATFS"
  "PartitionDriver"="mspart.dll"
  "AutoMount"=dword:1
  "AutoPart"=dword:1
  "AutoFormat"=dword:1
  "Folder"="ResidentFlash"
  "Name"="Microsoft Flash Disk"
  "BootPhase"=dword:0
  "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\FATFS]
  "FriendlyName"="FAT FileSystem"
  "Dll"="fatfsd.dll"
  "Flags"=dword:00280014
  "Paging"=dword:1
  "CacheSize"=dword:0
  "EnableCacheWarm"=dword:0
  "EnableCache"=dword:1
  "MountFlags"=dword:2

; END HIVE BOOT SECTION
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

17
 
是 Nand 驱动 的大小页问题
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
成熟三星S3C2440方案及S3C2416方案, WINCE5.0,
NBOOT EBOOT,支持SD卡升级NK,WINCE下升级NK,
boot定制 及 驱动定制开发 以及 硬件定制开发,
请联系QQ:570615487,注明:2440
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

19
 
成熟三星S3C2440方案及S3C2416方案, WINCE5.0,
NBOOT EBOOT,支持SD卡升级NK,WINCE下升级NK,
boot定制 及 驱动定制开发 以及 硬件定制开发,
请联系QQ:570615487,注明:2440
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

20
 
出现标记坏块,检查下SectorInfo的 BadBlock标志,记得K9F1208是第6个字节是BadBlock标志,K9F1G08改成了第一个字节。

出现这个错误:erase didn't set all bits high (marking block 0x0 bad)
应该是在bootpart.cpp中低级格式化时 调用FMD_ReadSecotr判断 整个PAGE+SectorInfo(2048+8)是否是0xFF,CE默认使用memcmp对比两个数据结构是否一致,但这里会涉及“指针对齐”问题,你可以打印出sizeof(SectorInfo)的大小。


K9F1208的SectorInfo
typedef struct _SectorInfo
{
    DWORD dwReserved1;  4字节
    BYTE  bOEMReserved; 1字节
    BYTE  bBadBlock;    1字节
    WORD  wReserved2;   2字节  
}SectorInfo, *PSectorInfo;  不会涉及指针对齐


K9F1G08的SectorInfo定义
typedef struct _SectorInfo
{
    BYTE  bBadBlock;    1字节
    DWORD dwReserved1;  4字节
    BYTE  bOEMReserved; 1字节
    WORD  wReserved2;   2字节
}SectorInfo, *PSectorInfo;  出现指针对齐问题


此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表