說明:本實例所使用的上位機程序開發工具為Visual C++6.0。
一、修改下位機固件程序
我們如果想實現一個USB的HID類設備,不需要在Windows下開發自己的驅動程序。HID不一定要是標准的外設類型,唯一的要求是交換的數據存儲在報文的結構內,設備固件必須支持報文的格式。任何工作在該限制之內的設備都可以成為一個HID,例如溫度計、電壓計、讀卡機等。
報文的格式是由報告描述符決定的,所以只要修改描述符就能實現我們需要的報文格式。下面我們來實現一個簡單的報文格式:上位機發送固定64字節數據給設備,這個數據可以是命令,也可是數據,具體含義並不是由報告描述符來決定的,是由開發人員事先約定好的。設備返回的數據也是64個字節,同樣這個數據流的每個字節(甚至每個位)的具體含義由開發人員事先約定好。
1、修改報告描述符
A、在Descriptor.C中找到以MouseReportDescriptor函數,將其內容修改如下:
- code char MouseReportDescriptor[29] = {
- 0x06,0x00,0xFF, //USAGE_PAGE (Vendor Defined Page 1)
- 0x09,0x01, //USAGE (Vendor Usage 1)
- 0xA1,0x01, //COLLECTION (Application)
- 0x19,0x01, //(Vendor Usage 1)
- 0x29,0x08, //(Vendor Usage 1)
- 0x15,0x00, //LOGICAL_MINIMUM (0)
- 0x26,0xFF,0x00, //LOGICAL_MAXIMUM (255)
- 0x75,0x08, //REPORT_SIZE (8)
- 0x95,0x40, //REPORT_COUNT (64)
- 0x81,0x02, //INPUT (Data,Var,Abs)
- 0x19,0x01, //(Vendor Usage 1)
- 0x29,0x08, //(Vendor Usage 1)
- 0x91,0x02, //OUTPUT (Data,Var,Abs)
- 0xC0 // END_COLLECTION
- };
此報告描述符定義了64個字節的輸入輸出數據。
B、將Descriptor.C中的如下代碼
- 0x66,0x03, //設備制造商定的產品ID
修改為
- 0x66,0x06, //設備制造商定的產品ID
C、在Descriptor.h中,將以下代碼
- extern code char MouseReportDescriptor[52];
修改為
- extern code char MouseReportDescriptor[29];
D、在Main.C中找到以下代碼
- if(bEPPflags.bits.configuration)
- {
- //在這里添加端點操作代碼
- }
將其修改為
- if(bEPPflags.bits.configuration)
- {
- //在這里添加端點操作代碼
- if(bEPPflags.bits.ep2_rxdone ) //主端點接收到數據(從主機發往設備的數據)
- {
- bEPPflags.bits.ep2_rxdone = 0;
- D12_WriteEndpoint(5,EP2_PACKET_SIZE,EpBuf); //立即將收到的64個字節發送到PC機
- }
- }
這一步的作用是立即將接到的數據返回給主機。函數D12_WriteEndpoint的定義位於D12CI.C中。
2、測試
我們可以利用一些USB調試軟件在自己沒有編寫上位機程序的情況下先進行一些測試。這里我們要用到的工具是BUS HOUND。
A、首先將第1步修改好的程序燒錄到主控芯片中並將硬件插入電腦,然后打開BUS HOUND,點“Settings”按鈕切換到設置頁,將“Max Phase”的值設為64並點“Apply”按鈕,這樣BUS HOUND才能監控最多64個字節的數據流。
B、點“Devices”按鈕切換到Devices頁,選定我們剛插入的硬件(一定要選緊臨“USB Root Hub”的下一級設備)。
C、點“Send Commands”按鈕,出現如下畫面
D、選中“Endpoint”為2,“Direction”為Out的那項,“Data Length”填64,發送的數據隨便填上一些數據,最后點擊“Run”按鈕
E、切換到BUS HOUND主界面,點“Capture”按鈕切換到監控頁面,如下圖所示,BUS HOUND捕捉到了一些數據。其中“Phase”列中的“DO”代表主機發往設備的數據,而“DI”代表設備發往主機的數據。我們看到設備返回的數據正好和主機發送的數據一樣,證明我們的下位機程序已經修改成功。