Chinaunix首页 | 论坛 | 博客
  • 博客访问: 527410
  • 博文数量: 1345
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 14830
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-14 20:32
文章分类

全部博文(1345)

文章存档

2010年(1345)

我的朋友

分类:

2010-10-18 17:47:34

  在网上的很多论坛中都看到有人提问:应用程序如何直接读写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设备的方法请收藏或告诉您的好朋友.
阅读(132) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~