kekw

Dependencies:   mbed C12832_lcd MMA7660

Committer:
gri
Date:
Sun Jan 19 14:57:41 2020 +0000
Revision:
2:b07d155d316c
KEKw

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gri 2:b07d155d316c 1 /* usbhid.cpp */
gri 2:b07d155d316c 2 /* USB HID class device */
gri 2:b07d155d316c 3 /* Copyright (c) Phil Wright 2008 */
gri 2:b07d155d316c 4
gri 2:b07d155d316c 5 #include "mbed.h"
gri 2:b07d155d316c 6 #include "usbhid.h"
gri 2:b07d155d316c 7 #include "asciihid.h"
gri 2:b07d155d316c 8
gri 2:b07d155d316c 9 /* Endpoint packet sizes */
gri 2:b07d155d316c 10 #define MAX_PACKET_SIZE_EP1 (64)
gri 2:b07d155d316c 11
gri 2:b07d155d316c 12 /* HID Class */
gri 2:b07d155d316c 13 #define HID_CLASS (3)
gri 2:b07d155d316c 14 #define HID_SUBCLASS_NONE (0)
gri 2:b07d155d316c 15 #define HID_PROTOCOL_NONE (0)
gri 2:b07d155d316c 16 #define HID_DESCRIPTOR (33)
gri 2:b07d155d316c 17 #define REPORT_DESCRIPTOR (34)
gri 2:b07d155d316c 18
gri 2:b07d155d316c 19 /* Class requests */
gri 2:b07d155d316c 20 #define GET_REPORT (0x1)
gri 2:b07d155d316c 21 #define GET_IDLE (0x2)
gri 2:b07d155d316c 22 #define SET_REPORT (0x9)
gri 2:b07d155d316c 23 #define SET_IDLE (0xa)
gri 2:b07d155d316c 24
gri 2:b07d155d316c 25 /* Descriptors */
gri 2:b07d155d316c 26 unsigned char deviceDescriptor[] = {
gri 2:b07d155d316c 27 0x12, /* bLength */
gri 2:b07d155d316c 28 DEVICE_DESCRIPTOR, /* bDescriptorType */
gri 2:b07d155d316c 29 0x00, /* bcdUSB (LSB) */
gri 2:b07d155d316c 30 0x02, /* bcdUSB (MSB) */
gri 2:b07d155d316c 31 0x00, /* bDeviceClass */
gri 2:b07d155d316c 32 0x00, /* bDeviceSubClass */
gri 2:b07d155d316c 33 0x00, /* bDeviceprotocol */
gri 2:b07d155d316c 34 MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */
gri 2:b07d155d316c 35 0x28, /* idVendor (LSB) */
gri 2:b07d155d316c 36 0x0d, /* idVendor (MSB) */
gri 2:b07d155d316c 37 0x05, /* idProduct (LSB) */
gri 2:b07d155d316c 38 0x02, /* idProduct (MSB) */
gri 2:b07d155d316c 39 0x00, /* bcdDevice (LSB) */
gri 2:b07d155d316c 40 0x00, /* bcdDevice (MSB) */
gri 2:b07d155d316c 41 0x00, /* iManufacturer */
gri 2:b07d155d316c 42 0x00, /* iProduct */
gri 2:b07d155d316c 43 0x00, /* iSerialNumber */
gri 2:b07d155d316c 44 0x01 /* bNumConfigurations */
gri 2:b07d155d316c 45 };
gri 2:b07d155d316c 46
gri 2:b07d155d316c 47 unsigned char configurationDescriptor[] = {
gri 2:b07d155d316c 48 0x09, /* bLength */
gri 2:b07d155d316c 49 CONFIGURATION_DESCRIPTOR, /* bDescriptorType */
gri 2:b07d155d316c 50 0x09+0x09+0x09+0x07, /* wTotalLength (LSB) */
gri 2:b07d155d316c 51 0x00, /* wTotalLength (MSB) */
gri 2:b07d155d316c 52 0x01, /* bNumInterfaces */
gri 2:b07d155d316c 53 0x01, /* bConfigurationValue */
gri 2:b07d155d316c 54 0x00, /* iConfiguration */
gri 2:b07d155d316c 55 0xc0, /* bmAttributes */
gri 2:b07d155d316c 56 0x00, /* bMaxPower */
gri 2:b07d155d316c 57
gri 2:b07d155d316c 58 0x09, /* bLength */
gri 2:b07d155d316c 59 INTERFACE_DESCRIPTOR, /* bDescriptorType */
gri 2:b07d155d316c 60 0x00, /* bInterfaceNumber */
gri 2:b07d155d316c 61 0x00, /* bAlternateSetting */
gri 2:b07d155d316c 62 0x01, /* bNumEndpoints */
gri 2:b07d155d316c 63 HID_CLASS, /* bInterfaceClass */
gri 2:b07d155d316c 64 HID_SUBCLASS_NONE, /* bInterfaceSubClass */
gri 2:b07d155d316c 65 HID_PROTOCOL_NONE, /* bInterfaceProtocol */
gri 2:b07d155d316c 66 0x00, /* iInterface */
gri 2:b07d155d316c 67
gri 2:b07d155d316c 68 0x09, /* bLength */
gri 2:b07d155d316c 69 HID_DESCRIPTOR, /* bDescriptorType */
gri 2:b07d155d316c 70 0x11, /* bcdHID (LSB) */
gri 2:b07d155d316c 71 0x01, /* bcdHID (MSB) */
gri 2:b07d155d316c 72 0x00, /* bCountryCode */
gri 2:b07d155d316c 73 0x01, /* bNumDescriptors */
gri 2:b07d155d316c 74 REPORT_DESCRIPTOR, /* bDescriptorType */
gri 2:b07d155d316c 75 0x79, /* wDescriptorLength (LSB) */
gri 2:b07d155d316c 76 0x00, /* wDescriptorLength (MSB) */
gri 2:b07d155d316c 77
gri 2:b07d155d316c 78 0x07, /* bLength */
gri 2:b07d155d316c 79 ENDPOINT_DESCRIPTOR, /* bDescriptorType */
gri 2:b07d155d316c 80 0x81, /* bEndpointAddress */
gri 2:b07d155d316c 81 0x03, /* bmAttributes */
gri 2:b07d155d316c 82 MAX_PACKET_SIZE_EP1, /* wMaxPacketSize (LSB) */
gri 2:b07d155d316c 83 0x00, /* wMaxPacketSize (MSB) */
gri 2:b07d155d316c 84 0x0a, /* bInterval */
gri 2:b07d155d316c 85 };
gri 2:b07d155d316c 86
gri 2:b07d155d316c 87 /* HID Class Report Descriptor */
gri 2:b07d155d316c 88 /* Short items: size is 0, 1, 2 or 3 specifying 0, 1, 2 or 4 (four) bytes of data as per HID Class standard */
gri 2:b07d155d316c 89
gri 2:b07d155d316c 90 /* Main items */
gri 2:b07d155d316c 91 #define INPUT(size) (0x80 | size)
gri 2:b07d155d316c 92 #define OUTPUT(size) (0x90 | size)
gri 2:b07d155d316c 93 #define FEATURE(size) (0xb0 | size)
gri 2:b07d155d316c 94 #define COLLECTION(size) (0xa0 | size)
gri 2:b07d155d316c 95 #define END_COLLECTION(size) (0xc0 | size)
gri 2:b07d155d316c 96
gri 2:b07d155d316c 97 /* Global items */
gri 2:b07d155d316c 98 #define USAGE_PAGE(size) (0x04 | size)
gri 2:b07d155d316c 99 #define LOGICAL_MIN(size) (0x14 | size)
gri 2:b07d155d316c 100 #define LOGICAL_MAX(size) (0x24 | size)
gri 2:b07d155d316c 101 #define PHYSICAL_MIN(size) (0x34 | size)
gri 2:b07d155d316c 102 #define PHYSICAL_MAX(size) (0x44 | size)
gri 2:b07d155d316c 103 #define UNIT_EXPONENT(size) (0x54 | size)
gri 2:b07d155d316c 104 #define UNIT(size) (0x64 | size)
gri 2:b07d155d316c 105 #define REPORT_SIZE(size) (0x74 | size)
gri 2:b07d155d316c 106 #define REPORT_ID(size) (0x84 | size)
gri 2:b07d155d316c 107 #define REPORT_COUNT(size) (0x94 | size)
gri 2:b07d155d316c 108 #define PUSH(size) (0xa4 | size)
gri 2:b07d155d316c 109 #define POP(size) (0xb4 | size)
gri 2:b07d155d316c 110
gri 2:b07d155d316c 111 /* Local items */
gri 2:b07d155d316c 112 #define USAGE(size) (0x08 | size)
gri 2:b07d155d316c 113 #define USAGE_MIN(size) (0x18 | size)
gri 2:b07d155d316c 114 #define USAGE_MAX(size) (0x28 | size)
gri 2:b07d155d316c 115 #define DESIGNATOR_INDEX(size) (0x38 | size)
gri 2:b07d155d316c 116 #define DESIGNATOR_MIN(size) (0x48 | size)
gri 2:b07d155d316c 117 #define DESIGNATOR_MAX(size) (0x58 | size)
gri 2:b07d155d316c 118 #define STRING_INDEX(size) (0x78 | size)
gri 2:b07d155d316c 119 #define STRING_MIN(size) (0x88 | size)
gri 2:b07d155d316c 120 #define STRING_MAX(size) (0x98 | size)
gri 2:b07d155d316c 121 #define DELIMITER(size) (0xa8 | size)
gri 2:b07d155d316c 122
gri 2:b07d155d316c 123 #define REPORT_ID_KEYBOARD (1)
gri 2:b07d155d316c 124 #define REPORT_ID_MOUSE (2)
gri 2:b07d155d316c 125
gri 2:b07d155d316c 126 #define MAX_REPORT_SIZE (8)
gri 2:b07d155d316c 127
gri 2:b07d155d316c 128 unsigned char reportDescriptor[] = {
gri 2:b07d155d316c 129 /* Keyboard */
gri 2:b07d155d316c 130 USAGE_PAGE(1), 0x01,
gri 2:b07d155d316c 131 USAGE(1), 0x06,
gri 2:b07d155d316c 132 COLLECTION(1), 0x01,
gri 2:b07d155d316c 133 REPORT_ID(1), REPORT_ID_KEYBOARD,
gri 2:b07d155d316c 134 USAGE_PAGE(1), 0x07,
gri 2:b07d155d316c 135 USAGE_MIN(1), 0xE0,
gri 2:b07d155d316c 136 USAGE_MAX(1), 0xE7,
gri 2:b07d155d316c 137 LOGICAL_MIN(1), 0x00,
gri 2:b07d155d316c 138 LOGICAL_MAX(1), 0x01,
gri 2:b07d155d316c 139 REPORT_SIZE(1), 0x01,
gri 2:b07d155d316c 140 REPORT_COUNT(1), 0x08,
gri 2:b07d155d316c 141 INPUT(1), 0x02,
gri 2:b07d155d316c 142 REPORT_COUNT(1), 0x01,
gri 2:b07d155d316c 143 REPORT_SIZE(1), 0x08,
gri 2:b07d155d316c 144 INPUT(1), 0x01,
gri 2:b07d155d316c 145 REPORT_COUNT(1), 0x05,
gri 2:b07d155d316c 146 REPORT_SIZE(1), 0x01,
gri 2:b07d155d316c 147 USAGE_PAGE(1), 0x08,
gri 2:b07d155d316c 148 USAGE_MIN(1), 0x01,
gri 2:b07d155d316c 149 USAGE_MAX(1), 0x05,
gri 2:b07d155d316c 150 OUTPUT(1), 0x02,
gri 2:b07d155d316c 151 REPORT_COUNT(1), 0x01,
gri 2:b07d155d316c 152 REPORT_SIZE(1), 0x03,
gri 2:b07d155d316c 153 OUTPUT(1), 0x01,
gri 2:b07d155d316c 154 REPORT_COUNT(1), 0x06,
gri 2:b07d155d316c 155 REPORT_SIZE(1), 0x08,
gri 2:b07d155d316c 156 LOGICAL_MIN(1), 0x00,
gri 2:b07d155d316c 157 LOGICAL_MAX(2), 0xff, 0x00,
gri 2:b07d155d316c 158 USAGE_PAGE(1), 0x07,
gri 2:b07d155d316c 159 USAGE_MIN(1), 0x00,
gri 2:b07d155d316c 160 USAGE_MAX(2), 0xff, 0x00,
gri 2:b07d155d316c 161 INPUT(1), 0x00,
gri 2:b07d155d316c 162 END_COLLECTION(0),
gri 2:b07d155d316c 163
gri 2:b07d155d316c 164 /* Mouse */
gri 2:b07d155d316c 165 USAGE_PAGE(1), 0x01,
gri 2:b07d155d316c 166 USAGE(1), 0x02,
gri 2:b07d155d316c 167 COLLECTION(1), 0x01,
gri 2:b07d155d316c 168 USAGE(1), 0x01,
gri 2:b07d155d316c 169 COLLECTION(1), 0x00,
gri 2:b07d155d316c 170 REPORT_ID(1), REPORT_ID_MOUSE,
gri 2:b07d155d316c 171 REPORT_COUNT(1), 0x03,
gri 2:b07d155d316c 172 REPORT_SIZE(1), 0x01,
gri 2:b07d155d316c 173 USAGE_PAGE(1), 0x09,
gri 2:b07d155d316c 174 USAGE_MIN(1), 0x1,
gri 2:b07d155d316c 175 USAGE_MAX(1), 0x3,
gri 2:b07d155d316c 176 LOGICAL_MIN(1), 0x00,
gri 2:b07d155d316c 177 LOGICAL_MAX(1), 0x01,
gri 2:b07d155d316c 178 INPUT(1), 0x02,
gri 2:b07d155d316c 179 REPORT_COUNT(1), 0x01,
gri 2:b07d155d316c 180 REPORT_SIZE(1), 0x05,
gri 2:b07d155d316c 181 INPUT(1), 0x01,
gri 2:b07d155d316c 182 REPORT_COUNT(1), 0x03,
gri 2:b07d155d316c 183 REPORT_SIZE(1), 0x08,
gri 2:b07d155d316c 184 USAGE_PAGE(1), 0x01,
gri 2:b07d155d316c 185 USAGE(1), 0x30,
gri 2:b07d155d316c 186 USAGE(1), 0x31,
gri 2:b07d155d316c 187 USAGE(1), 0x38,
gri 2:b07d155d316c 188 LOGICAL_MIN(1), 0x81,
gri 2:b07d155d316c 189 LOGICAL_MAX(1), 0x7f,
gri 2:b07d155d316c 190 INPUT(1), 0x06,
gri 2:b07d155d316c 191 END_COLLECTION(0),
gri 2:b07d155d316c 192 END_COLLECTION(0),
gri 2:b07d155d316c 193 };
gri 2:b07d155d316c 194
gri 2:b07d155d316c 195 volatile bool complete;
gri 2:b07d155d316c 196 volatile bool configured;
gri 2:b07d155d316c 197 unsigned char outputReport[MAX_REPORT_SIZE];
gri 2:b07d155d316c 198
gri 2:b07d155d316c 199 usbhid::usbhid()
gri 2:b07d155d316c 200 {
gri 2:b07d155d316c 201 configured = false;
gri 2:b07d155d316c 202 connect();
gri 2:b07d155d316c 203 }
gri 2:b07d155d316c 204
gri 2:b07d155d316c 205 void usbhid::deviceEventReset()
gri 2:b07d155d316c 206 {
gri 2:b07d155d316c 207 configured = false;
gri 2:b07d155d316c 208
gri 2:b07d155d316c 209 /* Must call base class */
gri 2:b07d155d316c 210 usbdevice::deviceEventReset();
gri 2:b07d155d316c 211 }
gri 2:b07d155d316c 212
gri 2:b07d155d316c 213 bool usbhid::requestSetConfiguration(void)
gri 2:b07d155d316c 214 {
gri 2:b07d155d316c 215 bool result;
gri 2:b07d155d316c 216
gri 2:b07d155d316c 217 /* Configure IN interrupt endpoint */
gri 2:b07d155d316c 218 realiseEndpoint(EP1IN, MAX_PACKET_SIZE_EP1);
gri 2:b07d155d316c 219 enableEndpointEvent(EP1IN);
gri 2:b07d155d316c 220
gri 2:b07d155d316c 221 /* Must call base class */
gri 2:b07d155d316c 222 result = usbdevice::requestSetConfiguration();
gri 2:b07d155d316c 223
gri 2:b07d155d316c 224 if (result)
gri 2:b07d155d316c 225 {
gri 2:b07d155d316c 226 /* Now configured */
gri 2:b07d155d316c 227 configured = true;
gri 2:b07d155d316c 228 }
gri 2:b07d155d316c 229
gri 2:b07d155d316c 230 return result;
gri 2:b07d155d316c 231 }
gri 2:b07d155d316c 232
gri 2:b07d155d316c 233 bool usbhid::requestGetDescriptor(void)
gri 2:b07d155d316c 234 {
gri 2:b07d155d316c 235 bool success = false;
gri 2:b07d155d316c 236
gri 2:b07d155d316c 237 switch (DESCRIPTOR_TYPE(transfer.setup.wValue))
gri 2:b07d155d316c 238 {
gri 2:b07d155d316c 239 case DEVICE_DESCRIPTOR:
gri 2:b07d155d316c 240 transfer.remaining = sizeof(deviceDescriptor);
gri 2:b07d155d316c 241 transfer.ptr = deviceDescriptor;
gri 2:b07d155d316c 242 transfer.direction = DEVICE_TO_HOST;
gri 2:b07d155d316c 243 success = true;
gri 2:b07d155d316c 244 break;
gri 2:b07d155d316c 245 case CONFIGURATION_DESCRIPTOR:
gri 2:b07d155d316c 246 transfer.remaining = sizeof(configurationDescriptor);
gri 2:b07d155d316c 247 transfer.ptr = configurationDescriptor;
gri 2:b07d155d316c 248 transfer.direction = DEVICE_TO_HOST;
gri 2:b07d155d316c 249 success = true;
gri 2:b07d155d316c 250 break;
gri 2:b07d155d316c 251 case STRING_DESCRIPTOR:
gri 2:b07d155d316c 252 case INTERFACE_DESCRIPTOR:
gri 2:b07d155d316c 253 case ENDPOINT_DESCRIPTOR:
gri 2:b07d155d316c 254 /* TODO: Support is optional, not implemented here */
gri 2:b07d155d316c 255 break;
gri 2:b07d155d316c 256 case HID_DESCRIPTOR:
gri 2:b07d155d316c 257 transfer.remaining = 0x09; /* TODO: Fix hard coded size/offset */
gri 2:b07d155d316c 258 transfer.ptr = &configurationDescriptor[18];
gri 2:b07d155d316c 259 transfer.direction = DEVICE_TO_HOST;
gri 2:b07d155d316c 260 success = true;
gri 2:b07d155d316c 261 break;
gri 2:b07d155d316c 262 case REPORT_DESCRIPTOR:
gri 2:b07d155d316c 263 transfer.remaining = sizeof(reportDescriptor);
gri 2:b07d155d316c 264 transfer.ptr = reportDescriptor;
gri 2:b07d155d316c 265 transfer.direction = DEVICE_TO_HOST;
gri 2:b07d155d316c 266 success = true;
gri 2:b07d155d316c 267 break;
gri 2:b07d155d316c 268 default:
gri 2:b07d155d316c 269 break;
gri 2:b07d155d316c 270 }
gri 2:b07d155d316c 271
gri 2:b07d155d316c 272 return success;
gri 2:b07d155d316c 273 }
gri 2:b07d155d316c 274
gri 2:b07d155d316c 275 bool usbhid::requestSetup(void)
gri 2:b07d155d316c 276 {
gri 2:b07d155d316c 277 /* Process class requests */
gri 2:b07d155d316c 278 bool success = false;
gri 2:b07d155d316c 279
gri 2:b07d155d316c 280 if (transfer.setup.bmRequestType.Type == CLASS_TYPE)
gri 2:b07d155d316c 281 {
gri 2:b07d155d316c 282 switch (transfer.setup.bRequest)
gri 2:b07d155d316c 283 {
gri 2:b07d155d316c 284 case SET_REPORT:
gri 2:b07d155d316c 285 switch (transfer.setup.wValue & 0xff)
gri 2:b07d155d316c 286 {
gri 2:b07d155d316c 287 case REPORT_ID_KEYBOARD:
gri 2:b07d155d316c 288 /* TODO: LED state */
gri 2:b07d155d316c 289 transfer.remaining = sizeof(outputReport);
gri 2:b07d155d316c 290 transfer.ptr = outputReport;
gri 2:b07d155d316c 291 transfer.direction = HOST_TO_DEVICE;
gri 2:b07d155d316c 292 success = true;
gri 2:b07d155d316c 293 break;
gri 2:b07d155d316c 294 default:
gri 2:b07d155d316c 295 break;
gri 2:b07d155d316c 296 }
gri 2:b07d155d316c 297 break;
gri 2:b07d155d316c 298 default:
gri 2:b07d155d316c 299 break;
gri 2:b07d155d316c 300 }
gri 2:b07d155d316c 301 }
gri 2:b07d155d316c 302
gri 2:b07d155d316c 303 if (success)
gri 2:b07d155d316c 304 {
gri 2:b07d155d316c 305 /* We've handled this request */
gri 2:b07d155d316c 306 return true;
gri 2:b07d155d316c 307 }
gri 2:b07d155d316c 308
gri 2:b07d155d316c 309 return usbdevice::requestSetup();
gri 2:b07d155d316c 310 }
gri 2:b07d155d316c 311
gri 2:b07d155d316c 312 bool usbhid::sendInputReport(unsigned char id, unsigned char *data, unsigned char size)
gri 2:b07d155d316c 313 {
gri 2:b07d155d316c 314 /* Send an Input Report */
gri 2:b07d155d316c 315 /* If data is NULL an all zero report is sent */
gri 2:b07d155d316c 316
gri 2:b07d155d316c 317 static unsigned char report[MAX_REPORT_SIZE+1]; /* +1 for report ID */
gri 2:b07d155d316c 318 unsigned char i;
gri 2:b07d155d316c 319
gri 2:b07d155d316c 320 if (size > MAX_REPORT_SIZE)
gri 2:b07d155d316c 321 {
gri 2:b07d155d316c 322 return false;
gri 2:b07d155d316c 323 }
gri 2:b07d155d316c 324
gri 2:b07d155d316c 325 /* Add report ID */
gri 2:b07d155d316c 326 report[0]=id;
gri 2:b07d155d316c 327
gri 2:b07d155d316c 328 /* Add report data */
gri 2:b07d155d316c 329 if (data != NULL)
gri 2:b07d155d316c 330 {
gri 2:b07d155d316c 331 for (i=0; i<size; i++)
gri 2:b07d155d316c 332 {
gri 2:b07d155d316c 333 report[i+1] = *data++;
gri 2:b07d155d316c 334 }
gri 2:b07d155d316c 335 }
gri 2:b07d155d316c 336 else
gri 2:b07d155d316c 337 {
gri 2:b07d155d316c 338 for (i=0; i<size; i++)
gri 2:b07d155d316c 339 {
gri 2:b07d155d316c 340 report[i+1] = 0;
gri 2:b07d155d316c 341 }
gri 2:b07d155d316c 342 }
gri 2:b07d155d316c 343
gri 2:b07d155d316c 344 /* Block if not configured */
gri 2:b07d155d316c 345 while (!configured);
gri 2:b07d155d316c 346
gri 2:b07d155d316c 347 /* Send report */
gri 2:b07d155d316c 348 complete = false;
gri 2:b07d155d316c 349 disableEvents();
gri 2:b07d155d316c 350 endpointWrite(EP1IN, report, size+1); /* +1 for report ID */
gri 2:b07d155d316c 351 enableEvents();
gri 2:b07d155d316c 352
gri 2:b07d155d316c 353 /* Wait for completion */
gri 2:b07d155d316c 354 while(!complete && configured);
gri 2:b07d155d316c 355 return true;
gri 2:b07d155d316c 356 }
gri 2:b07d155d316c 357
gri 2:b07d155d316c 358 void usbhid::endpointEventEP1In(void)
gri 2:b07d155d316c 359 {
gri 2:b07d155d316c 360 complete = true;
gri 2:b07d155d316c 361 }
gri 2:b07d155d316c 362
gri 2:b07d155d316c 363 bool usbhid::keyboard(char c)
gri 2:b07d155d316c 364 {
gri 2:b07d155d316c 365 /* Send a simulated keyboard keypress. Returns true if successful. */
gri 2:b07d155d316c 366 unsigned char report[8]={0,0,0,0,0,0,0,0};
gri 2:b07d155d316c 367
gri 2:b07d155d316c 368 report[0] = keymap[c].modifier;
gri 2:b07d155d316c 369 report[2] = keymap[c].usage;
gri 2:b07d155d316c 370
gri 2:b07d155d316c 371 /* Key down */
gri 2:b07d155d316c 372 if (!sendInputReport(REPORT_ID_KEYBOARD, report, 8))
gri 2:b07d155d316c 373 {
gri 2:b07d155d316c 374 return false;
gri 2:b07d155d316c 375 }
gri 2:b07d155d316c 376
gri 2:b07d155d316c 377 /* Key up */
gri 2:b07d155d316c 378 if (!sendInputReport(REPORT_ID_KEYBOARD, NULL, 8))
gri 2:b07d155d316c 379 {
gri 2:b07d155d316c 380 return false;
gri 2:b07d155d316c 381 }
gri 2:b07d155d316c 382
gri 2:b07d155d316c 383 return true;
gri 2:b07d155d316c 384 }
gri 2:b07d155d316c 385
gri 2:b07d155d316c 386 bool usbhid::keyboard(char *string)
gri 2:b07d155d316c 387 {
gri 2:b07d155d316c 388 /* Send a string of characters. Returns true if successful. */
gri 2:b07d155d316c 389 do {
gri 2:b07d155d316c 390 if (!keyboard(*string++))
gri 2:b07d155d316c 391 {
gri 2:b07d155d316c 392 return false;
gri 2:b07d155d316c 393 }
gri 2:b07d155d316c 394 } while (*string != '\0');
gri 2:b07d155d316c 395
gri 2:b07d155d316c 396 return true;
gri 2:b07d155d316c 397 }
gri 2:b07d155d316c 398
gri 2:b07d155d316c 399 bool usbhid::mouse(signed char x, signed char y, unsigned char buttons, signed char wheel)
gri 2:b07d155d316c 400 {
gri 2:b07d155d316c 401 /* Send a simulated mouse event. Returns true if successful. */
gri 2:b07d155d316c 402 unsigned char report[4]={0,0,0,0};
gri 2:b07d155d316c 403
gri 2:b07d155d316c 404 report[0] = buttons;
gri 2:b07d155d316c 405 report[1] = x;
gri 2:b07d155d316c 406 report[2] = y;
gri 2:b07d155d316c 407 report[3] = wheel;
gri 2:b07d155d316c 408
gri 2:b07d155d316c 409 if (!sendInputReport(REPORT_ID_MOUSE, report, 4))
gri 2:b07d155d316c 410 {
gri 2:b07d155d316c 411 return false;
gri 2:b07d155d316c 412 }
gri 2:b07d155d316c 413
gri 2:b07d155d316c 414 return true;
gri 2:b07d155d316c 415 }