2 ******************************************************************************
3 * @file usbh_hid_keybd.c
4 * @author MCD Application Team
7 * @brief This file is the application layer for USB Host HID Keyboard handling
8 * QWERTY and AZERTY Keyboard are supported as per the selection in
10 ******************************************************************************
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
14 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
15 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
16 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
17 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
18 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
20 * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
21 ******************************************************************************
25 /* Includes ------------------------------------------------------------------*/
26 #include "usbh_hid_keybd.h"
28 /** @addtogroup USBH_LIB
32 /** @addtogroup USBH_CLASS
36 /** @addtogroup USBH_HID_CLASS
40 /** @defgroup USBH_HID_KEYBD
41 * @brief This file includes HID Layer Handlers for USB Host HID class.
45 /** @defgroup USBH_HID_KEYBD_Private_TypesDefinitions
53 /** @defgroup USBH_HID_KEYBD_Private_Defines
61 /** @defgroup USBH_HID_KEYBD_Private_Macros
68 /** @defgroup USBH_HID_KEYBD_Private_FunctionPrototypes
71 static void KEYBRD_Init (void);
72 static void KEYBRD_Decode(uint8_t *data);
78 #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
79 #if defined (__CC_ARM) /*!< ARM Compiler */
81 #elif defined ( __ICCARM__ ) /*!< IAR Compiler */
82 #pragma data_alignment=4
83 #elif defined (__GNUC__) /*!< GNU Compiler */
85 #elif defined (__TASKING__) /*!< TASKING Compiler */
90 /** @defgroup USBH_HID_KEYBD_Private_Variables
93 HID_cb_TypeDef HID_KEYBRD_cb=
100 *******************************************************************************
102 *******************************************************************************
105 static const uint8_t HID_KEYBRD_Codes[] = {
106 0, 0, 0, 0, 31, 50, 48, 33,
107 19, 34, 35, 36, 24, 37, 38, 39, /* 0x00 - 0x0F */
108 52, 51, 25, 26, 17, 20, 32, 21,
109 23, 49, 18, 47, 22, 46, 2, 3, /* 0x10 - 0x1F */
110 4, 5, 6, 7, 8, 9, 10, 11,
111 43, 110, 15, 16, 61, 12, 13, 27, /* 0x20 - 0x2F */
112 28, 29, 42, 40, 41, 1, 53, 54,
113 55, 30, 112, 113, 114, 115, 116, 117, /* 0x30 - 0x3F */
114 118, 119, 120, 121, 122, 123, 124, 125,
115 126, 75, 80, 85, 76, 81, 86, 89, /* 0x40 - 0x4F */
116 79, 84, 83, 90, 95, 100, 105, 106,
117 108, 93, 98, 103, 92, 97, 102, 91, /* 0x50 - 0x5F */
118 96, 101, 99, 104, 45, 129, 0, 0,
119 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6F */
120 0, 0, 0, 0, 0, 0, 0, 0,
121 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7F */
122 0, 0, 0, 0, 0, 107, 0, 56,
123 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */
124 0, 0, 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */
126 0, 0, 0, 0, 0, 0, 0, 0,
127 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */
128 0, 0, 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */
130 0, 0, 0, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */
132 0, 0, 0, 0, 0, 0, 0, 0,
133 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */
134 58, 44, 60, 127, 64, 57, 62, 128 /* 0xE0 - 0xE7 */
137 #ifdef QWERTY_KEYBOARD
138 static const int8_t HID_KEYBRD_Key[] = {
139 '\0', '`', '1', '2', '3', '4', '5', '6',
140 '7', '8', '9', '0', '-', '=', '\0', '\r',
141 '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u',
142 'i', 'o', 'p', '[', ']', '\\',
143 '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j',
144 'k', 'l', ';', '\'', '\0', '\n',
145 '\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n',
146 'm', ',', '.', '/', '\0', '\0',
147 '\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0',
148 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
149 '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0',
150 '\0', '\0', '\0', '\0', '\0', '\0',
151 '\0', '\0', '7', '4', '1',
152 '\0', '/', '8', '5', '2',
153 '0', '*', '9', '6', '3',
154 '.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0',
155 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
156 '\0', '\0', '\0', '\0'
159 static const int8_t HID_KEYBRD_ShiftKey[] = {
160 '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
161 '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U',
162 'I', 'O', 'P', '{', '}', '|', '\0', 'A', 'S', 'D', 'F', 'G',
163 'H', 'J', 'K', 'L', ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X',
164 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', '\0',
165 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
166 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
167 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
168 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
169 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
170 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
175 static const int8_t HID_KEYBRD_Key[] = {
176 '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
177 '-', '=', '\0', '\r', '\t', 'a', 'z', 'e', 'r', 't', 'y', 'u',
178 'i', 'o', 'p', '[', ']', '\\', '\0', 'q', 's', 'd', 'f', 'g',
179 'h', 'j', 'k', 'l', 'm', '\0', '\0', '\n', '\0', '\0', 'w', 'x',
180 'c', 'v', 'b', 'n', ',', ';', ':', '!', '\0', '\0', '\0', '\0',
181 '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
182 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0',
183 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '4', '1','\0', '/',
184 '8', '5', '2', '0', '*', '9', '6', '3', '.', '-', '+', '\0',
185 '\n', '\0', '\0', '\0', '\0', '\0', '\0','\0', '\0', '\0', '\0', '\0', '\0',
186 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
189 static const int8_t HID_KEYBRD_ShiftKey[] = {
190 '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_',
191 '+', '\0', '\0', '\0', 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O',
192 'P', '{', '}', '*', '\0', 'Q', 'S', 'D', 'F', 'G', 'H', 'J', 'K',
193 'L', 'M', '%', '\0', '\n', '\0', '\0', 'W', 'X', 'C', 'V', 'B', 'N',
194 '?', '.', '/', '\0', '\0', '\0','\0', '\0', '\0', '\0', '\0', '\0', '\0',
195 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
196 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
197 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
198 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
199 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
208 /** @defgroup USBH_HID_KEYBD_Private_Functions
214 * @brief KEYBRD_Init.
215 * Initialize the keyboard function.
219 static void KEYBRD_Init (void)
226 * @brief KEYBRD_ProcessData.
227 * The function is to decode the pressed keys.
228 * @param pbuf : Pointer to the HID IN report data buffer
232 static void KEYBRD_Decode(uint8_t *pbuf)
234 static uint8_t shift;
235 static uint8_t keys[KBR_MAX_NBR_PRESSED];
236 static uint8_t keys_new[KBR_MAX_NBR_PRESSED];
237 static uint8_t keys_last[KBR_MAX_NBR_PRESSED];
238 static uint8_t key_newest;
239 static uint8_t nbr_keys;
240 static uint8_t nbr_keys_new;
241 static uint8_t nbr_keys_last;
253 /* Check if Shift key is pressed */
254 if ((pbuf[0] == KBD_LEFT_SHIFT) || (pbuf[0] == KBD_RIGHT_SHIFT)) {
262 /* Check for the value of pressed key */
263 for (ix = 2; ix < 2 + KBR_MAX_NBR_PRESSED; ix++) {
264 if ((pbuf[ix] == 0x01) ||
265 (pbuf[ix] == 0x02) ||
266 (pbuf[ix] == 0x03)) {
277 for (ix = 2; ix < 2 + KBR_MAX_NBR_PRESSED; ix++) {
279 keys[nbr_keys] = pbuf[ix];
281 for (jx = 0; jx < nbr_keys_last; jx++) {
282 if (pbuf[ix] == keys_last[jx]) {
287 if (jx == nbr_keys_last) {
288 keys_new[nbr_keys_new] = pbuf[ix];
294 if (nbr_keys_new == 1) {
295 key_newest = keys_new[0];
298 output = HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[key_newest]];
300 output = HID_KEYBRD_Key[HID_KEYBRD_Codes[key_newest]];
303 /* call user process handle */
304 USR_KEYBRD_ProcessData(output);
310 nbr_keys_last = nbr_keys;
311 for (ix = 0; ix < KBR_MAX_NBR_PRESSED; ix++) {
312 keys_last[ix] = keys[ix];
337 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/