zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
阅读:28709回复:72

【原创】2K大页面NAND FLASH的WINCE5.0/4.2下的驱动源码。

楼主#
更多 发布于:2007-01-15 17:44
  就在上周我在为开发2K大页面驱动而苦恼的时候,周末终于全部搞定了,并且做了较好的改进,前后花了我3天3夜的时间,现在直接把最终的成果直接奉献给大家。
能跟据FLASH ID识别自动注册相应FLASH的访问接口,目前代码上实现了K9S1208,K9F1G08,K9F2G08,K9F4G08,K9K8G08,K9F2G16的访问接口,实测过K9S1208,K9F1G08的功能,验证结果证明,该驱动可以识别出K9S1208,K9F1G08,自动加载相应的芯片访问接口,支持文件系统访问。通过查看参考K9F2G08/K9F4G08/K9K8G08的芯片资料,发现它们的普通命令接口和K9F1G08是一样的,只是块个数不一样而已,行地址是3个周期的,比K9F1G08多一个,所以把它们也支持了,但没有条件实测,理论上应该是行得通的,有相应硬件的人使用该驱动别忘了告诉我结果,有问题请联系我。请大家下载回去使用的时候看一下readme.txt里面有我的联系方式。
各位可以把使用情况,出现什么问题告诉我,让我可以改进和完善它。
附件名称/大小 下载次数 最后更新
2k大页面flash wince4.2_5.0驱动源码.rar (71KB)  2160 2007-01-15 17:44

最新喜欢:

linuclinuc
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
沙发#
发布于:2007-01-16 13:21
因为loader.h没有给大家,里面有两个宏定义需要修改一下,
// BinFS work area defined in boot.bib
//#define BINFS_RAM_START             (0x8c021000 | CACHED_TO_UNCACHED_OFFSET)   // uncached
//#define BINFS_RAM_LENGTH            0x5000

// BinFS work area defined in boot.bib
#define BINFS_RAM_START             (0x8c080000 | CACHED_TO_UNCACHED_OFFSET)   // uncached
#define BINFS_RAM_LENGTH            0x30000

否则BP_Init();初始化会失败。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
板凳#
发布于:2007-01-16 13:39
网友的疑问:
1.三星发布的eboot中应该只支持512byte的flash(我的理解),原因是eboot连接了bootpart.lib库,在bootpart.c中包括了bootpart.h文件,此中定义了SECTOR_SIZE为512,要支持2048的SECTOR_SIZE,应该要做改动,我不知道你是怎么处理这个问题的,谢谢!

2,在eboot运行时要调用BP_Init,此函数要用到BOOT.BIB中关于BIN_FS地址和大小的定义,我想最小应该是
一个block的大小,这样就导致要修改BOOT.BIB文件,从而EBOOT的地址也要做相应的改变,不知道你是怎么做的,从你的NBOOT里面看来,好像没有变!

3,我在做程序时,是在wince4.2的平台上做的,SJF2440.exe已经成功了,nboot也能加载镜像os,eboot也能将镜像os烧入nandflash中(KF1G08),也能启动,但是就是看不到nandflash的分区,我的电脑里面也没有
RESENTFLASH文件夹,我怀疑跟文件系统挂接时出了问题,我看了eboot 格式化后MBR,的确已经写入信息了。

