embox

Форк
0
153 строки · 3.8 Кб
1
/**
2
 * @file
3
 *
4
 * @date Feb 6, 2013
5
 * @author: Anton Bondarev
6
 */
7

8
#include <stdint.h>
9
#include <string.h>
10

11
#include <drivers/input/input_dev.h>
12
#include <drivers/input/keymap.h>
13

14
#define KEY_MAX (sizeof(key_map) / sizeof(char))
15

16
/*
17
 * Key map
18
 */
19
static const uint8_t key_map[] = {
20
	       0,     0x1b,      '1',      '2',     '3',      '4',      '5',      '6',
21
	     '7',      '8',      '9',      '0',     '-',      '=',     '\b',     '\t',
22
	     'q',      'w',      'e',      'r',     't',      'y',      'u',      'i',
23
	     'o',      'p',      '[',      ']',    '\r', KEY_CTRL,      'a',      's',
24
	     'd',      'f',      'g',      'h',     'j',      'k',      'l',      ';',
25
	    '\'',      '`', KEY_SHFT,     '\\',     'z',      'x',      'c',      'v',
26
	     'b',      'n',      'm',      ',',     '.',      '/', KEY_SHFT,      '*',
27
	 KEY_ALT,      ' ', KEY_CAPS,   KEY_F1,  KEY_F2,   KEY_F3,   KEY_F4,   KEY_F5,
28
	  KEY_F6,   KEY_F7,   KEY_F8,   KEY_F9, KEY_F10,        0,        0, KEY_HOME,
29
	  KEY_UP, KEY_PGUP,        0, KEY_LEFT,       0, KEY_RGHT,        0,  KEY_END,
30
	KEY_DOWN, KEY_PGDN,  KEY_INS,  KEY_DEL, KEY_F11,  KEY_F12
31
};
32

33
static const uint8_t shift_map[] = {
34
	       0,     0x1b,     '!',      '@',  '#',      '$',  '%',      '^',
35
	     '&',      '*',     '(',      ')',  '_',      '+', '\b',     '\t',
36
	     'Q',      'W',     'E',      'R',  'T',      'Y',  'U',      'I',
37
	     'O',      'P',     '{',      '}', '\r', KEY_CTRL,  'A',      'S',
38
	     'D',      'F',     'G',      'H',  'J',      'K',  'L',      ':',
39
	     '"',      '~',       0,      '|',  'Z',      'X',  'C',      'V',
40
	     'B',      'N',     'M',      '<',  '>',      '?',    0,      '*',
41
	 KEY_ALT,      ' ',       0,        0,    0,        0,    0,        0,
42
	       0,        0,       0,        0,    0,        0,    0, KEY_HOME,
43
	  KEY_UP, KEY_PGUP,       0, KEY_LEFT,    0, KEY_RGHT,    0,  KEY_END,
44
	KEY_DOWN, KEY_PGDN, KEY_INS,  KEY_DEL,    0,      0
45
};
46

47
static const unsigned char esc_start[] = {0x1B, 0x5B}; /* esc, '[' */
48

49
int keymap_kbd(struct input_event *event) {
50
	const uint8_t *cur_map;
51
	uint8_t val;
52
	int key_index = event->value & KEYBOARD_KEY_MASK;
53

54
	if (key_index > KEY_MAX) {
55
		return -1;
56
	}
57

58
	cur_map = event->value & KBD_SHIFT_PRESSED ? shift_map : key_map;
59
	val = cur_map[key_index];
60

61
	if (event->value & KBD_CTRL_PRESSED){
62
		val = val < 0x40 ? 0 : val & KEYBOARD_CTRL_MASK;
63
	}
64

65
	return val;
66
}
67

68
int keymap_to_ascii(struct input_event *event, unsigned char ascii_buff[4]) {
69
	int keycode = keymap_kbd(event);
70
	int seq_len = 0;
71

72
	if (keycode < 0 || !(event->type & KBD_KEY_PRESSED)) {
73
		return 0;
74
	}
75

76
	switch (keycode) {
77
	case 0:
78
	case KEY_CAPS:
79
	case KEY_SHFT:
80
	case KEY_CTRL:
81
	case KEY_ALT:
82
		return 0; /* no ascii symbols */
83

84
	case KEY_F1:
85
	case KEY_F2:
86
	case KEY_F3:
87
	case KEY_F4:
88
	case KEY_F5:
89
	case KEY_F6:
90
	case KEY_F7:
91
	case KEY_F8:
92
	case KEY_F9:
93
	case KEY_F10:
94
	case KEY_F11:
95
	case KEY_F12:
96
		return 0; /* no ascii symbols */
97

98
	case KEY_INS:
99
		/*0x7e325b1b */
100
		seq_len = 4;
101
		ascii_buff[2] = 0x32;
102
		ascii_buff[3] = 0x7e;
103
		break;
104
	case KEY_HOME:
105
		/* 0x485b1b */
106
		seq_len = 3;
107
		ascii_buff[2] = 0x48;
108
		break;
109
	case KEY_END:
110
		/* 0x465b1b */
111
		seq_len = 3;
112
		ascii_buff[2] = 0x46;
113
		break;
114
	case KEY_PGUP:
115
		/* 0x7e355b1b */
116
		seq_len = 4;
117
		ascii_buff[2] = 0x35;
118
		ascii_buff[3] = 0x7e;
119
		break;
120
	case KEY_PGDN:
121
		/* 0x7e365b1b */
122
		seq_len = 4;
123
		ascii_buff[2] = 0x36;
124
		ascii_buff[3] = 0x7e;
125
		break;
126
	case KEY_UP:
127
		/* 0x415b1b */
128
		seq_len = 3;
129
		ascii_buff[2] = 0x41;
130
		break;
131
	case KEY_DOWN:
132
		/* 0x425b1b */
133
		seq_len = 3;
134
		ascii_buff[2] = 0x42;
135
		break;
136
	case KEY_LEFT:
137
		/* 0x445b1b */
138
		seq_len = 3;
139
		ascii_buff[2] = 0x44;
140
		break;
141
	case KEY_RGHT:
142
		/* 0x435b1b */
143
		seq_len = 3;
144
		ascii_buff[2] = 0x43;
145
		break;
146

147
	default:
148
		ascii_buff[0] = (unsigned char)keycode;
149
		return 1;
150
	}
151
	memcpy(ascii_buff, esc_start, sizeof(esc_start));
152
	return seq_len;
153
}
154

155

156

157

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.