【Mouse】USB Mouse Packet


【原理】

  • usb mouse/hid device透過 packet 回傳給 os,告訴OS它的動作。

【封包】

  1. 範例一: Logitech/M-UV83(046D:C016)
    按鍵按下去彈起來除了下面的封包還會有一個 00xN(個,N同收到的封包長度) 的封包,以下省略。
    非 HID 的作法,基本上封包長度為 4 個。
    * 左鍵 01 00 00 00
    * 右鍵 02 00 00 00
    * 中鍵 04 00 00 00
    * 上移 00 00 FF 00
    * 下移 00 00 01 00
    * 左移 00 FF 00 00
    * 右移 00 01 00 00
  2. 範例二: Razer/RZ01-005 Gaming Mouse(1532:0101)
    由於像上面這樣去解析封包太麻煩了(每一款滑鼠的封包可能都不一樣)。所以就不寫了,改採hid方式。
  3. HID方式: (TBD)

【參考】

  1. Linux上面的作法,透過input_report_key(還要再研究)
    http://lxr.linux.no/#linux+v2.6.32/drivers/hid/usbhid/usbmouse.c
    static void usb_mouse_irq(struct urb *urb)
    {
            struct usb_mouse *mouse = urb->context;
            signed char *data = mouse->data;
            struct input_dev *dev = mouse->dev;
            int status;
    
            switch (urb->status) {
            case 0:                 /* success */
                    break;
            case -ECONNRESET:       /* unlink */
            case -ENOENT:
            case -ESHUTDOWN:
                    return;
            /* -EPIPE:  should clear the halt */
            default:                /* error */
                    goto resubmit;
            }
    
            input_report_key(dev, BTN_LEFT,   data[0] & 0x01);
            input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);
            input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);
            input_report_key(dev, BTN_SIDE,   data[0] & 0x08);
            input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);
    
            input_report_rel(dev, REL_X,     data[1]);
            input_report_rel(dev, REL_Y,     data[2]);
            input_report_rel(dev, REL_WHEEL, data[3]);
    
            input_sync(dev);
    resubmit:
            status = usb_submit_urb (urb, GFP_ATOMIC);
            if (status)
                    err ("can't resubmit intr, %s-%s/input0, status %d",
                                    mouse->usbdev->bus->bus_name,
                                    mouse->usbdev->devpath, status);
    }
  2. USB Monitor/Win7底下可用
    http://www.hhdsoftware.com/Products/home/usb-monitor.html 
  3. USB分析工具1 - SnoopyPro 和 usbmon(另一套usb 封包擷取軟體)
    http://top.ampbb.net/search/label/開發工具
     
 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com