【玩转.Net MF – 01】Flash远程读写

简介:

目前在PC远程访问设备Flash,也就是部署TinyCLR和下载应用程序。在以前写的《NandFlash驱动开发》文章,我们知道Flash被分为六个区,典型的结构如下(以Sam9261_ek开发板为例):


 
 
  1. const BlockRange g_K9F2G_8_BlockStatus[] =  
  2.  
  3. {  
  4.  
  5.     { BlockRange::BLOCKTYPE_BOOTSTRAP ,  0,  1 },  
  6.  
  7.     { BlockRange::BLOCKTYPE_CONFIG    ,  2,  2 },  
  8.  
  9.     { BlockRange::BLOCKTYPE_CODE      ,  3, 24 },  
  10.  
  11.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 25, 29 },  
  12.  
  13.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 30, 34 },  
  14.  
  15.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 35, 39 },  
  16.  
  17.     { BlockRange::BLOCKTYPE_DEPLOYMENT, 40, 48 },  
  18.  
  19.     { BlockRange::BLOCKTYPE_STORAGE_A , 49, 49 },  
  20.  
  21.     { BlockRange::BLOCKTYPE_STORAGE_B , 50, 50 },      
  22.  
  23.     {BlockRange::BLOCKTYPE_FILESYSTEM, 51, FLASH_BLOCK_COUNT - 1 }  
  24.  
  25. };  
  26.  

我们能否直接读写该Flash上的所有区呢?

实现这个功能的好处是易见的,我们再也没有必要为了下载一个应用程序而启动相对庞大的VS2008,再也不受必须打开MF工程才能下载的限制。在我们开发Ti DM355开发板就遇到类似问题,我们给异地开发板提供者演示相关程序功能时,必须要求对方安装VS2008,还必须发送我们的项目源码,否则就无法在另外的开发板上进行演示。

