xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/key_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include <stdio.h>
2*4882a593Smuzhiyun #include <stdlib.h>
3*4882a593Smuzhiyun #include <string.h>
4*4882a593Smuzhiyun #include <pthread.h>
5*4882a593Smuzhiyun #include <unistd.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/input.h>
8*4882a593Smuzhiyun #include <fcntl.h>
9*4882a593Smuzhiyun #include <dirent.h>
10*4882a593Smuzhiyun #include "common.h"
11*4882a593Smuzhiyun #include "key_test.h"
12*4882a593Smuzhiyun #include "test_case.h"
13*4882a593Smuzhiyun #include "language.h"
14*4882a593Smuzhiyun #define test_bit(bit, array)    (array[bit/8] & (1<<(bit%8)))
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include "screen_test.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun unsigned char keybitmask[(KEY_MAX + 1) / 8];
19*4882a593Smuzhiyun struct key key_code[KEY_MAX];
20*4882a593Smuzhiyun unsigned char key_cnt = 0;		/*key counter */
21*4882a593Smuzhiyun unsigned int gkey = 0;
22*4882a593Smuzhiyun static pthread_mutex_t gkeymutex = PTHREAD_MUTEX_INITIALIZER;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun int g_key_test = 0;
25*4882a593Smuzhiyun static struct testcase_info *tc_info;
26*4882a593Smuzhiyun 
set_gkey(unsigned int code)27*4882a593Smuzhiyun int set_gkey(unsigned int code)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	int i;
30*4882a593Smuzhiyun 	for (i = 0; i < key_cnt; i++) {
31*4882a593Smuzhiyun 		if (code == key_code[i].code) {
32*4882a593Smuzhiyun 			ui_print_xy_rgba(0, tc_info->y, 0, 255, 0, 255,
33*4882a593Smuzhiyun 				"%s:[%s] key down\n", PCBA_KEY,
34*4882a593Smuzhiyun 				key_code[i].name);
35*4882a593Smuzhiyun 			screenTest_key_detect(code);
36*4882a593Smuzhiyun 			break;
37*4882a593Smuzhiyun 		}
38*4882a593Smuzhiyun 	}
39*4882a593Smuzhiyun 	return 0;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
scan_key_code(void)42*4882a593Smuzhiyun int scan_key_code(void)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun 	unsigned temp = 0;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	pthread_mutex_lock(&gkeymutex);
47*4882a593Smuzhiyun 	if (gkey) {
48*4882a593Smuzhiyun 		temp = gkey;
49*4882a593Smuzhiyun 		gkey = 0;
50*4882a593Smuzhiyun 	}
51*4882a593Smuzhiyun 	pthread_mutex_unlock(&gkeymutex);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	return temp;
54*4882a593Smuzhiyun }
switch_key(int i)55*4882a593Smuzhiyun void switch_key(int i)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	key_code[key_cnt].code = i;
58*4882a593Smuzhiyun 	switch (i) {
59*4882a593Smuzhiyun 	case KEY_VOLUMEDOWN:
60*4882a593Smuzhiyun 		key_code[key_cnt].name = "vol-";
61*4882a593Smuzhiyun 		break;
62*4882a593Smuzhiyun 	case KEY_VOLUMEUP:
63*4882a593Smuzhiyun 		key_code[key_cnt].name = "vol+";
64*4882a593Smuzhiyun 		break;
65*4882a593Smuzhiyun 	case KEY_POWER:
66*4882a593Smuzhiyun 		key_code[key_cnt].name = "power";
67*4882a593Smuzhiyun 		break;
68*4882a593Smuzhiyun 	case KEY_F1:
69*4882a593Smuzhiyun 		key_code[key_cnt].name = "menu";
70*4882a593Smuzhiyun #ifdef RK312X_PCBA
71*4882a593Smuzhiyun 		key_code[key_cnt].name = "vol+";
72*4882a593Smuzhiyun #endif
73*4882a593Smuzhiyun 		break;
74*4882a593Smuzhiyun 	case KEY_HOME:
75*4882a593Smuzhiyun 		key_code[key_cnt].name = "home";
76*4882a593Smuzhiyun 		break;
77*4882a593Smuzhiyun 	case KEY_BACK:
78*4882a593Smuzhiyun 		key_code[key_cnt].name = "ESC";
79*4882a593Smuzhiyun 		break;
80*4882a593Smuzhiyun 	case KEY_UP:
81*4882a593Smuzhiyun 		key_code[key_cnt].name = "UP";
82*4882a593Smuzhiyun 		break;
83*4882a593Smuzhiyun 	case KEY_DOWN:
84*4882a593Smuzhiyun 		key_code[key_cnt].name = "DOWN";
85*4882a593Smuzhiyun 		break;
86*4882a593Smuzhiyun 	case KEY_LEFT:
87*4882a593Smuzhiyun 		key_code[key_cnt].name = "LEFT";
88*4882a593Smuzhiyun 		break;
89*4882a593Smuzhiyun 	case KEY_RIGHT:
90*4882a593Smuzhiyun 		key_code[key_cnt].name = "RIGHT";
91*4882a593Smuzhiyun 		break;
92*4882a593Smuzhiyun 	case KEY_MENU:
93*4882a593Smuzhiyun 		key_code[key_cnt].name = "MENU";
94*4882a593Smuzhiyun 		break;
95*4882a593Smuzhiyun 	case KEY_ENTER:
96*4882a593Smuzhiyun 	case KEY_REPLY:
97*4882a593Smuzhiyun 		key_code[key_cnt].name = "OK";
98*4882a593Smuzhiyun 		break;
99*4882a593Smuzhiyun 	default:
100*4882a593Smuzhiyun 		printf("un supported key:%d\n", i);
101*4882a593Smuzhiyun 		break;
102*4882a593Smuzhiyun 	}
103*4882a593Smuzhiyun 	key_cnt++;
104*4882a593Smuzhiyun }
key_code_probe(void)105*4882a593Smuzhiyun int key_code_probe(void)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	DIR *dir;
108*4882a593Smuzhiyun 	struct dirent *de;
109*4882a593Smuzhiyun 	int fd;
110*4882a593Smuzhiyun 	char name[80];
111*4882a593Smuzhiyun 	int i;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	dir = opendir("/dev/input");
114*4882a593Smuzhiyun 	if (dir != 0) {
115*4882a593Smuzhiyun 		while ((de = readdir(dir))) {
116*4882a593Smuzhiyun 			if (strncmp(de->d_name, "event", 5))
117*4882a593Smuzhiyun 				continue;
118*4882a593Smuzhiyun 			fd = openat(dirfd(dir), de->d_name, O_RDONLY);
119*4882a593Smuzhiyun 			if (fd < 0) {
120*4882a593Smuzhiyun 				continue;
121*4882a593Smuzhiyun 			} else {
122*4882a593Smuzhiyun 				if (ioctl
123*4882a593Smuzhiyun 				    (fd, EVIOCGNAME(sizeof(name) - 1),
124*4882a593Smuzhiyun 				     &name) < 1) {
125*4882a593Smuzhiyun 					name[0] = '\0';
126*4882a593Smuzhiyun 				}
127*4882a593Smuzhiyun 				/*do not open gsensor here */
128*4882a593Smuzhiyun 				if (!strcmp(name, "gsensor"))
129*4882a593Smuzhiyun 					continue;
130*4882a593Smuzhiyun 				ioctl(fd,
131*4882a593Smuzhiyun 				      EVIOCGBIT(EV_KEY, sizeof(keybitmask)),
132*4882a593Smuzhiyun 				      keybitmask);
133*4882a593Smuzhiyun 				for (i = 0; i < KEY_MAX; i++) {
134*4882a593Smuzhiyun 					if (test_bit(i, keybitmask) &&
135*4882a593Smuzhiyun 					    (i != KEY_WAKEUP))
136*4882a593Smuzhiyun 						switch_key(i);
137*4882a593Smuzhiyun 				}
138*4882a593Smuzhiyun 			}
139*4882a593Smuzhiyun 		}
140*4882a593Smuzhiyun 	}
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	return 0;
143*4882a593Smuzhiyun }
key_test(void * argc)144*4882a593Smuzhiyun void *key_test(void *argc)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun 	int i = 0;
147*4882a593Smuzhiyun 	int code;
148*4882a593Smuzhiyun 	int run = 1;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	tc_info = (struct testcase_info *)argc;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	if (tc_info->y <= 0)
153*4882a593Smuzhiyun 		tc_info->y = get_cur_print_y();
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	ui_print_xy_rgba(0, tc_info->y, 255, 255, 0, 255, "%s: Waiting press key...\n", PCBA_KEY);
156*4882a593Smuzhiyun 	key_code_probe();
157*4882a593Smuzhiyun 	g_key_test = 1;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	return NULL;
160*4882a593Smuzhiyun }
161