火加安四个火怎么读读

7354人阅读
作者:ARM-WINCE
在网上的很多论坛中都看到有人提问:应用程序如何直接读写Flash的扇区,或者是类似的问题。总之,就是希望应用程序能够直接访问Flash设备,直接读写扇区的数据,或者作其他的操作。这几天没事,就尝试着做了一下,把我的方法介绍给大家。
先做个简单的介绍。WinCE支持Flash设备,一般指Nandflash或者是NORFlash,采用的架构一般是FAL+FMD架构,我们实现FMD相关的接口函数,Flash的驱动就算完成了。当WinCE启动以后,我们能够看到Flash设备的磁盘。我们可以操作磁盘上面的文件,但是不能直接操作flash设备,对Flash设备的操作无非就是:读,写,擦除,读ID。
现在开始介绍实现的方法。我们如果想在应用程序中直接调用FMD中的FMD_ReadSector(..),FMD_WriteSector(..),FMD_EraseBlock(..)是不太现实的。这里再补充一下,这三个函数分别是Flash的读扇区,写扇区,擦除块的函数。好像有点罗嗦了。但是我们可以在应用程序中调用到FMD_OEMIoControl(..)函数,这个是可以做到的。所以我们需要改一下Flash设备的驱动程序,也就是改Flash设备驱动中的FMD_OEMIoControl(..)这个函数。我的改动如下:
BOOL& FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned){&&& PFMDInterface pInterface = (PFMDInterface)pOutB
&&& RETAILMSG(1, (TEXT(&FMD_OEMIoControl: control code is 0x%x/r/n&), dwIoControlCode));&&& switch(dwIoControlCode)&&& {&&&&&&& case IOCTL_FMD_GET_INTERFACE:&&&&&&&&&&& if (!pOutBuf || nOutBufSize & sizeof(FMDInterface))&&&&&&&&&&& {&&&&&&&&&&&&&&&& DEBUGMSG(1, (TEXT(&FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACE bad parameter(s)./r/n&)));&&&&&&&&&&&&&&&& return(FALSE);&&&&&&&&&&& }&&& &&&&&&&&&&& pInterface-&cbSize = sizeof(FMDInterface);&&&&&&&&&&&&pInterface-&pInit = FMD_I&&&&&&&&&&& pInterface-&pDeInit = FMD_D&&&&&&&&&&& pInterface-&pGetInfo = FMD_GetI&&&&&&& &&&&&&&&&&& pInterface-&pGetInfoEx = NULL;&//FMD_GetInfoEx;&&&&&&&&&&& pInterface-&pGetBlockStatus = FMD_GetBlockS&&&& &&&&&&&&&& &pInterface-&pSetBlockStatus = FMD_SetBlockS&&&&&&&&&&& pInterface-&pReadSector = FMD_ReadS&&&&&&&&&&& pInterface-&pWriteSector = FMD_WriteS&&&&&&&&&&& pInterface-&pEraseBlock = FMD_EraseB&&&&&&&&&&& pInterface-&pPowerUp = FMD_PowerUp;&&&&&&&&&&& pInterface-&pPowerDown = FMD_PowerD&&&&&&&&&&& pInterface-&pGetPhysSectorAddr = NULL;&&&&&&&&&&& &&&&&&&&&& &pInterface-&pOEMIoControl = FMD_OEMIoC&&&&&&&&&&& &&&&&&&&&&&&&&&&& case 0xff123456:&&&&&&&&&&& FMD_ReadSector(..);&&&&&&&&&&&&&&& //调用读Sector函数&&&&&&&&&&&&&&&&& case 0xff654321:&&&&&&&&&&& FMD_WriteSector(..);&&&&&&&&&&&&&&&&//调用写Sector函数&&&&&&&&&&&&&&&&& case 0xff123457:&&&&&&&&&&& FMD_EraseBlock(..);&&&&&&&&&&&&&& //调用擦除Block函数&&&&&&&&&&&&&&&&& default:&&&&&&&&&&& DEBUGMSG(1, (TEXT(&FMD_OEMIoControl: unrecognized IOCTL (0x%x)./r/n&), dwIoControlCode));&&&&&&&&&&& return(FALSE);&&& }
&&& return(TRUE);}&
在FMD_OEMIoControl(..)函数里面增加了3个case,这3个case里面调用了读/写/擦除函数。至于Case的值,我是随便定义的。这样Flash设备的驱动部分就改完了。
在改完Flash驱动以后,我下面会提供两种方法,每一种方法都和Flash设备的注册表配置有关:
1. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFlash]&Dll&=&ep94xxnandflash.dll&&Prefix&=&DSK&&Order&=dword:4;&Ioctl&=dword:4&Profile&=&NSFlash&&IClass&=&{A4E7EDDA-E575-B-5}&
; Override names in default profile[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash]&&Name&=&Ep94xx NAND Flash&&&Folder&=&NANDFlash&&&PartitionDriver&=&MSPart.dll&&&AutoMount&=dword:1&&AutoPart&=dword:1&&AutoFormat&=dword:1
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash/FATFS]&EnableCache&=dword:1&CacheSize&=dword:1000&MountBootable&=dword:1&Flags&=dword:&CheckForFormat&=dword:1
然后编写应用程序,主要就是通过CreateFile来打开DSK1:设备,然后通过DeviceIoControl(..)函数来调用FMD_OEMIoControl(..)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:
&hFirm = CreateFile(TEXT(&DSK1:&), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);&if(hFirm == INVALID_HANDLE_VALUE)&{&&printf(&Open Flash Device Failed&);&&return 0;&}
&iRet = DeviceIoControl(hFirm, 0xff123456, para1, para2, para3, para4, para5, para6);& //Read Flash Sector&iRet = DeviceIoControl(hFirm, 0xff654321, para1, para2, para3, para4, para5, para6);& //Write Flash Sector&iRet = DeviceIoControl(hFirm, 0xff123457, para1, para2, para3, para4, para5, para6);& //Erase Flash Block
&printf(&DeviceIoControl OK/r/n&);
&while(1)&&;
通过上面的应用程序,就能够调用到Flash设备驱动中的FMD_OEMIoControl(..)函数,这样根据不同的case就可以调用读/写/擦除函数了。
2. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFlash]&Dll&=&ep94xxnandflash.dll&&Prefix&=&DSK&&Order&=dword:4;&Ioctl&=dword:4&Profile&=&NSFlash&&IClass&=&{A4E7EDDA-E575-B-5}&
; Override names in default profile[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash]&&Name&=&Ep94xx NAND Flash&&&Folder&=&NANDFlash&&&PartitionDriver&=&MSPart.dll&&&AutoMount&=dword:1&&AutoPart&=dword:1&&AutoFormat&=dword:1
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash/FATFS]&EnableCache&=dword:1&CacheSize&=dword:1000&MountBootable&=dword:1&Flags&=dword:&CheckForFormat&=dword:1
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/NSFlash]&DriverPath&=&Drivers//BuiltIn//NANDFlash&&LoadFlags&=dword:0&BootPhase&=dword:1
然后编写应用程序,主要就是通过OpenStore来打开NSFlash,然后通过DeviceIoControl(..)函数来调用FMD_OEMIoControl(..)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:
&HANDLE&hF
&hFirm = OpenStore(L&NSFlash&);&if(hFirm == INVALID_HANDLE_VALUE)&{&&printf(&Open Flash Device Failed&);&&return 0;&}
&iRet = DeviceIoControl(hFirm, 0xff123456, para1, para2, para3, para4, para5, para6);&iRet = DeviceIoControl(hFirm, 0xff654321, para1, para2, para3, para4, para5, para6);&iRet = DeviceIoControl(hFirm, 0xff123457, para1, para2, para3, para4, para5, para6);
&printf(&DeviceIoControl OK/r/n&);
&while(1)&&;
通过这种方法,也可以在应用程序中调用到FMD_OEMIoControl(..)函数,从而达到直接访问Flash设备的目的。
总结一下,上面的两种方法大致原理其实是一样的,都是通过DeviceIoControl函数来调用FMD_OEMIoControl函数,然后达到直接访问Flash驱动的目的,这样就可以在应用程序中直接读/写/擦除Flash设备了。
最后需要注意的是:你的Flash驱动里面需要对读/写/擦除等直接操作Flash硬件的函数进行保护,因为Flash设备应该是由WinCE的文件系统来管理的,而现在你的应用程序也可以直接访问它了,所以保险起见,添加互斥量保护避免访问冲突。
上面的所有实现,都是在WinCE6.0上面做得,相信在WinCE5.0上面应该差不多。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:443449次
积分:5375
积分:5375
排名:第1548名
原创:90篇
评论:481条
(1)(1)(1)(1)(2)(2)(1)(1)(1)(1)(1)(2)(4)(4)(2)(3)(4)(3)(5)(6)(5)(5)(6)(6)(4)(3)(1)(3)(1)(6)(4)米字旁加安读什么?_百度知道
米字旁加安读什么?
我有更好的答案
不记得有这个字啊 ^_^
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁常德外国语学校(综合楼、图书馆、科教楼、1#教学楼)加安铝合金窗户及防火门、更换变形缝等装饰装修工程中标公告- 湖南省招标-中国国际招标网
您当前位置: >
常德外国语学校(综合楼、图书馆、科教楼、1#教学楼)加安铝合金窗户及防火门、更换变形缝等装饰装修工程中标公告
来源:中国国际招标网&&&& 发布时间:
常德外国语学校(综合楼、图书馆、科教楼、1#教学楼)加安铝合金窗户及防火门、更换变形缝等装饰装修工程
:常德外国语学校(综合楼、图书馆、科教楼、1#教学楼)加安铝合金窗户及防火门、更换变形缝等装饰装修工程
:CDZT(2014)15
:常德外国语学校
评标结果公示时间
评标结果公示截止时间
根据《中华人民共和国招标投标法》、《湖南省实施
办法》,常德外国语学校(综合楼、图书馆、科教楼、1#教学楼)加安铝合金窗户及防火门、更换变形缝等装饰装修工程项目国内公开招标于日15:00点在常德市公共资源交易中心举行开标、评标会议。
评标工作由从评委专家库中随机抽取的专家完成,常德市室内装饰工程监督管理所对整个开评标过程进行监督。
评标委员会按照招标文件确定的评标办法,对所有有效的投标书进行了详细的评审,评委经过集体充分评议,推荐的中标候选人为:
第一名:湖南三星装饰有限公司
第二名:常德市嘉禾装饰工程有限责任公司
第三名:常德居众装饰设计工程有限公司
根据《湖南省招标公告和中标候选人公示暂行办法》第十二条的规定,现予以公告。
本公告公示期十天。如有异议,请根据国家发展与改革委员会七部委制定的《工程建设项目招标投标活动投诉处理办法》(七部委令[2004]第11号)的有关规定,向相关建设行政主管部门书面反映。
湖南中投项目管理有限公司
为保证您能够顺利投标,请在投标或购买招标文件前向招标代理机构或招标人咨询投标详细要求,具体要求及项目情况以招标代理机构或招标人的解释为准。
相关中标结果
&&&&&&&&&&必联公司 版权所有&&&& &&
&&&&&&&&&&&&&&&&&京公网安备27 号酉加安怎么读_百度知道
酉加安怎么读
酉加安怎么读
我来帮他解答
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 4个火读什么 的文章

 

随机推荐