自製USB滑鼠

Oct 24, 2007 2 分鐘 579 字 #USB

希望本部落格能引發大家學習的熱情。


上一次一樣,今天還是拿EasyLogger來修改。

第一步當然還是使用HID descriptor tool把下面的表格自動轉換成程式碼,這部份大家應該已經很熟,所以就不再重覆了。要是不小心忘記了,回去看一下上次的自製USB HID搖桿就好了。網路可以查到的東西就不太需要背誦下來,讓大腦用在獨特的地方比較好。這句話的意思是說:大家一定要記得把這個部落格放進書籤

轉出來就是下面這樣的程式碼

PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { 
0x05, 0x01,        // USAGE_PAGE (Generic Desktop)
0x09, 0x02,        // USAGE (Mouse)
0xa1, 0x01,        // COLLECTION (Application)
0x09, 0x01,        //   USAGE (Pointer)
0xa1, 0x00,        //   COLLECTION (Physical)
0x05, 0x09,        //     USAGE_PAGE (Button)
0x19, 0x01,        //     USAGE_MINIMUM (Button 1)
0x29, 0x03,        //     USAGE_MAXIMUM (Button 3)
0x15, 0x00,        //     LOGICAL_MINIMUM (0)
0x25, 0x01,        //     LOGICAL_MAXIMUM (1)
0x95, 0x03,        //     REPORT_COUNT (3)
0x75, 0x01,        //     REPORT_SIZE (1)
0x81, 0x02,        //     INPUT (Data,Var,Abs)
0x95, 0x01,        //     REPORT_COUNT (1)
0x75, 0x05,        //     REPORT_SIZE (5)
0x81, 0x03,        //     INPUT (Cnst,Var,Abs)
0x05, 0x01,        //     USAGE_PAGE 
//     (Generic Desktop)
0x09, 0x30,        //     USAGE (X)
0x09, 0x31,        //     USAGE (Y)
0x15, 0x00,        //     LOGICAL_MINIMUM (0)
0x26, 0xff, 0x7f,  //     LOGICAL_MAXIMUM (32767)
0x75, 0x10,        //     REPORT_SIZE (16)
0x95, 0x02,        //     REPORT_COUNT (2)
0x81, 0x02,        //     INPUT (Data,Var,Abs)
0xc0,              //   END_COLLECTION
0xc0               // END_COLLECTION
};

上面這張表格的意思是我們向系統註冊了5 個byte大小的資料表來表示我們的滑鼠的資料,分別是按鍵狀態和X及Y的絕對座標。所以每當我們像下面這個程式片段傳5 個byte給PC時系統就會去對滑鼠游標做相對應的動作。

if (key & 1 << BIT_S)
    reportBuffer[0] = 0; 
else
    reportBuffer[0] = 1;    

if (keyBoth) {
    if (key & 1 << BIT_A ) {
    reportBuffer[1] = 0x32;
    reportBuffer[2] = 0x52;
    reportBuffer[3] = 0x3f;
    reportBuffer[4] = 0x10;
}else{
    reportBuffer[1] = 0x98;
    reportBuffer[2] = 0x50;
    reportBuffer[3] = 0x3f;
    reportBuffer[4] = 0x10;
}

今天的程式是平常在工作時使用USB示波器(如下圖),在移動觀察波形的時間軸時非常不方便,所以就做了今天這個小電路來取代滑鼠。這樣USB示波器用起來的感覺就跟真的示波器差不多了。

`