blob: acd82ef9acd94b49093fb069aa6e8b169fd83f27
1 | #include<stdio.h> |
2 | #include<stdlib.h> |
3 | #include<string.h> |
4 | #include<ctype.h> |
5 | |
6 | #include "amlogic_ui.h" |
7 | |
8 | #include "common.h" |
9 | #include "device.h" |
10 | #include "screen_ui.h" |
11 | #include "ui.h" |
12 | #include "recovery_extra/recovery_amlogic.h" |
13 | |
14 | #include <errno.h> |
15 | #include <fcntl.h> |
16 | #include <limits.h> |
17 | #include <sys/stat.h> |
18 | #include <sys/wait.h> |
19 | #include <unistd.h> |
20 | #include <sys/types.h> |
21 | #include <sys/mount.h> |
22 | #include <string.h> |
23 | #include <ziparchive/zip_archive.h> |
24 | #include <android-base/logging.h> |
25 | #include "cutils/properties.h" |
26 | |
27 | #include <fcntl.h> |
28 | #include <linux/fb.h> |
29 | #include <sys/ioctl.h> |
30 | #include <sys/mman.h> |
31 | #include <sys/types.h> |
32 | #include <unistd.h> |
33 | |
34 | #define FB_ACTIVATE_FORCE 128 /* force apply even when no change*/ |
35 | |
36 | |
37 | class AmlogicDevice : public Device { |
38 | public: |
39 | AmlogicDevice(ScreenRecoveryUI* ui) : Device(ui) { } |
40 | }; |
41 | |
42 | Device* make_device() { |
43 | amlogic_init(); |
44 | load_key_map(); |
45 | fb_set(); |
46 | return new AmlogicDevice(new ScreenRecoveryUI); |
47 | } |
48 | |
49 | |
50 | int num_keys; |
51 | KeyMapItem_t* keys_map; |
52 | |
53 | KeyMapItem_t g_default_keymap[3] = { |
54 | { "select", KEY_ENTER, {KEY_ENTER, KEY_TAB, KEY_BACK, -1, -1, -1} }, |
55 | { "down", KEY_DOWN, {KEY_DOWN, KEY_VOLUMEDOWN, KEY_PAGEDOWN, -1, -1, -1} }, |
56 | { "up", KEY_UP, {KEY_UP, KEY_VOLUMEUP, KEY_PAGEUP, -1, -1, -1} }, |
57 | }; |
58 | |
59 | CtrlInfo_t g_ctrlinfo[3] = { |
60 | { "select", KEY_ENTER }, |
61 | { "down", KEY_DOWN }, |
62 | { "up", KEY_UP }, |
63 | }; |
64 | |
65 | static KeyMapItem_t g_presupposed_keymap[] = { |
66 | { "select", -4, {BTN_MOUSE, BTN_LEFT, -1, -1, -1, -1} } |
67 | }; |
68 | |
69 | #define NUM_PRESUPPOSED_KEY_MAP (sizeof(g_presupposed_keymap) / sizeof(g_presupposed_keymap[0])) |
70 | |
71 | void fb_set() { |
72 | fb_var_screeninfo vi2; |
73 | int fd = open("/dev/graphics/fb0", O_RDWR); |
74 | if (fd == -1) { |
75 | printf("cannot open fb0"); |
76 | } |
77 | |
78 | if (ioctl(fd, FBIOGET_VSCREENINFO, &vi2) < 0) { |
79 | printf("failed to get fb0 info"); |
80 | close(fd); |
81 | } |
82 | |
83 | vi2.nonstd=1; |
84 | vi2.transp.length=0; |
85 | vi2.activate = FB_ACTIVATE_FORCE; |
86 | if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi2) < 0) { |
87 | printf("active fb swap failed"); |
88 | } |
89 | |
90 | close(fd); |
91 | } |
92 | |
93 | |
94 | int getKey(char *key) { |
95 | |
96 | if (key == NULL) { |
97 | return -1; |
98 | } |
99 | |
100 | unsigned int i; |
101 | for (i = 0; i < NUM_CTRLINFO; i++) { |
102 | CtrlInfo_t *info = &g_ctrlinfo[i]; |
103 | if (strcmp(info->type, key) == 0) { |
104 | return info->value; |
105 | } |
106 | } |
107 | return -1; |
108 | } |
109 | |
110 | void load_key_map() { |
111 | FILE* fstab = fopen("/etc/recovery.kl", "r"); |
112 | if (fstab != NULL) { |
113 | printf("loaded /etc/recovery.kl\n"); |
114 | int alloc = 2; |
115 | keys_map = (KeyMapItem_t*)malloc(alloc * sizeof(KeyMapItem_t)); |
116 | |
117 | keys_map[0].type = "down"; |
118 | keys_map[0].value = KEY_DOWN; |
119 | keys_map[0].key[0] = -1; |
120 | keys_map[0].key[1] = -1; |
121 | keys_map[0].key[2] = -1; |
122 | keys_map[0].key[3] = -1; |
123 | keys_map[0].key[4] = -1; |
124 | keys_map[0].key[5] = -1; |
125 | num_keys = 0; |
126 | |
127 | char buffer[1024]; |
128 | int i; |
129 | int value = -1; |
130 | while (fgets(buffer, sizeof(buffer)-1, fstab)) { |
131 | for (i = 0; buffer[i] && isspace(buffer[i]); ++i); |
132 | |
133 | if (buffer[i] == '\0' || buffer[i] == '#') continue; |
134 | |
135 | char* original = strdup(buffer); |
136 | |
137 | char* type = strtok(original+i, " \t\n"); |
138 | char* key1 = strtok(NULL, " \t\n"); |
139 | char* key2 = strtok(NULL, " \t\n"); |
140 | char* key3 = strtok(NULL, " \t\n"); |
141 | char* key4 = strtok(NULL, " \t\n"); |
142 | char* key5 = strtok(NULL, " \t\n"); |
143 | char* key6 = strtok(NULL, " \t\n"); |
144 | |
145 | value = getKey(type); |
146 | if (type && key1 && (value > 0)) { |
147 | while (num_keys >= alloc) { |
148 | alloc *= 2; |
149 | keys_map = (KeyMapItem_t*)realloc(keys_map, alloc*sizeof(KeyMapItem_t)); |
150 | } |
151 | keys_map[num_keys].type = strdup(type); |
152 | keys_map[num_keys].value = value; |
153 | keys_map[num_keys].key[0] = key1?atoi(key1):-1; |
154 | keys_map[num_keys].key[1] = key2?atoi(key2):-1; |
155 | keys_map[num_keys].key[2] = key3?atoi(key3):-1; |
156 | keys_map[num_keys].key[3] = key4?atoi(key4):-1; |
157 | keys_map[num_keys].key[4] = key5?atoi(key5):-1; |
158 | keys_map[num_keys].key[5] = key6?atoi(key6):-1; |
159 | |
160 | ++num_keys; |
161 | } else { |
162 | printf("skipping malformed recovery.lk line: %s\n", original); |
163 | } |
164 | free(original); |
165 | } |
166 | |
167 | fclose(fstab); |
168 | } else { |
169 | printf("failed to open /etc/recovery.kl, use default map\n"); |
170 | num_keys = NUM_DEFAULT_KEY_MAP; |
171 | keys_map = g_default_keymap; |
172 | } |
173 | |
174 | printf("recovery key map table:\n"); |
175 | int i; |
176 | for (i = 0; i < num_keys; ++i) { |
177 | KeyMapItem_t* v = &keys_map[i]; |
178 | printf(" %d type:%s value:%d key:%d %d %d %d %d %d\n", i, v->type, v->value, |
179 | v->key[0], v->key[1], v->key[2], v->key[3], v->key[4], v->key[5]); |
180 | } |
181 | printf("\n"); |
182 | } |
183 | |
184 | int getMapKey(int key) { |
185 | int i,j; |
186 | printf("******getMapKey, key: %d 0x%x\n", key, key); |
187 | for (i = 0; i < num_keys; i++) { |
188 | KeyMapItem_t* v = &keys_map[i]; |
189 | for (j = 0; j < 6; j++) { |
190 | printf("******v->key[%d]=0x%x, value=0x%x\n", j, v->key[j], v->value); |
191 | if (v->key[j] == key) |
192 | return v->value; |
193 | } |
194 | } |
195 | |
196 | for (i = 0; i < (int)NUM_PRESUPPOSED_KEY_MAP; i++) { |
197 | for (j = 0; j < 6; j++) { |
198 | if (g_presupposed_keymap[i].key[j] == key) |
199 | return g_presupposed_keymap[i].value; |
200 | } |
201 | } |
202 | |
203 | return -1; |
204 | } |
205 | |
206 |