仔细研究了一下MFDeploy程序(这是典型的C#程序,在Vista和Windows7上可直接运行,在WinXP及以前的系统上需要安装.Net Framework运行时),发现可以为其开发一个插件来实现我们所要求的功能。

MFDeploy程序可以通过三种方式来访问.Net MF设备,串口、网口和USB,并且可以把TinyCLR部署到设备上去(需要开发板运行TinyBooter),也可以清空应用程序区,所以我们只要把这部分功能给扩展一下就可以了。

插件类必须继承于MFPlugInMenuItem类,相关代码如下:


 
 
  1. public class PlugInHandle : MFPlugInMenuItem  
  2.  
  3.      {  
  4.  
  5.         public override string Name { get { return "Read/Write Flash"; } }  
  6.  
  7.         public override void OnAction(IMFDeployForm form, MFDevice device)  
  8.  
  9.         {  
  10.  
  11.             if (form == null || device == null) return;  
  12.  
  13.             (new frmRWFlash(form, device)).ShowDialog();  
  14.  
  15.         }  
  16.  
  17. }  
  18.  

其中由宿主传递过来的form和device非常重要,form就是针对MFDeploy主窗体,主要提供DumpToOutput函数,把消息显示到信息区,而device则提供和设备通信的相关函数,如Ping、Deploy、Erase、Execute等。

插件实现的第一步,要读写Flash区,首先要获取Flash的内存映像表,通过如下的代码就可以获取:


 
 
  1. _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.Reply reply = engine.GetFlashSectorMap();  
  2.  
  3. if (reply != null)  
  4.  
  5. {  
  6.  
  7.     for (int i = 0; i < reply.m_map.Length; i++)  
  8.  
  9.     {  
  10.  
  11.         _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.FlashSectorData fsd = reply.m_map[i];  
  12.  
  13.         string usage = "";  
  14.  
  15.         switch (fsd.m_flags & _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_MASK)  
  16.  
  17.         {  
  18.  
  19.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_APPLICATION:  
  20.  
  21.                 usage = "Application";  
  22.  
  23.                 break;  
  24.  
  25.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_BOOTSTRAP:  
  26.  
  27.                 usage = "Bootstrap";  
  28.  
  29.                 break;  
  30.  
  31.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_CODE:  
  32.  
  33.                 usage = "Code";  
  34.  
  35.                 break;  
  36.  
  37.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_CONFIG:  
  38.  
  39.                 usage = "Configuration";  
  40.  
  41.                 break;  
  42.  
  43.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_DEPLOYMENT:  
  44.  
  45.                 usage = "Deployment";  
  46.  
  47.                 break;  
  48.  
  49.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_JITTER:  
  50.  
  51.                 usage = "Jitter";  
  52.  
  53.                 break;  
  54.  
  55.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_FS:  
  56.  
  57.                 usage = "File System";  
  58.  
  59.                 break;  
  60.  
  61.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_RESERVED:  
  62.  
  63.                 usage = "Reserved";  
  64.  
  65.                 break;  
  66.  
  67.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_STORAGE_A:  
  68.  
  69.                 usage = "Storage";  
  70.  
  71.                 break;  
  72.  
  73.             case _DBG.WireProtocol.Commands.Monitor_FlashSectorMap.c_MEMORY_USAGE_STORAGE_B:  
  74.  
  75.                 usage = "Storage";  
  76.  
  77.                 break;  
  78.  
  79.             case 0xA0:  
  80.  
  81.                 usage = "Custom";  
  82.  
  83.                 break;  
  84.  
  85.         }  
  86.  
  87.         FlashMap.Add(FlashMaps, usage, fsd.m_address, fsd.m_size);  
  88.  
  89.   }  
  90.  
  91. }  
  92.  

    第二步就是读写Flash的扇区数据,可以通过如下代码实现:

bool ret = engine.ReadMemory(addr, buflen, out bytData);

bool ret = engine.WriteMemory(addr, FileIndex.GetBytes(), 0, (int)FileIndex.HeadSize);

    但是仅仅实现以上两步还不行,因为TinyCLR代码会限制一些Flash的读写范围,所以我们还得需要修改TinyCLR的代码。

在\CLR\Debugger目录下的Debugger.cpp文件有一个函数CheckPermission,我们修改一下它的代码,让它直接返回true就可以了,这样我们就可以对Flash任何区都可以读写了。


 
 
  1. bool CLR_DBG_Debugger::CheckPermission( ByteAddress address, int mode )  
  2.  
  3. {  
  4.  
  5.     NATIVE_PROFILE_CLR_DEBUGGER();  
  6.  
  7.     bool   hasPermission = false;  
  8.  
  9.     UINT32 regionIndex, rangeIndex;  
  10.  
  11.    
  12.  
  13.     m_deploymentStorageDevice->FindRegionFromAddress( address, regionIndex, rangeIndex );  
  14.  
  15.     const BlockRange& range = m_deploymentStorageDevice->GetDeviceInfo()->Regions[ regionIndex ].BlockRanges[ rangeIndex ];  
  16.  
  17.    
  18.  
  19.     return true;  
  20.  
  21.     /*  
  22.  
  23.     switch(mode)  
  24.  
  25.     {  
  26.  
  27.         case AccessMemory_Check:  
  28.  
  29.             hasPermission = true;  
  30.  
  31.             break;  
  32.  
  33.         case AccessMemory_Read:  
  34.  
  35.             switch(range.RangeType)  
  36.  
  37.             {  
  38.  
  39.                 case BlockRange::BLOCKTYPE_CONFIG:         // fall through  
  40.  
  41.                 case BlockRange::BLOCKTYPE_DIRTYBIT:       // fall through  
  42.  
  43.                 case BlockRange::BLOCKTYPE_DEPLOYMENT:     // fall through  
  44.  
  45.                 case BlockRange::BLOCKTYPE_FILESYSTEM:     // fall through  
  46.  
  47.                 case BlockRange::BLOCKTYPE_STORAGE_A:      // fall through  
  48.  
  49.                 case BlockRange::BLOCKTYPE_STORAGE_B:  
  50.  
  51.    
  52.  
  53.                     hasPermission = true;  
  54.  
  55.                     break;  
  56.  
  57.             }  
  58.  
  59.             break;  
  60.  
  61.         case AccessMemory_Write:  
  62.  
  63.             if(range.IsDeployment())  
  64.  
  65.             {  
  66.  
  67.                 hasPermission = true;  
  68.  
  69.             }  
  70.  
  71.             break;  
  72.  
  73.         case AccessMemory_Erase:  
  74.  
  75.             switch(range.RangeType)  
  76.  
  77.             {  
  78.  
  79.                 case BlockRange::BLOCKTYPE_DEPLOYMENT:   // fall through  
  80.  
  81.                 case BlockRange::BLOCKTYPE_FILESYSTEM:   // fall through  
  82.  
  83.                 case BlockRange::BLOCKTYPE_STORAGE_A:    // fall through  
  84.  
  85.                 case BlockRange::BLOCKTYPE_STORAGE_B:  
  86.  
  87.                     hasPermission = true;  
  88.  
  89.                     break;  
  90.  
  91.             }  
  92.  
  93.             break;  
  94.  
  95.         default:  
  96.  
  97.             hasPermission = false;  
  98.  
  99.             break;  
  100.  
  101.     }  
  102.  
  103.    
  104.  
  105.     return hasPermission;*/  
  106.  
  107. }  
  108.  

     编译好插件,把它拷贝到MFDeploy.exe文件所在的子目录PlugIn,启动MFDeploy.exe程序,在Plug-in菜单下就会有我们的插件菜单。


      

 


      

 


这样就可以对Flash上的任何区都可以进行读写了。并且针对Deployment区,不仅可以下载.Net Micro Framework应用程序,也可以单击“Run”按钮,运行当前下载的程序(这样就不用重启TinyCLR了)。

针对File System区,我考虑实现一个类似VS2008远程工具“远程文件查看器”,这样PC就会更方便和.Net MF设备进行交互了。如果大家看过我以前写的《LCD驱动开发》,屏幕上显示的位图,就是通过该插件下载的。







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/321217,如需转载请自行联系原作者
相关文章
|
C# Windows 内存技术
一起谈.NET技术,将Flash 嵌入WPF 程序
由于WPF 本身中不支持COM 组件同时也无法加载ActiveX 控件,所以需要借助WinForm 引用ActiveX 控件将Flash 加入其中。首先创建一个WPF 项目(WpfFlash),将Flash 文件(.swf)加入到项目中,并将Copy to Output Directory 设置为"Copy always"。
972 0
|
XML 数据格式 内存技术
利用fluorineFx将DataTable从.Net传递到Flash
FluorineFx自带的示例都不错,就是有点不简洁,下面的代码基本上已经最简版了(环境vs2010)1、先创建一个Web Application,然后添加FluorineFx以及FluorineFx.
988 0
|
内存技术
[转载].Net和Flash如何进行数据交互
.Net和Flash如何进行数据交互 列出.Net和Flash如何进行数据交互的例子,希望对大家能有所帮助.C#的类声明:using System;using System.Collections.
736 0
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
54 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
46 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
120 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
189 0
|
6月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
78 0
下一篇
无影云桌面