Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBMouseKeyboard.c Source File

USBMouseKeyboard.c

00001 /* Keyboard_RelMouse.c */
00002 
00003 /* USB device example: Keyboard and a relative mouse */
00004 /* Copyright (c) 2011 ARM Limited. All rights reserved. */
00005 
00006 #include "stdint.h"
00007 
00008 #include "USBMouseKeyboard.h"
00009 
00010 uint8_t * USBMouseKeyboard::ReportDesc() {
00011     static uint8_t reportDescriptor[] = {
00012         /* Keyboard */
00013         USAGE_PAGE(1),      0x01,
00014         USAGE(1),           0x06,
00015         COLLECTION(1),      0x01,
00016         REPORT_ID(1),       REPORT_ID_KEYBOARD,
00017         USAGE_PAGE(1),      0x07,
00018         USAGE_MINIMUM(1),       0xE0,
00019         USAGE_MAXIMUM(1),       0xE7,
00020         LOGICAL_MINIMUM(1),     0x00,
00021         LOGICAL_MAXIMUM(1),     0x01,
00022         REPORT_SIZE(1),     0x01,
00023         REPORT_COUNT(1),    0x08,
00024         INPUT(1),           0x02,
00025         REPORT_COUNT(1),    0x01,
00026         REPORT_SIZE(1),     0x08,
00027         INPUT(1),           0x01,
00028         REPORT_COUNT(1),    0x05,
00029         REPORT_SIZE(1),     0x01,
00030         USAGE_PAGE(1),      0x08,
00031         USAGE_MINIMUM(1),       0x01,
00032         USAGE_MAXIMUM(1),       0x05,
00033         OUTPUT(1),          0x02,
00034         REPORT_COUNT(1),    0x01,
00035         REPORT_SIZE(1),     0x03,
00036         OUTPUT(1),          0x01,
00037         REPORT_COUNT(1),    0x06,
00038         REPORT_SIZE(1),     0x08,
00039         LOGICAL_MINIMUM(1),     0x00,
00040         LOGICAL_MAXIMUM(2),     0xff, 0x00,
00041         USAGE_PAGE(1),      0x07,
00042         USAGE_MINIMUM(1),       0x00,
00043         USAGE_MAXIMUM(2),       0xff, 0x00,
00044         INPUT(1),           0x00,
00045         END_COLLECTION(0),
00046 
00047         /* Mouse */
00048         USAGE_PAGE(1),      0x01,           /* Generic Desktop */
00049         USAGE(1),           0x02,           /* Mouse */
00050         COLLECTION(1),      0x01,           /* Application*/
00051         USAGE(1),           0x01,           /* Pointer */
00052         COLLECTION(1),      0x00,           /* Physical */
00053         REPORT_ID(1),       REPORT_ID_MOUSE,
00054         REPORT_COUNT(1),    0x03,
00055         REPORT_SIZE(1),     0x01,
00056         USAGE_PAGE(1),      0x09,           /* Buttons */
00057         USAGE_MINIMUM(1),       0x1,
00058         USAGE_MAXIMUM(1),       0x3,
00059         LOGICAL_MINIMUM(1),     0x00,
00060         LOGICAL_MAXIMUM(1),     0x01,
00061         INPUT(1),           0x02,
00062         REPORT_COUNT(1),    0x01,
00063         REPORT_SIZE(1),     0x05,
00064         INPUT(1),           0x01,
00065         REPORT_COUNT(1),    0x03,
00066         REPORT_SIZE(1),     0x08,
00067         USAGE_PAGE(1),      0x01,
00068         USAGE(1),           0x30,           /* X */
00069         USAGE(1),           0x31,           /* Y */
00070         USAGE(1),           0x38,           /* scroll */
00071         LOGICAL_MINIMUM(1),     0x81,
00072         LOGICAL_MAXIMUM(1),     0x7f,
00073         INPUT(1),           0x06,
00074         END_COLLECTION(0),
00075         END_COLLECTION(0),
00076 
00077 
00078         USAGE_PAGE(1), 0x0c,                        /* USAGE_PAGE (Consumer Devices) */
00079         USAGE(1), 0x01,                             /* USAGE (Consumer Control) */
00080         COLLECTION(1), 0x01,                        /* COLLECTION (Application) */
00081         REPORT_ID(1),       REPORT_ID_VOLUME,
00082         LOGICAL_MINIMUM(1), 0x00,                   /*   LOGICAL_MINIMUM (0) */
00083         LOGICAL_MAXIMUM(1), 0x01,                   /*   LOGICAL_MAXIMUM (1) */
00084         USAGE(1), 0xe9,                             /*   Volume Up */
00085         USAGE(1), 0xea,                             /*   Volume Down */
00086         REPORT_SIZE(1), 0x01,
00087         REPORT_COUNT(1), 0x02,
00088         INPUT(1), 0x06,                             /*   INPUT (Data,Var,Rel) */
00089         USAGE(1), 0xe2,                             /*   Mute */
00090         REPORT_COUNT(1), 0x01,                      /*   REPORT_COUNT (1) */
00091         INPUT(1), 0x06,                             /*   INPUT (Data,Var,Rel) */
00092         REPORT_COUNT(1), 0x05,                      /*   REPORT_COUNT (5) */
00093         INPUT(1), 0x07,                             /*   INPUT (Cnst,Var,Rel) */
00094         END_COLLECTION(0),                          /* END_COLLECTION */
00095     };
00096     reportLength = sizeof(reportDescriptor);
00097     return reportDescriptor;
00098 }
00099 
00100 
00101 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
00102     while (x > 127) {
00103         if (!mouseWrite(127, 0, button, z)) return false;
00104         x = x - 127;
00105     }
00106     while (x < -128) {
00107         if (!mouseWrite(-128, 0, button, z)) return false;
00108         x = x + 128;
00109     }
00110     while (y > 127) {
00111         if (!mouseWrite(0, 127, button, z)) return false;
00112         y = y - 127;
00113     }
00114     while (y < -128) {
00115         if (!mouseWrite(0, -128, button, z)) return false;
00116         y = y + 128;
00117     }
00118     return mouseWrite(x, y, button, z);
00119 }
00120 
00121 bool USBMouseKeyboard::mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
00122     HID_REPORT report;
00123 
00124     report.data[0] = REPORT_ID_MOUSE;
00125     report.data[1] = buttons & 0x07;
00126     report.data[2] = x;
00127     report.data[3] = y;
00128     report.data[4] = -z; /* >0 to scroll down, <0 to scroll up */
00129 
00130     report.length = 5;
00131 
00132     return USBClass_HID_sendInputReport(EPINT_IN, &report);
00133 }