ADC Niose test Connect four analog signals to your MBED. and then run the Windows app. The four traces are displayed on an oscilloscope like display. I have used a USB HID DEVICE link, so connections to D+, D- are required. The MBED code is otherwise quite basic, So you can modify it to your own test needs. Additionaly, there is a 16 bit count value, in my MBED code Mainly to test if MSB & LSB are correct.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBKeyboard.cpp Source File

USBKeyboard.cpp

00001 // USBKeyboard.c
00002 // USB device example: Standard keyboard
00003 // Copyright (c) 2011 ARM Limited. All rights reserved.
00004 
00005 #include "stdint.h"
00006 
00007 #include "USBKeyboard.h"
00008 
00009 #define REPORT_ID_KEYBOARD 1
00010 #define REPORT_ID_VOLUME   3
00011 
00012 /* Modifiers */
00013 enum MODIFIER_KEY
00014 {
00015     KEY_CTRL = 1,
00016     KEY_SHIFT = 2,
00017     KEY_ALT = 4,
00018 };
00019 
00020 typedef struct {
00021     unsigned char usage;
00022     unsigned char modifier;
00023 } KEYMAP;
00024 
00025 #ifdef US_KEYBOARD
00026 /* US keyboard (as HID standard) */
00027 #define KEYMAP_SIZE (145)
00028 const KEYMAP keymap[KEYMAP_SIZE] = {
00029 {0, 0},             /* NUL */
00030 {0, 0},             /* SOH */
00031 {0, 0},             /* STX */
00032 {0, 0},             /* ETX */
00033 {0, 0},             /* EOT */
00034 {0, 0},             /* ENQ */
00035 {0, 0},             /* ACK */
00036 {0, 0},             /* BEL */
00037 {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
00038 {0x2b, 0},          /* TAB */  /* Keyboard Tab */
00039 {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
00040 {0, 0},             /* VT  */
00041 {0, 0},             /* FF  */
00042 {0, 0},             /* CR  */
00043 {0, 0},             /* SO  */
00044 {0, 0},             /* SI  */
00045 {0, 0},             /* DEL */
00046 {0, 0},             /* DC1 */
00047 {0, 0},             /* DC2 */
00048 {0, 0},             /* DC3 */
00049 {0, 0},             /* DC4 */
00050 {0, 0},             /* NAK */
00051 {0, 0},             /* SYN */
00052 {0, 0},             /* ETB */
00053 {0, 0},             /* CAN */
00054 {0, 0},             /* EM  */
00055 {0, 0},             /* SUB */
00056 {0, 0},             /* ESC */
00057 {0, 0},             /* FS  */
00058 {0, 0},             /* GS  */
00059 {0, 0},             /* RS  */
00060 {0, 0},             /* US  */
00061 {0x2c, 0},          /*   */
00062 {0x1e, KEY_SHIFT},      /* ! */
00063 {0x34, KEY_SHIFT},      /* " */
00064 {0x20, KEY_SHIFT},      /* # */
00065 {0x21, KEY_SHIFT},      /* $ */
00066 {0x22, KEY_SHIFT},      /* % */
00067 {0x24, KEY_SHIFT},      /* & */
00068 {0x34, 0},          /* ' */
00069 {0x26, KEY_SHIFT},      /* ( */
00070 {0x27, KEY_SHIFT},      /* ) */
00071 {0x25, KEY_SHIFT},      /* * */
00072 {0x2e, KEY_SHIFT},      /* + */
00073 {0x36, 0},          /* , */
00074 {0x2d, 0},          /* - */
00075 {0x37, 0},          /* . */
00076 {0x38, 0},          /* / */
00077 {0x27, 0},          /* 0 */
00078 {0x1e, 0},          /* 1 */
00079 {0x1f, 0},          /* 2 */
00080 {0x20, 0},          /* 3 */
00081 {0x21, 0},          /* 4 */
00082 {0x22, 0},          /* 5 */
00083 {0x23, 0},          /* 6 */
00084 {0x24, 0},          /* 7 */
00085 {0x25, 0},          /* 8 */
00086 {0x26, 0},          /* 9 */
00087 {0x33, KEY_SHIFT},      /* : */
00088 {0x33, 0},          /* ; */
00089 {0x36, KEY_SHIFT},      /* < */
00090 {0x2e, 0},          /* = */
00091 {0x37, KEY_SHIFT},      /* > */
00092 {0x38, KEY_SHIFT},      /* ? */
00093 {0x1f, KEY_SHIFT},      /* @ */
00094 {0x04, KEY_SHIFT},      /* A */
00095 {0x05, KEY_SHIFT},      /* B */
00096 {0x06, KEY_SHIFT},      /* C */
00097 {0x07, KEY_SHIFT},      /* D */
00098 {0x08, KEY_SHIFT},      /* E */
00099 {0x09, KEY_SHIFT},      /* F */
00100 {0x0a, KEY_SHIFT},      /* G */
00101 {0x0b, KEY_SHIFT},      /* H */
00102 {0x0c, KEY_SHIFT},      /* I */
00103 {0x0d, KEY_SHIFT},      /* J */
00104 {0x0e, KEY_SHIFT},      /* K */
00105 {0x0f, KEY_SHIFT},      /* L */
00106 {0x10, KEY_SHIFT},      /* M */
00107 {0x11, KEY_SHIFT},      /* N */
00108 {0x12, KEY_SHIFT},      /* O */
00109 {0x13, KEY_SHIFT},      /* P */
00110 {0x14, KEY_SHIFT},      /* Q */
00111 {0x15, KEY_SHIFT},      /* R */
00112 {0x16, KEY_SHIFT},      /* S */
00113 {0x17, KEY_SHIFT},      /* T */
00114 {0x18, KEY_SHIFT},      /* U */
00115 {0x19, KEY_SHIFT},      /* V */
00116 {0x1a, KEY_SHIFT},      /* W */
00117 {0x1b, KEY_SHIFT},      /* X */
00118 {0x1c, KEY_SHIFT},      /* Y */
00119 {0x1d, KEY_SHIFT},      /* Z */
00120 {0x2f, 0},          /* [ */
00121 {0x31, 0},          /* \ */
00122 {0x30, 0},          /* ] */
00123 {0x23, KEY_SHIFT},      /* ^ */
00124 {0x2d, KEY_SHIFT},      /* _ */
00125 {0x35, 0},          /* ` */
00126 {0x04, 0},          /* a */
00127 {0x05, 0},          /* b */
00128 {0x06, 0},          /* c */
00129 {0x07, 0},          /* d */
00130 {0x08, 0},          /* e */
00131 {0x09, 0},          /* f */
00132 {0x0a, 0},          /* g */
00133 {0x0b, 0},          /* h */
00134 {0x0c, 0},          /* i */
00135 {0x0d, 0},          /* j */
00136 {0x0e, 0},          /* k */
00137 {0x0f, 0},          /* l */
00138 {0x10, 0},          /* m */
00139 {0x11, 0},          /* n */
00140 {0x12, 0},          /* o */
00141 {0x13, 0},          /* p */
00142 {0x14, 0},          /* q */
00143 {0x15, 0},          /* r */
00144 {0x16, 0},          /* s */
00145 {0x17, 0},          /* t */
00146 {0x18, 0},          /* u */
00147 {0x19, 0},          /* v */
00148 {0x1a, 0},          /* w */
00149 {0x1b, 0},          /* x */
00150 {0x1c, 0},          /* y */
00151 {0x1d, 0},          /* z */
00152 {0x2f, KEY_SHIFT},      /* { */
00153 {0x31, KEY_SHIFT},      /* | */
00154 {0x30, KEY_SHIFT},      /* } */
00155 {0x35, KEY_SHIFT},      /* ~ */
00156 {0,0},              /* DEL */
00157 
00158 {0x3a, 0},          /* F1 */
00159 {0x3b, 0},          /* F2 */
00160 {0x3c, 0},          /* F3 */
00161 {0x3d, 0},          /* F4 */
00162 {0x3e, 0},          /* F5 */
00163 {0x3f, 0},          /* F6 */
00164 {0x40, 0},          /* F7 */
00165 {0x41, 0},          /* F8 */
00166 {0x42, 0},          /* F9 */
00167 {0x43, 0},          /* F10 */
00168 {0x44, 0},          /* F11 */
00169 {0x45, 0},          /* F12 */
00170 
00171 {0x46, 0},          /* PRINT_SCREEN */
00172 {0x49, 0},          /* INSERT */
00173 {0x4a, 0},          /* HOME */
00174 {0x4b, 0},          /* PAGE_UP */
00175 {0x4e, 0},          /* PAGE_DOWN */
00176 };
00177 
00178 #else
00179 /* UK keyboard */
00180 #define KEYMAP_SIZE (145)
00181 const KEYMAP keymap[KEYMAP_SIZE] = {
00182 {0, 0},             /* NUL */
00183 {0, 0},             /* SOH */
00184 {0, 0},             /* STX */
00185 {0, 0},             /* ETX */
00186 {0, 0},             /* EOT */
00187 {0, 0},             /* ENQ */
00188 {0, 0},             /* ACK */
00189 {0, 0},             /* BEL */
00190 {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
00191 {0x2b, 0},          /* TAB */  /* Keyboard Tab */
00192 {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
00193 {0, 0},             /* VT  */
00194 {0, 0},             /* FF  */
00195 {0, 0},             /* CR  */
00196 {0, 0},             /* SO  */
00197 {0, 0},             /* SI  */
00198 {0, 0},             /* DEL */
00199 {0, 0},             /* DC1 */
00200 {0, 0},             /* DC2 */
00201 {0, 0},             /* DC3 */
00202 {0, 0},             /* DC4 */
00203 {0, 0},             /* NAK */
00204 {0, 0},             /* SYN */
00205 {0, 0},             /* ETB */
00206 {0, 0},             /* CAN */
00207 {0, 0},             /* EM  */
00208 {0, 0},             /* SUB */
00209 {0, 0},             /* ESC */
00210 {0, 0},             /* FS  */
00211 {0, 0},             /* GS  */
00212 {0, 0},             /* RS  */
00213 {0, 0},             /* US  */
00214 {0x2c, 0},          /*   */
00215 {0x1e, KEY_SHIFT},      /* ! */
00216 {0x1f, KEY_SHIFT},      /* " */
00217 {0x32, 0},          /* # */
00218 {0x21, KEY_SHIFT},      /* $ */
00219 {0x22, KEY_SHIFT},      /* % */
00220 {0x24, KEY_SHIFT},      /* & */
00221 {0x34, 0},          /* ' */
00222 {0x26, KEY_SHIFT},      /* ( */
00223 {0x27, KEY_SHIFT},      /* ) */
00224 {0x25, KEY_SHIFT},      /* * */
00225 {0x2e, KEY_SHIFT},      /* + */
00226 {0x36, 0},          /* , */
00227 {0x2d, 0},          /* - */
00228 {0x37, 0},          /* . */
00229 {0x38, 0},          /* / */
00230 {0x27, 0},          /* 0 */
00231 {0x1e, 0},          /* 1 */
00232 {0x1f, 0},          /* 2 */
00233 {0x20, 0},          /* 3 */
00234 {0x21, 0},          /* 4 */
00235 {0x22, 0},          /* 5 */
00236 {0x23, 0},          /* 6 */
00237 {0x24, 0},          /* 7 */
00238 {0x25, 0},          /* 8 */
00239 {0x26, 0},          /* 9 */
00240 {0x33, KEY_SHIFT},      /* : */
00241 {0x33, 0},          /* ; */
00242 {0x36, KEY_SHIFT},      /* < */
00243 {0x2e, 0},          /* = */
00244 {0x37, KEY_SHIFT},      /* > */
00245 {0x38, KEY_SHIFT},      /* ? */
00246 {0x34, KEY_SHIFT},      /* @ */
00247 {0x04, KEY_SHIFT},      /* A */
00248 {0x05, KEY_SHIFT},      /* B */
00249 {0x06, KEY_SHIFT},      /* C */
00250 {0x07, KEY_SHIFT},      /* D */
00251 {0x08, KEY_SHIFT},      /* E */
00252 {0x09, KEY_SHIFT},      /* F */
00253 {0x0a, KEY_SHIFT},      /* G */
00254 {0x0b, KEY_SHIFT},      /* H */
00255 {0x0c, KEY_SHIFT},      /* I */
00256 {0x0d, KEY_SHIFT},      /* J */
00257 {0x0e, KEY_SHIFT},      /* K */
00258 {0x0f, KEY_SHIFT},      /* L */
00259 {0x10, KEY_SHIFT},      /* M */
00260 {0x11, KEY_SHIFT},      /* N */
00261 {0x12, KEY_SHIFT},      /* O */
00262 {0x13, KEY_SHIFT},      /* P */
00263 {0x14, KEY_SHIFT},      /* Q */
00264 {0x15, KEY_SHIFT},      /* R */
00265 {0x16, KEY_SHIFT},      /* S */
00266 {0x17, KEY_SHIFT},      /* T */
00267 {0x18, KEY_SHIFT},      /* U */
00268 {0x19, KEY_SHIFT},      /* V */
00269 {0x1a, KEY_SHIFT},      /* W */
00270 {0x1b, KEY_SHIFT},      /* X */
00271 {0x1c, KEY_SHIFT},      /* Y */
00272 {0x1d, KEY_SHIFT},      /* Z */
00273 {0x2f, 0},          /* [ */
00274 {0x64, 0},          /* \ */
00275 {0x30, 0},          /* ] */
00276 {0x23, KEY_SHIFT},      /* ^ */
00277 {0x2d, KEY_SHIFT},      /* _ */
00278 {0x35, 0},          /* ` */
00279 {0x04, 0},          /* a */
00280 {0x05, 0},          /* b */
00281 {0x06, 0},          /* c */
00282 {0x07, 0},          /* d */
00283 {0x08, 0},          /* e */
00284 {0x09, 0},          /* f */
00285 {0x0a, 0},          /* g */
00286 {0x0b, 0},          /* h */
00287 {0x0c, 0},          /* i */
00288 {0x0d, 0},          /* j */
00289 {0x0e, 0},          /* k */
00290 {0x0f, 0},          /* l */
00291 {0x10, 0},          /* m */
00292 {0x11, 0},          /* n */
00293 {0x12, 0},          /* o */
00294 {0x13, 0},          /* p */
00295 {0x14, 0},          /* q */
00296 {0x15, 0},          /* r */
00297 {0x16, 0},          /* s */
00298 {0x17, 0},          /* t */
00299 {0x18, 0},          /* u */
00300 {0x19, 0},          /* v */
00301 {0x1a, 0},          /* w */
00302 {0x1b, 0},          /* x */
00303 {0x1c, 0},          /* y */
00304 {0x1d, 0},          /* z */
00305 {0x2f, KEY_SHIFT},      /* { */
00306 {0x64, KEY_SHIFT},      /* | */
00307 {0x30, KEY_SHIFT},      /* } */
00308 {0x32, KEY_SHIFT},      /* ~ */
00309 {0,0},             /* DEL */
00310 
00311 {0x3a, 0},          /* F1 */
00312 {0x3b, 0},          /* F2 */
00313 {0x3c, 0},          /* F3 */
00314 {0x3d, 0},          /* F4 */
00315 {0x3e, 0},          /* F5 */
00316 {0x3f, 0},          /* F6 */
00317 {0x40, 0},          /* F7 */
00318 {0x41, 0},          /* F8 */
00319 {0x42, 0},          /* F9 */
00320 {0x43, 0},          /* F10 */
00321 {0x44, 0},          /* F11 */
00322 {0x45, 0},          /* F12 */
00323 
00324 {0x46, 0},          /* PRINT_SCREEN */
00325 {0x49, 0},          /* INSERT */
00326 {0x4a, 0},          /* HOME */
00327 {0x4b, 0},          /* PAGE_UP */
00328 {0x4e, 0},          /* PAGE_DOWN */
00329 };
00330 #endif
00331 
00332 uint8_t * USBKeyboard::reportDesc() {
00333     static uint8_t reportDescriptor[] = {
00334         USAGE_PAGE(1), 0x01,                    // Generic Desktop
00335         USAGE(1), 0x06,                         // Keyboard
00336         COLLECTION(1), 0x01,                    // Application
00337         REPORT_ID(1),       REPORT_ID_KEYBOARD,
00338 
00339         USAGE_PAGE(1), 0x07,                    // Key Codes
00340         USAGE_MINIMUM(1), 0xE0,
00341         USAGE_MAXIMUM(1), 0xE7,
00342         LOGICAL_MINIMUM(1), 0x00,
00343         LOGICAL_MAXIMUM(1), 0x01,
00344         REPORT_SIZE(1), 0x01,
00345         REPORT_COUNT(1), 0x08,
00346         INPUT(1), 0x02,                         // Data, Variable, Absolute
00347         REPORT_COUNT(1), 0x01,
00348         REPORT_SIZE(1), 0x08,
00349         INPUT(1), 0x01,                         // Constant
00350         REPORT_COUNT(1), 0x05,
00351         REPORT_SIZE(1), 0x01,
00352 
00353 
00354         USAGE_PAGE(1), 0x08,                    // LEDs
00355         USAGE_MINIMUM(1), 0x01,
00356         USAGE_MAXIMUM(1), 0x05,
00357         OUTPUT(1), 0x02,                        // Data, Variable, Absolute
00358         REPORT_COUNT(1), 0x01,
00359         REPORT_SIZE(1), 0x03,
00360         OUTPUT(1), 0x01,                        // Constant
00361         REPORT_COUNT(1), 0x06,
00362         REPORT_SIZE(1), 0x08,
00363         LOGICAL_MINIMUM(1), 0x00,
00364         LOGICAL_MAXIMUM(1), 0x65,
00365 
00366 
00367         USAGE_PAGE(1), 0x07,                    // Key Codes
00368         USAGE_MINIMUM(1), 0x00,
00369         USAGE_MAXIMUM(1), 0x65,
00370         INPUT(1), 0x00,                         // Data, Array
00371         END_COLLECTION(0),
00372 
00373         // Media Control
00374         USAGE_PAGE(1), 0x0C,
00375         USAGE(1), 0x01,
00376         COLLECTION(1), 0x01,
00377         REPORT_ID(1), REPORT_ID_VOLUME,
00378         USAGE_PAGE(1), 0x0C,
00379         LOGICAL_MINIMUM(1), 0x00,
00380         LOGICAL_MAXIMUM(1), 0x01,
00381         REPORT_SIZE(1), 0x01,
00382         REPORT_COUNT(1), 0x07,
00383         USAGE(1), 0xB5,             // Next Track
00384         USAGE(1), 0xB6,             // Previous Track
00385         USAGE(1), 0xB7,             // Stop
00386         USAGE(1), 0xCD,             // Play / Pause
00387         USAGE(1), 0xE2,             // Mute
00388         USAGE(1), 0xE9,             // Volume Up
00389         USAGE(1), 0xEA,             // Volume Down
00390         INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
00391         REPORT_COUNT(1), 0x01,
00392         INPUT(1), 0x01,
00393         END_COLLECTION(0),
00394 
00395     };
00396     reportLength = sizeof(reportDescriptor);
00397     return reportDescriptor;
00398 }
00399 
00400 int USBKeyboard::_putc(int c) {
00401     return keyCode(c, keymap[c].modifier);
00402 }
00403 
00404 bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {
00405     // Send a simulated keyboard keypress. Returns true if successful.
00406 
00407     HID_REPORT report;
00408 
00409     report.data[0] = REPORT_ID_KEYBOARD;
00410     report.data[1] = modifier;
00411     report.data[2] = 0;
00412     report.data[3] = keymap[key].usage;
00413     report.data[4] = 0;
00414     report.data[5] = 0;
00415     report.data[6] = 0;
00416     report.data[7] = 0;
00417     report.data[8] = 0;
00418 
00419     report.length = 9;
00420 
00421     if (!send(&report)) {
00422         return false;
00423     }
00424 
00425     report.data[1] = 0;
00426     report.data[3] = 0;
00427 
00428     if (!send(&report)) {
00429         return false;
00430     }
00431 
00432     return true;
00433 
00434 }
00435 
00436 
00437 bool USBKeyboard::mediaControl(MEDIA_KEY key) {
00438     HID_REPORT report;
00439 
00440     report.data[0] = REPORT_ID_VOLUME;
00441     report.data[1] = (1 << key) & 0x7f;
00442 
00443     report.length = 2;
00444 
00445     send(&report);
00446     
00447     report.data[0] = REPORT_ID_VOLUME;
00448     report.data[1] = 0;
00449 
00450     report.length = 2;
00451 
00452     return send(&report);
00453 }
00454 
00455