USB Mouse (relative) example for mbed NXP LPC11U24 beta
Diff: HID_devices/USBMouseKeyboard.c
- Revision:
- 0:163560051396
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HID_devices/USBMouseKeyboard.c Mon Oct 24 10:26:27 2011 +0000 @@ -0,0 +1,133 @@ +/* Keyboard_RelMouse.c */ + +/* USB device example: Keyboard and a relative mouse */ +/* Copyright (c) 2011 ARM Limited. All rights reserved. */ + +#include "stdint.h" + +#include "USBMouseKeyboard.h" + +uint8_t * USBMouseKeyboard::ReportDesc() { + static uint8_t reportDescriptor[] = { + /* Keyboard */ + USAGE_PAGE(1), 0x01, + USAGE(1), 0x06, + COLLECTION(1), 0x01, + REPORT_ID(1), REPORT_ID_KEYBOARD, + USAGE_PAGE(1), 0x07, + USAGE_MINIMUM(1), 0xE0, + USAGE_MAXIMUM(1), 0xE7, + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(1), 0x01, + REPORT_SIZE(1), 0x01, + REPORT_COUNT(1), 0x08, + INPUT(1), 0x02, + REPORT_COUNT(1), 0x01, + REPORT_SIZE(1), 0x08, + INPUT(1), 0x01, + REPORT_COUNT(1), 0x05, + REPORT_SIZE(1), 0x01, + USAGE_PAGE(1), 0x08, + USAGE_MINIMUM(1), 0x01, + USAGE_MAXIMUM(1), 0x05, + OUTPUT(1), 0x02, + REPORT_COUNT(1), 0x01, + REPORT_SIZE(1), 0x03, + OUTPUT(1), 0x01, + REPORT_COUNT(1), 0x06, + REPORT_SIZE(1), 0x08, + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(2), 0xff, 0x00, + USAGE_PAGE(1), 0x07, + USAGE_MINIMUM(1), 0x00, + USAGE_MAXIMUM(2), 0xff, 0x00, + INPUT(1), 0x00, + END_COLLECTION(0), + + /* Mouse */ + USAGE_PAGE(1), 0x01, /* Generic Desktop */ + USAGE(1), 0x02, /* Mouse */ + COLLECTION(1), 0x01, /* Application*/ + USAGE(1), 0x01, /* Pointer */ + COLLECTION(1), 0x00, /* Physical */ + REPORT_ID(1), REPORT_ID_MOUSE, + REPORT_COUNT(1), 0x03, + REPORT_SIZE(1), 0x01, + USAGE_PAGE(1), 0x09, /* Buttons */ + USAGE_MINIMUM(1), 0x1, + USAGE_MAXIMUM(1), 0x3, + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(1), 0x01, + INPUT(1), 0x02, + REPORT_COUNT(1), 0x01, + REPORT_SIZE(1), 0x05, + INPUT(1), 0x01, + REPORT_COUNT(1), 0x03, + REPORT_SIZE(1), 0x08, + USAGE_PAGE(1), 0x01, + USAGE(1), 0x30, /* X */ + USAGE(1), 0x31, /* Y */ + USAGE(1), 0x38, /* scroll */ + LOGICAL_MINIMUM(1), 0x81, + LOGICAL_MAXIMUM(1), 0x7f, + INPUT(1), 0x06, + END_COLLECTION(0), + END_COLLECTION(0), + + + USAGE_PAGE(1), 0x0c, /* USAGE_PAGE (Consumer Devices) */ + USAGE(1), 0x01, /* USAGE (Consumer Control) */ + COLLECTION(1), 0x01, /* COLLECTION (Application) */ + REPORT_ID(1), REPORT_ID_VOLUME, + LOGICAL_MINIMUM(1), 0x00, /* LOGICAL_MINIMUM (0) */ + LOGICAL_MAXIMUM(1), 0x01, /* LOGICAL_MAXIMUM (1) */ + USAGE(1), 0xe9, /* Volume Up */ + USAGE(1), 0xea, /* Volume Down */ + REPORT_SIZE(1), 0x01, + REPORT_COUNT(1), 0x02, + INPUT(1), 0x06, /* INPUT (Data,Var,Rel) */ + USAGE(1), 0xe2, /* Mute */ + REPORT_COUNT(1), 0x01, /* REPORT_COUNT (1) */ + INPUT(1), 0x06, /* INPUT (Data,Var,Rel) */ + REPORT_COUNT(1), 0x05, /* REPORT_COUNT (5) */ + INPUT(1), 0x07, /* INPUT (Cnst,Var,Rel) */ + END_COLLECTION(0), /* END_COLLECTION */ + }; + reportLength = sizeof(reportDescriptor); + return reportDescriptor; +} + + +bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) { + while (x > 127) { + if (!mouseWrite(127, 0, button, z)) return false; + x = x - 127; + } + while (x < -128) { + if (!mouseWrite(-128, 0, button, z)) return false; + x = x + 128; + } + while (y > 127) { + if (!mouseWrite(0, 127, button, z)) return false; + y = y - 127; + } + while (y < -128) { + if (!mouseWrite(0, -128, button, z)) return false; + y = y + 128; + } + return mouseWrite(x, y, button, z); +} + +bool USBMouseKeyboard::mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z) { + HID_REPORT report; + + report.data[0] = REPORT_ID_MOUSE; + report.data[1] = buttons & 0x07; + report.data[2] = x; + report.data[3] = y; + report.data[4] = -z; /* >0 to scroll down, <0 to scroll up */ + + report.length = 5; + + return USBClass_HID_sendInputReport(EPINT_IN, &report); +}