解答:
zhengshijie@msn.com 说:
问题1:
zhengshijie@msn.com 说:
bootpart.h的SECTOR_SIZE保持512不变。
风景这边独好 说:
难道有一部分不用
风景这边独好 说:
你的意思是在fat文件系统访问时把2k得sector当512字节用吗?
zhengshijie@msn.com 说:
问题2:#define BINFS_RAM_START             (0x8c080000 | CACHED_TO_UNCACHED_OFFSET)   // uncached
#define BINFS_RAM_LENGTH            0x30000
zhengshijie@msn.com 说:
是的,FAT文件系统的sector_size是512的。
zhengshijie@msn.com 说:
问题3:前面都做好了,就不存在这个问题了,另外,你可以看一下控制面板中是否能看到这个DISK,格式化一下就可以看到文件夹了,当然你把前面两个问题解决了,第三个问题也就不存在了。
风景这边独好 说:
也就是说剩余flash做flash盘时,可用空间只有实际空间得1/4?
zhengshijie@msn.com 说:
那不是,可用空间是你实际空间。
风景这边独好 说:
不太明白
风景这边独好 说:
你不是把一个sector当成512了吗
zhengshijie@msn.com 说:
是这样的,FAL层做了隐射,你也知道FAT文件系统的SECTOR SIZE就是512的,然后通过FAL(文件系统抽象层)做了逻辑到物理的映射。
风景这边独好 说:
Log2Phys就是这个函数吗?
风景这边独好 说:
你作eboot时,有没有改动boot part.c这个函数啊,就是说eboot连接的库有没有修改?
zhengshijie@msn.com 说:
这个eboot中的bootpart.cpp里的,fal.lib里有类似的函数。因为fal.lib没有源码的。
zhengshijie@msn.com 说:
不需要修改bootpart.cpp
风景这边独好 说:
明白,你只改动fmd的驱动就行了
zhengshijie@msn.com 说:
最后结果证明,不用考虑上层的接口,微软已经考虑了FLASH的多样性,所以要你提供FMD_GetInfo()获取实际物理存储介质的信息,只要把信息给对,驱动就按实际的FLASH实现,其它不用考虑。
风景这边独好 说:
能不能看看你的BOOT.BIB文件
风景这边独好 说:
明白了,多谢指教
zhengshijie@msn.com 说:
这是我做完了得到的体会,一开始我也有你那些顾虑,BOOT.BIB不用改动。
zhengshijie@msn.com 说:
我甚至实现了在驱动中做了2048到512的映射,把一页分成4页,而且作成功了。
风景这边独好 说:
BINFS_RAM_START 原来是在8c021000啊
风景这边独好 说:
我也想用分页来做,受你在网上的影响啊
zhengshijie@msn.com 说:
没关系的,实际程序用的是loader.h中的宏定义,只要loader.h改了就可以了。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
地板#
发布于:2007-02-05 16:48
to waterman:
谢谢指出问题4,是我的coding错误,可以参考FMD_ReadSector1208()改正过来。
问题3,实际应用过程中,我并没有碰到出错,所以我把ECC去掉了,你认为有必要就自己加好了。
问题1,你想做成512,也无需修改FAL,你也改不了FAL,你没有它的源码。
你看到存储管理里是2K的,有什么疑问吗?它显示的是你的FLASH信息。
你最后的疑问是什么呢?因为没看过你的代码不知道你到底怎么做的。我的驱动已经验证过了是可行的。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
地下室#
发布于:2007-03-29 17:33
to jasonshi:
  BAD 标志位置请看源码,已经根据大页的做了相应的改动。
MBR和512的一样,bootpart.cpp,bootpart.h都不改动,逻辑上还是512/sector.这个问题前面已经讨论过。
to chunpengkai:
  请确认一下spare区的读写,sectorinfo的读写是否OK,因为创建分区的时候会把sectorinfo写到spare区域,如果所有读写都没有问题,保证FMD_GetInfo()提供的是你FLASH信息。应该没有什么问题了。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
5楼#
发布于:2007-05-28 17:35
#ifndef SECTOR_SIZE
#define SECTOR_SIZE                    (GetBytesPerSector())
#endif

#ifndef PAGES_PER_BLOCK
#define PAGES_PER_BLOCK             (GetSectorsPerBlock())  
#endif

#ifndef SECTOR_TO_BLOCK
#ifndef LOG_2_PAGES_PER_BLOCK
#define LOG_2_PAGES_PER_BLOCK        (GetLog2PagesPerBlock(NAND_PAGE_CNT))
#endif
#define SECTOR_TO_BLOCK(sector)     ((sector) >> LOG_2_PAGES_PER_BLOCK )
#endif
#ifndef BLOCK_TO_SECTOR
#ifndef LOG_2_PAGES_PER_BLOCK
#define LOG_2_PAGES_PER_BLOCK        (GetLog2PagesPerBlock(NAND_PAGE_CNT))
#endif
#define BLOCK_TO_SECTOR(block)      ((block)  << LOG_2_PAGES_PER_BLOCK )
#endif

#ifndef BADBLOCKMARK
#define BADBLOCKMARK                0x00
#endif
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
6楼#
发布于:2007-05-28 17:41
我没有在4.2上面测试过,从网友的反馈得知4.2上不能直接用2048做SECTOR_SIZE,那就需要模拟成小页,512bytes/page,256pages/block.做成这样的话就肯定在什么版本上都能运行了。模拟成小页的我一开始也是这么做的,系统也已经运行了,后来觉得效率可能差一些,所以就改成现在这个样子的。
游客

返回顶部