Merge pull request #93 from zyp/master
[fw/stlink] / example / stm32f4 / STM32_USB_HOST_Library / Class / HID / src / usbh_hid_keybd.c
1 /**
2   ******************************************************************************
3   * @file    usbh_hid_keybd.c 
4   * @author  MCD Application Team
5   * @version V2.0.0
6   * @date    22-July-2011
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 
9   *          usbh_hid_keybd.h              
10   ******************************************************************************
11   * @attention
12   *
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.
19   *
20   * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
21   ******************************************************************************
22   */ 
23
24
25 /* Includes ------------------------------------------------------------------*/
26 #include "usbh_hid_keybd.h"
27
28 /** @addtogroup USBH_LIB
29 * @{
30 */
31
32 /** @addtogroup USBH_CLASS
33 * @{
34 */
35
36 /** @addtogroup USBH_HID_CLASS
37 * @{
38 */
39
40 /** @defgroup USBH_HID_KEYBD 
41 * @brief    This file includes HID Layer Handlers for USB Host HID class.
42 * @{
43 */ 
44
45 /** @defgroup USBH_HID_KEYBD_Private_TypesDefinitions
46 * @{
47 */ 
48 /**
49 * @}
50 */ 
51
52
53 /** @defgroup USBH_HID_KEYBD_Private_Defines
54 * @{
55 */ 
56 /**
57 * @}
58 */ 
59
60
61 /** @defgroup USBH_HID_KEYBD_Private_Macros
62 * @{
63 */ 
64 /**
65 * @}
66 */ 
67
68 /** @defgroup USBH_HID_KEYBD_Private_FunctionPrototypes
69 * @{
70 */ 
71 static void  KEYBRD_Init (void);
72 static void  KEYBRD_Decode(uint8_t *data);
73
74 /**
75 * @}
76 */ 
77
78 #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
79  #if defined   (__CC_ARM) /*!< ARM Compiler */
80   __align(4) 
81  #elif defined ( __ICCARM__ ) /*!< IAR Compiler */
82   #pragma data_alignment=4
83  #elif defined (__GNUC__) /*!< GNU Compiler */
84  #pragma pack(4) 
85  #elif defined  (__TASKING__) /*!< TASKING Compiler */                           
86   __align(4) 
87  #endif /* __CC_ARM */
88 #endif
89  
90 /** @defgroup USBH_HID_KEYBD_Private_Variables
91 * @{
92 */
93 HID_cb_TypeDef HID_KEYBRD_cb= 
94 {
95   KEYBRD_Init,
96   KEYBRD_Decode
97 };
98
99 /*
100 *******************************************************************************
101 *                                             LOCAL CONSTANTS
102 *******************************************************************************
103 */
104
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 */
135 };
136
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'
157 };
158
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'
171 };
172
173 #else
174
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'
187 };
188
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'
200 };
201 #endif
202
203 /**
204 * @}
205 */ 
206
207
208 /** @defgroup USBH_HID_KEYBD_Private_Functions
209 * @{
210 */ 
211
212
213 /**
214 * @brief  KEYBRD_Init.
215 *         Initialize the keyboard function.
216 * @param  None
217 * @retval None
218 */
219 static void  KEYBRD_Init (void)
220 {
221   /* Call User Init*/
222   USR_KEYBRD_Init();
223 }
224
225 /**
226 * @brief  KEYBRD_ProcessData.
227 *         The function is to decode the pressed keys.
228 * @param  pbuf : Pointer to the HID IN report data buffer
229 * @retval None
230 */
231
232 static void KEYBRD_Decode(uint8_t *pbuf)
233 {
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;
242   uint8_t   ix;
243   uint8_t   jx;
244   uint8_t   error;
245   uint8_t   output;            
246   
247   nbr_keys      = 0;
248   nbr_keys_new  = 0;
249   nbr_keys_last = 0;
250   key_newest    = 0x00;
251   
252   
253   /* Check if Shift key is pressed */                                                                         
254   if ((pbuf[0] == KBD_LEFT_SHIFT) || (pbuf[0] == KBD_RIGHT_SHIFT)) {
255     shift = TRUE;
256   } else {
257     shift = FALSE;
258   }
259   
260   error = FALSE;
261   
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)) {
267             error = TRUE;
268           }
269   }
270   
271   if (error == TRUE) {
272     return;
273   }
274   
275   nbr_keys     = 0;
276   nbr_keys_new = 0;
277   for (ix = 2; ix < 2 + KBR_MAX_NBR_PRESSED; ix++) {
278     if (pbuf[ix] != 0) {
279       keys[nbr_keys] = pbuf[ix];                                       
280       nbr_keys++;
281       for (jx = 0; jx < nbr_keys_last; jx++) {                         
282         if (pbuf[ix] == keys_last[jx]) {
283           break;
284         }
285       }
286       
287       if (jx == nbr_keys_last) {
288         keys_new[nbr_keys_new] = pbuf[ix];
289         nbr_keys_new++;
290       }
291     }
292   }
293   
294   if (nbr_keys_new == 1) {
295     key_newest = keys_new[0];
296     
297     if (shift == TRUE) {
298       output =  HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[key_newest]];
299     } else {
300       output =  HID_KEYBRD_Key[HID_KEYBRD_Codes[key_newest]];
301     }
302     
303     /* call user process handle */
304     USR_KEYBRD_ProcessData(output);
305   } else {
306     key_newest = 0x00;
307   }
308   
309   
310   nbr_keys_last  = nbr_keys;
311   for (ix = 0; ix < KBR_MAX_NBR_PRESSED; ix++) {
312     keys_last[ix] = keys[ix];
313   }
314 }
315
316 /**
317 * @}
318 */ 
319
320 /**
321 * @}
322 */ 
323
324 /**
325 * @}
326 */
327
328 /**
329 * @}
330 */
331
332
333 /**
334 * @}
335 */
336
337 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
338