summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/ibasso/sysfs-ibasso.c
diff options
context:
space:
mode:
authorUdo Schläpfer <rockbox-2014.10@desktopwarrior.net>2015-02-02 21:44:29 +0100
committerUdo Schläpfer <rockbox-2014.10@desktopwarrior.net>2015-02-02 21:57:55 +0100
commitdbabd0d9c34a33bc0c51243ec37f230d117db955 (patch)
tree46de348929ce739702a230a2587fdb5539585753 /firmware/target/hosted/ibasso/sysfs-ibasso.c
parentcef17e3d59ad93f766e8ee23b1610540a33dfe5e (diff)
downloadrockbox-dbabd0d9c34a33bc0c51243ec37f230d117db955.tar.gz
rockbox-dbabd0d9c34a33bc0c51243ec37f230d117db955.zip
iBasso DX50/DX90: Major code cleanup and reorganization.
Reorganization - Separated iBasso devices from PLATFORM_ANDROID. These are now standlone hosted targets. Most device specific code is in the firmware/target/hosted/ibasso directory. - No dependency on Android SDK, only the Android NDK is needed. 32 bit Android NDK and Android API Level 16. - Separate implementation for each device where feasible. Code cleanup - Rewrite of existing code, from simple reformat to complete reimplementation. - New backlight interface, seperating backlight from touchscreen. - Rewrite of device button handler, removing unneeded code and fixing memory leaks. - New Debug messages interface logging to Android adb logcat (DEBUGF, panicf, logf). - Rewrite of lcd device handler, removing unneeded code and fixing memory leaks. - Rewrite of audiohw device handler/pcm interface, removing unneeded code and fixing memory leaks, enabling 44.1/48kHz pthreaded playback. - Rewrite of power and powermng, proper shutdown, using batterylog results (see http://gerrit.rockbox.org/r/#/c/1047/). - Rewrite of configure (Android NDK) and device specific config. - Rewrite of the Android NDK specific Makefile. Misc - All plugins/games/demos activated. - Update tinyalsa to latest from https://github.com/tinyalsa/tinyalsa. Includes - http://gerrit.rockbox.org/r/#/c/993/ - http://gerrit.rockbox.org/r/#/c/1010/ - http://gerrit.rockbox.org/r/#/c/1035/ Does not include http://gerrit.rockbox.org/r/#/c/1007/ due to new backlight interface and new option for hold switch, touchscreen, physical button interaction. Rockbox needs the iBasso DX50/DX90 loader for startup, see http://gerrit.rockbox.org/r/#/c/1099/ The loader expects Rockbox to be installed in /mnt/sdcard/.rockbox/. If /mnt/sdcard/ is accessed as USB mass storage device, Rockbox will exit gracefully and the loader will restart Rockbox on USB disconnect. Tested on iBasso DX50. Compiled (not tested) for iBasso DX90. Compiled (not tested) for PLATFORM_ANDROID. Change-Id: I5f5e22e68f5b4cf29c28e2b40b2c265f2beb7ab7
Diffstat (limited to 'firmware/target/hosted/ibasso/sysfs-ibasso.c')
-rw-r--r--firmware/target/hosted/ibasso/sysfs-ibasso.c404
1 files changed, 404 insertions, 0 deletions
diff --git a/firmware/target/hosted/ibasso/sysfs-ibasso.c b/firmware/target/hosted/ibasso/sysfs-ibasso.c
new file mode 100644
index 0000000000..8ca3edf387
--- /dev/null
+++ b/firmware/target/hosted/ibasso/sysfs-ibasso.c
@@ -0,0 +1,404 @@
1/***************************************************************************
2 * __________ __ ___
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2014 by Ilia Sergachev: Initial Rockbox port to iBasso DX50
10 * Copyright (C) 2014 by Mario Basister: iBasso DX90 port
11 * Copyright (C) 2014 by Simon Rothen: Initial Rockbox repository submission, additional features
12 * Copyright (C) 2014 by Udo Schläpfer: Code clean up, additional features
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
18 *
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
21 *
22 ****************************************************************************/
23
24
25#include <stdio.h>
26#include <string.h>
27
28#include "config.h"
29#include "debug.h"
30
31#include "debug-ibasso.h"
32#include "sysfs-ibasso.h"
33
34
35static const char* SYSFS_PATHS[] =
36{
37 /* SYSFS_DX50_CODEC_VOLUME */
38 "/dev/codec_volume",
39
40 /* SYSFS_HOLDKEY */
41 "/sys/class/axppower/holdkey",
42
43 /* SYSFS_DX90_ES9018_VOLUME */
44 "/sys/class/codec/es9018_volume",
45
46 /* SYSFS_MUTE */
47 "/sys/class/codec/mute",
48
49 /* SYSFS_WM8740_MUTE */
50 "/sys/class/codec/wm8740_mute",
51
52 /* SYSFS_BATTERY_CAPACITY */
53 "/sys/class/power_supply/battery/capacity",
54
55 /* SYSFS_BATTERY_CURRENT_NOW */
56 "/sys/class/power_supply/battery/current_now",
57
58 /* SYSFS_BATTERY_ENERGY_FULL_DESIGN */
59 "/sys/class/power_supply/battery/energy_full_design",
60
61 /* SYSFS_BATTERY_HEALTH */
62 "/sys/class/power_supply/battery/health",
63
64 /* SYSFS_BATTERY_MODEL_NAME */
65 "/sys/class/power_supply/battery/model_name",
66
67 /* SYSFS_BATTERY_ONLINE */
68 "/sys/class/power_supply/battery/online",
69
70 /* SYSFS_BATTERY_PRESENT */
71 "/sys/class/power_supply/battery/present",
72
73 /* SYSFS_BATTERY_STATUS */
74 "/sys/class/power_supply/battery/status",
75
76 /* SYSFS_BATTERY_TECHNOLOGY */
77 "/sys/class/power_supply/battery/technology",
78
79 /* SYSFS_BATTERY_TEMP */
80 "/sys/class/power_supply/battery/temp",
81
82 /* SYSFS_BATTERY_TYPE */
83 "/sys/class/power_supply/battery/type",
84
85 /* SYSFS_BATTERY_VOLTAGE_MAX_DESIGN */
86 "/sys/class/power_supply/battery/voltage_max_design",
87
88 /* SYSFS_BATTERY_VOLTAGE_MIN_DESIGN */
89 "/sys/class/power_supply/battery/voltage_min_design",
90
91 /* SYSFS_BATTERY_VOLTAGE_NOW */
92 "/sys/class/power_supply/battery/voltage_now",
93
94 /* SYSFS_USB_POWER_CURRENT_NOW */
95 "/sys/class/power_supply/usb/current_now",
96
97 /* SYSFS_USB_POWER_ONLINE */
98 "/sys/class/power_supply/usb/online",
99
100 /* SYSFS_USB_POWER_PRESENT */
101 "/sys/class/power_supply/usb/present",
102
103 /* SYSFS_USB_POWER_VOLTAGE_NOW */
104 "/sys/class/power_supply/usb/voltage_now",
105
106 /* SYSFS_BACKLIGHT_POWER */
107 "/sys/devices/platform/rk29_backlight/backlight/rk28_bl/bl_power",
108
109 /* SYSFS_BACKLIGHT_BRIGHTNESS */
110 "/sys/devices/platform/rk29_backlight/backlight/rk28_bl/brightness",
111
112 /* SYSFS_POWER_STATE */
113 "/sys/power/state",
114
115 /* SYSFS_POWER_WAKE_LOCK */
116 "/sys/power/wake_lock"
117};
118
119
120static FILE* open_read(const char* file_name)
121{
122 FILE *f = fopen(file_name, "r");
123 if(f == NULL)
124 {
125 DEBUGF("ERROR %s: Can not open %s for reading.", __func__, file_name);
126 }
127
128 return f;
129}
130
131
132static FILE* open_write(const char* file_name)
133{
134 FILE *f = fopen(file_name, "w");
135 if(f == NULL)
136 {
137 DEBUGF("ERROR %s: Can not open %s for writing.", __func__, file_name);
138 }
139
140 return f;
141}
142
143
144bool sysfs_get_int(enum sys_fs_interface_id id, int* value)
145{
146 *value = -1;
147
148 switch(id)
149 {
150 case SYSFS_BATTERY_CAPACITY:
151 case SYSFS_BATTERY_CURRENT_NOW:
152 case SYSFS_BATTERY_ENERGY_FULL_DESIGN:
153 case SYSFS_BATTERY_ONLINE:
154 case SYSFS_BATTERY_PRESENT:
155 case SYSFS_BATTERY_TEMP:
156 case SYSFS_BATTERY_VOLTAGE_MAX_DESIGN:
157 case SYSFS_BATTERY_VOLTAGE_MIN_DESIGN:
158 case SYSFS_BATTERY_VOLTAGE_NOW:
159 case SYSFS_USB_POWER_CURRENT_NOW:
160 case SYSFS_USB_POWER_VOLTAGE_NOW:
161 case SYSFS_USB_POWER_ONLINE:
162 case SYSFS_USB_POWER_PRESENT:
163 {
164 break;
165 }
166
167 default:
168 {
169 DEBUGF("ERROR %s: Unknown interface id: %d.", __func__, id);
170 return false;
171 }
172 }
173
174 const char* interface = SYSFS_PATHS[id];
175
176 /*DEBUGF("%s: interface: %s.", __func__, interface);*/
177
178 FILE *f = open_read(interface);
179 if(f == NULL)
180 {
181 return false;
182 }
183
184 bool success = true;
185 if(fscanf(f, "%d", value) == EOF)
186 {
187 DEBUGF("ERROR %s: Read failed for %s.", __func__, interface);
188 success = false;
189 }
190
191 fclose(f);
192 return success;
193}
194
195
196bool sysfs_set_int(enum sys_fs_interface_id id, int value)
197{
198 switch(id)
199 {
200 case SYSFS_BACKLIGHT_POWER:
201 case SYSFS_BACKLIGHT_BRIGHTNESS:
202 case SYSFS_DX50_CODEC_VOLUME:
203 case SYSFS_DX90_ES9018_VOLUME:
204 {
205 break;
206 }
207
208 default:
209 {
210 DEBUGF("ERROR %s: Unknown interface id: %d.", __func__, id);
211 return false;
212 }
213 }
214
215 const char* interface = SYSFS_PATHS[id];
216
217 /*DEBUGF("%s: interface: %s, value: %d.", __func__, interface, value);*/
218
219 FILE *f = open_write(interface);
220 if(f == NULL)
221 {
222 return false;
223 }
224
225 bool success = true;
226 if(fprintf(f, "%d", value) < 1)
227 {
228 DEBUGF("ERROR %s: Write failed for %s.", __func__, interface);
229 success = false;
230 }
231
232 fclose(f);
233 return success;
234}
235
236
237bool sysfs_get_char(enum sys_fs_interface_id id, char* value)
238{
239 *value = '\0';
240
241 switch(id)
242 {
243 case SYSFS_HOLDKEY:
244 {
245 break;
246 }
247
248 default:
249 {
250 DEBUGF("ERROR %s: Unknown interface id: %d.", __func__, id);
251 return false;
252 }
253 }
254
255 const char* interface = SYSFS_PATHS[id];
256
257 /*DEBUGF("%s: interface: %s.", __func__, interface);*/
258
259 FILE *f = open_read(interface);
260 if(f == NULL)
261 {
262 return false;
263 }
264
265 bool success = true;
266 if(fscanf(f, "%c", value) == EOF)
267 {
268 DEBUGF("ERROR %s: Read failed for %s.", __func__, interface);
269 success = false;
270 }
271
272 fclose(f);
273 return success;
274}
275
276
277bool sysfs_set_char(enum sys_fs_interface_id id, char value)
278{
279 switch(id)
280 {
281 case SYSFS_MUTE:
282 case SYSFS_WM8740_MUTE:
283 {
284 break;
285 }
286
287 default:
288 {
289 DEBUGF("ERROR %s: Unknown interface id: %d.", __func__, id);
290 return false;
291 }
292 }
293
294 const char* interface = SYSFS_PATHS[id];
295
296 /*DEBUGF("%s: interface: %s, value: %c.", __func__, interface, value);*/
297
298 FILE *f = open_write(interface);
299 if(f == NULL)
300 {
301 return false;
302 }
303
304 bool success = true;
305 if(fprintf(f, "%c", value) < 1)
306 {
307 DEBUGF("ERROR %s: Write failed for %s.", __func__, interface);
308 success = false;
309 }
310
311 fclose(f);
312 return success;
313}
314
315
316bool sysfs_get_string(enum sys_fs_interface_id id, char* value, int size)
317{
318 value[0] = '\0';
319
320 switch(id)
321 {
322 case SYSFS_BATTERY_STATUS:
323 case SYSFS_BATTERY_HEALTH:
324 case SYSFS_BATTERY_MODEL_NAME:
325 case SYSFS_BATTERY_TECHNOLOGY:
326 case SYSFS_BATTERY_TYPE:
327 {
328 break;
329 }
330
331 default:
332 {
333 DEBUGF("ERROR %s: Unknown interface id: %d.", __func__, id);
334 return false;
335 }
336 }
337
338 const char* interface = SYSFS_PATHS[id];
339
340 /*DEBUGF("%s: interface: %s, size: %d.", __func__, interface, size);*/
341
342 FILE *f = open_read(interface);
343 if(f == NULL)
344 {
345 return false;
346 }
347
348 bool success = true;
349 if(fgets(value, size, f) == NULL)
350 {
351 DEBUGF("ERROR %s: Read failed for %s.", __func__, interface);
352 success = false;
353 }
354 else
355 {
356 size_t length = strlen(value);
357 if((length > 0) && value[length - 1] == '\n')
358 {
359 value[length - 1] = '\0';
360 }
361 }
362
363 fclose(f);
364 return success;
365}
366
367
368bool sysfs_set_string(enum sys_fs_interface_id id, char* value)
369{
370 switch(id)
371 {
372 case SYSFS_POWER_STATE:
373 case SYSFS_POWER_WAKE_LOCK:
374 {
375 break;
376 }
377
378 default:
379 {
380 DEBUGF("ERROR %s: Unknown interface id: %d.", __func__, id);
381 return false;
382 }
383 }
384
385 const char* interface = SYSFS_PATHS[id];
386
387 /*DEBUGF("%s: interface: %s, value: %s.", __func__, interface, value);*/
388
389 FILE *f = open_write(interface);
390 if(f == NULL)
391 {
392 return false;
393 }
394
395 bool success = true;
396 if(fprintf(f, "%s", value) < 1)
397 {
398 DEBUGF("ERROR %s: Write failed for %s.", __func__, interface);
399 success = false;
400 }
401
402 fclose(f);
403 return success;
404}