summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/fiio/button-fiio.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/hosted/fiio/button-fiio.c')
-rw-r--r--firmware/target/hosted/fiio/button-fiio.c308
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
40static int key_enter_delay = 0;
41static int key_right_delay = 0;
42static int key_left_delay = 0;
43static int key_power_delay = 0;
44static int key_home_delay = 0;
45static int key_backspace_delay = 0;
46static int key_leftbrace_delay = 0;
47static int key_rightbrace_delay = 0;
48static int key_up_delay = 0;
49static int key_down_delay = 0;
50static int key_f12_delay = 0;
51
52#define NR_POLL_DESC 2
53static struct pollfd poll_fds[NR_POLL_DESC];
54
55#define DEF_DELAY 5
56
57static 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
135static 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
168static 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
220void 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
242int 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
290bool 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
301void 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}