mX mbed BaseBoard USB HID

Dependencies:   mbed

Committer:
ashwin_athani
Date:
Wed Dec 08 06:30:25 2010 +0000
Revision:
0:093612081f64

        

Who changed what in which revision?

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