【原理】
- usb mouse/hid device透過 packet 回傳給 os,告訴OS它的動作。
【封包】
- 範例一: 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 - 範例二: Razer/RZ01-005 Gaming Mouse(1532:0101)
由於像上面這樣去解析封包太麻煩了(每一款滑鼠的封包可能都不一樣)。所以就不寫了,改採hid方式。 - HID方式: (TBD)
【參考】
- 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); }
- USB Monitor/Win7底下可用
http://www.hhdsoftware.com/Products/home/usb-monitor.html - USB分析工具1 - SnoopyPro 和 usbmon(另一套usb 封包擷取軟體)
http://top.ampbb.net/search/label/開發工具