summaryrefslogtreecommitdiff
path: root/recovery/ui/amlogic_ui.cpp (plain)
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
37class AmlogicDevice : public Device {
38 public:
39 AmlogicDevice(ScreenRecoveryUI* ui) : Device(ui) { }
40};
41
42Device* make_device() {
43 amlogic_init();
44 load_key_map();
45 fb_set();
46 return new AmlogicDevice(new ScreenRecoveryUI);
47}
48
49
50int num_keys;
51KeyMapItem_t* keys_map;
52
53KeyMapItem_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
59CtrlInfo_t g_ctrlinfo[3] = {
60 { "select", KEY_ENTER },
61 { "down", KEY_DOWN },
62 { "up", KEY_UP },
63};
64
65static 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
71void 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
94int 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
110void 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
184int 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