以前看USB協議2.0的時候,有個認識上的誤區,認為所謂的復合設備,必須是兩個物理上相獨立的USB設備(兩個USB Device,兩個USB地址,只是在同一條USB總線而已)。最近在開發.Net Micro Framewok的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(應用口)。當然也可以根據需要配置成三個、四個設置或多個你任意想要的接口。
2 支持雙接口,需要做些什麼
.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://blog.csdn.net/yefanqiu/archive/2009/01/21/3849067.aspx)這裡就不多說了;二是開發一個.Net Micro Frame USB Device應用程序,來響應Windows平台的USB讀寫程序。
我們的程序很簡單,實現一個轉發功能,也就是把Windows平台的USB程序發送的數據,原封不動的發送回去。代碼如下:
1 using System;
2 using Microsoft.SPOT;
3 using System.Threading;
4 using Microsoft.SPOT.Hardware;
5 namespace USBDeviceTest
6 {
7 public class Program
8 {
9 public static void Main()
10 {
11 byte[] bytData=new byte[1024];
12 YFInterop.MFNative.Usb_Open(0);
13 while (true)
14 {
15 int intSize=YFInterop.MFNative.Usb_Available();
16 if (intSize > 0)
17 {
18 if (YFInterop.MFNative.Usb_Read(bytData, 0, intSize) == intSize)
19 {
20 string strData = intSize.ToString()+":";
21 for (int i = 0; i < intSize; i++)
22 {
23 strData += bytData[i].ToString() + " ";
24 }
25 Debug.Print(strData);
26 YFInterop.MFNative.Usb_Write(bytData, 0, intSize);
27 }
28 }
29 Thread.Sleep(3);
30 }
31 YFInterop.MFNative.Usb_Close();
32 }
33 }
34 }
35
注:測試時,VS2008可以一直處在調試模式(可即時打印調試信息),此時USB Test程序同時完成數據收發。