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