当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]WinCE支持Flash设备,一般指Nandflash或者是NORFlash,采用的架构一般是FAL+FMD架构,我们实现FMD相关的接口函数,Flash的驱动就算完成了。当WinCE启动以后,我们能够看到Flash设备的磁盘。我们可以操作磁盘上面的文件,但是不能直接操作flash设备,对Flash设备的操作无非就是:读,写,擦除,读ID。

在网上的很多论坛中都看到有人提问:应用程序如何直接读写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,DWORDnInBufSize, PBYTE pOutBuf, DWORD nOutBufSize,PDWORDpBytesReturned)

PFMDInterface pInterface = (PFMDInterface)pOutBuf;

RETAILMSG(1, (TEXT("FMD_OEMIoControl: control code is0x%xrn"),dwIoControlCode));

switch(dwIoControlCode)

case IOCTL_FMD_GET_INTERFACE:

if (!pOutBuf nOutBufSize < sizeof(FMDInterface))

DEBUGMSG(1, (TEXT("FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACEbadmeter(s).rn")));

return(FALSE);

pInterface->cbSize = sizeof(FMDInterface);

pInterface->pInit = FMD_Init;

pInterface->pDeInit = FMD_Deinit;

pInterface->pGetInfo = FMD_GetInfo;

pInterface->pGetInfoEx = NULL; //FMD_GetInfoEx;

pInterface->pGetBlockStatus = FMD_GetBlockStatus;

pInterface->pSetBlockStatus = FMD_SetBlockStatus;

pInterface->pReadSector = FMD_ReadSector;

pInterface->pWriteSector = FMD_WriteSector;

pInterface->pEraseBlock = FMD_EraseBlock;

pInterface->pPowerUp = FMD_PowerUp;

pInterface->pPowerDown = FMD_PowerDown;

pInterface->pGetPhysSectorAddr = NULL;

pInterface->pOEMIoControl = FMD_OEMIoControl;

break;

case 0xff123456:

FMD_ReadSector(..);//调用读Sector函数

break;

case 0xff654321:

FMD_WriteSector(..);//调用写Sector函数

break;

case 0xff123457:

FMD_EraseBlock(..);//调用擦除Block函数

break;

default:

DEBUGMSG(1, (TEXT("FMD_OEMIoControl: unrecognizedIOCTL(0x%x).rn"), dwIoControlCode));

return(FALSE);

return(TRUE);

在FMD_OEMIoControl(..)函数里面增加了3个case,这3个case里面调用了读/写/擦除函数。至于Case的值,我是随便定义的。这样Flash设备的驱动部分就改完了。

在改完Flash驱动以后,我下面会提供两种方法,每一种方法都和Flash设备的注册表配置有关:

1. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:

[HKEY_LOCAL_MACHINEDriversBuiltInNANDFlash]

"Dll"="ep94xxnandflash.dll"

"Prefix"="DSK"

"Order"=dword:4

;"Ioctl"=dword:4

"Profile"="NSFlash"

"IClass"="A4E7EDDA-E575-4252-9D6B-4195D48BB865"

; Override names in default profile

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlash]

"Name"="Ep94xx NAND Flash"

"Folder"="NANDFlash"

"PartitionDriver"="MSPart.dll"

"AutoMount"=dword:1

"AutoPart"=dword:1

"AutoFormat"=dword:1

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashFATFS]

"EnableCache"=dword:1

"CacheSize"=dword:1000

"MountBootable"=dword:1

"Flags"=dword:00000024

"CheckForFormat"=dword:1


然后编写应用程序,主要就是通过CreateFile来打开DSK1:设备,然后通过DeviceIoControl(..)函数来调用FMD_OEMIoControl(..)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:

HANDLE hFirm;

hFirm = CreateFile(TEXT("DSK1:"), GENERIC_READ GENERIC_WRITE,0,NULL, OPEN_EXISTING, 0, NULL);

printf("Open Flash Device Failed");

return 0;

iRet = DeviceIoControl(hFirm, 0xff123456, 1, 2, 3, 4, 5,6);//Read Flash Sector

iRet = DeviceIoControl(hFirm, 0xff654321, 1, 2, 3, 4, 5,6);//Write Flash Sector

iRet = DeviceIoControl(hFirm, 0xff123457, 1, 2, 3, 4, 5,6);//Erase Flash Block

printf("DeviceIoControl OKrn");

while(1)

;

通过上面的应用程序,就能够调用到Flash设备驱动中的FMD_OEMIoControl(..)函数,这样根据不同的case就可以调用读/写/擦除函数了。

2. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:

[HKEY_LOCAL_MACHINEDriversBuiltInNANDFlash]

"Dll"="ep94xxnandflash.dll"

"Prefix"="DSK"

"Order"=dword:4

;"Ioctl"=dword:4

"Profile"="NSFlash"

"IClass"="A4E7EDDA-E575-4252-9D6B-4195D48BB865"

; Override names in default profile

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlash]

"Name"="Ep94xx NAND Flash"

"Folder"="NANDFlash"

"PartitionDriver"="MSPart.dll"

"AutoMount"=dword:1

"AutoPart"=dword:1

"AutoFormat"=dword:1

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashFATFS]

"EnableCache"=dword:1

"CacheSize"=dword:1000

"MountBootable"=dword:1

"Flags"=dword:00000024

"CheckForFormat"=dword:1

[HKEY_LOCAL_MACHINESystemStorageManagerAutoLoadNSFlash]

"DriverPath"="Drivers\BuiltIn\NANDFlash"

"LoadFlags"=dword:0

"BootPhase"=dword:1

然后编写应用程序,主要就是通过OpenStore来打开NSFlash,然后通过DeviceIoControl(..)函数来调用FMD_OEMIoControl(..)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:

HANDLE hFirm;

hFirm = OpenStore(L"NSFlash");

printf("Open Flash Device Failed");

return 0;

iRet = DeviceIoControl(hFirm, 0xff123456, 1, 2, 3, 4, 5, 6);

iRet = DeviceIoControl(hFirm, 0xff654321, 1, 2, 3, 4, 5, 6);

iRet = DeviceIoControl(hFirm, 0xff123457, 1, 2, 3, 4, 5, 6);

printf("DeviceIoControl OKrn");

while(1)

;

通过这种方法,也可以在应用程序中调用到FMD_OEMIoControl(..)函数,从而达到直接访问Flash设备的目的。

总结一下,上面的两种方法大致原理其实是一样的,都是通过DeviceIoControl函数来调用FMD_OEMIoControl函数,然后达到直接访问Flash驱动的目的,这样就可以在应用程序中直接读/写/擦除Flash设备了。

最后需要注意的是:你的Flash驱动里面需要对读/写/擦除等直接操作Flash硬件的函数进行保护,因为Flash设备应该是由WinCE的文件系统来管理的,而现在你的应用程序也可以直接访问它了,所以保险起见,添加互斥量保护避免访问冲突。

上面的所有实现,都是在WinCE6.0上面做得,相信在WinCE5.0上面应该差不多。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