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.
USBHostKeyboard.cpp
00001 /* mbed USBHost Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include "USBHostKeyboard.h" 00018 00019 #if USBHOST_KEYBOARD 00020 00021 static uint8_t keymap[4][0x39] = { 00022 { 00023 0, 0, 0, 0, 'a', 'b' /*0x05*/, 00024 'c', 'd', 'e', 'f', 'g' /*0x0a*/, 00025 'h', 'i', 'j', 'k', 'l'/*0x0f*/, 00026 'm', 'n', 'o', 'p', 'q'/*0x14*/, 00027 'r', 's', 't', 'u', 'v'/*0x19*/, 00028 'w', 'x', 'y', 'z', '1'/*0x1E*/, 00029 '2', '3', '4', '5', '6'/*0x23*/, 00030 '7', '8', '9', '0', 0x0A /*enter*/, /*0x28*/ 00031 0x1B /*escape*/, 0x08 /*backspace*/, 0x09/*tab*/, 0x20/*space*/, '-', /*0x2d*/ 00032 '=', '[', ']', '\\', '#', /*0x32*/ 00033 ';', '\'', 0, ',', '.', /*0x37*/ 00034 '/' 00035 }, 00036 00037 /* CTRL MODIFIER */ 00038 { 00039 0, 0, 0, 0, 0, 0 /*0x05*/, 00040 0, 0, 0, 0, 0 /*0x0a*/, 00041 0, 0, 0, 0, 0/*0x0f*/, 00042 0, 0, 0, 0, 0/*0x14*/, 00043 0, 0, 0, 0, 0/*0x19*/, 00044 0, 0, 0, 0, 0/*0x1E*/, 00045 0, 0, 0, 0, 0/*0x23*/, 00046 0, 0, 0, 0, 0 /*enter*/, /*0x28*/ 00047 0, 0, 0, 0, 0, /*0x2d*/ 00048 0, 0, 0, 0, 0, /*0x32*/ 00049 0, 0, 0, 0, 0, /*0x37*/ 00050 0 00051 }, 00052 00053 /* SHIFT MODIFIER */ 00054 { 00055 0, 0, 0, 0, 'A', 'B' /*0x05*/, 00056 'C', 'D', 'E', 'F', 'G' /*0x0a*/, 00057 'H', 'I', 'J', 'K', 'L'/*0x0f*/, 00058 'M', 'N', 'O', 'P', 'Q'/*0x14*/, 00059 'R', 'S', 'T', 'U', 'V'/*0x19*/, 00060 'W', 'X', 'Y', 'Z', '!'/*0x1E*/, 00061 '@', '#', '$', '%', '^'/*0x23*/, 00062 '&', '*', '(', ')', 0, /*0x28*/ 00063 0, 0, 0, 0, 0, /*0x2d*/ 00064 '+', '{', '}', '|', '~', /*0x32*/ 00065 ':', '"', 0, '<', '>', /*0x37*/ 00066 '?' 00067 }, 00068 00069 /* ALT MODIFIER */ 00070 { 00071 0, 0, 0, 0, 0, 0 /*0x05*/, 00072 0, 0, 0, 0, 0 /*0x0a*/, 00073 0, 0, 0, 0, 0/*0x0f*/, 00074 0, 0, 0, 0, 0/*0x14*/, 00075 0, 0, 0, 0, 0/*0x19*/, 00076 0, 0, 0, 0, 0/*0x1E*/, 00077 0, 0, 0, 0, 0/*0x23*/, 00078 0, 0, 0, 0, 0 /*enter*/, /*0x28*/ 00079 0, 0, 0, 0, 0, /*0x2d*/ 00080 0, 0, 0, 0, 0, /*0x32*/ 00081 0, 0, 0, 0, 0, /*0x37*/ 00082 0 00083 } 00084 00085 }; 00086 00087 00088 USBHostKeyboard::USBHostKeyboard() 00089 { 00090 host = USBHost::getHostInst(); 00091 init(); 00092 } 00093 00094 00095 void USBHostKeyboard::init() 00096 { 00097 dev = NULL; 00098 int_in = NULL; 00099 report_id = 0; 00100 onKey = NULL; 00101 onKeyCode = NULL; 00102 dev_connected = false; 00103 keyboard_intf = -1; 00104 keyboard_device_found = false; 00105 } 00106 00107 bool USBHostKeyboard::connected() 00108 { 00109 return dev_connected; 00110 } 00111 00112 00113 bool USBHostKeyboard::connect() 00114 { 00115 00116 if (dev_connected) { 00117 return true; 00118 } 00119 00120 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { 00121 if ((dev = host->getDevice(i)) != NULL) { 00122 00123 if (host->enumerate(dev, this)) { 00124 break; 00125 } 00126 00127 if (keyboard_device_found) { 00128 { 00129 /* As this is done in a specific thread 00130 * this lock is taken to avoid to process the device 00131 * disconnect in usb process during the device registering */ 00132 USBHost::Lock Lock(host); 00133 00134 int_in = dev->getEndpoint(keyboard_intf, INTERRUPT_ENDPOINT, IN); 00135 00136 if (!int_in) { 00137 break; 00138 } 00139 00140 USB_INFO("New Keyboard device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, keyboard_intf); 00141 dev->setName("Keyboard", keyboard_intf); 00142 host->registerDriver(dev, keyboard_intf, this, &USBHostKeyboard::init); 00143 00144 int_in->attach(this, &USBHostKeyboard::rxHandler); 00145 } 00146 host->interruptRead(dev, int_in, report, int_in->getSize(), false); 00147 00148 dev_connected = true; 00149 return true; 00150 } 00151 } 00152 } 00153 init(); 00154 return false; 00155 } 00156 00157 void USBHostKeyboard::rxHandler() 00158 { 00159 int len = int_in->getLengthTransferred(); 00160 int index = (len == 9) ? 1 : 0; 00161 int len_listen = int_in->getSize(); 00162 uint8_t key = 0; 00163 if (len == 8 || len == 9) { 00164 uint8_t modifier = (report[index] == 4) ? 3 : report[index]; 00165 len_listen = len; 00166 key = keymap[modifier][report[index + 2]]; 00167 if (key && onKey) { 00168 (*onKey)(key); 00169 } 00170 if ((report[index + 2] || modifier) && onKeyCode) { 00171 (*onKeyCode)(report[index + 2], modifier); 00172 } 00173 } 00174 if (dev && int_in) { 00175 host->interruptRead(dev, int_in, report, len_listen, false); 00176 } 00177 } 00178 00179 /*virtual*/ void USBHostKeyboard::setVidPid(uint16_t vid, uint16_t pid) 00180 { 00181 // we don't check VID/PID for keyboard driver 00182 } 00183 00184 /*virtual*/ bool USBHostKeyboard::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed 00185 { 00186 if ((keyboard_intf == -1) && 00187 (intf_class == HID_CLASS) && 00188 (intf_subclass == 0x01) && 00189 (intf_protocol == 0x01)) { 00190 keyboard_intf = intf_nb; 00191 return true; 00192 } 00193 return false; 00194 } 00195 00196 /*virtual*/ bool USBHostKeyboard::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used 00197 { 00198 if (intf_nb == keyboard_intf) { 00199 if (type == INTERRUPT_ENDPOINT && dir == IN) { 00200 keyboard_device_found = true; 00201 return true; 00202 } 00203 } 00204 return false; 00205 } 00206 00207 #endif
Generated on Tue Jul 12 2022 14:25:18 by
