1 /******************************************************************************************************************************************
2 * 文件名称: usbh_hid_keybd.c
3 * 功能说明:
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0 2020年11月3日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include <string.h>
22 #include "SWM341.h"
23 #include "usbh_hid_core.h"
24 #include "usbh_hid_keybd.h"
25
26
27 USBH_HID_cb_t USBH_HID_KeyBD_cb =
28 {
29 USBH_HID_KeyBD_Init,
30 USBH_HID_KeyBD_Decode
31 };
32
33
34 static const uint8_t HID_KEYBRD_Codes[] = {
35 0, 0, 0, 0, 31, 50, 48, 33, 19, 34, 35, 36, 24, 37, 38, 39,
36 52, 51, 25, 26, 17, 20, 32, 21, 23, 49, 18, 47, 22, 46, 2, 3,
37 4, 5, 6, 7, 8, 9, 10, 11, 43, 110, 15, 16, 61, 12, 13, 27,
38 28, 29, 42, 40, 41, 1, 53, 54, 55, 30, 112, 113, 114, 115, 116, 117,
39 118, 119, 120, 121, 122, 123, 124, 125, 126, 75, 80, 85, 76, 81, 86, 89,
40 79, 84, 83, 90, 95, 100, 105, 106, 108, 93, 98, 103, 92, 97, 102, 91,
41 96, 101, 99, 104, 45, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 107, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0,
44 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49 58, 44, 60, 127, 64, 57, 62, 128,
50 };
51
52 static const uint8_t HID_KEYBRD_Key[] = {
53 '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8',
54 '9', '0', '-', '=', '\0', '\r', '\t', 'q', 'w', 'e',
55 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\',
56 '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
57 ';', '\'', '\0', '\n', '\0', '\0', 'z', 'x', 'c', 'v',
58 'b', 'n', 'm', ',', '.', '/', '\0', '\0', '\0', '\0',
59 '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
60 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
61 '\r', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
62 '\0', '7', '4', '1', '\0', '/', '8', '5', '2', '0',
63 '*', '9', '6', '3', '.', '-', '+', '\0', '\n', '\0',
64 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
65 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
66 };
67
68 static const uint8_t HID_KEYBRD_ShiftKey[] = {
69 '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*',
70 '(', ')', '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E',
71 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '|',
72 '\0', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
73 ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', 'C', 'V',
74 'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', '\0',
75 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
76 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
77 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
78 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
79 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
80 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
81 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
82 };
83
84
85 static uint8_t keys_last[6];
86 static uint8_t nbr_keys_last;
87
88
USBH_HID_KeyBD_Init(void)89 void USBH_HID_KeyBD_Init(void)
90 {
91 nbr_keys_last = 0;
92 memset(keys_last, 0x00, 6);
93 }
94
95
USBH_HID_KeyBD_Decode(uint8_t * pbuf)96 void USBH_HID_KeyBD_Decode(uint8_t *pbuf)
97 {
98 char key;
99 uint8_t i, j;
100 uint8_t keys[6];
101 uint8_t keys_new[6];
102 uint8_t nbr_keys;
103 uint8_t nbr_keys_new;
104
105 for(i = 2; i < 8; i++)
106 {
107 if((pbuf[i] == 0x01) || (pbuf[i] == 0x02) || (pbuf[i] == 0x03))
108 return;
109 }
110
111 nbr_keys = 0;
112 nbr_keys_new = 0;
113 for(i = 2; i < 8; i++)
114 {
115 if(pbuf[i] != 0x00)
116 {
117 keys[nbr_keys++] = pbuf[i];
118
119 for(j = 0; j < nbr_keys_last; j++)
120 {
121 if(pbuf[i] == keys_last[j])
122 break;
123 }
124
125 if(j == nbr_keys_last) // 遍历到了最后,说明 pbuf[i] 不在 keys_last 中,是新按下的
126 keys_new[nbr_keys_new++] = pbuf[i];
127 }
128 }
129
130 if(nbr_keys_new == 1)
131 {
132 if((pbuf[0] & KBD_LEFT_SHIFT) || (pbuf[0] & KBD_RIGHT_SHIFT))
133 {
134 key = HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[keys_new[0]]];
135 }
136 else
137 {
138 key = HID_KEYBRD_Key[HID_KEYBRD_Codes[keys_new[0]]];
139 }
140
141 USBH_HID_KeyBD_Handle(pbuf[0], key); // call user process handle
142 }
143
144 memcpy(keys_last, keys, 6);
145 nbr_keys_last = nbr_keys;
146 }
147
148
149 __attribute__((weak))
USBH_HID_KeyBD_Handle(uint8_t ctrl,char key)150 void USBH_HID_KeyBD_Handle(uint8_t ctrl, char key)
151 {
152 if((ctrl & KBD_LEFT_CTRL) | (ctrl & KBD_RIGHT_CTRL))
153 printf("Ctrl-");
154
155 if((ctrl & KBD_LEFT_ALT) | (ctrl & KBD_RIGHT_ALT))
156 printf("Alt-");
157
158 printf("%c\r\n", key);
159 }
160