Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
USBDevice/USBHID/.svn/text-base/USBKeyboard.cpp.svn-base
- Committer:
- znuh
- Date:
- 2011-11-29
- Revision:
- 0:505207de8566
File content as of revision 0:505207de8566:
/* USBKeyboard.c */
/* USB device example: Standard keyboard */
/* Copyright (c) 2011 ARM Limited. All rights reserved. */
#include "stdint.h"
#include "USBKeyboard.h"
/*
* Descriptors
*/
uint8_t * USBKeyboard::ReportDesc() {
static uint8_t reportDescriptor[] = {
/* Based on Appendix E.6 of "Device Class Definition for Human Interface
Devices (HID)" Version 1.11. */
USAGE_PAGE(1), 0x01, /* Generic Desktop */
USAGE(1), 0x06, /* Keyboard */
COLLECTION(1), 0x01, /* Application*/
REPORT_ID(1), REPORT_ID_KEYBOARD,
USAGE_PAGE(1), 0x07, /* Key Codes */
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, /* Data, Variable, Absolute */
REPORT_COUNT(1), 0x01,
REPORT_SIZE(1), 0x08,
INPUT(1), 0x01, /* Constant */
REPORT_COUNT(1), 0x05,
REPORT_SIZE(1), 0x01,
USAGE_PAGE(1), 0x08, /* LEDs */
USAGE_MINIMUM(1), 0x01,
USAGE_MAXIMUM(1), 0x05,
OUTPUT(1), 0x02, /* Data, Variable, Absolute */
REPORT_COUNT(1), 0x01,
REPORT_SIZE(1), 0x03,
OUTPUT(1), 0x01, /* Constant */
REPORT_COUNT(1), 0x06,
REPORT_SIZE(1), 0x08,
LOGICAL_MINIMUM(1), 0x00,
LOGICAL_MAXIMUM(1), 0x65,
USAGE_PAGE(1), 0x07, /* Key Codes */
USAGE_MINIMUM(1), 0x00,
USAGE_MAXIMUM(1), 0x65,
INPUT(1), 0x00, /* Data, Array */
END_COLLECTION(0),
/* Media Control */
USAGE_PAGE(1), 0x0C,
USAGE(1), 0x01,
COLLECTION(1), 0x01,
REPORT_ID(1), REPORT_ID_VOLUME,
USAGE_PAGE(1), 0x0C,
LOGICAL_MINIMUM(1), 0x00,
LOGICAL_MAXIMUM(1), 0x01,
REPORT_SIZE(1), 0x01,
REPORT_COUNT(1), 0x07,
USAGE(1), 0xB5, /* Next Track */
USAGE(1), 0xB6, /* Previous Track */
USAGE(1), 0xB7, /* Stop */
USAGE(1), 0xCD, /* Play / Pause */
USAGE(1), 0xE2, /* Mute */
USAGE(1), 0xE9, /* Volume Up */
USAGE(1), 0xEA, /* Volume Down */
INPUT(1), 0x02, /* Input (Data, Variable, Absolute) */
REPORT_COUNT(1), 0x01,
INPUT(1), 0x01,
END_COLLECTION(0),
};
reportLength = sizeof(reportDescriptor);
return reportDescriptor;
}
int USBKeyboard::_putc(int c) {
return keyCode(keymap[c].modifier, c);
}
bool USBKeyboard::keyCode(uint8_t modifier, uint8_t key) {
/* Send a simulated keyboard keypress. Returns true if successful. */
HID_REPORT report;
report.data[0] = REPORT_ID_KEYBOARD;
report.data[1] = modifier;
report.data[2] = 0;
report.data[3] = keymap[key].usage;
report.data[4] = 0;
report.data[5] = 0;
report.data[6] = 0;
report.data[7] = 0;
report.data[8] = 0;
report.length = 9;
if (!USBHID_send(EPINT_IN, &report)) {
return false;
}
report.data[1] = 0;
report.data[3] = 0;
if (!USBHID_send(EPINT_IN, &report)) {
return false;
}
return true;
}
bool USBKeyboard::mediaControl(MEDIA_KEY key) {
HID_REPORT report;
report.data[0] = REPORT_ID_VOLUME;
report.data[1] = (1 << key) & 0x7f;
report.length = 2;
return USBHID_send(EPINT_IN, &report);
}