diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-10-03 18:17:11 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-10-09 12:41:18 -0400 |
commit | aabc8aca47e60cf745a34af28c50679fcb967910 (patch) | |
tree | cfe17f546aae9785fb13482f39527e2da0597ccb /firmware/target/hosted/fiio/button-fiio.c | |
parent | 4231c2c83f2b5331e3e38b10a308ee3752315f9c (diff) | |
download | rockbox-aabc8aca47e60cf745a34af28c50679fcb967910.tar.gz rockbox-aabc8aca47e60cf745a34af28c50679fcb967910.zip |
New port: FiiO M3K
Most credit goes to: Roman Skylarov
Additional integration and refactoring by myself.
*** COMPLETELY UNTESTED ***
Change-Id: Ia64c36d92e0214c6b15f7a868df286f8113ea27b
Diffstat (limited to 'firmware/target/hosted/fiio/button-fiio.c')
-rw-r--r-- | firmware/target/hosted/fiio/button-fiio.c | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/firmware/target/hosted/fiio/button-fiio.c b/firmware/target/hosted/fiio/button-fiio.c new file mode 100644 index 0000000000..fcc7480e11 --- /dev/null +++ b/firmware/target/hosted/fiio/button-fiio.c | |||
@@ -0,0 +1,308 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___ | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * | ||
9 | * Copyright (C) 2017 Marcin Bukat | ||
10 | * Copyright (C) 2019 Roman Stolyarov | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #include <poll.h> | ||
22 | //#include <dir.h> | ||
23 | #include <errno.h> | ||
24 | #include <unistd.h> | ||
25 | #include <sys/types.h> | ||
26 | #include <linux/input.h> | ||
27 | #include <fcntl.h> | ||
28 | #include <string.h> | ||
29 | #include <stdlib.h> | ||
30 | |||
31 | #include "sysfs.h" | ||
32 | #include "button.h" | ||
33 | #include "button-target.h" | ||
34 | #include "panic.h" | ||
35 | |||
36 | #include "kernel.h" | ||
37 | #include "backlight.h" | ||
38 | #include "backlight-target.h" | ||
39 | |||
40 | static int key_enter_delay = 0; | ||
41 | static int key_right_delay = 0; | ||
42 | static int key_left_delay = 0; | ||
43 | static int key_power_delay = 0; | ||
44 | static int key_home_delay = 0; | ||
45 | static int key_backspace_delay = 0; | ||
46 | static int key_leftbrace_delay = 0; | ||
47 | static int key_rightbrace_delay = 0; | ||
48 | static int key_up_delay = 0; | ||
49 | static int key_down_delay = 0; | ||
50 | static int key_f12_delay = 0; | ||
51 | |||
52 | #define NR_POLL_DESC 2 | ||
53 | static struct pollfd poll_fds[NR_POLL_DESC]; | ||
54 | |||
55 | #define DEF_DELAY 5 | ||
56 | |||
57 | static int button_map_on(int keycode) | ||
58 | { | ||
59 | switch(keycode) | ||
60 | { | ||
61 | case KEY_ENTER: | ||
62 | key_enter_delay = DEF_DELAY; | ||
63 | return BUTTON_PLAY; | ||
64 | case KEY_F10: | ||
65 | key_enter_delay = 0; | ||
66 | return BUTTON_PLAY; | ||
67 | |||
68 | case KEY_RIGHT: | ||
69 | key_right_delay = DEF_DELAY; | ||
70 | return BUTTON_VOL_DOWN; | ||
71 | case KEY_F7: | ||
72 | key_right_delay = 0; | ||
73 | return BUTTON_VOL_DOWN; | ||
74 | |||
75 | case KEY_LEFT: | ||
76 | key_left_delay = DEF_DELAY; | ||
77 | return BUTTON_VOL_UP; | ||
78 | case KEY_F6: | ||
79 | key_left_delay = 0; | ||
80 | return BUTTON_VOL_UP; | ||
81 | |||
82 | case KEY_POWER: | ||
83 | key_power_delay = DEF_DELAY; | ||
84 | return BUTTON_POWER; | ||
85 | case KEY_F8: | ||
86 | key_power_delay = 0; | ||
87 | return BUTTON_POWER; | ||
88 | |||
89 | case KEY_HOME: | ||
90 | key_home_delay = DEF_DELAY; | ||
91 | return BUTTON_OPTION; | ||
92 | case KEY_F9: | ||
93 | key_home_delay = 0; | ||
94 | return BUTTON_OPTION; | ||
95 | |||
96 | case KEY_BACKSPACE: | ||
97 | key_backspace_delay = DEF_DELAY; | ||
98 | return BUTTON_HOME; | ||
99 | case KEY_NUMLOCK: | ||
100 | key_backspace_delay = 0; | ||
101 | return BUTTON_HOME; | ||
102 | |||
103 | case KEY_LEFTBRACE: | ||
104 | key_leftbrace_delay = DEF_DELAY; | ||
105 | return BUTTON_PREV; | ||
106 | case KEY_F5: | ||
107 | key_leftbrace_delay = 0; | ||
108 | return BUTTON_PREV; | ||
109 | |||
110 | case KEY_RIGHTBRACE: | ||
111 | key_rightbrace_delay = DEF_DELAY; | ||
112 | return BUTTON_NEXT; | ||
113 | case KEY_F4: | ||
114 | key_rightbrace_delay = 0; | ||
115 | return BUTTON_NEXT; | ||
116 | |||
117 | case KEY_UP: | ||
118 | if (!key_up_delay) key_up_delay = DEF_DELAY; | ||
119 | return BUTTON_UP; | ||
120 | |||
121 | case KEY_DOWN: | ||
122 | if (!key_down_delay) key_down_delay = DEF_DELAY; | ||
123 | return BUTTON_DOWN; | ||
124 | |||
125 | case KEY_F12: | ||
126 | key_f12_delay = DEF_DELAY; | ||
127 | //return BUTTON_UNLOCK; | ||
128 | return 0; | ||
129 | |||
130 | default: | ||
131 | return 0; | ||
132 | } | ||
133 | } | ||
134 | |||
135 | static int button_map_off(int keycode) | ||
136 | { | ||
137 | switch(keycode) | ||
138 | { | ||
139 | case KEY_F10: | ||
140 | return BUTTON_PLAY; | ||
141 | |||
142 | case KEY_F7: | ||
143 | return BUTTON_VOL_DOWN; | ||
144 | |||
145 | case KEY_F6: | ||
146 | return BUTTON_VOL_UP; | ||
147 | |||
148 | case KEY_F8: | ||
149 | return BUTTON_POWER; | ||
150 | |||
151 | case KEY_F9: | ||
152 | return BUTTON_OPTION; | ||
153 | |||
154 | case KEY_NUMLOCK: | ||
155 | return BUTTON_HOME; | ||
156 | |||
157 | case KEY_F5: | ||
158 | return BUTTON_PREV; | ||
159 | |||
160 | case KEY_F4: | ||
161 | return BUTTON_NEXT; | ||
162 | |||
163 | default: | ||
164 | return 0; | ||
165 | } | ||
166 | } | ||
167 | |||
168 | static int button_map_timer(void) | ||
169 | { | ||
170 | int map = 0; | ||
171 | |||
172 | if (key_enter_delay) | ||
173 | { | ||
174 | if (--key_enter_delay == 0) map |= BUTTON_PLAY; | ||
175 | } | ||
176 | if (key_right_delay) | ||
177 | { | ||
178 | if (--key_right_delay == 0) map |= BUTTON_VOL_DOWN; | ||
179 | } | ||
180 | if (key_left_delay) | ||
181 | { | ||
182 | if (--key_left_delay == 0) map |= BUTTON_VOL_UP; | ||
183 | } | ||
184 | if (key_power_delay) | ||
185 | { | ||
186 | if (--key_power_delay == 0) map |= BUTTON_POWER; | ||
187 | } | ||
188 | if (key_home_delay) | ||
189 | { | ||
190 | if (--key_home_delay == 0) map |= BUTTON_OPTION; | ||
191 | } | ||
192 | if (key_backspace_delay) | ||
193 | { | ||
194 | if (--key_backspace_delay == 0) map |= BUTTON_HOME; | ||
195 | } | ||
196 | if (key_leftbrace_delay) | ||
197 | { | ||
198 | if (--key_leftbrace_delay == 0) map |= BUTTON_PREV; | ||
199 | } | ||
200 | if (key_rightbrace_delay) | ||
201 | { | ||
202 | if (--key_rightbrace_delay == 0) map |= BUTTON_NEXT; | ||
203 | } | ||
204 | if (key_up_delay) | ||
205 | { | ||
206 | if (--key_up_delay == 0) map |= BUTTON_UP; | ||
207 | } | ||
208 | if (key_down_delay) | ||
209 | { | ||
210 | if (--key_down_delay == 0) map |= BUTTON_DOWN; | ||
211 | } | ||
212 | if (key_f12_delay) | ||
213 | { | ||
214 | if (--key_f12_delay == 0) map |= 0; //BUTTON_UNLOCK | ||
215 | } | ||
216 | |||
217 | return map; | ||
218 | } | ||
219 | |||
220 | void button_init_device(void) | ||
221 | { | ||
222 | const char * const input_devs[] = { | ||
223 | "/dev/input/event0", | ||
224 | "/dev/input/event1", | ||
225 | }; | ||
226 | |||
227 | for(int i = 0; i < NR_POLL_DESC; i++) | ||
228 | { | ||
229 | int fd = open(input_devs[i], O_RDWR); | ||
230 | |||
231 | if(fd < 0) | ||
232 | { | ||
233 | panicf("Cannot open input device: %s\n", input_devs[i]); | ||
234 | } | ||
235 | |||
236 | poll_fds[i].fd = fd; | ||
237 | poll_fds[i].events = POLLIN; | ||
238 | poll_fds[i].revents = 0; | ||
239 | } | ||
240 | } | ||
241 | |||
242 | int button_read_device(void) | ||
243 | { | ||
244 | static int button_bitmap = 0; | ||
245 | static int map; | ||
246 | struct input_event event; | ||
247 | |||
248 | /* check if there are any events pending and process them */ | ||
249 | while(poll(poll_fds, NR_POLL_DESC, 0)) | ||
250 | { | ||
251 | for(int i = 0; i < NR_POLL_DESC; i++) | ||
252 | { | ||
253 | /* read only if non-blocking */ | ||
254 | if(poll_fds[i].revents & POLLIN) | ||
255 | { | ||
256 | int size = read(poll_fds[i].fd, &event, sizeof(event)); | ||
257 | if(size == (int)sizeof(event)) | ||
258 | { | ||
259 | if(event.type == EV_KEY) | ||
260 | { | ||
261 | int keycode = event.code; | ||
262 | |||
263 | /* event.value == 1 means press | ||
264 | * event.value == 0 means release | ||
265 | */ | ||
266 | bool press = event.value ? true : false; | ||
267 | |||
268 | if(press) | ||
269 | { | ||
270 | map = button_map_on(keycode); | ||
271 | if(map) button_bitmap |= map; | ||
272 | } | ||
273 | else | ||
274 | { | ||
275 | map = button_map_off(keycode); | ||
276 | if(map) button_bitmap &= ~map; | ||
277 | } | ||
278 | } | ||
279 | } | ||
280 | } | ||
281 | } | ||
282 | } | ||
283 | |||
284 | map = button_map_timer(); | ||
285 | if(map) button_bitmap &= ~map; | ||
286 | |||
287 | return button_bitmap; | ||
288 | } | ||
289 | |||
290 | bool headphones_inserted(void) | ||
291 | { | ||
292 | int status = 0; | ||
293 | const char * const sysfs_hs_switch = "/sys/class/misc/axp173/headset_state"; | ||
294 | |||
295 | sysfs_get_int(sysfs_hs_switch, &status); | ||
296 | if (status) return true; | ||
297 | |||
298 | return false; | ||
299 | } | ||
300 | |||
301 | void button_close_device(void) | ||
302 | { | ||
303 | /* close descriptors */ | ||
304 | for(int i = 0; i < NR_POLL_DESC; i++) | ||
305 | { | ||
306 | close(poll_fds[i].fd); | ||
307 | } | ||
308 | } | ||