阅读:28709回复:72
【原创】2K大页面NAND FLASH的WINCE5.0/4.2下的驱动源码。
就在上周我在为开发2K大页面驱动而苦恼的时候,周末终于全部搞定了,并且做了较好的改进,前后花了我3天3夜的时间,现在直接把最终的成果直接奉献给大家。
能跟据FLASH ID识别自动注册相应FLASH的访问接口,目前代码上实现了K9S1208,K9F1G08,K9F2G08,K9F4G08,K9K8G08,K9F2G16的访问接口,实测过K9S1208,K9F1G08的功能,验证结果证明,该驱动可以识别出K9S1208,K9F1G08,自动加载相应的芯片访问接口,支持文件系统访问。通过查看参考K9F2G08/K9F4G08/K9K8G08的芯片资料,发现它们的普通命令接口和K9F1G08是一样的,只是块个数不一样而已,行地址是3个周期的,比K9F1G08多一个,所以把它们也支持了,但没有条件实测,理论上应该是行得通的,有相应硬件的人使用该驱动别忘了告诉我结果,有问题请联系我。请大家下载回去使用的时候看一下readme.txt里面有我的联系方式。 各位可以把使用情况,出现什么问题告诉我,让我可以改进和完善它。 |
|
最新喜欢:linuc |
沙发#
发布于: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();初始化会失败。 |
|
板凳#
发布于: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改了就可以了。 |
|
地板#
发布于:2007-02-05 16:48
to waterman:
谢谢指出问题4,是我的coding错误,可以参考FMD_ReadSector1208()改正过来。 问题3,实际应用过程中,我并没有碰到出错,所以我把ECC去掉了,你认为有必要就自己加好了。 问题1,你想做成512,也无需修改FAL,你也改不了FAL,你没有它的源码。 你看到存储管理里是2K的,有什么疑问吗?它显示的是你的FLASH信息。 你最后的疑问是什么呢?因为没看过你的代码不知道你到底怎么做的。我的驱动已经验证过了是可行的。 |
|
地下室#
发布于: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信息。应该没有什么问题了。 |
|
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 |
|
6楼#
发布于:2007-05-28 17:41
我没有在4.2上面测试过,从网友的反馈得知4.2上不能直接用2048做SECTOR_SIZE,那就需要模拟成小页,512bytes/page,256pages/block.做成这样的话就肯定在什么版本上都能运行了。模拟成小页的我一开始也是这么做的,系统也已经运行了,后来觉得效率可能差一些,所以就改成现在这个样子的。
|
|