在网上的很多论坛中都看到有人提问:应用程序如何直接读写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)poutbuf;
retailmsg(1, (text("fmd_oemiocontrol: control code is 0x%xrn"), 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).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: unrecognized ioctl (0x%x).rn"), dwiocontrolcode));
return(false);
}
return(true);
}
如果喜欢在wince下,应用程序直接读/写/擦除flash设备的方法请收藏或告诉您的好朋友.
阅读(146) | 评论(0) | 转发(0) |