【.Net MF新特性】Usb双接口支持

以前看USB协议2.0的时候,有个认识上的误区,认为所谓的复合设备,必须是两个物理上相独立的USB设备(两个USB Device,两个USB地址,只是在同一条USB总线而已)。最近在开发.Net Micro Framewok的USB双接口功能时,才明白复合设备原来也可以是这样实现!

对USB设备来说,至少会有一个USB配置,而这个配置可以包括一到多个接口,而一个接口又可以包括多个端点。对Windows平台来说,每一个接口在逻辑上对应一个虚拟设备,可以分别安装不同的驱动(视接口的配置来定,即使两个接口配置一样,也需要安装两次相同的驱动),但从表面上看和两个真实的物理USB设备没有什么不同。

1为什么要实现双接口
有在.Net Micro Framework调试SideShow经验的用户,就会有特别深的感触,因为SideShow通信是基于USB,而大部分.Net Micro Framework调试口也是基于USB,由于只有一个接口,所以PC端要么安装SideShow驱动,要么安装.Net Micro Frame USB设备驱动,二者不能共存(当然让两个驱动共存,也可以设置不同的PID和VID,但是这样就需要在.Net Micro Frame开发板上进行相应的配置了),别说在线调试了,光编译下载,就不知道要折腾好几回。

所以对只有一个USB Debug口的开发板,要调试USB相关例程是非常痛苦的。

而USB双接口的方案就是为解决该问题而生。同时有两个USB接口,即可以安装两个不同的驱动,也可以在线调试USB例程。这是多么一个令人神往的特性,尤为可喜的是这已经不仅仅是个意境,现如今已成为现实。目前我们已经测试通过的有:Debug+Mass Storage(U盘),Debug+HID(鼠标),Debug+Application(应用口)。当然也可以根据需要配置成三个、四个设置或多个你任意想要的接口。

 

【.Net MF新特性】Usb双接口支持

 

2 支持双接口,需要做些什么
 

 

【.Net MF新特性】Usb双接口支持

.Net Micro Framework USB接口模型

第一、   修改.Net Micro Framework的USB接口配置,把一个接口修改成两个接口;

第二、   修改.Net Micro Framework的USB接口驱动,以前仅支持端点1和端点2,目前增加对端点3和端点4的支持。逻辑上接口1包括端点1和端点2,接口2包括端点3和端点4;

第三、   修改PAL层接口,增加端点3和端点4的读写接口函数;

第四、   编写P/Invoke接口,让C#程序也可以读写端点3和端点4的数据(端点1和端点2默认供调试程序读写用);

第五、   修改.Net Micro Frame USB Windows驱动,让其支持双接口。(当然如果你的接口配置为HID或Mass Storage,那就不需要开发专门的驱动了);

第六、   剩下的就是测试再测试了。

3 一个双接口通信的例子
驱动程序等等安装完毕,准备停当之后,我们需要编写两部分程序来调试USB应用。一是普通Windows USB读写程序,这个程序我在以前写的Blog上已经介绍了(http://yfsoft.blog.51cto.com/1635641/321262)这里就不多说了;二是开发一个.Net Micro Frame USB Device应用程序,来响应Windows平台的USB读写程序。

我们的程序很简单,实现一个转发功能,也就是把Windows平台的USB程序发送的数据,原封不动的发送回去。代码如下:


  1. using System;  
  2.  
  3. using Microsoft.SPOT;  
  4.  
  5. using System.Threading;  
  6.  
  7. using Microsoft.SPOT.Hardware;  
  8.  
  9. namespace USBDeviceTest  
  10.  
  11. {  
  12.  
  13.     public class Program  
  14.  
  15.     {  
  16.  
  17.         public static void Main()  
  18.  
  19.         {  
  20.  
  21.             byte[] bytData=new byte[1024];  
  22.  
  23.             YFInterop.MFNative.Usb_Open(0);  
  24.  
  25.             while (true)  
  26.  
  27.             {  
  28.  
  29.                 int intSize=YFInterop.MFNative.Usb_Available();  
  30.  
  31.                 if (intSize > 0)  
  32.  
  33.                 {  
  34.  
  35.                     if (YFInterop.MFNative.Usb_Read(bytData, 0, intSize) == intSize)  
  36.  
  37.                     {  
  38.  
  39.                         string strData = intSize.ToString()+":";  
  40.  
  41.                         for (int i = 0; i < intSize; i++)  
  42.  
  43.                         {  
  44.  
  45.                             strData += bytData[i].ToString() + " ";  
  46.  
  47.                         }  
  48.  
  49.                         Debug.Print(strData);  
  50.  
  51.                         YFInterop.MFNative.Usb_Write(bytData, 0, intSize);  
  52.  
  53.                     }  
  54.  
  55.                 }  
  56.  
  57.                 Thread.Sleep(3);  
  58.  
  59.             }  
  60.  
  61.             YFInterop.MFNative.Usb_Close();  
  62.  
  63.         }  
  64.  
  65.     }  
  66.  
  67. }  
  68.  
  69.    
  70.  

 

【.Net MF新特性】Usb双接口支持

 

注:测试时,VS2008可以一直处在调试模式(可即时打印调试信息),此时USB Test程序同时完成数据收发。

 






本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/321252,如需转载请自行联系原作者

上一篇:实时定时操作代码片段个人记录org.quartz.Job


下一篇:使用 MEF 公开 Silverlight“.NET研究” MVVM 应用程序中的接口