summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2018-11-05 13:01:55 +0100
committerSolomon Peachy <pizza@shaftnet.org>2020-04-06 18:15:41 +0200
commit180cef835bf40d0081895773aaa637ac926bb0ac (patch)
tree48c380d76c0ea40931cb5e863b40fc5dfa1ecba4
parentced3a20aacf26642ccc3ffd136f64247c67e5769 (diff)
downloadrockbox-180cef835bf40d0081895773aaa637ac926bb0ac.tar.gz
rockbox-180cef835bf40d0081895773aaa637ac926bb0ac.zip
xDuoo X3II and X20 port
Provided by Roman Stolyarov Integration, Refactoring, and Upstreaming by Solomon Peachy X3II confirmed working by forum tester, X20 is nearly identical. This includes bootloader, main firmware, and the flash image patcher. Eventual Todo: * Further refactor AGPTek Rocker & xduoo hiby bootloaders * Further refactor AGPTek Rocker & xduoo hosted platform code Change-Id: I34a674051d368efcc75d1d18c725971fe46c3eee
-rw-r--r--apps/SOURCES4
-rw-r--r--apps/bitmaps/native/SOURCES4
-rw-r--r--apps/bitmaps/native/hibyicon.130x130x16.bmpbin0 -> 51016 bytes
-rw-r--r--apps/keymaps/keymap-xduoox20.c213
-rw-r--r--apps/keymaps/keymap-xduoox3ii.c213
-rw-r--r--apps/plugins/battery_bench.c12
-rw-r--r--apps/plugins/blackjack.c32
-rw-r--r--apps/plugins/brickmania.c20
-rw-r--r--apps/plugins/calculator.c22
-rw-r--r--apps/plugins/calendar.c20
-rw-r--r--apps/plugins/chessbox/chessbox_pgn.h28
-rw-r--r--apps/plugins/chessclock.c20
-rw-r--r--apps/plugins/chip8.c16
-rw-r--r--apps/plugins/chopper.c10
-rw-r--r--apps/plugins/clix.c16
-rw-r--r--apps/plugins/cube.c20
-rw-r--r--apps/plugins/doom/i_video.c22
-rw-r--r--apps/plugins/fft/fft.c18
-rw-r--r--apps/plugins/flipit.c24
-rw-r--r--apps/plugins/fractals/fractal.h24
-rw-r--r--apps/plugins/goban/goban.h24
-rw-r--r--apps/plugins/imageviewer/imageviewer_button.h30
-rw-r--r--apps/plugins/invadrox.c14
-rw-r--r--apps/plugins/jewels.c20
-rw-r--r--apps/plugins/lib/keymaps.h16
-rw-r--r--apps/plugins/lib/pluginlib_actions.c30
-rw-r--r--apps/plugins/midi/midiplay.c16
-rw-r--r--apps/plugins/minesweeper.c26
-rw-r--r--apps/plugins/mp3_encoder.c13
-rw-r--r--apps/plugins/mpegplayer/mpeg_settings.c20
-rw-r--r--apps/plugins/mpegplayer/mpegplayer.c18
-rw-r--r--apps/plugins/oscilloscope.c29
-rw-r--r--apps/plugins/pacbox/pacbox.h19
-rw-r--r--apps/plugins/pegbox.c34
-rw-r--r--apps/plugins/pong.c16
-rw-r--r--apps/plugins/reversi/reversi-gui.h22
-rw-r--r--apps/plugins/rockblox.c24
-rw-r--r--apps/plugins/rockboy/rockboy.c20
-rw-r--r--apps/plugins/sliding_puzzle.c19
-rw-r--r--apps/plugins/snake.c16
-rw-r--r--apps/plugins/snake2.c18
-rw-r--r--apps/plugins/sokoban.c32
-rw-r--r--apps/plugins/solitaire.c38
-rw-r--r--apps/plugins/spacerocks.c18
-rw-r--r--apps/plugins/star.c32
-rw-r--r--apps/plugins/stopwatch.c16
-rw-r--r--apps/plugins/sudoku/sudoku.h28
-rw-r--r--apps/plugins/text_viewer/tv_button.h24
-rw-r--r--apps/plugins/vu_meter.c22
-rw-r--r--apps/plugins/wormlet.c18
-rw-r--r--apps/plugins/xobox.c18
-rw-r--r--apps/plugins/zxbox/keymaps.h16
-rw-r--r--apps/plugins/zxbox/zxbox_keyb.c18
-rw-r--r--bootloader/SOURCES2
-rw-r--r--bootloader/rocker_linux.c4
-rw-r--r--bootloader/xduoo_linux.c555
-rw-r--r--firmware/SOURCES38
-rw-r--r--firmware/asm/SOURCES2
-rw-r--r--firmware/drivers/audio/xduoolinux_codec.c122
-rw-r--r--firmware/export/audiohw.h2
-rw-r--r--firmware/export/config.h6
-rw-r--r--firmware/export/config/agptekrocker.h2
-rw-r--r--firmware/export/config/xduoox20.h126
-rw-r--r--firmware/export/config/xduoox3ii.h126
-rw-r--r--firmware/export/rbpaths.h2
-rw-r--r--firmware/export/xduoolinux_codec.h7
-rw-r--r--firmware/target/hosted/backlight-target.h (renamed from firmware/target/hosted/agptek/backlight-target.h)0
-rw-r--r--firmware/target/hosted/backlight-unix.c (renamed from firmware/target/hosted/agptek/backlight-agptek.c)0
-rw-r--r--firmware/target/hosted/filesystem-app.c6
-rw-r--r--firmware/target/hosted/rtc.c2
-rw-r--r--firmware/target/hosted/sdl/sim-ui-defines.h16
-rw-r--r--firmware/target/hosted/sysfs.c (renamed from firmware/target/hosted/agptek/sysfs.c)0
-rw-r--r--firmware/target/hosted/sysfs.h (renamed from firmware/target/hosted/agptek/sysfs.h)0
-rw-r--r--firmware/target/hosted/system-hosted.c (renamed from firmware/target/hosted/agptek/system-agptek.c)0
-rw-r--r--firmware/target/hosted/xduoo/adc-target.h0
-rw-r--r--firmware/target/hosted/xduoo/button-target.h46
-rw-r--r--firmware/target/hosted/xduoo/button-xduoo.c202
-rw-r--r--firmware/target/hosted/xduoo/debug-xduoo.c6
-rw-r--r--firmware/target/hosted/xduoo/lcd-target.h32
-rw-r--r--firmware/target/hosted/xduoo/lcd-xduoo.c140
-rw-r--r--firmware/target/hosted/xduoo/power-xduoo.c74
-rw-r--r--firmware/target/hosted/xduoo/power-xduoo.h31
-rw-r--r--firmware/target/hosted/xduoo/powermgmt-xduoo.c70
-rw-r--r--firmware/target/hosted/xduoo/system-target.h28
-rw-r--r--firmware/target/hosted/xduoo/usb-xduoo.c118
-rw-r--r--firmware/target/hosted/xduoo/xduoo.make52
-rwxr-xr-xtools/configure92
-rw-r--r--tools/root.make6
88 files changed, 3333 insertions, 44 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index 67fe678287..20e6fa9d2d 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -323,4 +323,8 @@ keymaps/keymap-dx50.c
323keymaps/keymap-agptekrocker.c 323keymaps/keymap-agptekrocker.c
324#elif CONFIG_KEYPAD == XDUOO_X3_PAD 324#elif CONFIG_KEYPAD == XDUOO_X3_PAD
325keymaps/keymap-xduoox3.c 325keymaps/keymap-xduoox3.c
326#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
327keymaps/keymap-xduoox3ii.c
328#elif CONFIG_KEYPAD == XDUOO_X20_PAD
329keymaps/keymap-xduoox20.c
326#endif 330#endif
diff --git a/apps/bitmaps/native/SOURCES b/apps/bitmaps/native/SOURCES
index ea726d4c07..f74f289214 100644
--- a/apps/bitmaps/native/SOURCES
+++ b/apps/bitmaps/native/SOURCES
@@ -48,6 +48,10 @@ toolsicon.130x130x16.bmp
48hibyicon.70x70x16.bmp 48hibyicon.70x70x16.bmp
49rockboxicon.70x70x16.bmp 49rockboxicon.70x70x16.bmp
50toolsicon.70x70x16.bmp 50toolsicon.70x70x16.bmp
51#elif (defined(XDUOO_X3II) || defined(XDUOO_X20))
52hibyicon.130x130x16.bmp
53rockboxicon.130x130x16.bmp
54toolsicon.130x130x16.bmp
51#endif 55#endif
52#endif 56#endif
53 57
diff --git a/apps/bitmaps/native/hibyicon.130x130x16.bmp b/apps/bitmaps/native/hibyicon.130x130x16.bmp
new file mode 100644
index 0000000000..0c31b90e28
--- /dev/null
+++ b/apps/bitmaps/native/hibyicon.130x130x16.bmp
Binary files differ
diff --git a/apps/keymaps/keymap-xduoox20.c b/apps/keymaps/keymap-xduoox20.c
new file mode 100644
index 0000000000..3b1b01b7fa
--- /dev/null
+++ b/apps/keymaps/keymap-xduoox20.c
@@ -0,0 +1,213 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2018 by 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
22/* Button Code Definitions for xDuoo X20 target */
23
24#include "config.h"
25#include "action.h"
26#include "button.h"
27#include "settings.h"
28
29/* {Action Code, Button code, Prereq button code } */
30
31/*
32 * The format of the list is as follows
33 * { Action Code, Button code, Prereq button code }
34 * if there's no need to check the previous button's value, use BUTTON_NONE
35 * Insert LAST_ITEM_IN_LIST at the end of each mapping
36 */
37static const struct button_mapping button_context_standard[] = {
38 { ACTION_STD_PREV, BUTTON_PREV, BUTTON_NONE },
39 { ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
40 { ACTION_STD_NEXT, BUTTON_NEXT, BUTTON_NONE },
41 { ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
42 { ACTION_STD_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
43 { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
44 { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
45 { ACTION_STD_MENU, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
46
47 LAST_ITEM_IN_LIST
48}; /* button_context_standard */
49
50static const struct button_mapping button_context_wps[] = {
51 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
52 { ACTION_WPS_SKIPPREV, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
53 { ACTION_WPS_SEEKBACK, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
54 { ACTION_WPS_STOPSEEK, BUTTON_PREV|BUTTON_REL, BUTTON_PREV|BUTTON_REPEAT },
55 { ACTION_WPS_SKIPNEXT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
56 { ACTION_WPS_SEEKFWD, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
57 { ACTION_WPS_STOPSEEK, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT|BUTTON_REPEAT },
58 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
59 { ACTION_WPS_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
60 { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
61 { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
62 { ACTION_WPS_BROWSE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
63 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
64 { ACTION_WPS_MENU, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
65 { ACTION_WPS_QUICKSCREEN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
66 { ACTION_WPS_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
67
68 LAST_ITEM_IN_LIST
69}; /* button_context_wps */
70
71static const struct button_mapping button_context_list[] = {
72 { ACTION_LIST_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
73 { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
74 { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
75 { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
76
77 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
78}; /* button_context_list */
79
80/** Bookmark Screen **/
81static const struct button_mapping button_context_bmark[] = {
82 { ACTION_BMS_DELETE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
83
84 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
85}; /* button_context_bmark */
86
87/** Keyboard **/
88static const struct button_mapping button_context_keyboard[] = {
89 { ACTION_KBD_LEFT, BUTTON_PREV, BUTTON_NONE },
90 { ACTION_KBD_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
91 { ACTION_KBD_RIGHT, BUTTON_NEXT, BUTTON_NONE },
92 { ACTION_KBD_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
93 { ACTION_KBD_DOWN, BUTTON_OPTION, BUTTON_NONE },
94 { ACTION_KBD_DOWN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE },
95 { ACTION_KBD_CURSOR_LEFT, BUTTON_VOL_UP, BUTTON_NONE },
96 { ACTION_KBD_CURSOR_LEFT, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
97 { ACTION_KBD_CURSOR_RIGHT, BUTTON_VOL_DOWN, BUTTON_NONE },
98 { ACTION_KBD_CURSOR_RIGHT, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
99 { ACTION_KBD_BACKSPACE, BUTTON_HOME, BUTTON_NONE },
100 { ACTION_KBD_BACKSPACE, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE },
101 { ACTION_KBD_SELECT, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
102 { ACTION_KBD_DONE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
103 { ACTION_KBD_ABORT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
104
105 LAST_ITEM_IN_LIST
106}; /* button_context_keyboard */
107
108/** Pitchscreen **/
109static const struct button_mapping button_context_pitchscreen[] = {
110 { ACTION_PS_INC_SMALL, BUTTON_VOL_UP, BUTTON_NONE },
111 { ACTION_PS_INC_BIG, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
112 { ACTION_PS_DEC_SMALL, BUTTON_VOL_DOWN, BUTTON_NONE },
113 { ACTION_PS_DEC_BIG, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
114 { ACTION_PS_NUDGE_LEFT, BUTTON_PREV, BUTTON_NONE },
115 { ACTION_PS_NUDGE_LEFTOFF, BUTTON_PREV|BUTTON_REL, BUTTON_NONE },
116 { ACTION_PS_NUDGE_RIGHT, BUTTON_NEXT, BUTTON_NONE },
117 { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_NEXT|BUTTON_REL, BUTTON_NONE },
118 { ACTION_PS_TOGGLE_MODE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE },
119 { ACTION_PS_RESET, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
120 { ACTION_PS_EXIT, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
121 { ACTION_PS_SLOWER, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
122 { ACTION_PS_FASTER, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
123
124 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
125}; /* button_context_pitchscreen */
126
127/** Quickscreen **/
128static const struct button_mapping button_context_quickscreen[] = {
129 { ACTION_QS_TOP, BUTTON_VOL_UP, BUTTON_NONE },
130 { ACTION_QS_TOP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
131 { ACTION_QS_DOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
132 { ACTION_QS_DOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
133 { ACTION_QS_LEFT, BUTTON_PREV, BUTTON_NONE },
134 { ACTION_QS_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
135 { ACTION_QS_RIGHT, BUTTON_NEXT, BUTTON_NONE },
136 { ACTION_QS_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
137 { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
138
139 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
140}; /* button_context_quickscreen */
141
142/** Settings - General Mappings **/
143static const struct button_mapping button_context_settings[] = {
144 { ACTION_SETTINGS_RESET, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
145 { ACTION_STD_PREV, BUTTON_PREV, BUTTON_NONE },
146 { ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
147 { ACTION_STD_NEXT, BUTTON_NEXT, BUTTON_NONE },
148 { ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
149 { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
150 { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
151
152 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
153}; /* button_context_settings */
154
155static const struct button_mapping button_context_settings_vol_is_inc[] = {
156 { ACTION_SETTINGS_INC, BUTTON_VOL_UP, BUTTON_NONE },
157 { ACTION_SETTINGS_INCREPEAT,BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
158 { ACTION_SETTINGS_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
159 { ACTION_SETTINGS_DECREPEAT,BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
160
161 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
162}; /* button_context_settings_right_is_inc */
163
164/** Tree **/
165static const struct button_mapping button_context_tree[] = {
166 { ACTION_TREE_WPS, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
167 { ACTION_TREE_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
168 { ACTION_STD_MENU, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
169
170 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
171}; /* button_context_tree */
172
173/** Yes/No Screen **/
174static const struct button_mapping button_context_yesnoscreen[] = {
175 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
176
177 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
178}; /* button_context_settings_yesnoscreen */
179
180/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
181const struct button_mapping* get_context_mapping(int context)
182{
183 switch (context)
184 {
185 case CONTEXT_LIST:
186 return button_context_list;
187 case CONTEXT_STD:
188 return button_context_standard;
189 case CONTEXT_BOOKMARKSCREEN:
190 return button_context_bmark;
191 case CONTEXT_KEYBOARD:
192 return button_context_keyboard;
193 case CONTEXT_PITCHSCREEN:
194 return button_context_pitchscreen;
195 case CONTEXT_QUICKSCREEN:
196 return button_context_quickscreen;
197 case CONTEXT_SETTINGS:
198 return button_context_settings;
199 case CONTEXT_SETTINGS_TIME:
200 case CONTEXT_SETTINGS_COLOURCHOOSER:
201 case CONTEXT_SETTINGS_EQ:
202 case CONTEXT_SETTINGS_RECTRIGGER:
203 return button_context_settings_vol_is_inc;
204 case CONTEXT_TREE:
205 case CONTEXT_MAINMENU:
206 return button_context_tree;
207 case CONTEXT_WPS:
208 return button_context_wps;
209 case CONTEXT_YESNOSCREEN:
210 return button_context_yesnoscreen;
211 }
212 return button_context_standard;
213}
diff --git a/apps/keymaps/keymap-xduoox3ii.c b/apps/keymaps/keymap-xduoox3ii.c
new file mode 100644
index 0000000000..d30efaed2c
--- /dev/null
+++ b/apps/keymaps/keymap-xduoox3ii.c
@@ -0,0 +1,213 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2018 by 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
22/* Button Code Definitions for xDuoo X3ii target */
23
24#include "config.h"
25#include "action.h"
26#include "button.h"
27#include "settings.h"
28
29/* {Action Code, Button code, Prereq button code } */
30
31/*
32 * The format of the list is as follows
33 * { Action Code, Button code, Prereq button code }
34 * if there's no need to check the previous button's value, use BUTTON_NONE
35 * Insert LAST_ITEM_IN_LIST at the end of each mapping
36 */
37static const struct button_mapping button_context_standard[] = {
38 { ACTION_STD_PREV, BUTTON_PREV, BUTTON_NONE },
39 { ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
40 { ACTION_STD_NEXT, BUTTON_NEXT, BUTTON_NONE },
41 { ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
42 { ACTION_STD_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
43 { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
44 { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
45 { ACTION_STD_MENU, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
46
47 LAST_ITEM_IN_LIST
48}; /* button_context_standard */
49
50static const struct button_mapping button_context_wps[] = {
51 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
52 { ACTION_WPS_SKIPPREV, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
53 { ACTION_WPS_SEEKBACK, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
54 { ACTION_WPS_STOPSEEK, BUTTON_PREV|BUTTON_REL, BUTTON_PREV|BUTTON_REPEAT },
55 { ACTION_WPS_SKIPNEXT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
56 { ACTION_WPS_SEEKFWD, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
57 { ACTION_WPS_STOPSEEK, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT|BUTTON_REPEAT },
58 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
59 { ACTION_WPS_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
60 { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
61 { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
62 { ACTION_WPS_BROWSE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
63 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
64 { ACTION_WPS_MENU, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
65 { ACTION_WPS_QUICKSCREEN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
66 { ACTION_WPS_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
67
68 LAST_ITEM_IN_LIST
69}; /* button_context_wps */
70
71static const struct button_mapping button_context_list[] = {
72 { ACTION_LIST_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
73 { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
74 { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
75 { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
76
77 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
78}; /* button_context_list */
79
80/** Bookmark Screen **/
81static const struct button_mapping button_context_bmark[] = {
82 { ACTION_BMS_DELETE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
83
84 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
85}; /* button_context_bmark */
86
87/** Keyboard **/
88static const struct button_mapping button_context_keyboard[] = {
89 { ACTION_KBD_LEFT, BUTTON_PREV, BUTTON_NONE },
90 { ACTION_KBD_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
91 { ACTION_KBD_RIGHT, BUTTON_NEXT, BUTTON_NONE },
92 { ACTION_KBD_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
93 { ACTION_KBD_DOWN, BUTTON_OPTION, BUTTON_NONE },
94 { ACTION_KBD_DOWN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE },
95 { ACTION_KBD_CURSOR_LEFT, BUTTON_VOL_UP, BUTTON_NONE },
96 { ACTION_KBD_CURSOR_LEFT, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
97 { ACTION_KBD_CURSOR_RIGHT, BUTTON_VOL_DOWN, BUTTON_NONE },
98 { ACTION_KBD_CURSOR_RIGHT, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
99 { ACTION_KBD_BACKSPACE, BUTTON_HOME, BUTTON_NONE },
100 { ACTION_KBD_BACKSPACE, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE },
101 { ACTION_KBD_SELECT, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
102 { ACTION_KBD_DONE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
103 { ACTION_KBD_ABORT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
104
105 LAST_ITEM_IN_LIST
106}; /* button_context_keyboard */
107
108/** Pitchscreen **/
109static const struct button_mapping button_context_pitchscreen[] = {
110 { ACTION_PS_INC_SMALL, BUTTON_VOL_UP, BUTTON_NONE },
111 { ACTION_PS_INC_BIG, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
112 { ACTION_PS_DEC_SMALL, BUTTON_VOL_DOWN, BUTTON_NONE },
113 { ACTION_PS_DEC_BIG, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
114 { ACTION_PS_NUDGE_LEFT, BUTTON_PREV, BUTTON_NONE },
115 { ACTION_PS_NUDGE_LEFTOFF, BUTTON_PREV|BUTTON_REL, BUTTON_NONE },
116 { ACTION_PS_NUDGE_RIGHT, BUTTON_NEXT, BUTTON_NONE },
117 { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_NEXT|BUTTON_REL, BUTTON_NONE },
118 { ACTION_PS_TOGGLE_MODE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE },
119 { ACTION_PS_RESET, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
120 { ACTION_PS_EXIT, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
121 { ACTION_PS_SLOWER, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
122 { ACTION_PS_FASTER, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
123
124 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
125}; /* button_context_pitchscreen */
126
127/** Quickscreen **/
128static const struct button_mapping button_context_quickscreen[] = {
129 { ACTION_QS_TOP, BUTTON_VOL_UP, BUTTON_NONE },
130 { ACTION_QS_TOP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
131 { ACTION_QS_DOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
132 { ACTION_QS_DOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
133 { ACTION_QS_LEFT, BUTTON_PREV, BUTTON_NONE },
134 { ACTION_QS_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
135 { ACTION_QS_RIGHT, BUTTON_NEXT, BUTTON_NONE },
136 { ACTION_QS_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
137 { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
138
139 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
140}; /* button_context_quickscreen */
141
142/** Settings - General Mappings **/
143static const struct button_mapping button_context_settings[] = {
144 { ACTION_SETTINGS_RESET, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
145 { ACTION_STD_PREV, BUTTON_PREV, BUTTON_NONE },
146 { ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
147 { ACTION_STD_NEXT, BUTTON_NEXT, BUTTON_NONE },
148 { ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
149 { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
150 { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
151
152 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
153}; /* button_context_settings */
154
155static const struct button_mapping button_context_settings_vol_is_inc[] = {
156 { ACTION_SETTINGS_INC, BUTTON_VOL_UP, BUTTON_NONE },
157 { ACTION_SETTINGS_INCREPEAT,BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
158 { ACTION_SETTINGS_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
159 { ACTION_SETTINGS_DECREPEAT,BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
160
161 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
162}; /* button_context_settings_right_is_inc */
163
164/** Tree **/
165static const struct button_mapping button_context_tree[] = {
166 { ACTION_TREE_WPS, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
167 { ACTION_TREE_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
168 { ACTION_STD_MENU, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
169
170 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
171}; /* button_context_tree */
172
173/** Yes/No Screen **/
174static const struct button_mapping button_context_yesnoscreen[] = {
175 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
176
177 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
178}; /* button_context_settings_yesnoscreen */
179
180/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
181const struct button_mapping* get_context_mapping(int context)
182{
183 switch (context)
184 {
185 case CONTEXT_LIST:
186 return button_context_list;
187 case CONTEXT_STD:
188 return button_context_standard;
189 case CONTEXT_BOOKMARKSCREEN:
190 return button_context_bmark;
191 case CONTEXT_KEYBOARD:
192 return button_context_keyboard;
193 case CONTEXT_PITCHSCREEN:
194 return button_context_pitchscreen;
195 case CONTEXT_QUICKSCREEN:
196 return button_context_quickscreen;
197 case CONTEXT_SETTINGS:
198 return button_context_settings;
199 case CONTEXT_SETTINGS_TIME:
200 case CONTEXT_SETTINGS_COLOURCHOOSER:
201 case CONTEXT_SETTINGS_EQ:
202 case CONTEXT_SETTINGS_RECTRIGGER:
203 return button_context_settings_vol_is_inc;
204 case CONTEXT_TREE:
205 case CONTEXT_MAINMENU:
206 return button_context_tree;
207 case CONTEXT_WPS:
208 return button_context_wps;
209 case CONTEXT_YESNOSCREEN:
210 return button_context_yesnoscreen;
211 }
212 return button_context_standard;
213}
diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c
index 21b2ce4963..f24ad579e8 100644
--- a/apps/plugins/battery_bench.c
+++ b/apps/plugins/battery_bench.c
@@ -298,6 +298,18 @@
298#define BATTERY_ON_TXT "PLAY - start" 298#define BATTERY_ON_TXT "PLAY - start"
299#define BATTERY_OFF_TXT "POWER" 299#define BATTERY_OFF_TXT "POWER"
300 300
301#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
302#define BATTERY_ON BUTTON_PLAY
303#define BATTERY_OFF BUTTON_POWER
304#define BATTERY_ON_TXT "Play - start"
305#define BATTERY_OFF_TXT "POWER"
306
307#elif CONFIG_KEYPAD == XDUOO_X20_PAD
308#define BATTERY_ON BUTTON_PLAY
309#define BATTERY_OFF BUTTON_POWER
310#define BATTERY_ON_TXT "Play - start"
311#define BATTERY_OFF_TXT "POWER"
312
301#else 313#else
302#error No keymap defined! 314#error No keymap defined!
303#endif 315#endif
diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c
index 52881f0af2..4511d3fad5 100644
--- a/apps/plugins/blackjack.c
+++ b/apps/plugins/blackjack.c
@@ -589,6 +589,38 @@ enum {
589#define BJACK_RIGHT BUTTON_NEXT 589#define BJACK_RIGHT BUTTON_NEXT
590#define BJACK_LEFT BUTTON_PREV 590#define BJACK_LEFT BUTTON_PREV
591 591
592#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
593#define BJACK_SELECT_NAME "PLAY"
594#define BJACK_STAY_NAME "NEXT"
595#define BJACK_QUIT_NAME "POWER"
596#define BJACK_DOUBLE_NAME "PREV"
597#define BJACK_SELECT BUTTON_PLAY
598#define BJACK_QUIT BUTTON_POWER
599#define BJACK_MAX BUTTON_VOL_UP
600#define BJACK_MIN BUTTON_VOL_DOWN
601#define BJACK_STAY BUTTON_NEXT
602#define BJACK_DOUBLEDOWN BUTTON_PREV
603#define BJACK_UP BUTTON_HOME
604#define BJACK_DOWN BUTTON_OPTION
605#define BJACK_RIGHT BUTTON_NEXT
606#define BJACK_LEFT BUTTON_PREV
607
608#elif CONFIG_KEYPAD == XDUOO_X20_PAD
609#define BJACK_SELECT_NAME "PLAY"
610#define BJACK_STAY_NAME "NEXT"
611#define BJACK_QUIT_NAME "POWER"
612#define BJACK_DOUBLE_NAME "PREV"
613#define BJACK_SELECT BUTTON_PLAY
614#define BJACK_QUIT BUTTON_POWER
615#define BJACK_MAX BUTTON_VOL_UP
616#define BJACK_MIN BUTTON_VOL_DOWN
617#define BJACK_STAY BUTTON_NEXT
618#define BJACK_DOUBLEDOWN BUTTON_PREV
619#define BJACK_UP BUTTON_HOME
620#define BJACK_DOWN BUTTON_OPTION
621#define BJACK_RIGHT BUTTON_NEXT
622#define BJACK_LEFT BUTTON_PREV
623
592#elif CONFIG_KEYPAD == IHIFI_770_PAD 624#elif CONFIG_KEYPAD == IHIFI_770_PAD
593#define BJACK_SELECT_NAME "PLAY" 625#define BJACK_SELECT_NAME "PLAY"
594#define BJACK_STAY_NAME "NEXT" 626#define BJACK_STAY_NAME "NEXT"
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
index f7c9f9adf2..c5d74bcf37 100644
--- a/apps/plugins/brickmania.c
+++ b/apps/plugins/brickmania.c
@@ -342,6 +342,26 @@ CONFIG_KEYPAD == SANSA_CONNECT_PAD
342#define UP BUTTON_HOME 342#define UP BUTTON_HOME
343#define DOWN BUTTON_OPTION 343#define DOWN BUTTON_OPTION
344 344
345#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
346#define QUIT BUTTON_POWER
347#define LEFT BUTTON_PREV
348#define RIGHT BUTTON_NEXT
349#define ALTLEFT BUTTON_VOL_DOWN
350#define ALTRIGHT BUTTON_VOL_UP
351#define SELECT BUTTON_PLAY
352#define UP BUTTON_HOME
353#define DOWN BUTTON_OPTION
354
355#elif CONFIG_KEYPAD == XDUOO_X20_PAD
356#define QUIT BUTTON_POWER
357#define LEFT BUTTON_PREV
358#define RIGHT BUTTON_NEXT
359#define ALTLEFT BUTTON_VOL_DOWN
360#define ALTRIGHT BUTTON_VOL_UP
361#define SELECT BUTTON_PLAY
362#define UP BUTTON_HOME
363#define DOWN BUTTON_OPTION
364
345#elif CONFIG_KEYPAD == IHIFI_770_PAD 365#elif CONFIG_KEYPAD == IHIFI_770_PAD
346#define QUIT BUTTON_POWER 366#define QUIT BUTTON_POWER
347#define LEFT BUTTON_HOME 367#define LEFT BUTTON_HOME
diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c
index a4a29ff6ac..be5087967c 100644
--- a/apps/plugins/calculator.c
+++ b/apps/plugins/calculator.c
@@ -536,6 +536,28 @@ F3: equal to "="
536#define CALCULATOR_CALC (BUTTON_PLAY|BUTTON_REPEAT) 536#define CALCULATOR_CALC (BUTTON_PLAY|BUTTON_REPEAT)
537#define CALCULATOR_CLEAR (BUTTON_POWER|BUTTON_REPEAT) 537#define CALCULATOR_CLEAR (BUTTON_POWER|BUTTON_REPEAT)
538 538
539#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
540#define CALCULATOR_LEFT BUTTON_PREV
541#define CALCULATOR_RIGHT BUTTON_NEXT
542#define CALCULATOR_UP BUTTON_HOME
543#define CALCULATOR_DOWN BUTTON_OPTION
544#define CALCULATOR_QUIT BUTTON_POWER
545#define CALCULATOR_INPUT_CALC_PRE (BUTTON_OPTION|BUTTON_REPEAT)
546#define CALCULATOR_INPUT (BUTTON_PLAY|BUTTON_REL)
547#define CALCULATOR_CALC (BUTTON_PLAY|BUTTON_REPEAT)
548#define CALCULATOR_CLEAR (BUTTON_POWER|BUTTON_REPEAT)
549
550#elif CONFIG_KEYPAD == XDUOO_X20_PAD
551#define CALCULATOR_LEFT BUTTON_PREV
552#define CALCULATOR_RIGHT BUTTON_NEXT
553#define CALCULATOR_UP BUTTON_HOME
554#define CALCULATOR_DOWN BUTTON_OPTION
555#define CALCULATOR_QUIT BUTTON_POWER
556#define CALCULATOR_INPUT_CALC_PRE (BUTTON_OPTION|BUTTON_REPEAT)
557#define CALCULATOR_INPUT (BUTTON_PLAY|BUTTON_REL)
558#define CALCULATOR_CALC (BUTTON_PLAY|BUTTON_REPEAT)
559#define CALCULATOR_CLEAR (BUTTON_POWER|BUTTON_REPEAT)
560
539#elif CONFIG_KEYPAD == IHIFI_770_PAD 561#elif CONFIG_KEYPAD == IHIFI_770_PAD
540#define CALCULATOR_LEFT BUTTON_HOME 562#define CALCULATOR_LEFT BUTTON_HOME
541#define CALCULATOR_RIGHT BUTTON_VOL_DOWN 563#define CALCULATOR_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index 56f9bde193..af550685cc 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -423,6 +423,26 @@
423#define CALENDAR_NEXT_MONTH BUTTON_VOL_UP 423#define CALENDAR_NEXT_MONTH BUTTON_VOL_UP
424#define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN 424#define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN
425 425
426#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
427#define CALENDAR_QUIT BUTTON_POWER
428#define CALENDAR_SELECT BUTTON_PLAY
429#define CALENDAR_NEXT_WEEK BUTTON_OPTION
430#define CALENDAR_PREV_WEEK BUTTON_HOME
431#define CALENDAR_NEXT_DAY BUTTON_NEXT
432#define CALENDAR_PREV_DAY BUTTON_PREV
433#define CALENDAR_NEXT_MONTH BUTTON_VOL_UP
434#define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN
435
436#elif CONFIG_KEYPAD == XDUOO_X20_PAD
437#define CALENDAR_QUIT BUTTON_POWER
438#define CALENDAR_SELECT BUTTON_PLAY
439#define CALENDAR_NEXT_WEEK BUTTON_OPTION
440#define CALENDAR_PREV_WEEK BUTTON_HOME
441#define CALENDAR_NEXT_DAY BUTTON_NEXT
442#define CALENDAR_PREV_DAY BUTTON_PREV
443#define CALENDAR_NEXT_MONTH BUTTON_VOL_UP
444#define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN
445
426#elif CONFIG_KEYPAD == IHIFI_770_PAD 446#elif CONFIG_KEYPAD == IHIFI_770_PAD
427#define CALENDAR_QUIT BUTTON_POWER 447#define CALENDAR_QUIT BUTTON_POWER
428#define CALENDAR_SELECT BUTTON_PLAY 448#define CALENDAR_SELECT BUTTON_PLAY
diff --git a/apps/plugins/chessbox/chessbox_pgn.h b/apps/plugins/chessbox/chessbox_pgn.h
index 3c4d5357a5..9d37953c6f 100644
--- a/apps/plugins/chessbox/chessbox_pgn.h
+++ b/apps/plugins/chessbox/chessbox_pgn.h
@@ -572,6 +572,34 @@
572#define CB_SCROLL_LEFT (BUTTON_PREV|BUTTON_REPEAT) 572#define CB_SCROLL_LEFT (BUTTON_PREV|BUTTON_REPEAT)
573#define CB_SCROLL_RIGHT (BUTTON_NEXT|BUTTON_REPEAT) 573#define CB_SCROLL_RIGHT (BUTTON_NEXT|BUTTON_REPEAT)
574 574
575#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
576#define CB_SELECT BUTTON_PLAY
577#define CB_UP BUTTON_HOME
578#define CB_DOWN BUTTON_OPTION
579#define CB_LEFT BUTTON_PREV
580#define CB_RIGHT BUTTON_NEXT
581#define CB_PLAY BUTTON_VOL_UP
582#define CB_LEVEL BUTTON_VOL_DOWN
583#define CB_MENU BUTTON_POWER
584#define CB_SCROLL_UP (BUTTON_HOME|BUTTON_REPEAT)
585#define CB_SCROLL_DOWN (BUTTON_OPTION|BUTTON_REPEAT)
586#define CB_SCROLL_LEFT (BUTTON_PREV|BUTTON_REPEAT)
587#define CB_SCROLL_RIGHT (BUTTON_NEXT|BUTTON_REPEAT)
588
589#elif CONFIG_KEYPAD == XDUOO_X20_PAD
590#define CB_SELECT BUTTON_PLAY
591#define CB_UP BUTTON_HOME
592#define CB_DOWN BUTTON_OPTION
593#define CB_LEFT BUTTON_PREV
594#define CB_RIGHT BUTTON_NEXT
595#define CB_PLAY BUTTON_VOL_UP
596#define CB_LEVEL BUTTON_VOL_DOWN
597#define CB_MENU BUTTON_POWER
598#define CB_SCROLL_UP (BUTTON_HOME|BUTTON_REPEAT)
599#define CB_SCROLL_DOWN (BUTTON_OPTION|BUTTON_REPEAT)
600#define CB_SCROLL_LEFT (BUTTON_PREV|BUTTON_REPEAT)
601#define CB_SCROLL_RIGHT (BUTTON_NEXT|BUTTON_REPEAT)
602
575#elif CONFIG_KEYPAD == IHIFI_770_PAD 603#elif CONFIG_KEYPAD == IHIFI_770_PAD
576#define CB_SELECT BUTTON_PLAY 604#define CB_SELECT BUTTON_PLAY
577#define CB_UP BUTTON_PREV 605#define CB_UP BUTTON_PREV
diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c
index 6b07e1bab5..d93777860b 100644
--- a/apps/plugins/chessclock.c
+++ b/apps/plugins/chessclock.c
@@ -422,6 +422,26 @@
422#define CHC_SETTINGS_OK BUTTON_PLAY 422#define CHC_SETTINGS_OK BUTTON_PLAY
423#define CHC_SETTINGS_CANCEL BUTTON_POWER 423#define CHC_SETTINGS_CANCEL BUTTON_POWER
424 424
425#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
426#define CHC_QUIT BUTTON_POWER
427#define CHC_STARTSTOP BUTTON_PLAY
428#define CHC_RESET BUTTON_OPTION
429#define CHC_MENU BUTTON_HOME
430#define CHC_SETTINGS_INC BUTTON_NEXT
431#define CHC_SETTINGS_DEC BUTTON_PREV
432#define CHC_SETTINGS_OK BUTTON_PLAY
433#define CHC_SETTINGS_CANCEL BUTTON_POWER
434
435#elif CONFIG_KEYPAD == XDUOO_X20_PAD
436#define CHC_QUIT BUTTON_POWER
437#define CHC_STARTSTOP BUTTON_PLAY
438#define CHC_RESET BUTTON_OPTION
439#define CHC_MENU BUTTON_HOME
440#define CHC_SETTINGS_INC BUTTON_NEXT
441#define CHC_SETTINGS_DEC BUTTON_PREV
442#define CHC_SETTINGS_OK BUTTON_PLAY
443#define CHC_SETTINGS_CANCEL BUTTON_POWER
444
425#elif CONFIG_KEYPAD == IHIFI_770_PAD 445#elif CONFIG_KEYPAD == IHIFI_770_PAD
426#define CHC_QUIT BUTTON_POWER 446#define CHC_QUIT BUTTON_POWER
427#define CHC_STARTSTOP BUTTON_PLAY 447#define CHC_STARTSTOP BUTTON_PLAY
diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c
index 58d80a2ccf..7c2be3f7e7 100644
--- a/apps/plugins/chip8.c
+++ b/apps/plugins/chip8.c
@@ -1291,6 +1291,22 @@ CONFIG_KEYPAD == MROBE500_PAD
1291#define CHIP8_KEY6 BUTTON_NEXT 1291#define CHIP8_KEY6 BUTTON_NEXT
1292#define CHIP8_KEY8 BUTTON_OPTION 1292#define CHIP8_KEY8 BUTTON_OPTION
1293 1293
1294#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
1295#define CHIP8_OFF BUTTON_POWER
1296#define CHIP8_KEY2 BUTTON_HOME
1297#define CHIP8_KEY4 BUTTON_PREV
1298#define CHIP8_KEY5 BUTTON_PLAY
1299#define CHIP8_KEY6 BUTTON_NEXT
1300#define CHIP8_KEY8 BUTTON_OPTION
1301
1302#elif CONFIG_KEYPAD == XDUOO_X20_PAD
1303#define CHIP8_OFF BUTTON_POWER
1304#define CHIP8_KEY2 BUTTON_HOME
1305#define CHIP8_KEY4 BUTTON_PREV
1306#define CHIP8_KEY5 BUTTON_PLAY
1307#define CHIP8_KEY6 BUTTON_NEXT
1308#define CHIP8_KEY8 BUTTON_OPTION
1309
1294#elif CONFIG_KEYPAD == IHIFI_770_PAD 1310#elif CONFIG_KEYPAD == IHIFI_770_PAD
1295#define CHIP8_OFF BUTTON_POWER 1311#define CHIP8_OFF BUTTON_POWER
1296#define CHIP8_KEY2 BUTTON_NEXT 1312#define CHIP8_KEY2 BUTTON_NEXT
diff --git a/apps/plugins/chopper.c b/apps/plugins/chopper.c
index 249cfe9715..71e24deb8f 100644
--- a/apps/plugins/chopper.c
+++ b/apps/plugins/chopper.c
@@ -214,6 +214,16 @@ CONFIG_KEYPAD == MROBE500_PAD
214#define ACTION BUTTON_PLAY 214#define ACTION BUTTON_PLAY
215#define ACTIONTEXT "PLAY" 215#define ACTIONTEXT "PLAY"
216 216
217#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
218#define QUIT BUTTON_POWER
219#define ACTION BUTTON_PLAY
220#define ACTIONTEXT "PLAY"
221
222#elif CONFIG_KEYPAD == XDUOO_X20_PAD
223#define QUIT BUTTON_POWER
224#define ACTION BUTTON_PLAY
225#define ACTIONTEXT "PLAY"
226
217#elif CONFIG_KEYPAD == IHIFI_770_PAD 227#elif CONFIG_KEYPAD == IHIFI_770_PAD
218#define QUIT BUTTON_POWER 228#define QUIT BUTTON_POWER
219#define ACTION BUTTON_PLAY 229#define ACTION BUTTON_PLAY
diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c
index c6364b14b4..e80fdeab8b 100644
--- a/apps/plugins/clix.c
+++ b/apps/plugins/clix.c
@@ -284,6 +284,22 @@
284#define CLIX_BUTTON_RIGHT BUTTON_NEXT 284#define CLIX_BUTTON_RIGHT BUTTON_NEXT
285#define CLIX_BUTTON_CLICK BUTTON_PLAY 285#define CLIX_BUTTON_CLICK BUTTON_PLAY
286 286
287#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
288#define CLIX_BUTTON_QUIT BUTTON_POWER
289#define CLIX_BUTTON_UP BUTTON_HOME
290#define CLIX_BUTTON_DOWN BUTTON_OPTION
291#define CLIX_BUTTON_LEFT BUTTON_PREV
292#define CLIX_BUTTON_RIGHT BUTTON_NEXT
293#define CLIX_BUTTON_CLICK BUTTON_PLAY
294
295#elif CONFIG_KEYPAD == XDUOO_X20_PAD
296#define CLIX_BUTTON_QUIT BUTTON_POWER
297#define CLIX_BUTTON_UP BUTTON_HOME
298#define CLIX_BUTTON_DOWN BUTTON_OPTION
299#define CLIX_BUTTON_LEFT BUTTON_PREV
300#define CLIX_BUTTON_RIGHT BUTTON_NEXT
301#define CLIX_BUTTON_CLICK BUTTON_PLAY
302
287#elif CONFIG_KEYPAD == IHIFI_770_PAD 303#elif CONFIG_KEYPAD == IHIFI_770_PAD
288#define CLIX_BUTTON_QUIT BUTTON_POWER 304#define CLIX_BUTTON_QUIT BUTTON_POWER
289#define CLIX_BUTTON_UP BUTTON_PREV 305#define CLIX_BUTTON_UP BUTTON_PREV
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c
index cad57f9ed6..78fd333773 100644
--- a/apps/plugins/cube.c
+++ b/apps/plugins/cube.c
@@ -423,6 +423,26 @@
423#define CUBE_PAUSE BUTTON_HOME 423#define CUBE_PAUSE BUTTON_HOME
424#define CUBE_HIGHSPEED BUTTON_PLAY 424#define CUBE_HIGHSPEED BUTTON_PLAY
425 425
426#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
427#define CUBE_QUIT BUTTON_POWER
428#define CUBE_NEXT BUTTON_NEXT
429#define CUBE_PREV BUTTON_PREV
430#define CUBE_INC BUTTON_VOL_UP
431#define CUBE_DEC BUTTON_VOL_DOWN
432#define CUBE_MODE BUTTON_OPTION
433#define CUBE_PAUSE BUTTON_HOME
434#define CUBE_HIGHSPEED BUTTON_PLAY
435
436#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
437#define CUBE_QUIT BUTTON_POWER
438#define CUBE_NEXT BUTTON_NEXT
439#define CUBE_PREV BUTTON_PREV
440#define CUBE_INC BUTTON_VOL_UP
441#define CUBE_DEC BUTTON_VOL_DOWN
442#define CUBE_MODE BUTTON_OPTION
443#define CUBE_PAUSE BUTTON_HOME
444#define CUBE_HIGHSPEED BUTTON_PLAY
445
426#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 446#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
427#define CUBE_QUIT BUTTON_POWER 447#define CUBE_QUIT BUTTON_POWER
428#define CUBE_NEXT BUTTON_NEXT 448#define CUBE_NEXT BUTTON_NEXT
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c
index 41194670bf..9f367d7d76 100644
--- a/apps/plugins/doom/i_video.c
+++ b/apps/plugins/doom/i_video.c
@@ -566,6 +566,28 @@ void I_ShutdownGraphics(void)
566#define DOOMBUTTON_ENTER BUTTON_PLAY 566#define DOOMBUTTON_ENTER BUTTON_PLAY
567#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 567#define DOOMBUTTON_WEAPON BUTTON_VOL_UP
568 568
569#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
570#define DOOMBUTTON_UP BUTTON_HOME
571#define DOOMBUTTON_DOWN BUTTON_OPTION
572#define DOOMBUTTON_LEFT BUTTON_PREV
573#define DOOMBUTTON_RIGHT BUTTON_NEXT
574#define DOOMBUTTON_SHOOT BUTTON_PLAY
575#define DOOMBUTTON_OPEN (BUTTON_HOME | BUTTON_POWER)
576#define DOOMBUTTON_ESC BUTTON_POWER
577#define DOOMBUTTON_ENTER BUTTON_PLAY
578#define DOOMBUTTON_WEAPON BUTTON_VOL_UP
579
580#elif CONFIG_KEYPAD == XDUOO_X20_PAD
581#define DOOMBUTTON_UP BUTTON_HOME
582#define DOOMBUTTON_DOWN BUTTON_OPTION
583#define DOOMBUTTON_LEFT BUTTON_PREV
584#define DOOMBUTTON_RIGHT BUTTON_NEXT
585#define DOOMBUTTON_SHOOT BUTTON_PLAY
586#define DOOMBUTTON_OPEN (BUTTON_HOME | BUTTON_POWER)
587#define DOOMBUTTON_ESC BUTTON_POWER
588#define DOOMBUTTON_ENTER BUTTON_PLAY
589#define DOOMBUTTON_WEAPON BUTTON_VOL_UP
590
569#elif CONFIG_KEYPAD == IHIFI_770_PAD 591#elif CONFIG_KEYPAD == IHIFI_770_PAD
570#define DOOMBUTTON_UP BUTTON_PREV 592#define DOOMBUTTON_UP BUTTON_PREV
571#define DOOMBUTTON_DOWN BUTTON_NEXT 593#define DOOMBUTTON_DOWN BUTTON_NEXT
diff --git a/apps/plugins/fft/fft.c b/apps/plugins/fft/fft.c
index d56e37f9e2..0f4e33759d 100644
--- a/apps/plugins/fft/fft.c
+++ b/apps/plugins/fft/fft.c
@@ -343,6 +343,24 @@ GREY_INFO_STRUCT
343# define FFT_AMP_SCALE BUTTON_PLAY 343# define FFT_AMP_SCALE BUTTON_PLAY
344# define FFT_QUIT BUTTON_POWER 344# define FFT_QUIT BUTTON_POWER
345 345
346#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
347# define FFT_PREV_GRAPH BUTTON_PREV
348# define FFT_NEXT_GRAPH BUTTON_NEXT
349# define FFT_ORIENTATION BUTTON_HOME
350# define FFT_FREQ_SCALE BUTTON_OPTION
351# define FFT_WINDOW (BUTTON_HOME|BUTTON_POWER)
352# define FFT_AMP_SCALE BUTTON_PLAY
353# define FFT_QUIT BUTTON_POWER
354
355#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
356# define FFT_PREV_GRAPH BUTTON_PREV
357# define FFT_NEXT_GRAPH BUTTON_NEXT
358# define FFT_ORIENTATION BUTTON_HOME
359# define FFT_FREQ_SCALE BUTTON_OPTION
360# define FFT_WINDOW (BUTTON_HOME|BUTTON_POWER)
361# define FFT_AMP_SCALE BUTTON_PLAY
362# define FFT_QUIT BUTTON_POWER
363
346#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 364#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
347# define FFT_PREV_GRAPH BUTTON_PREV 365# define FFT_PREV_GRAPH BUTTON_PREV
348# define FFT_NEXT_GRAPH BUTTON_NEXT 366# define FFT_NEXT_GRAPH BUTTON_NEXT
diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c
index c108939a95..7d1257ef94 100644
--- a/apps/plugins/flipit.c
+++ b/apps/plugins/flipit.c
@@ -494,6 +494,30 @@
494#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY) 494#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
495#define FLIPIT_TOGGLE BUTTON_PLAY 495#define FLIPIT_TOGGLE BUTTON_PLAY
496 496
497#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
498
499#define FLIPIT_LEFT BUTTON_PREV
500#define FLIPIT_RIGHT BUTTON_NEXT
501#define FLIPIT_UP BUTTON_HOME
502#define FLIPIT_DOWN BUTTON_OPTION
503#define FLIPIT_QUIT BUTTON_POWER
504#define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_PREV)
505#define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_NEXT)
506#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
507#define FLIPIT_TOGGLE BUTTON_PLAY
508
509#elif CONFIG_KEYPAD == XDUOO_X20_PAD
510
511#define FLIPIT_LEFT BUTTON_PREV
512#define FLIPIT_RIGHT BUTTON_NEXT
513#define FLIPIT_UP BUTTON_HOME
514#define FLIPIT_DOWN BUTTON_OPTION
515#define FLIPIT_QUIT BUTTON_POWER
516#define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_PREV)
517#define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_NEXT)
518#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
519#define FLIPIT_TOGGLE BUTTON_PLAY
520
497#elif CONFIG_KEYPAD == IHIFI_770_PAD 521#elif CONFIG_KEYPAD == IHIFI_770_PAD
498 522
499#define FLIPIT_LEFT BUTTON_HOME 523#define FLIPIT_LEFT BUTTON_HOME
diff --git a/apps/plugins/fractals/fractal.h b/apps/plugins/fractals/fractal.h
index 5a56a39b13..679782d37a 100644
--- a/apps/plugins/fractals/fractal.h
+++ b/apps/plugins/fractals/fractal.h
@@ -496,6 +496,30 @@
496#define FRACTAL_PRECISION_DEC (BUTTON_PLAY | BUTTON_PREV) 496#define FRACTAL_PRECISION_DEC (BUTTON_PLAY | BUTTON_PREV)
497#define FRACTAL_RESET (BUTTON_HOME | BUTTON_POWER) 497#define FRACTAL_RESET (BUTTON_HOME | BUTTON_POWER)
498 498
499#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
500#define FRACTAL_QUIT BUTTON_POWER
501#define FRACTAL_UP BUTTON_HOME
502#define FRACTAL_DOWN BUTTON_OPTION
503#define FRACTAL_LEFT BUTTON_PREV
504#define FRACTAL_RIGHT BUTTON_NEXT
505#define FRACTAL_ZOOM_IN BUTTON_VOL_UP
506#define FRACTAL_ZOOM_OUT BUTTON_VOL_DOWN
507#define FRACTAL_PRECISION_INC (BUTTON_PLAY | BUTTON_NEXT)
508#define FRACTAL_PRECISION_DEC (BUTTON_PLAY | BUTTON_PREV)
509#define FRACTAL_RESET (BUTTON_HOME | BUTTON_POWER)
510
511#elif CONFIG_KEYPAD == XDUOO_X20_PAD
512#define FRACTAL_QUIT BUTTON_POWER
513#define FRACTAL_UP BUTTON_HOME
514#define FRACTAL_DOWN BUTTON_OPTION
515#define FRACTAL_LEFT BUTTON_PREV
516#define FRACTAL_RIGHT BUTTON_NEXT
517#define FRACTAL_ZOOM_IN BUTTON_VOL_UP
518#define FRACTAL_ZOOM_OUT BUTTON_VOL_DOWN
519#define FRACTAL_PRECISION_INC (BUTTON_PLAY | BUTTON_NEXT)
520#define FRACTAL_PRECISION_DEC (BUTTON_PLAY | BUTTON_PREV)
521#define FRACTAL_RESET (BUTTON_HOME | BUTTON_POWER)
522
499#elif CONFIG_KEYPAD == IHIFI_770_PAD 523#elif CONFIG_KEYPAD == IHIFI_770_PAD
500#define FRACTAL_QUIT BUTTON_POWER 524#define FRACTAL_QUIT BUTTON_POWER
501#define FRACTAL_UP BUTTON_PREV 525#define FRACTAL_UP BUTTON_PREV
diff --git a/apps/plugins/goban/goban.h b/apps/plugins/goban/goban.h
index 9f03937078..e04b4c2447 100644
--- a/apps/plugins/goban/goban.h
+++ b/apps/plugins/goban/goban.h
@@ -464,6 +464,30 @@
464#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT 464#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
465#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_POWER 465#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_POWER
466 466
467#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
468#define GBN_BUTTON_UP BUTTON_HOME
469#define GBN_BUTTON_DOWN BUTTON_OPTION
470#define GBN_BUTTON_LEFT BUTTON_PREV
471#define GBN_BUTTON_RIGHT BUTTON_NEXT
472#define GBN_BUTTON_RETREAT BUTTON_VOL_DOWN
473#define GBN_BUTTON_ADVANCE BUTTON_VOL_UP
474#define GBN_BUTTON_MENU BUTTON_POWER
475#define GBN_BUTTON_PLAY BUTTON_PLAY | BUTTON_REL
476#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
477#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_POWER
478
479#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
480#define GBN_BUTTON_UP BUTTON_HOME
481#define GBN_BUTTON_DOWN BUTTON_OPTION
482#define GBN_BUTTON_LEFT BUTTON_PREV
483#define GBN_BUTTON_RIGHT BUTTON_NEXT
484#define GBN_BUTTON_RETREAT BUTTON_VOL_DOWN
485#define GBN_BUTTON_ADVANCE BUTTON_VOL_UP
486#define GBN_BUTTON_MENU BUTTON_POWER
487#define GBN_BUTTON_PLAY BUTTON_PLAY | BUTTON_REL
488#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
489#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_POWER
490
467#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 491#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
468 492
469#define GBN_BUTTON_UP BUTTON_PREV 493#define GBN_BUTTON_UP BUTTON_PREV
diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h
index 5ffef12a62..e37febc76a 100644
--- a/apps/plugins/imageviewer/imageviewer_button.h
+++ b/apps/plugins/imageviewer/imageviewer_button.h
@@ -510,6 +510,36 @@
510#define IMGVIEW_MENU BUTTON_POWER 510#define IMGVIEW_MENU BUTTON_POWER
511#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_POWER) 511#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_POWER)
512 512
513#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
514#define IMGVIEW_ZOOM_PRE BUTTON_PLAY
515#define IMGVIEW_ZOOM_IN (BUTTON_PLAY | BUTTON_REL)
516#define IMGVIEW_ZOOM_OUT (BUTTON_PLAY | BUTTON_REPEAT)
517#define IMGVIEW_UP BUTTON_HOME
518#define IMGVIEW_DOWN BUTTON_OPTION
519#define IMGVIEW_LEFT BUTTON_PREV
520#define IMGVIEW_RIGHT BUTTON_NEXT
521#define IMGVIEW_NEXT BUTTON_VOL_UP
522#define IMGVIEW_NEXT_REPEAT (BUTTON_VOL_UP|BUTTON_REPEAT)
523#define IMGVIEW_PREVIOUS BUTTON_VOL_DOWN
524#define IMGVIEW_PREVIOUS_REPEAT (BUTTON_VOL_DOWN|BUTTON_REPEAT)
525#define IMGVIEW_MENU BUTTON_POWER
526#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_POWER)
527
528#elif CONFIG_KEYPAD == XDUOO_X20_PAD
529#define IMGVIEW_ZOOM_PRE BUTTON_PLAY
530#define IMGVIEW_ZOOM_IN (BUTTON_PLAY | BUTTON_REL)
531#define IMGVIEW_ZOOM_OUT (BUTTON_PLAY | BUTTON_REPEAT)
532#define IMGVIEW_UP BUTTON_HOME
533#define IMGVIEW_DOWN BUTTON_OPTION
534#define IMGVIEW_LEFT BUTTON_PREV
535#define IMGVIEW_RIGHT BUTTON_NEXT
536#define IMGVIEW_NEXT BUTTON_VOL_UP
537#define IMGVIEW_NEXT_REPEAT (BUTTON_VOL_UP|BUTTON_REPEAT)
538#define IMGVIEW_PREVIOUS BUTTON_VOL_DOWN
539#define IMGVIEW_PREVIOUS_REPEAT (BUTTON_VOL_DOWN|BUTTON_REPEAT)
540#define IMGVIEW_MENU BUTTON_POWER
541#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_POWER)
542
513#elif CONFIG_KEYPAD == IHIFI_770_PAD 543#elif CONFIG_KEYPAD == IHIFI_770_PAD
514#define IMGVIEW_ZOOM_PRE BUTTON_PLAY 544#define IMGVIEW_ZOOM_PRE BUTTON_PLAY
515#define IMGVIEW_ZOOM_IN (BUTTON_PLAY | BUTTON_REL) 545#define IMGVIEW_ZOOM_IN (BUTTON_PLAY | BUTTON_REL)
diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c
index d3feb236cc..8cf4d67f3e 100644
--- a/apps/plugins/invadrox.c
+++ b/apps/plugins/invadrox.c
@@ -272,6 +272,20 @@ CONFIG_KEYPAD == MROBE500_PAD
272#define QUIT BUTTON_POWER 272#define QUIT BUTTON_POWER
273#define FIRE BUTTON_MENU 273#define FIRE BUTTON_MENU
274 274
275#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
276
277#define QUIT BUTTON_POWER
278#define LEFT BUTTON_HOME
279#define RIGHT BUTTON_VOL_DOWN
280#define FIRE BUTTON_VOL_UP
281
282#elif CONFIG_KEYPAD == XDUOO_X20_PAD
283
284#define QUIT BUTTON_POWER
285#define LEFT BUTTON_HOME
286#define RIGHT BUTTON_VOL_DOWN
287#define FIRE BUTTON_VOL_UP
288
275#elif CONFIG_KEYPAD == IHIFI_770_PAD 289#elif CONFIG_KEYPAD == IHIFI_770_PAD
276 290
277#define QUIT BUTTON_POWER 291#define QUIT BUTTON_POWER
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index bc0bc73183..38121a480c 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -387,6 +387,26 @@ CONFIG_KEYPAD == MROBE500_PAD
387#define HK_SELECT "PLAY" 387#define HK_SELECT "PLAY"
388#define HK_CANCEL "POWER" 388#define HK_CANCEL "POWER"
389 389
390#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
391#define JEWELS_UP BUTTON_HOME
392#define JEWELS_DOWN BUTTON_OPTION
393#define JEWELS_LEFT BUTTON_PREV
394#define JEWELS_RIGHT BUTTON_NEXT
395#define JEWELS_SELECT BUTTON_PLAY
396#define JEWELS_CANCEL BUTTON_POWER
397#define HK_SELECT "PLAY"
398#define HK_CANCEL "POWER"
399
400#elif CONFIG_KEYPAD == XDUOO_X20_PAD
401#define JEWELS_UP BUTTON_HOME
402#define JEWELS_DOWN BUTTON_OPTION
403#define JEWELS_LEFT BUTTON_PREV
404#define JEWELS_RIGHT BUTTON_NEXT
405#define JEWELS_SELECT BUTTON_PLAY
406#define JEWELS_CANCEL BUTTON_POWER
407#define HK_SELECT "PLAY"
408#define HK_CANCEL "POWER"
409
390#elif CONFIG_KEYPAD == IHIFI_770_PAD 410#elif CONFIG_KEYPAD == IHIFI_770_PAD
391#define JEWELS_UP BUTTON_PREV 411#define JEWELS_UP BUTTON_PREV
392#define JEWELS_DOWN BUTTON_NEXT 412#define JEWELS_DOWN BUTTON_NEXT
diff --git a/apps/plugins/lib/keymaps.h b/apps/plugins/lib/keymaps.h
index e240a0989e..e3de03f222 100644
--- a/apps/plugins/lib/keymaps.h
+++ b/apps/plugins/lib/keymaps.h
@@ -223,6 +223,22 @@
223#define BTN_FIRE BUTTON_PLAY 223#define BTN_FIRE BUTTON_PLAY
224#define BTN_PAUSE BUTTON_POWER 224#define BTN_PAUSE BUTTON_POWER
225 225
226#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
227#define BTN_UP BUTTON_VOL_UP
228#define BTN_DOWN BUTTON_VOL_DOWN
229#define BTN_LEFT BUTTON_PREV
230#define BTN_RIGHT BUTTON_NEXT
231#define BTN_FIRE BUTTON_PLAY
232#define BTN_PAUSE BUTTON_POWER
233
234#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
235#define BTN_UP BUTTON_VOL_UP
236#define BTN_DOWN BUTTON_VOL_DOWN
237#define BTN_LEFT BUTTON_PREV
238#define BTN_RIGHT BUTTON_NEXT
239#define BTN_FIRE BUTTON_PLAY
240#define BTN_PAUSE BUTTON_POWER
241
226#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 242#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
227#define BTN_UP BUTTON_PREV 243#define BTN_UP BUTTON_PREV
228#define BTN_DOWN BUTTON_NEXT 244#define BTN_DOWN BUTTON_NEXT
diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c
index 97b5a1e1bf..0834e020f4 100644
--- a/apps/plugins/lib/pluginlib_actions.c
+++ b/apps/plugins/lib/pluginlib_actions.c
@@ -237,6 +237,24 @@ const struct button_mapping pla_main_ctx[] =
237 { PLA_DOWN_REPEAT, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE }, 237 { PLA_DOWN_REPEAT, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE },
238 { PLA_LEFT_REPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE }, 238 { PLA_LEFT_REPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
239 { PLA_RIGHT_REPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE }, 239 { PLA_RIGHT_REPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
240#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
241 { PLA_UP, BUTTON_HOME, BUTTON_NONE },
242 { PLA_DOWN, BUTTON_OPTION, BUTTON_NONE },
243 { PLA_LEFT, BUTTON_PREV, BUTTON_NONE },
244 { PLA_RIGHT, BUTTON_NEXT, BUTTON_NONE },
245 { PLA_UP_REPEAT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE },
246 { PLA_DOWN_REPEAT, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE },
247 { PLA_LEFT_REPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
248 { PLA_RIGHT_REPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
249#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
250 { PLA_UP, BUTTON_HOME, BUTTON_NONE },
251 { PLA_DOWN, BUTTON_OPTION, BUTTON_NONE },
252 { PLA_LEFT, BUTTON_PREV, BUTTON_NONE },
253 { PLA_RIGHT, BUTTON_NEXT, BUTTON_NONE },
254 { PLA_UP_REPEAT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE },
255 { PLA_DOWN_REPEAT, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE },
256 { PLA_LEFT_REPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
257 { PLA_RIGHT_REPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
240#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 258#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
241 { PLA_UP, BUTTON_PREV, BUTTON_NONE }, 259 { PLA_UP, BUTTON_PREV, BUTTON_NONE },
242 { PLA_DOWN, BUTTON_NEXT, BUTTON_NONE }, 260 { PLA_DOWN, BUTTON_NEXT, BUTTON_NONE },
@@ -480,6 +498,18 @@ const struct button_mapping pla_main_ctx[] =
480 {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE}, 498 {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE},
481 {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY}, 499 {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
482 {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, 500 {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
501#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
502 {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER},
503 {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE},
504 {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE},
505 {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
506 {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
507#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
508 {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER},
509 {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE},
510 {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE},
511 {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
512 {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
483#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 513#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
484 {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER}, 514 {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER},
485 {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE}, 515 {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE},
diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c
index 8e867e5173..e6e2b4bf51 100644
--- a/apps/plugins/midi/midiplay.c
+++ b/apps/plugins/midi/midiplay.c
@@ -301,6 +301,22 @@
301#define MIDI_VOL_DOWN BUTTON_VOL_DOWN 301#define MIDI_VOL_DOWN BUTTON_VOL_DOWN
302#define MIDI_PLAYPAUSE BUTTON_PLAY 302#define MIDI_PLAYPAUSE BUTTON_PLAY
303 303
304#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
305#define MIDI_QUIT BUTTON_POWER
306#define MIDI_FFWD BUTTON_NEXT
307#define MIDI_REWIND BUTTON_PREV
308#define MIDI_VOL_UP BUTTON_VOL_UP
309#define MIDI_VOL_DOWN BUTTON_VOL_DOWN
310#define MIDI_PLAYPAUSE BUTTON_PLAY
311
312#elif CONFIG_KEYPAD == XDUOO_X20_PAD
313#define MIDI_QUIT BUTTON_POWER
314#define MIDI_FFWD BUTTON_NEXT
315#define MIDI_REWIND BUTTON_PREV
316#define MIDI_VOL_UP BUTTON_VOL_UP
317#define MIDI_VOL_DOWN BUTTON_VOL_DOWN
318#define MIDI_PLAYPAUSE BUTTON_PLAY
319
304#elif CONFIG_KEYPAD == IHIFI_770_PAD 320#elif CONFIG_KEYPAD == IHIFI_770_PAD
305#define MIDI_QUIT BUTTON_POWER 321#define MIDI_QUIT BUTTON_POWER
306#define MIDI_FFWD BUTTON_VOL_DOWN 322#define MIDI_FFWD BUTTON_VOL_DOWN
diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c
index 956ba128d5..917f90dcd0 100644
--- a/apps/plugins/minesweeper.c
+++ b/apps/plugins/minesweeper.c
@@ -417,6 +417,32 @@ CONFIG_KEYPAD == MROBE500_PAD
417# define MINESWP_DISCOVER2 BUTTON_VOL_UP 417# define MINESWP_DISCOVER2 BUTTON_VOL_UP
418# define MINESWP_INFO (BUTTON_PLAY | BUTTON_OPTION) 418# define MINESWP_INFO (BUTTON_PLAY | BUTTON_OPTION)
419 419
420#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
421# define MINESWP_LEFT BUTTON_PREV
422# define MINESWP_RIGHT BUTTON_NEXT
423# define MINESWP_UP BUTTON_HOME
424# define MINESWP_DOWN BUTTON_OPTION
425# define MINESWP_QUIT BUTTON_POWER
426# define MINESWP_TOGGLE_PRE BUTTON_PLAY
427# define MINESWP_TOGGLE (BUTTON_PLAY | BUTTON_REL)
428# define MINESWP_TOGGLE2 BUTTON_VOL_DOWN
429# define MINESWP_DISCOVER (BUTTON_PLAY | BUTTON_REPEAT)
430# define MINESWP_DISCOVER2 BUTTON_VOL_UP
431# define MINESWP_INFO (BUTTON_PLAY | BUTTON_OPTION)
432
433#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
434# define MINESWP_LEFT BUTTON_PREV
435# define MINESWP_RIGHT BUTTON_NEXT
436# define MINESWP_UP BUTTON_HOME
437# define MINESWP_DOWN BUTTON_OPTION
438# define MINESWP_QUIT BUTTON_POWER
439# define MINESWP_TOGGLE_PRE BUTTON_PLAY
440# define MINESWP_TOGGLE (BUTTON_PLAY | BUTTON_REL)
441# define MINESWP_TOGGLE2 BUTTON_VOL_DOWN
442# define MINESWP_DISCOVER (BUTTON_PLAY | BUTTON_REPEAT)
443# define MINESWP_DISCOVER2 BUTTON_VOL_UP
444# define MINESWP_INFO (BUTTON_PLAY | BUTTON_OPTION)
445
420#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 446#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
421# define MINESWP_LEFT BUTTON_HOME 447# define MINESWP_LEFT BUTTON_HOME
422# define MINESWP_RIGHT BUTTON_VOL_DOWN 448# define MINESWP_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c
index d147120cd4..3b912ba606 100644
--- a/apps/plugins/mp3_encoder.c
+++ b/apps/plugins/mp3_encoder.c
@@ -2562,6 +2562,19 @@ CONFIG_KEYPAD == MROBE500_PAD
2562#define MP3ENC_DONE BUTTON_POWER 2562#define MP3ENC_DONE BUTTON_POWER
2563#define MP3ENC_SELECT BUTTON_PLAY 2563#define MP3ENC_SELECT BUTTON_PLAY
2564 2564
2565#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
2566#define MP3ENC_PREV BUTTON_HOME
2567#define MP3ENC_NEXT BUTTON_OPTION
2568#define MP3ENC_DONE BUTTON_POWER
2569#define MP3ENC_SELECT BUTTON_PLAY
2570
2571#elif CONFIG_KEYPAD == XDUOO_X20_PAD
2572#define MP3ENC_PREV BUTTON_HOME
2573#define MP3ENC_NEXT BUTTON_OPTION
2574#define MP3ENC_DONE BUTTON_POWER
2575#define MP3ENC_SELECT BUTTON_PLAY
2576
2577
2565#elif CONFIG_KEYPAD == IHIFI_770_PAD 2578#elif CONFIG_KEYPAD == IHIFI_770_PAD
2566#define MP3ENC_PREV BUTTON_PREV 2579#define MP3ENC_PREV BUTTON_PREV
2567#define MP3ENC_NEXT BUTTON_NEXT 2580#define MP3ENC_NEXT BUTTON_NEXT
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c
index 8427db12b4..d5d7c7c019 100644
--- a/apps/plugins/mpegplayer/mpeg_settings.c
+++ b/apps/plugins/mpegplayer/mpeg_settings.c
@@ -316,6 +316,26 @@ struct mpeg_settings settings;
316#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN 316#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
317#define MPEG_START_TIME_EXIT BUTTON_POWER 317#define MPEG_START_TIME_EXIT BUTTON_POWER
318 318
319#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
320#define MPEG_START_TIME_SELECT BUTTON_PLAY
321#define MPEG_START_TIME_LEFT BUTTON_PREV
322#define MPEG_START_TIME_RIGHT BUTTON_NEXT
323#define MPEG_START_TIME_UP BUTTON_HOME
324#define MPEG_START_TIME_DOWN BUTTON_OPTION
325#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
326#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
327#define MPEG_START_TIME_EXIT BUTTON_POWER
328
329#elif CONFIG_KEYPAD == XDUOO_X20_PAD
330#define MPEG_START_TIME_SELECT BUTTON_PLAY
331#define MPEG_START_TIME_LEFT BUTTON_PREV
332#define MPEG_START_TIME_RIGHT BUTTON_NEXT
333#define MPEG_START_TIME_UP BUTTON_HOME
334#define MPEG_START_TIME_DOWN BUTTON_OPTION
335#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
336#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
337#define MPEG_START_TIME_EXIT BUTTON_POWER
338
319#elif CONFIG_KEYPAD == IHIFI_770_PAD 339#elif CONFIG_KEYPAD == IHIFI_770_PAD
320#define MPEG_START_TIME_SELECT BUTTON_PLAY 340#define MPEG_START_TIME_SELECT BUTTON_PLAY
321#define MPEG_START_TIME_LEFT BUTTON_HOME 341#define MPEG_START_TIME_LEFT BUTTON_HOME
diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c
index 39ea484ff2..eed1fab6d7 100644
--- a/apps/plugins/mpegplayer/mpegplayer.c
+++ b/apps/plugins/mpegplayer/mpegplayer.c
@@ -450,6 +450,24 @@ CONFIG_KEYPAD == SANSA_M200_PAD
450#define MPEG_RW BUTTON_PREV 450#define MPEG_RW BUTTON_PREV
451#define MPEG_FF BUTTON_NEXT 451#define MPEG_FF BUTTON_NEXT
452 452
453#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
454#define MPEG_MENU BUTTON_PLAY
455#define MPEG_STOP BUTTON_POWER
456#define MPEG_PAUSE BUTTON_HOME
457#define MPEG_VOLDOWN BUTTON_VOL_DOWN
458#define MPEG_VOLUP BUTTON_VOL_UP
459#define MPEG_RW BUTTON_PREV
460#define MPEG_FF BUTTON_NEXT
461
462#elif CONFIG_KEYPAD == XDUOO_X20_PAD
463#define MPEG_MENU BUTTON_PLAY
464#define MPEG_STOP BUTTON_POWER
465#define MPEG_PAUSE BUTTON_HOME
466#define MPEG_VOLDOWN BUTTON_VOL_DOWN
467#define MPEG_VOLUP BUTTON_VOL_UP
468#define MPEG_RW BUTTON_PREV
469#define MPEG_FF BUTTON_NEXT
470
453#elif CONFIG_KEYPAD == IHIFI_770_PAD 471#elif CONFIG_KEYPAD == IHIFI_770_PAD
454#define MPEG_MENU BUTTON_PLAY 472#define MPEG_MENU BUTTON_PLAY
455#define MPEG_STOP BUTTON_POWER 473#define MPEG_STOP BUTTON_POWER
diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c
index f4711d4e0e..6702add139 100644
--- a/apps/plugins/oscilloscope.c
+++ b/apps/plugins/oscilloscope.c
@@ -518,6 +518,35 @@
518#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN 518#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
519#define NEED_LASTBUTTON 519#define NEED_LASTBUTTON
520 520
521#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
522#define OSCILLOSCOPE_QUIT BUTTON_POWER
523#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_PLAY
524#define OSCILLOSCOPE_DRAWMODE (BUTTON_PLAY | BUTTON_REL)
525#define OSCILLOSCOPE_ORIENTATION_PRE BUTTON_PLAY
526#define OSCILLOSCOPE_ORIENTATION (BUTTON_PLAY | BUTTON_REPEAT)
527#define OSCILLOSCOPE_ADVMODE BUTTON_HOME
528#define OSCILLOSCOPE_PAUSE BUTTON_OPTION
529#define OSCILLOSCOPE_SPEED_UP BUTTON_NEXT
530#define OSCILLOSCOPE_SPEED_DOWN BUTTON_PREV
531#define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
532#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
533#define NEED_LASTBUTTON
534
535#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
536#define OSCILLOSCOPE_QUIT BUTTON_POWER
537#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_PLAY
538#define OSCILLOSCOPE_DRAWMODE (BUTTON_PLAY | BUTTON_REL)
539#define OSCILLOSCOPE_ORIENTATION_PRE BUTTON_PLAY
540#define OSCILLOSCOPE_ORIENTATION (BUTTON_PLAY | BUTTON_REPEAT)
541#define OSCILLOSCOPE_ADVMODE BUTTON_HOME
542#define OSCILLOSCOPE_PAUSE BUTTON_OPTION
543#define OSCILLOSCOPE_SPEED_UP BUTTON_NEXT
544#define OSCILLOSCOPE_SPEED_DOWN BUTTON_PREV
545#define OSCILLOSCOPE_VOL_UP BUTTON_VOL_UP
546#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
547#define NEED_LASTBUTTON
548
549
521#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 550#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
522#define OSCILLOSCOPE_QUIT BUTTON_POWER 551#define OSCILLOSCOPE_QUIT BUTTON_POWER
523#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_PLAY 552#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_PLAY
diff --git a/apps/plugins/pacbox/pacbox.h b/apps/plugins/pacbox/pacbox.h
index 0e3de62dfa..78a171467a 100644
--- a/apps/plugins/pacbox/pacbox.h
+++ b/apps/plugins/pacbox/pacbox.h
@@ -364,6 +364,25 @@
364#define PACMAN_1UP BUTTON_VOLUP 364#define PACMAN_1UP BUTTON_VOLUP
365#define PACMAN_COIN BUTTON_VOLDOWN 365#define PACMAN_COIN BUTTON_VOLDOWN
366 366
367#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
368#define PACMAN_UP BUTTON_PREV
369#define PACMAN_DOWN BUTTON_NEXT
370#define PACMAN_LEFT BUTTON_HOME
371#define PACMAN_RIGHT BUTTON_VOL_DOWN
372#define PACMAN_MENU BUTTON_POWER
373#define PACMAN_1UP BUTTON_VOL_UP
374#define PACMAN_COIN BUTTON_PLAY
375
376#elif CONFIG_KEYPAD == XDUOO_X20_PAD
377#define PACMAN_UP BUTTON_PREV
378#define PACMAN_DOWN BUTTON_NEXT
379#define PACMAN_LEFT BUTTON_HOME
380#define PACMAN_RIGHT BUTTON_VOL_DOWN
381#define PACMAN_MENU BUTTON_POWER
382#define PACMAN_1UP BUTTON_VOL_UP
383#define PACMAN_COIN BUTTON_PLAY
384
385
367#elif CONFIG_KEYPAD == IHIFI_770_PAD 386#elif CONFIG_KEYPAD == IHIFI_770_PAD
368#define PACMAN_UP BUTTON_PREV 387#define PACMAN_UP BUTTON_PREV
369#define PACMAN_DOWN BUTTON_NEXT 388#define PACMAN_DOWN BUTTON_NEXT
diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c
index cc2e8e3f23..b638f2feeb 100644
--- a/apps/plugins/pegbox.c
+++ b/apps/plugins/pegbox.c
@@ -660,6 +660,40 @@ CONFIG_KEYPAD == MROBE500_PAD
660#define LVL_UP_TEXT "VOL+" 660#define LVL_UP_TEXT "VOL+"
661#define LVL_DOWN_TEXT "VOL-" 661#define LVL_DOWN_TEXT "VOL-"
662 662
663#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
664#define PEGBOX_SELECT BUTTON_PLAY
665#define PEGBOX_QUIT BUTTON_POWER
666#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME)
667#define PEGBOX_LVL_UP BUTTON_VOL_UP
668#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN
669#define PEGBOX_UP BUTTON_HOME
670#define PEGBOX_DOWN BUTTON_OPTION
671#define PEGBOX_RIGHT BUTTON_NEXT
672#define PEGBOX_LEFT BUTTON_PREV
673
674#define SELECT_TEXT "PLAY"
675#define QUIT_TEXT "POWER"
676#define RESTART_TEXT "HOME"
677#define LVL_UP_TEXT "VOL+"
678#define LVL_DOWN_TEXT "VOL-"
679
680#elif CONFIG_KEYPAD == XDUOO_X20_PAD
681#define PEGBOX_SELECT BUTTON_PLAY
682#define PEGBOX_QUIT BUTTON_POWER
683#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME)
684#define PEGBOX_LVL_UP BUTTON_VOL_UP
685#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN
686#define PEGBOX_UP BUTTON_HOME
687#define PEGBOX_DOWN BUTTON_OPTION
688#define PEGBOX_RIGHT BUTTON_NEXT
689#define PEGBOX_LEFT BUTTON_PREV
690
691#define SELECT_TEXT "PLAY"
692#define QUIT_TEXT "POWER"
693#define RESTART_TEXT "HOME"
694#define LVL_UP_TEXT "VOL+"
695#define LVL_DOWN_TEXT "VOL-"
696
663#elif CONFIG_KEYPAD == IHIFI_770_PAD 697#elif CONFIG_KEYPAD == IHIFI_770_PAD
664#define PEGBOX_SELECT BUTTON_PLAY 698#define PEGBOX_SELECT BUTTON_PLAY
665#define PEGBOX_QUIT BUTTON_POWER 699#define PEGBOX_QUIT BUTTON_POWER
diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c
index cb3006d7c4..3656a35fd2 100644
--- a/apps/plugins/pong.c
+++ b/apps/plugins/pong.c
@@ -317,6 +317,22 @@ CONFIG_KEYPAD == MROBE500_PAD
317#define PONG_RIGHT_UP BUTTON_HOME 317#define PONG_RIGHT_UP BUTTON_HOME
318#define PONG_RIGHT_DOWN BUTTON_NEXT 318#define PONG_RIGHT_DOWN BUTTON_NEXT
319 319
320#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
321#define PONG_QUIT BUTTON_POWER
322#define PONG_PAUSE BUTTON_PLAY
323#define PONG_LEFT_UP BUTTON_PREV
324#define PONG_LEFT_DOWN BUTTON_OPTION
325#define PONG_RIGHT_UP BUTTON_HOME
326#define PONG_RIGHT_DOWN BUTTON_NEXT
327
328#elif CONFIG_KEYPAD == XDUOO_X20_PAD
329#define PONG_QUIT BUTTON_POWER
330#define PONG_PAUSE BUTTON_PLAY
331#define PONG_LEFT_UP BUTTON_PREV
332#define PONG_LEFT_DOWN BUTTON_OPTION
333#define PONG_RIGHT_UP BUTTON_HOME
334#define PONG_RIGHT_DOWN BUTTON_NEXT
335
320#elif CONFIG_KEYPAD == IHIFI_770_PAD 336#elif CONFIG_KEYPAD == IHIFI_770_PAD
321#define PONG_QUIT BUTTON_POWER 337#define PONG_QUIT BUTTON_POWER
322#define PONG_PAUSE BUTTON_PREV 338#define PONG_PAUSE BUTTON_PREV
diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h
index cba34d2814..4ec6bcb67b 100644
--- a/apps/plugins/reversi/reversi-gui.h
+++ b/apps/plugins/reversi/reversi-gui.h
@@ -339,6 +339,28 @@
339#define REVERSI_BUTTON_MENU BUTTON_PLAY 339#define REVERSI_BUTTON_MENU BUTTON_PLAY
340#define REVERSI_BUTTON_MENU_LONGPRESS 340#define REVERSI_BUTTON_MENU_LONGPRESS
341 341
342#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
343#define REVERSI_BUTTON_QUIT BUTTON_POWER
344#define REVERSI_BUTTON_UP BUTTON_HOME
345#define REVERSI_BUTTON_DOWN BUTTON_OPTION
346#define REVERSI_BUTTON_LEFT BUTTON_PREV
347#define REVERSI_BUTTON_RIGHT BUTTON_NEXT
348#define REVERSI_BUTTON_MAKE_MOVE BUTTON_PLAY
349#define REVERSI_BUTTON_MAKE_MOVE_SHORTPRESS
350#define REVERSI_BUTTON_MENU BUTTON_PLAY
351#define REVERSI_BUTTON_MENU_LONGPRESS
352
353#elif CONFIG_KEYPAD == XDUOO_X20_PAD
354#define REVERSI_BUTTON_QUIT BUTTON_POWER
355#define REVERSI_BUTTON_UP BUTTON_HOME
356#define REVERSI_BUTTON_DOWN BUTTON_OPTION
357#define REVERSI_BUTTON_LEFT BUTTON_PREV
358#define REVERSI_BUTTON_RIGHT BUTTON_NEXT
359#define REVERSI_BUTTON_MAKE_MOVE BUTTON_PLAY
360#define REVERSI_BUTTON_MAKE_MOVE_SHORTPRESS
361#define REVERSI_BUTTON_MENU BUTTON_PLAY
362#define REVERSI_BUTTON_MENU_LONGPRESS
363
342#elif CONFIG_KEYPAD == IHIFI_770_PAD 364#elif CONFIG_KEYPAD == IHIFI_770_PAD
343#define REVERSI_BUTTON_QUIT BUTTON_POWER 365#define REVERSI_BUTTON_QUIT BUTTON_POWER
344#define REVERSI_BUTTON_UP BUTTON_PREV 366#define REVERSI_BUTTON_UP BUTTON_PREV
diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c
index 13eb593775..e2fedab200 100644
--- a/apps/plugins/rockblox.c
+++ b/apps/plugins/rockblox.c
@@ -492,6 +492,30 @@
492#define ROCKBLOX_DROP (BUTTON_PLAY|BUTTON_REL) 492#define ROCKBLOX_DROP (BUTTON_PLAY|BUTTON_REL)
493#define ROCKBLOX_RESTART (BUTTON_PLAY|BUTTON_REPEAT) 493#define ROCKBLOX_RESTART (BUTTON_PLAY|BUTTON_REPEAT)
494 494
495#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
496
497#define ROCKBLOX_OFF BUTTON_POWER
498#define ROCKBLOX_ROTATE_CCW BUTTON_HOME
499#define ROCKBLOX_ROTATE_CCW2 BUTTON_VOL_DOWN
500#define ROCKBLOX_ROTATE_CW BUTTON_VOL_UP
501#define ROCKBLOX_DOWN BUTTON_OPTION
502#define ROCKBLOX_LEFT BUTTON_PREV
503#define ROCKBLOX_RIGHT BUTTON_NEXT
504#define ROCKBLOX_DROP (BUTTON_PLAY|BUTTON_REL)
505#define ROCKBLOX_RESTART (BUTTON_PLAY|BUTTON_REPEAT)
506
507#elif CONFIG_KEYPAD == XDUOO_X20_PAD
508
509#define ROCKBLOX_OFF BUTTON_POWER
510#define ROCKBLOX_ROTATE_CCW BUTTON_HOME
511#define ROCKBLOX_ROTATE_CCW2 BUTTON_VOL_DOWN
512#define ROCKBLOX_ROTATE_CW BUTTON_VOL_UP
513#define ROCKBLOX_DOWN BUTTON_OPTION
514#define ROCKBLOX_LEFT BUTTON_PREV
515#define ROCKBLOX_RIGHT BUTTON_NEXT
516#define ROCKBLOX_DROP (BUTTON_PLAY|BUTTON_REL)
517#define ROCKBLOX_RESTART (BUTTON_PLAY|BUTTON_REPEAT)
518
495#elif CONFIG_KEYPAD == IHIFI_770_PAD 519#elif CONFIG_KEYPAD == IHIFI_770_PAD
496 520
497#define ROCKBLOX_OFF BUTTON_POWER 521#define ROCKBLOX_OFF BUTTON_POWER
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c
index 8886793ab7..f188dc1e24 100644
--- a/apps/plugins/rockboy/rockboy.c
+++ b/apps/plugins/rockboy/rockboy.c
@@ -433,6 +433,26 @@ static void setoptions (void)
433 options.SELECT = BUTTON_VOL_UP; 433 options.SELECT = BUTTON_VOL_UP;
434 options.MENU = BUTTON_POWER; 434 options.MENU = BUTTON_POWER;
435 435
436#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
437 options.UP = BUTTON_PREV;
438 options.DOWN = BUTTON_NEXT;
439
440 options.A = BUTTON_HOME;
441 options.B = BUTTON_OPTION;
442 options.START = BUTTON_VOL_DOWN;
443 options.SELECT = BUTTON_VOL_UP;
444 options.MENU = BUTTON_POWER;
445
446#elif CONFIG_KEYPAD == XDUOO_X20_PAD
447 options.UP = BUTTON_PREV;
448 options.DOWN = BUTTON_NEXT;
449
450 options.A = BUTTON_HOME;
451 options.B = BUTTON_OPTION;
452 options.START = BUTTON_VOL_DOWN;
453 options.SELECT = BUTTON_VOL_UP;
454 options.MENU = BUTTON_POWER;
455
436#elif CONFIG_KEYPAD == IHIFI_770_PAD 456#elif CONFIG_KEYPAD == IHIFI_770_PAD
437 options.UP = BUTTON_PREV; 457 options.UP = BUTTON_PREV;
438 options.DOWN = BUTTON_NEXT; 458 options.DOWN = BUTTON_NEXT;
diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c
index 0ea36c84b8..9b863906ce 100644
--- a/apps/plugins/sliding_puzzle.c
+++ b/apps/plugins/sliding_puzzle.c
@@ -340,6 +340,25 @@ CONFIG_KEYPAD == MROBE500_PAD
340#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_POWER) 340#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_POWER)
341#define PUZZLE_PICTURE BUTTON_PLAY 341#define PUZZLE_PICTURE BUTTON_PLAY
342 342
343#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
344#define PUZZLE_QUIT BUTTON_POWER
345#define PUZZLE_LEFT BUTTON_PREV
346#define PUZZLE_RIGHT BUTTON_NEXT
347#define PUZZLE_UP BUTTON_HOME
348#define PUZZLE_DOWN BUTTON_OPTION
349#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_POWER)
350#define PUZZLE_PICTURE BUTTON_PLAY
351
352#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
353#define PUZZLE_QUIT BUTTON_POWER
354#define PUZZLE_LEFT BUTTON_PREV
355#define PUZZLE_RIGHT BUTTON_NEXT
356#define PUZZLE_UP BUTTON_HOME
357#define PUZZLE_DOWN BUTTON_OPTION
358#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_POWER)
359#define PUZZLE_PICTURE BUTTON_PLAY
360
361
343#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 362#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
344#define PUZZLE_QUIT BUTTON_POWER 363#define PUZZLE_QUIT BUTTON_POWER
345#define PUZZLE_LEFT BUTTON_HOME 364#define PUZZLE_LEFT BUTTON_HOME
diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c
index 2518316bdd..ae1e4350ad 100644
--- a/apps/plugins/snake.c
+++ b/apps/plugins/snake.c
@@ -297,6 +297,22 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left;
297#define SNAKE_DOWN BUTTON_OPTION 297#define SNAKE_DOWN BUTTON_OPTION
298#define SNAKE_PLAYPAUSE BUTTON_PLAY 298#define SNAKE_PLAYPAUSE BUTTON_PLAY
299 299
300#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
301#define SNAKE_QUIT BUTTON_POWER
302#define SNAKE_LEFT BUTTON_PREV
303#define SNAKE_RIGHT BUTTON_NEXT
304#define SNAKE_UP BUTTON_HOME
305#define SNAKE_DOWN BUTTON_OPTION
306#define SNAKE_PLAYPAUSE BUTTON_PLAY
307
308#elif CONFIG_KEYPAD == XDUOO_X20_PAD
309#define SNAKE_QUIT BUTTON_POWER
310#define SNAKE_LEFT BUTTON_PREV
311#define SNAKE_RIGHT BUTTON_NEXT
312#define SNAKE_UP BUTTON_HOME
313#define SNAKE_DOWN BUTTON_OPTION
314#define SNAKE_PLAYPAUSE BUTTON_PLAY
315
300#elif CONFIG_KEYPAD == IHIFI_770_PAD 316#elif CONFIG_KEYPAD == IHIFI_770_PAD
301#define SNAKE_QUIT BUTTON_POWER 317#define SNAKE_QUIT BUTTON_POWER
302#define SNAKE_LEFT BUTTON_HOME 318#define SNAKE_LEFT BUTTON_HOME
diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c
index 9ea79504e4..a9f0942806 100644
--- a/apps/plugins/snake2.c
+++ b/apps/plugins/snake2.c
@@ -428,6 +428,24 @@ CONFIG_KEYPAD == MROBE500_PAD
428#define SNAKE2_PLAYPAUSE BUTTON_PLAY 428#define SNAKE2_PLAYPAUSE BUTTON_PLAY
429#define SNAKE2_PLAYPAUSE_TEXT "PLAY" 429#define SNAKE2_PLAYPAUSE_TEXT "PLAY"
430 430
431#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
432#define SNAKE2_LEFT BUTTON_PREV
433#define SNAKE2_RIGHT BUTTON_NEXT
434#define SNAKE2_UP BUTTON_HOME
435#define SNAKE2_DOWN BUTTON_OPTION
436#define SNAKE2_QUIT BUTTON_POWER
437#define SNAKE2_PLAYPAUSE BUTTON_PLAY
438#define SNAKE2_PLAYPAUSE_TEXT "PLAY"
439
440#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
441#define SNAKE2_LEFT BUTTON_PREV
442#define SNAKE2_RIGHT BUTTON_NEXT
443#define SNAKE2_UP BUTTON_HOME
444#define SNAKE2_DOWN BUTTON_OPTION
445#define SNAKE2_QUIT BUTTON_POWER
446#define SNAKE2_PLAYPAUSE BUTTON_PLAY
447#define SNAKE2_PLAYPAUSE_TEXT "PLAY"
448
431#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 449#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
432#define SNAKE2_LEFT BUTTON_HOME 450#define SNAKE2_LEFT BUTTON_HOME
433#define SNAKE2_RIGHT BUTTON_VOL_DOWN 451#define SNAKE2_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c
index 17971ec4db..450c881d1e 100644
--- a/apps/plugins/sokoban.c
+++ b/apps/plugins/sokoban.c
@@ -667,6 +667,38 @@
667#define BUTTON_SAVE BUTTON_PLAY 667#define BUTTON_SAVE BUTTON_PLAY
668#define BUTTON_SAVE_NAME "PLAY" 668#define BUTTON_SAVE_NAME "PLAY"
669 669
670#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
671#define SOKOBAN_LEFT BUTTON_PREV
672#define SOKOBAN_RIGHT BUTTON_NEXT
673#define SOKOBAN_UP BUTTON_HOME
674#define SOKOBAN_DOWN BUTTON_OPTION
675#define SOKOBAN_MENU BUTTON_POWER
676#define SOKOBAN_UNDO_PRE BUTTON_PLAY
677#define SOKOBAN_UNDO (BUTTON_PLAY | BUTTON_REL)
678#define SOKOBAN_REDO (BUTTON_POWER | BUTTON_PLAY)
679#define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN
680#define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_NEXT)
681#define SOKOBAN_LEVEL_UP BUTTON_VOL_UP
682#define SOKOBAN_PAUSE BUTTON_PLAY
683#define BUTTON_SAVE BUTTON_PLAY
684#define BUTTON_SAVE_NAME "PLAY"
685
686#elif CONFIG_KEYPAD == XDUOO_X20_PAD
687#define SOKOBAN_LEFT BUTTON_PREV
688#define SOKOBAN_RIGHT BUTTON_NEXT
689#define SOKOBAN_UP BUTTON_HOME
690#define SOKOBAN_DOWN BUTTON_OPTION
691#define SOKOBAN_MENU BUTTON_POWER
692#define SOKOBAN_UNDO_PRE BUTTON_PLAY
693#define SOKOBAN_UNDO (BUTTON_PLAY | BUTTON_REL)
694#define SOKOBAN_REDO (BUTTON_POWER | BUTTON_PLAY)
695#define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN
696#define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_NEXT)
697#define SOKOBAN_LEVEL_UP BUTTON_VOL_UP
698#define SOKOBAN_PAUSE BUTTON_PLAY
699#define BUTTON_SAVE BUTTON_PLAY
700#define BUTTON_SAVE_NAME "PLAY"
701
670#elif CONFIG_KEYPAD == IHIFI_770_PAD 702#elif CONFIG_KEYPAD == IHIFI_770_PAD
671#define SOKOBAN_LEFT BUTTON_HOME 703#define SOKOBAN_LEFT BUTTON_HOME
672#define SOKOBAN_RIGHT BUTTON_VOL_DOWN 704#define SOKOBAN_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index 1ee79bb86a..dd4c8d3447 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -706,6 +706,44 @@ CONFIG_KEYPAD == MROBE500_PAD
706# define HK_CUR2STACK "DBL PLAY" 706# define HK_CUR2STACK "DBL PLAY"
707# define HK_REM2STACK "NEXT" 707# define HK_REM2STACK "NEXT"
708 708
709#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
710# define SOL_QUIT BUTTON_POWER
711# define SOL_UP BUTTON_HOME
712# define SOL_DOWN BUTTON_OPTION
713# define SOL_LEFT BUTTON_PREV
714# define SOL_RIGHT BUTTON_NEXT
715# define SOL_MOVE_PRE BUTTON_PLAY
716# define SOL_MOVE (BUTTON_PLAY | BUTTON_REL)
717# define SOL_DRAW (BUTTON_POWER | BUTTON_REPEAT)
718# define SOL_REM2CUR BUTTON_VOL_DOWN
719# define SOL_CUR2STACK_PRE BUTTON_PLAY
720# define SOL_CUR2STACK (BUTTON_PLAY | BUTTON_REPEAT)
721# define SOL_REM2STACK BUTTON_VOL_UP
722# define HK_MOVE "PLAY"
723# define HK_DRAW "DBL HOME"
724# define HK_REM2CUR "PREV"
725# define HK_CUR2STACK "DBL PLAY"
726# define HK_REM2STACK "NEXT"
727
728#elif CONFIG_KEYPAD == XDUOO_X20_PAD
729# define SOL_QUIT BUTTON_POWER
730# define SOL_UP BUTTON_HOME
731# define SOL_DOWN BUTTON_OPTION
732# define SOL_LEFT BUTTON_PREV
733# define SOL_RIGHT BUTTON_NEXT
734# define SOL_MOVE_PRE BUTTON_PLAY
735# define SOL_MOVE (BUTTON_PLAY | BUTTON_REL)
736# define SOL_DRAW (BUTTON_POWER | BUTTON_REPEAT)
737# define SOL_REM2CUR BUTTON_VOL_DOWN
738# define SOL_CUR2STACK_PRE BUTTON_PLAY
739# define SOL_CUR2STACK (BUTTON_PLAY | BUTTON_REPEAT)
740# define SOL_REM2STACK BUTTON_VOL_UP
741# define HK_MOVE "PLAY"
742# define HK_DRAW "DBL HOME"
743# define HK_REM2CUR "PREV"
744# define HK_CUR2STACK "DBL PLAY"
745# define HK_REM2STACK "NEXT"
746
709#elif CONFIG_KEYPAD == IHIFI_770_PAD 747#elif CONFIG_KEYPAD == IHIFI_770_PAD
710# define SOL_QUIT BUTTON_POWER 748# define SOL_QUIT BUTTON_POWER
711# define SOL_UP BUTTON_PREV 749# define SOL_UP BUTTON_PREV
diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c
index 15d4039b4d..98c6d1a032 100644
--- a/apps/plugins/spacerocks.c
+++ b/apps/plugins/spacerocks.c
@@ -363,6 +363,24 @@
363#define AST_RIGHT BUTTON_NEXT 363#define AST_RIGHT BUTTON_NEXT
364#define AST_FIRE BUTTON_PLAY 364#define AST_FIRE BUTTON_PLAY
365 365
366#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
367#define AST_PAUSE BUTTON_VOL_UP
368#define AST_QUIT BUTTON_POWER
369#define AST_THRUST BUTTON_HOME
370#define AST_HYPERSPACE BUTTON_OPTION
371#define AST_LEFT BUTTON_PREV
372#define AST_RIGHT BUTTON_NEXT
373#define AST_FIRE BUTTON_PLAY
374
375#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
376#define AST_PAUSE BUTTON_VOL_UP
377#define AST_QUIT BUTTON_POWER
378#define AST_THRUST BUTTON_HOME
379#define AST_HYPERSPACE BUTTON_OPTION
380#define AST_LEFT BUTTON_PREV
381#define AST_RIGHT BUTTON_NEXT
382#define AST_FIRE BUTTON_PLAY
383
366#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 384#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
367#define AST_PAUSE BUTTON_PLAY 385#define AST_PAUSE BUTTON_PLAY
368#define AST_QUIT BUTTON_POWER 386#define AST_QUIT BUTTON_POWER
diff --git a/apps/plugins/star.c b/apps/plugins/star.c
index fdf67bec4c..43036e2808 100644
--- a/apps/plugins/star.c
+++ b/apps/plugins/star.c
@@ -639,6 +639,38 @@
639#define STAR_LEVEL_DOWN_NAME "PLAY + PREV" 639#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
640#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION" 640#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
641 641
642#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
643#define STAR_QUIT BUTTON_POWER
644#define STAR_LEFT BUTTON_PREV
645#define STAR_RIGHT BUTTON_NEXT
646#define STAR_UP BUTTON_HOME
647#define STAR_DOWN BUTTON_OPTION
648#define STAR_TOGGLE_CONTROL BUTTON_PLAY
649#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
650#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
651#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
652#define STAR_TOGGLE_CONTROL_NAME "PLAY"
653#define STAR_QUIT_NAME "POWER"
654#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
655#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
656#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
657
658#elif CONFIG_KEYPAD == XDUOO_X20_PAD
659#define STAR_QUIT BUTTON_POWER
660#define STAR_LEFT BUTTON_PREV
661#define STAR_RIGHT BUTTON_NEXT
662#define STAR_UP BUTTON_HOME
663#define STAR_DOWN BUTTON_OPTION
664#define STAR_TOGGLE_CONTROL BUTTON_PLAY
665#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
666#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
667#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
668#define STAR_TOGGLE_CONTROL_NAME "PLAY"
669#define STAR_QUIT_NAME "POWER"
670#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
671#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
672#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
673
642#elif CONFIG_KEYPAD == IHIFI_770_PAD 674#elif CONFIG_KEYPAD == IHIFI_770_PAD
643#define STAR_QUIT BUTTON_POWER 675#define STAR_QUIT BUTTON_POWER
644#define STAR_LEFT BUTTON_HOME 676#define STAR_LEFT BUTTON_HOME
diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c
index 5e83859d89..a806e4e830 100644
--- a/apps/plugins/stopwatch.c
+++ b/apps/plugins/stopwatch.c
@@ -321,6 +321,22 @@
321#define STOPWATCH_SCROLL_UP BUTTON_HOME 321#define STOPWATCH_SCROLL_UP BUTTON_HOME
322#define STOPWATCH_SCROLL_DOWN BUTTON_OPTION 322#define STOPWATCH_SCROLL_DOWN BUTTON_OPTION
323 323
324#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
325#define STOPWATCH_QUIT BUTTON_POWER
326#define STOPWATCH_START_STOP BUTTON_NEXT
327#define STOPWATCH_RESET_TIMER BUTTON_PREV
328#define STOPWATCH_LAP_TIMER BUTTON_PLAY
329#define STOPWATCH_SCROLL_UP BUTTON_HOME
330#define STOPWATCH_SCROLL_DOWN BUTTON_OPTION
331
332#elif CONFIG_KEYPAD == XDUOO_X20_PAD
333#define STOPWATCH_QUIT BUTTON_POWER
334#define STOPWATCH_START_STOP BUTTON_NEXT
335#define STOPWATCH_RESET_TIMER BUTTON_PREV
336#define STOPWATCH_LAP_TIMER BUTTON_PLAY
337#define STOPWATCH_SCROLL_UP BUTTON_HOME
338#define STOPWATCH_SCROLL_DOWN BUTTON_OPTION
339
324#elif CONFIG_KEYPAD == IHIFI_770_PAD 340#elif CONFIG_KEYPAD == IHIFI_770_PAD
325#define STOPWATCH_QUIT BUTTON_POWER 341#define STOPWATCH_QUIT BUTTON_POWER
326#define STOPWATCH_START_STOP BUTTON_NEXT 342#define STOPWATCH_START_STOP BUTTON_NEXT
diff --git a/apps/plugins/sudoku/sudoku.h b/apps/plugins/sudoku/sudoku.h
index 62ec80dba8..2bee868de9 100644
--- a/apps/plugins/sudoku/sudoku.h
+++ b/apps/plugins/sudoku/sudoku.h
@@ -437,6 +437,34 @@
437#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL) 437#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL)
438#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_POWER) 438#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_POWER)
439 439
440#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
441#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER
442#define SUDOKU_BUTTON_QUIT (BUTTON_POWER | BUTTON_REPEAT)
443#define SUDOKU_BUTTON_UP BUTTON_HOME
444#define SUDOKU_BUTTON_DOWN BUTTON_OPTION
445#define SUDOKU_BUTTON_LEFT BUTTON_PREV
446#define SUDOKU_BUTTON_RIGHT BUTTON_NEXT
447#define SUDOKU_BUTTON_TOGGLEBACK BUTTON_VOL_DOWN
448#define SUDOKU_BUTTON_TOGGLE BUTTON_VOL_UP
449#define SUDOKU_BUTTON_ALTTOGGLE BUTTON_PLAY
450#define SUDOKU_BUTTON_MENU_PRE BUTTON_POWER
451#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL)
452#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_POWER)
453
454#elif CONFIG_KEYPAD == XDUOO_X20_PAD
455#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER
456#define SUDOKU_BUTTON_QUIT (BUTTON_POWER | BUTTON_REPEAT)
457#define SUDOKU_BUTTON_UP BUTTON_HOME
458#define SUDOKU_BUTTON_DOWN BUTTON_OPTION
459#define SUDOKU_BUTTON_LEFT BUTTON_PREV
460#define SUDOKU_BUTTON_RIGHT BUTTON_NEXT
461#define SUDOKU_BUTTON_TOGGLEBACK BUTTON_VOL_DOWN
462#define SUDOKU_BUTTON_TOGGLE BUTTON_VOL_UP
463#define SUDOKU_BUTTON_ALTTOGGLE BUTTON_PLAY
464#define SUDOKU_BUTTON_MENU_PRE BUTTON_POWER
465#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL)
466#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_POWER)
467
440#elif CONFIG_KEYPAD == IHIFI_770_PAD 468#elif CONFIG_KEYPAD == IHIFI_770_PAD
441#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER 469#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER
442#define SUDOKU_BUTTON_QUIT (BUTTON_POWER | BUTTON_REPEAT) 470#define SUDOKU_BUTTON_QUIT (BUTTON_POWER | BUTTON_REPEAT)
diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h
index da6453ff8d..6ee8f9bbf1 100644
--- a/apps/plugins/text_viewer/tv_button.h
+++ b/apps/plugins/text_viewer/tv_button.h
@@ -562,6 +562,30 @@
562#define TV_LINE_DOWN BUTTON_OPTION 562#define TV_LINE_DOWN BUTTON_OPTION
563#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY) 563#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY)
564 564
565#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
566#define TV_QUIT BUTTON_POWER
567#define TV_SCROLL_UP BUTTON_VOL_UP
568#define TV_SCROLL_DOWN BUTTON_VOL_DOWN
569#define TV_SCREEN_LEFT BUTTON_PREV
570#define TV_SCREEN_RIGHT BUTTON_NEXT
571#define TV_MENU BUTTON_PLAY
572#define TV_AUTOSCROLL (BUTTON_POWER | BUTTON_HOME)
573#define TV_LINE_UP BUTTON_HOME
574#define TV_LINE_DOWN BUTTON_OPTION
575#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY)
576
577#elif CONFIG_KEYPAD == XDUOO_X20_PAD
578#define TV_QUIT BUTTON_POWER
579#define TV_SCROLL_UP BUTTON_VOL_UP
580#define TV_SCROLL_DOWN BUTTON_VOL_DOWN
581#define TV_SCREEN_LEFT BUTTON_PREV
582#define TV_SCREEN_RIGHT BUTTON_NEXT
583#define TV_MENU BUTTON_PLAY
584#define TV_AUTOSCROLL (BUTTON_POWER | BUTTON_HOME)
585#define TV_LINE_UP BUTTON_HOME
586#define TV_LINE_DOWN BUTTON_OPTION
587#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY)
588
565/* Xuelin 770/770c keys */ 589/* Xuelin 770/770c keys */
566#elif CONFIG_KEYPAD == IHIFI_770_PAD 590#elif CONFIG_KEYPAD == IHIFI_770_PAD
567#define TV_QUIT BUTTON_POWER 591#define TV_QUIT BUTTON_POWER
diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c
index eaa92d4b48..33ad38d72c 100644
--- a/apps/plugins/vu_meter.c
+++ b/apps/plugins/vu_meter.c
@@ -432,6 +432,28 @@
432#define LABEL_MENU "PLAY" 432#define LABEL_MENU "PLAY"
433#define LABEL_VOLUME "VOL UP/DN" 433#define LABEL_VOLUME "VOL UP/DN"
434 434
435#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
436#define VUMETER_QUIT BUTTON_POWER
437#define VUMETER_HELP BUTTON_HOME
438#define VUMETER_MENU BUTTON_PLAY
439#define VUMETER_UP BUTTON_VOL_UP
440#define VUMETER_DOWN BUTTON_VOL_DOWN
441#define LABEL_HELP "HOME"
442#define LABEL_QUIT "POWER"
443#define LABEL_MENU "PLAY"
444#define LABEL_VOLUME "VOL UP/DN"
445
446#elif (CONFIG_KEYPAD == XDUOO_X20_PAD)
447#define VUMETER_QUIT BUTTON_POWER
448#define VUMETER_HELP BUTTON_HOME
449#define VUMETER_MENU BUTTON_PLAY
450#define VUMETER_UP BUTTON_VOL_UP
451#define VUMETER_DOWN BUTTON_VOL_DOWN
452#define LABEL_HELP "HOME"
453#define LABEL_QUIT "POWER"
454#define LABEL_MENU "PLAY"
455#define LABEL_VOLUME "VOL UP/DN"
456
435#elif (CONFIG_KEYPAD == IHIFI_770_PAD) 457#elif (CONFIG_KEYPAD == IHIFI_770_PAD)
436#define VUMETER_QUIT BUTTON_POWER 458#define VUMETER_QUIT BUTTON_POWER
437#define VUMETER_HELP BUTTON_HOME 459#define VUMETER_HELP BUTTON_HOME
diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c
index 9adfc97b81..d342511419 100644
--- a/apps/plugins/wormlet.c
+++ b/apps/plugins/wormlet.c
@@ -402,6 +402,24 @@ CONFIG_KEYPAD == MROBE500_PAD
402#define BTN_QUIT BUTTON_POWER 402#define BTN_QUIT BUTTON_POWER
403#define BTN_STOPRESET (BUTTON_HOME | BUTTON_POWER) 403#define BTN_STOPRESET (BUTTON_HOME | BUTTON_POWER)
404 404
405#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
406#define BTN_DIR_UP BUTTON_HOME
407#define BTN_DIR_DOWN BUTTON_OPTION
408#define BTN_DIR_LEFT BUTTON_PREV
409#define BTN_DIR_RIGHT BUTTON_NEXT
410#define BTN_STARTPAUSE BUTTON_PLAY
411#define BTN_QUIT BUTTON_POWER
412#define BTN_STOPRESET (BUTTON_HOME | BUTTON_POWER)
413
414#elif CONFIG_KEYPAD == XDUOO_X20_PAD
415#define BTN_DIR_UP BUTTON_HOME
416#define BTN_DIR_DOWN BUTTON_OPTION
417#define BTN_DIR_LEFT BUTTON_PREV
418#define BTN_DIR_RIGHT BUTTON_NEXT
419#define BTN_STARTPAUSE BUTTON_PLAY
420#define BTN_QUIT BUTTON_POWER
421#define BTN_STOPRESET (BUTTON_HOME | BUTTON_POWER)
422
405#elif CONFIG_KEYPAD == IHIFI_770_PAD 423#elif CONFIG_KEYPAD == IHIFI_770_PAD
406#define BTN_DIR_UP BUTTON_PREV 424#define BTN_DIR_UP BUTTON_PREV
407#define BTN_DIR_DOWN BUTTON_NEXT 425#define BTN_DIR_DOWN BUTTON_NEXT
diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c
index 8acdf85015..9643641569 100644
--- a/apps/plugins/xobox.c
+++ b/apps/plugins/xobox.c
@@ -351,6 +351,24 @@ CONFIG_KEYPAD == MROBE500_PAD
351#define DOWN BUTTON_OPTION 351#define DOWN BUTTON_OPTION
352#define PAUSE BUTTON_PLAY 352#define PAUSE BUTTON_PLAY
353 353
354#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
355
356#define QUIT BUTTON_POWER
357#define LEFT BUTTON_PREV
358#define RIGHT BUTTON_NEXT
359#define UP BUTTON_HOME
360#define DOWN BUTTON_OPTION
361#define PAUSE BUTTON_PLAY
362
363#elif CONFIG_KEYPAD == XDUOO_X20_PAD
364
365#define QUIT BUTTON_POWER
366#define LEFT BUTTON_PREV
367#define RIGHT BUTTON_NEXT
368#define UP BUTTON_HOME
369#define DOWN BUTTON_OPTION
370#define PAUSE BUTTON_PLAY
371
354#elif CONFIG_KEYPAD == IHIFI_770_PAD 372#elif CONFIG_KEYPAD == IHIFI_770_PAD
355 373
356#define QUIT BUTTON_POWER 374#define QUIT BUTTON_POWER
diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h
index ce527c561e..53dd9e8d88 100644
--- a/apps/plugins/zxbox/keymaps.h
+++ b/apps/plugins/zxbox/keymaps.h
@@ -290,6 +290,22 @@
290#define ZX_UP BUTTON_HOME 290#define ZX_UP BUTTON_HOME
291#define ZX_DOWN BUTTON_OPTION 291#define ZX_DOWN BUTTON_OPTION
292 292
293#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
294#define ZX_SELECT BUTTON_PLAY
295#define ZX_MENU BUTTON_POWER
296#define ZX_LEFT BUTTON_PREV
297#define ZX_RIGHT BUTTON_NEXT
298#define ZX_UP BUTTON_HOME
299#define ZX_DOWN BUTTON_OPTION
300
301#elif CONFIG_KEYPAD == XDUOO_X20_PAD
302#define ZX_SELECT BUTTON_PLAY
303#define ZX_MENU BUTTON_POWER
304#define ZX_LEFT BUTTON_PREV
305#define ZX_RIGHT BUTTON_NEXT
306#define ZX_UP BUTTON_HOME
307#define ZX_DOWN BUTTON_OPTION
308
293#elif CONFIG_KEYPAD == IHIFI_770_PAD 309#elif CONFIG_KEYPAD == IHIFI_770_PAD
294#define ZX_SELECT BUTTON_PLAY 310#define ZX_SELECT BUTTON_PLAY
295#define ZX_MENU BUTTON_POWER 311#define ZX_MENU BUTTON_POWER
diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c
index b3f1ca70e8..4a26accc8a 100644
--- a/apps/plugins/zxbox/zxbox_keyb.c
+++ b/apps/plugins/zxbox/zxbox_keyb.c
@@ -287,6 +287,24 @@
287#define KBD_UP BUTTON_HOME 287#define KBD_UP BUTTON_HOME
288#define KBD_DOWN BUTTON_OPTION 288#define KBD_DOWN BUTTON_OPTION
289 289
290#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
291
292#define KBD_SELECT BUTTON_PLAY
293#define KBD_ABORT BUTTON_POWER
294#define KBD_LEFT BUTTON_PREV
295#define KBD_RIGHT BUTTON_NEXT
296#define KBD_UP BUTTON_HOME
297#define KBD_DOWN BUTTON_OPTION
298
299#elif CONFIG_KEYPAD == XDUOO_X20_PAD
300
301#define KBD_SELECT BUTTON_PLAY
302#define KBD_ABORT BUTTON_POWER
303#define KBD_LEFT BUTTON_PREV
304#define KBD_RIGHT BUTTON_NEXT
305#define KBD_UP BUTTON_HOME
306#define KBD_DOWN BUTTON_OPTION
307
290#elif CONFIG_KEYPAD == IHIFI_770_PAD 308#elif CONFIG_KEYPAD == IHIFI_770_PAD
291 309
292#define KBD_SELECT BUTTON_PLAY 310#define KBD_SELECT BUTTON_PLAY
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index ce73724f69..82ddcb80b9 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -78,6 +78,8 @@ mpio_hd200_hd300.c
78nwz_linux.c 78nwz_linux.c
79#elif defined(AGPTEK_ROCKER) 79#elif defined(AGPTEK_ROCKER)
80rocker_linux.c 80rocker_linux.c
81#elif (defined(XDUOO_X3II) || defined(XDUOO_X20))
82xduoo_linux.c
81#elif defined(RK27_GENERIC) || defined(HM60X) || defined(HM801) \ 83#elif defined(RK27_GENERIC) || defined(HM60X) || defined(HM801) \
82 || defined(MA9) || defined(MA9C) || defined(MA8) || defined(MA8C) \ 84 || defined(MA9) || defined(MA9C) || defined(MA8) || defined(MA8C) \
83 || defined(IHIFI760) || defined(IHIFI960) || defined(IHIFI800) \ 85 || defined(IHIFI760) || defined(IHIFI960) || defined(IHIFI800) \
diff --git a/bootloader/rocker_linux.c b/bootloader/rocker_linux.c
index cb0e5b66e5..80b3bfbab5 100644
--- a/bootloader/rocker_linux.c
+++ b/bootloader/rocker_linux.c
@@ -12,7 +12,7 @@
12 * 12 *
13 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing 13 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
14 * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach 14 * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach
15 * 15 *
16 * This program is free software; you can redistribute it and/or 16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License 17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2 18 * as published by the Free Software Foundation; either version 2
@@ -464,7 +464,7 @@ static int open_log(void)
464 return fd; 464 return fd;
465 close(fd); 465 close(fd);
466 /* move file */ 466 /* move file */
467 rename("/mnt/sd_0/rockbox.log", "/mnt_sd0/rockbox.log.1"); 467 rename("/mnt/sd_0/rockbox.log", "/mnt_sd_0/rockbox.log.1");
468 /* re-open the file, truncate in case the move was unsuccessful */ 468 /* re-open the file, truncate in case the move was unsuccessful */
469 return open("/mnt/sd_0/rockbox.log", O_RDWR | O_CREAT | O_APPEND | O_TRUNC); 469 return open("/mnt/sd_0/rockbox.log", O_RDWR | O_CREAT | O_APPEND | O_TRUNC);
470} 470}
diff --git a/bootloader/xduoo_linux.c b/bootloader/xduoo_linux.c
new file mode 100644
index 0000000000..1071c6dc9b
--- /dev/null
+++ b/bootloader/xduoo_linux.c
@@ -0,0 +1,555 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 *
10 * Copyright (C) 2016 by Amaury Pouly
11 * 2018 by Marcin Bukat
12 * 2018 by Roman Stolyarov
13 *
14 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
15 * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach
16 *
17 * This program is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU General Public License
19 * as published by the Free Software Foundation; either version 2
20 * of the License, or (at your option) any later version.
21 *
22 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
23 * KIND, either express or implied.
24 *
25 ****************************************************************************/
26
27#include "system.h"
28#include "lcd.h"
29#include "backlight.h"
30#include "button-target.h"
31#include "button.h"
32#include "../kernel/kernel-internal.h"
33#include "core_alloc.h"
34#include "filesystem-app.h"
35#include "lcd.h"
36#include "font.h"
37#include "power.h"
38#include <string.h>
39#include <stdlib.h>
40#include <unistd.h>
41#include <sys/types.h>
42#include <sys/stat.h>
43#include <fcntl.h>
44#include <dirent.h>
45#include <sys/wait.h>
46#include <stdarg.h>
47#include "version.h"
48
49/* all images must have the following size */
50#define ICON_WIDTH 130
51#define ICON_HEIGHT 130
52
53/* images */
54#include "bitmaps/rockboxicon.h"
55#include "bitmaps/hibyicon.h"
56#include "bitmaps/toolsicon.h"
57
58/* don't issue an error when parsing the file for dependencies */
59#if defined(BMPWIDTH_rockboxicon) && (BMPWIDTH_rockboxicon != ICON_WIDTH || \
60 BMPHEIGHT_rockboxicon != ICON_HEIGHT)
61#error rockboxicon has the wrong resolution
62#endif
63#if defined(BMPWIDTH_hibyicon) && (BMPWIDTH_hibyicon != ICON_WIDTH || \
64 BMPHEIGHT_hibyicon != ICON_HEIGHT)
65#error hibyicon has the wrong resolution
66#endif
67#if defined(BMPWIDTH_toolsicon) && (BMPWIDTH_toolsicon != ICON_WIDTH || \
68 BMPHEIGHT_toolsicon != ICON_HEIGHT)
69#error toolsicon has the wrong resolution
70#endif
71
72#ifndef BUTTON_UP
73#define BUTTON_UP BUTTON_PREV
74#endif
75#ifndef BUTTON_DOWN
76#define BUTTON_DOWN BUTTON_NEXT
77#endif
78#ifndef BUTTON_ENTER
79#define BUTTON_ENTER BUTTON_PLAY
80#endif
81
82/* return icon y position (x is always centered) */
83static int get_icon_y(void)
84{
85 int h;
86 lcd_getstringsize("X", NULL, &h);
87 return ((LCD_HEIGHT - ICON_HEIGHT)/2) - h;
88}
89
90/* Important Note: this bootloader is carefully written so that in case of
91 * error, the OF is run. This seems like the safest option since the OF is
92 * always there and might do magic things. */
93
94enum boot_mode
95{
96 BOOT_ROCKBOX,
97 BOOT_TOOLS,
98 BOOT_OF,
99 BOOT_COUNT,
100 BOOT_USB, /* special */
101 BOOT_STOP, /* power down/suspend */
102};
103
104static void display_text_center(int y, const char *text)
105{
106 int width;
107 lcd_getstringsize(text, &width, NULL);
108 lcd_putsxy(LCD_WIDTH / 2 - width / 2, y, text);
109}
110
111static void display_text_centerf(int y, const char *format, ...)
112{
113 char buf[1024];
114 va_list ap;
115 va_start(ap, format);
116
117 vsnprintf(buf, sizeof(buf), format, ap);
118 display_text_center(y, buf);
119}
120
121/* get timeout before taking action if the user doesn't touch the device */
122static int get_inactivity_tmo(void)
123{
124#if defined(HAS_BUTTON_HOLD)
125 if(button_hold())
126 return 5 * HZ; /* Inactivity timeout when on hold */
127 else
128#endif
129 return 10 * HZ; /* Inactivity timeout when not on hold */
130}
131
132/* return action on idle timeout */
133static enum boot_mode inactivity_action(enum boot_mode cur_selection)
134{
135#if defined(HAS_BUTTON_HOLD)
136 if(button_hold())
137 return BOOT_STOP; /* power down/suspend */
138 else
139#endif
140 return cur_selection; /* return last choice */
141}
142
143/* we store the boot mode in a file in /tmp so we can reload it between 'boots'
144 * (since the mostly suspends instead of powering down) */
145static enum boot_mode load_boot_mode(enum boot_mode mode)
146{
147 int fd = open("/data/rb_bl_mode.txt", O_RDONLY);
148 if(fd >= 0)
149 {
150 read(fd, &mode, sizeof(mode));
151 close(fd);
152 }
153 return mode;
154}
155
156static void save_boot_mode(enum boot_mode mode)
157{
158 int fd = open("/data/rb_bl_mode.txt", O_RDWR | O_CREAT | O_TRUNC);
159 if(fd >= 0)
160 {
161 write(fd, &mode, sizeof(mode));
162 close(fd);
163 }
164}
165
166static enum boot_mode get_boot_mode(void)
167{
168 /* load previous mode, or start with rockbox if none */
169 enum boot_mode init_mode = load_boot_mode(BOOT_ROCKBOX);
170 /* wait for user action */
171 enum boot_mode mode = init_mode;
172 int last_activity = current_tick;
173#if defined(HAS_BUTTON_HOLD)
174 bool hold_status = button_hold();
175#endif
176 while(true)
177 {
178 /* on usb detect, return to usb
179 * FIXME this is a hack, we need proper usb detection */
180 if(power_input_status() & POWER_INPUT_USB_CHARGER)
181 {
182 /* save last choice */
183 save_boot_mode(mode);
184 return BOOT_USB;
185 }
186 /* inactivity detection */
187 int timeout = last_activity + get_inactivity_tmo();
188 if(TIME_AFTER(current_tick, timeout))
189 {
190 /* save last choice */
191 save_boot_mode(mode);
192 return inactivity_action(mode);
193 }
194 /* redraw */
195 lcd_clear_display();
196 /* display top text */
197#if defined(HAS_BUTTON_HOLD)
198 if(button_hold())
199 {
200 lcd_set_foreground(LCD_RGBPACK(255, 0, 0));
201 display_text_center(0, "ON HOLD!");
202 }
203 else
204#endif
205 {
206 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
207 display_text_center(0, "SELECT PLAYER");
208 }
209 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
210 /* display icon */
211 const struct bitmap *icon = (mode == BOOT_OF) ? &bm_hibyicon :
212 (mode == BOOT_ROCKBOX) ? &bm_rockboxicon : &bm_toolsicon;
213 lcd_bmp(icon, (LCD_WIDTH - ICON_WIDTH) / 2, get_icon_y());
214 /* display bottom description */
215 const char *desc = (mode == BOOT_OF) ? "HIBY PLAYER" :
216 (mode == BOOT_ROCKBOX) ? "ROCKBOX" : "TOOLS";
217
218 int desc_height;
219 lcd_getstringsize(desc, NULL, &desc_height);
220 display_text_center(LCD_HEIGHT - 3*desc_height, desc);
221
222 /* display arrows */
223 int arrow_width, arrow_height;
224 lcd_getstringsize("<", &arrow_width, &arrow_height);
225 int arrow_y = get_icon_y() + ICON_HEIGHT / 2 - arrow_height / 2;
226 lcd_putsxy(arrow_width / 2, arrow_y, "<");
227 lcd_putsxy(LCD_WIDTH - 3 * arrow_width / 2, arrow_y, ">");
228
229 lcd_set_foreground(LCD_RGBPACK(0, 255, 0));
230 display_text_centerf(LCD_HEIGHT - arrow_height * 3 / 2, "timeout in %d sec",
231 (timeout - current_tick + HZ - 1) / HZ);
232
233 lcd_update();
234
235 /* wait for a key */
236 int btn = button_get_w_tmo(HZ / 10);
237
238#if defined(HAS_BUTTON_HOLD)
239 /* record action, changing HOLD counts as action */
240 if(btn & BUTTON_MAIN || hold_status != button_hold())
241 last_activity = current_tick;
242
243 hold_status = button_hold();
244#else
245 if(btn & BUTTON_MAIN)
246 last_activity = current_tick;
247#endif
248 /* ignore release, allow repeat */
249 if(btn & BUTTON_REL)
250 continue;
251 if(btn & BUTTON_REPEAT)
252 btn &= ~BUTTON_REPEAT;
253 /* play -> stop loop and return mode */
254 if(btn == BUTTON_ENTER)
255 break;
256 /* left/right/up/down: change mode */
257 if(btn == BUTTON_UP || btn == BUTTON_VOL_UP)
258 mode = (mode + BOOT_COUNT - 1) % BOOT_COUNT;
259 if(btn == BUTTON_DOWN || btn == BUTTON_VOL_DOWN)
260 mode = (mode + 1) % BOOT_COUNT;
261 }
262
263 /* save mode */
264 save_boot_mode(mode);
265 return mode;
266}
267
268void error_screen(const char *msg)
269{
270 lcd_clear_display();
271 lcd_putsf(0, 0, msg);
272 lcd_update();
273}
274
275int choice_screen(const char *title, bool center, int nr_choices, const char *choices[])
276{
277 int choice = 0;
278 int max_len = 0;
279 int h;
280 lcd_getstringsize("x", NULL, &h);
281 for(int i = 0; i < nr_choices; i++)
282 {
283 int len = strlen(choices[i]);
284 if(len > max_len)
285 max_len = len;
286 }
287 char *buf = malloc(max_len + 10);
288 int top_y = 2 * h;
289 int nr_lines = (LCD_HEIGHT - top_y) / h;
290 while(true)
291 {
292 /* make sure choice is visible */
293 int offset = choice - nr_lines / 2;
294 if(offset < 0)
295 offset = 0;
296 lcd_clear_display();
297 /* display top text */
298 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
299 display_text_center(0, title);
300 int line = 0;
301 for(int i = 0; i < nr_choices && line < nr_lines; i++)
302 {
303 if(i < offset)
304 continue;
305 if(i == choice)
306 lcd_set_foreground(LCD_RGBPACK(255, 0, 0));
307 else
308 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
309 sprintf(buf, "%s", choices[i]);
310 if(center)
311 display_text_center(top_y + h * line, buf);
312 else
313 lcd_putsxy(0, top_y + h * line, buf);
314 line++;
315 }
316
317 lcd_update();
318
319 /* wait for a key */
320 int btn = button_get_w_tmo(HZ / 10);
321 /* ignore release, allow repeat */
322 if(btn & BUTTON_REL)
323 continue;
324 if(btn & BUTTON_REPEAT)
325 btn &= ~BUTTON_REPEAT;
326 /* play -> stop loop and return mode */
327 if(btn == BUTTON_ENTER)
328 {
329 free(buf);
330 return btn == BUTTON_ENTER ? choice : -1;
331 }
332 /* left/right/up/down: change mode */
333 if(btn == BUTTON_UP || btn == BUTTON_VOL_UP)
334 choice = (choice + nr_choices - 1) % nr_choices;
335 if(btn == BUTTON_DOWN || btn == BUTTON_VOL_DOWN)
336 choice = (choice + 1) % nr_choices;
337 }
338}
339
340void run_file(const char *name)
341{
342 char *dirname = "/mnt/sd_0/";
343 char *buf = malloc(strlen(dirname) + strlen(name) + 1);
344 sprintf(buf, "%s%s", dirname, name);
345
346 lcd_clear_display();
347 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
348 lcd_putsf(0, 0, "Running %s", name);
349 lcd_update();
350
351 pid_t pid = fork();
352 if(pid == 0)
353 {
354 execlp("sh", "sh", buf, NULL);
355 _exit(42);
356 }
357 int status;
358 waitpid(pid, &status, 0);
359 if(WIFEXITED(status))
360 {
361 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
362 lcd_putsf(0, 1, "program returned %d", WEXITSTATUS(status));
363 }
364 else
365 {
366 lcd_set_foreground(LCD_RGBPACK(255, 0, 0));
367 lcd_putsf(0, 1, "an error occured: %x", status);
368 }
369 lcd_set_foreground(LCD_RGBPACK(255, 0, 0));
370 lcd_putsf(0, 3, "Press any key or wait");
371 lcd_update();
372 /* wait a small time */
373 sleep(HZ);
374 /* ignore event */
375 while(button_get(false) != 0) {}
376 /* wait for any key or timeout */
377 button_get_w_tmo(4 * HZ);
378}
379
380void run_script_menu(void)
381{
382 const char **entries = NULL;
383 int nr_entries = 0;
384 DIR *dir = opendir("/mnt/sd_0");
385 struct dirent *ent;
386 while((ent = readdir(dir)))
387 {
388 if(ent->d_type != DT_REG)
389 continue;
390 entries = realloc(entries, (nr_entries + 1) * sizeof(const char *));
391 entries[nr_entries++] = strdup(ent->d_name);
392 }
393 closedir(dir);
394 int idx = choice_screen("RUN SCRIPT", false, nr_entries, entries);
395 if(idx >= 0)
396 run_file(entries[idx]);
397 for(int i = 0; i < nr_entries; i++)
398 free((char *)entries[i]);
399 free(entries);
400}
401
402static void adb(int start)
403{
404 pid_t pid = fork();
405 if(pid == 0)
406 {
407 execlp("/etc/init.d/K90adb", "K90adb", start ? "start" : "stop", NULL);
408 _exit(42);
409 }
410 int status;
411 waitpid(pid, &status, 0);
412#if 0
413 if(WIFEXITED(status))
414 {
415 lcd_set_foreground(LCD_RGBPACK(255, 201, 0));
416 lcd_putsf(0, 1, "program returned %d", WEXITSTATUS(status));
417 }
418 else
419 {
420 lcd_set_foreground(LCD_RGBPACK(255, 0, 0));
421 lcd_putsf(0, 1, "an error occured: %x", status);
422 }
423#endif
424}
425
426static void tools_screen(void)
427{
428 const char *choices[] = {"ADB start", "ADB stop", "Run script", "Restart", "Shutdown"};
429 int choice = choice_screen("TOOLS MENU", true, 5, choices);
430 if(choice == 0)
431 {
432 /* run service menu */
433 printf("Starting ADB service...\n");
434 fflush(stdout);
435 adb(1);
436 }
437 else if(choice == 1)
438 {
439 printf("Stopping ADB service...\n");
440 fflush(stdout);
441 adb(0);
442 }
443 else if(choice == 2)
444 {
445 run_script_menu();
446 }
447 else if(choice == 3)
448 system_reboot();
449 else if(choice == 4)
450 power_off();
451}
452
453#if 0
454/* open log file */
455static int open_log(void)
456{
457 /* open regular log file */
458 int fd = open("/mnt/sd_0/rockbox.log", O_RDWR | O_CREAT | O_APPEND);
459 /* get its size */
460 struct stat stat;
461 if(fstat(fd, &stat) != 0)
462 return fd; /* on error, don't do anything */
463 /* if file is too large, rename it and start a new log file */
464 if(stat.st_size < 1000000)
465 return fd;
466 close(fd);
467 /* move file */
468 rename("/mnt/sd_0/rockbox.log", "/mnt/sd_0/rockbox.log.1");
469 /* re-open the file, truncate in case the move was unsuccessful */
470 return open("/mnt/sd_0/rockbox.log", O_RDWR | O_CREAT | O_APPEND | O_TRUNC);
471}
472#endif
473
474int main(int argc, char **argv)
475{
476 (void) argc;
477 (void) argv;
478#if 0
479 /* redirect stdout and stderr to have error messages logged somewhere on the
480 * user partition */
481 int fd = open_log();
482 if(fd >= 0)
483 {
484 dup2(fd, fileno(stdout));
485 dup2(fd, fileno(stderr));
486 close(fd);
487 }
488 /* print version */
489 printf("Rockbox boot loader\n");
490 printf("Version: %s\n", rbversion);
491 printf("%s\n", MODEL_NAME);
492#endif
493
494 system_init();
495 core_allocator_init();
496 kernel_init();
497 paths_init();
498 lcd_init();
499 font_init();
500 button_init();
501 backlight_init();
502 backlight_set_brightness(DEFAULT_BRIGHTNESS_SETTING);
503
504 /* try to load the extra font we install on the device */
505 //int font_id = font_load("/usr/rockbox/fonts/20-Terminus-Bold.fnt");
506 //if(font_id >= 0)
507 // lcd_setfont(font_id);
508
509 /* run all tools menu */
510 while(true)
511 {
512 enum boot_mode mode = get_boot_mode();
513 if(mode == BOOT_USB || mode == BOOT_OF)
514 {
515#if 0
516 fflush(stdout);
517 fflush(stderr);
518 close(fileno(stdout));
519 close(fileno(stderr));
520#endif
521 /* for now the only way we have to trigger USB mode it to run the OF */
522 /* boot OF */
523 execvp("/usr/bin/hiby_player", argv);
524 error_screen("Cannot boot OF");
525 sleep(5 * HZ);
526 }
527 else if(mode == BOOT_TOOLS)
528 {
529 tools_screen();
530 }
531 else if(mode == BOOT_ROCKBOX)
532 {
533 fflush(stdout);
534#if defined(XDUOO_X3II)
535 system("/bin/cp /mnt/sd_0/.rockbox/rockbox.x3ii /tmp");
536 execl("/tmp/rockbox.x3ii", "rockbox.x3ii", NULL);
537#elif defined(XDUOO_X20)
538 system("/bin/cp /mnt/sd_0/.rockbox/rockbox.x20 /tmp");
539 execl("/tmp/rockbox.x20", "rockbox.x20", NULL);
540#endif
541 printf("execvp failed: %s\n", strerror(errno));
542 /* fallback to OF in case of failure */
543 error_screen("Cannot boot Rockbox");
544 sleep(5 * HZ);
545 }
546 else
547 {
548 printf("suspend\n");
549// nwz_power_suspend();
550 }
551 }
552 /* if we reach this point, everything failed, so return an error so that
553 * sysmgrd knows something is wrong */
554 return 1;
555}
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 89f4f52895..7be6010ab7 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -113,25 +113,37 @@ target/hosted/sonynwz/nvp-nwz.c
113target/hosted/sonynwz/nwz-db.c 113target/hosted/sonynwz/nwz-db.c
114#endif 114#endif
115 115
116#if defined(AGPTEK_ROCKER) && !defined(SIMULATOR) 116#if ((defined(AGPTEK_ROCKER) || defined(XDUOO_X3II) || defined(XDUOO_X20)) && !defined(SIMULATOR))
117drivers/lcd-memframe.c 117drivers/lcd-memframe.c
118target/hosted/alsa-controls.c
119target/hosted/pcm-alsa.c
118target/hosted/backtrace-glibc.c 120target/hosted/backtrace-glibc.c
119target/hosted/kernel-unix.c
120target/hosted/filesystem-unix.c 121target/hosted/filesystem-unix.c
122target/hosted/kernel-unix.c
121target/hosted/lc-unix.c 123target/hosted/lc-unix.c
122target/hosted/alsa-controls.c 124target/hosted/sysfs.c
123target/hosted/pcm-alsa.c 125target/hosted/backlight-unix.c
124target/hosted/agptek/sysfs.c 126target/hosted/system-hosted.c
125target/hosted/agptek/backlight-agptek.c 127#endif
128
129#if defined(AGPTEK_ROCKER) && !defined(SIMULATOR)
126target/hosted/agptek/button-agptek.c 130target/hosted/agptek/button-agptek.c
127target/hosted/agptek/debug-agptek.c 131target/hosted/agptek/debug-agptek.c
128target/hosted/agptek/lcd-agptek.c 132target/hosted/agptek/lcd-agptek.c
129target/hosted/agptek/power-agptek.c 133target/hosted/agptek/power-agptek.c
130target/hosted/agptek/powermgmt-agptek.c 134target/hosted/agptek/powermgmt-agptek.c
131target/hosted/agptek/system-agptek.c
132target/hosted/agptek/usb-agptek.c 135target/hosted/agptek/usb-agptek.c
133#endif 136#endif
134 137
138#if ((defined(XDUOO_X3II)||defined(XDUOO_X20)) && !defined(SIMULATOR))
139target/hosted/xduoo/button-xduoo.c
140target/hosted/xduoo/debug-xduoo.c
141target/hosted/xduoo/lcd-xduoo.c
142target/hosted/xduoo/power-xduoo.c
143target/hosted/xduoo/powermgmt-xduoo.c
144target/hosted/xduoo/usb-xduoo.c
145#endif
146
135#if defined(SAMSUNG_YPR0) && !defined(SIMULATOR) 147#if defined(SAMSUNG_YPR0) && !defined(SIMULATOR)
136drivers/adc-as3514.c 148drivers/adc-as3514.c
137#if (CONFIG_RTC == RTC_AS3514) 149#if (CONFIG_RTC == RTC_AS3514)
@@ -502,6 +514,8 @@ target/hosted/alsa-controls.c
502target/hosted/pcm-alsa.c 514target/hosted/pcm-alsa.c
503#elif defined(HAVE_ROCKER_CODEC) && !defined(SIMULATOR) 515#elif defined(HAVE_ROCKER_CODEC) && !defined(SIMULATOR)
504drivers/audio/rocker_codec.c 516drivers/audio/rocker_codec.c
517#elif defined(HAVE_XDUOO_LINUX_CODEC) && !defined(SIMULATOR)
518drivers/audio/xduoolinux_codec.c
505#elif defined(HAVE_SDL_AUDIO) 519#elif defined(HAVE_SDL_AUDIO)
506drivers/audio/sdl.c 520drivers/audio/sdl.c
507#if CONFIG_CODEC == SWCODEC 521#if CONFIG_CODEC == SWCODEC
@@ -584,7 +598,7 @@ target/arm/ipod/powermgmt-ipod-pcf.c
584target/arm/pp/i2c-pp.c 598target/arm/pp/i2c-pp.c
585#elif CONFIG_I2C == I2C_PNX0101 599#elif CONFIG_I2C == I2C_PNX0101
586target/arm/pnx0101/i2c-pnx0101.c 600target/arm/pnx0101/i2c-pnx0101.c
587#elif CONFIG_I2C == I2C_TCC780X || CONFIG_I2C == I2C_TCC77X 601#elif CONFIG_I2C == I2C_TCC780X || CONFIG_I2C == I2C_TCC77X
588target/arm/i2c-telechips.c 602target/arm/i2c-telechips.c
589#elif CONFIG_I2C == I2C_S3C2440 603#elif CONFIG_I2C == I2C_S3C2440
590target/arm/s3c2440/i2c-s3c2440.c 604target/arm/s3c2440/i2c-s3c2440.c
@@ -837,9 +851,9 @@ drivers/isp1583.c
837target/arm/rk27xx/usb-drv-rk27xx.c 851target/arm/rk27xx/usb-drv-rk27xx.c
838#endif 852#endif
839#else /* !defined(HAVE_USBSTACK) */ 853#else /* !defined(HAVE_USBSTACK) */
840#if CONFIG_USBOTG == USBOTG_ISP1362 854#if CONFIG_USBOTG == USBOTG_ISP1362
841drivers/isp1362.c 855drivers/isp1362.c
842#elif CONFIG_USBOTG == USBOTG_M5636 856#elif CONFIG_USBOTG == USBOTG_M5636
843drivers/m5636.c 857drivers/m5636.c
844#endif 858#endif
845#endif /* !defined(HAVE_USBSTACK) */ 859#endif /* !defined(HAVE_USBSTACK) */
@@ -1415,7 +1429,7 @@ target/arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c
1415target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c 1429target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c
1416target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c 1430target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c
1417target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c 1431target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c
1418target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c 1432target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c
1419#ifndef BOOTLOADER 1433#ifndef BOOTLOADER
1420target/arm/pnx0101/pcm-pnx0101.c 1434target/arm/pnx0101/pcm-pnx0101.c
1421#endif /* BOOTLOADER */ 1435#endif /* BOOTLOADER */
@@ -1989,7 +2003,7 @@ target/hosted/ibasso/dx90/button-dx90.c
1989#ifdef WIN32 2003#ifdef WIN32
1990asm/mempcpy.c 2004asm/mempcpy.c
1991target/hosted/filesystem-win32.c 2005target/hosted/filesystem-win32.c
1992#else /* !WIN32 */ 2006#else /* !WIN32 */
1993target/hosted/filesystem-unix.c 2007target/hosted/filesystem-unix.c
1994#endif /* WIN32 */ 2008#endif /* WIN32 */
1995target/hosted/sdl/load_code-sdl.c 2009target/hosted/sdl/load_code-sdl.c
diff --git a/firmware/asm/SOURCES b/firmware/asm/SOURCES
index eba5bd2cb6..085b6351a5 100644
--- a/firmware/asm/SOURCES
+++ b/firmware/asm/SOURCES
@@ -15,7 +15,7 @@ mempcpy.c
15 defined(CREATIVE_ZVx) || defined(SANSA_CONNECT) || defined(SANSA_FUZEPLUS) || \ 15 defined(CREATIVE_ZVx) || defined(SANSA_CONNECT) || defined(SANSA_FUZEPLUS) || \
16 defined(COWON_D2) || defined(MINI2440) || defined(SAMSUNG_YPR0) || \ 16 defined(COWON_D2) || defined(MINI2440) || defined(SAMSUNG_YPR0) || \
17 defined(SAMSUNG_YPR1) || defined(DX50) || defined(DX90) || (defined(MROBE_500) && !defined(LCD_USE_DMA)) || \ 17 defined(SAMSUNG_YPR1) || defined(DX50) || defined(DX90) || (defined(MROBE_500) && !defined(LCD_USE_DMA)) || \
18 defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI) || defined(SONY_NWZ_LINUX) || defined(AGPTEK_ROCKER)) && \ 18 defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI) || defined(SONY_NWZ_LINUX) || defined(AGPTEK_ROCKER) || defined(XDUOO_X3II) || defined(XDUOO_X20)) && \
19 !defined(SIMULATOR) 19 !defined(SIMULATOR)
20#if LCD_DEPTH >= 24 20#if LCD_DEPTH >= 24
21lcd-as-memframe-24bit.c 21lcd-as-memframe-24bit.c
diff --git a/firmware/drivers/audio/xduoolinux_codec.c b/firmware/drivers/audio/xduoolinux_codec.c
new file mode 100644
index 0000000000..5db4902e5f
--- /dev/null
+++ b/firmware/drivers/audio/xduoolinux_codec.c
@@ -0,0 +1,122 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 *
11 * Copyright (c) 2018 Marcin Bukat
12 * Copyright (c) 2018 Roman Stolyarov
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#include "config.h"
25#include "audio.h"
26#include "audiohw.h"
27#include "system.h"
28#include "kernel.h"
29#include "panic.h"
30#include "sysfs.h"
31#include "alsa-controls.h"
32
33static int fd_hw;
34
35static void hw_open(void)
36{
37 fd_hw = open("/dev/snd/controlC0", O_RDWR);
38 if(fd_hw < 0)
39 panicf("Cannot open '/dev/snd/controlC0'");
40}
41
42static void hw_close(void)
43{
44 close(fd_hw);
45}
46
47void audiohw_preinit(void)
48{
49 alsa_controls_init();
50 hw_open();
51}
52
53void audiohw_postinit(void)
54{
55 long int ps = 2; // headset
56 int status = 0;
57
58 const char * const sysfs_lo_switch = "/sys/class/switch/lineout/state";
59 const char * const sysfs_hs_switch = "/sys/class/switch/headset/state";
60#ifdef XDUOO_X20
61 const char * const sysfs_bal_switch = "/sys/class/switch/balance/state";
62#endif
63
64#if defined(XDUOO_X3II)
65 alsa_controls_set_bool("AK4490 Soft Mute", true);
66#endif
67
68 sysfs_get_int(sysfs_lo_switch, &status);
69 if (status) ps = 1; // lineout
70
71 sysfs_get_int(sysfs_hs_switch, &status);
72 if (status) ps = 2; // headset
73
74#ifdef XDUOO_X20
75 sysfs_get_int(sysfs_bal_switch, &status);
76 if (status) ps = 3; // balance
77#endif
78
79 /* Output port switch */
80 alsa_controls_set_ints("Output Port Switch", 1, &ps);
81
82#if defined(XDUOO_X3II)
83 alsa_controls_set_bool("AK4490 Soft Mute", false);
84#endif
85}
86
87void audiohw_close(void)
88{
89 hw_close();
90 alsa_controls_close();
91}
92
93void audiohw_set_frequency(int fsel)
94{
95 (void)fsel;
96}
97
98void audiohw_set_volume(int vol_l, int vol_r)
99{
100 long int vol_l_hw = -vol_l/5;
101 long int vol_r_hw = -vol_r/5;
102
103 alsa_controls_set_ints("Left Playback Volume", 1, &vol_l_hw);
104 alsa_controls_set_ints("Right Playback Volume", 1, &vol_r_hw);
105}
106
107void audiohw_set_filter_roll_off(int value)
108{
109 /* 0 = fast (sharp);
110 1 = slow;
111 2 = fast2
112 3 = slow2
113 4 = NOS ? */
114 long int value_hw = value;
115#if defined(XDUOO_X3II)
116 alsa_controls_set_ints("AK4490 Digital Filter", 1, &value_hw);
117#elif defined(XDUOO_X20)
118 alsa_controls_set_ints("ES9018_K2M Digital Filter", 1, &value_hw);
119#else
120 (void)value;
121#endif
122}
diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h
index 458fba3412..00bb15812d 100644
--- a/firmware/export/audiohw.h
+++ b/firmware/export/audiohw.h
@@ -224,6 +224,8 @@ struct sound_settings_info
224#include "codec-dx90.h" 224#include "codec-dx90.h"
225#elif defined(HAVE_ROCKER_CODEC) 225#elif defined(HAVE_ROCKER_CODEC)
226#include "rocker_codec.h" 226#include "rocker_codec.h"
227#elif defined(HAVE_XDUOO_LINUX_CODEC)
228#include "rocker_codec.h"
227#endif 229#endif
228 230
229/* convert caps into defines */ 231/* convert caps into defines */
diff --git a/firmware/export/config.h b/firmware/export/config.h
index a41cceff59..c55d489c26 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -171,6 +171,8 @@
171#define XDUOO_X3_PAD 66 171#define XDUOO_X3_PAD 66
172#define IHIFI_770_PAD 67 172#define IHIFI_770_PAD 67
173#define IHIFI_800_PAD 68 173#define IHIFI_800_PAD 68
174#define XDUOO_X3II_PAD 69
175#define XDUOO_X20_PAD 70
174 176
175/* CONFIG_REMOTE_KEYPAD */ 177/* CONFIG_REMOTE_KEYPAD */
176#define H100_REMOTE 1 178#define H100_REMOTE 1
@@ -624,6 +626,10 @@ Lyre prototype 1 */
624#include "config/agptekrocker.h" 626#include "config/agptekrocker.h"
625#elif defined(XDUOO_X3) 627#elif defined(XDUOO_X3)
626#include "config/xduoox3.h" 628#include "config/xduoox3.h"
629#elif defined(XDUOO_X3II)
630#include "config/xduoox3ii.h"
631#elif defined(XDUOO_X20)
632#include "config/xduoox20.h"
627#else 633#else
628/* no known platform */ 634/* no known platform */
629#endif 635#endif
diff --git a/firmware/export/config/agptekrocker.h b/firmware/export/config/agptekrocker.h
index 172e079721..372287f4b5 100644
--- a/firmware/export/config/agptekrocker.h
+++ b/firmware/export/config/agptekrocker.h
@@ -3,7 +3,7 @@
3 */ 3 */
4 4
5/* For Rolo and boot loader */ 5/* For Rolo and boot loader */
6#define MODEL_NUMBER 103//??? 6#define MODEL_NUMBER 105
7 7
8#define MODEL_NAME "Agptek Rocker" 8#define MODEL_NAME "Agptek Rocker"
9 9
diff --git a/firmware/export/config/xduoox20.h b/firmware/export/config/xduoox20.h
new file mode 100644
index 0000000000..d451ba31f4
--- /dev/null
+++ b/firmware/export/config/xduoox20.h
@@ -0,0 +1,126 @@
1/*
2 * This config file is for the xDuoo X20
3 */
4
5/* For Rolo and boot loader */
6#define MODEL_NUMBER 111
7
8#define MODEL_NAME "xDuoo X20"
9
10/* LCD dimensions */
11#define LCD_WIDTH 240
12#define LCD_HEIGHT 320
13/* sqrt(240^2 + 320^2) / 2.4 = 166 */
14#define LCD_DPI 166
15
16#ifndef SIMULATOR
17#define CONFIG_PLATFORM (PLATFORM_HOSTED)
18#endif
19
20/* define this if you have a bitmap LCD display */
21#define HAVE_LCD_BITMAP
22
23/* define this if you have a colour LCD */
24#define HAVE_LCD_COLOR
25
26#define HAVE_LCD_ENABLE
27
28/* Define this if the LCD can shut down */
29#define HAVE_LCD_SHUTDOWN
30
31/* define this if you want album art for this target */
32#define HAVE_ALBUMART
33
34/* define this to enable bitmap scaling */
35#define HAVE_BMP_SCALING
36
37/* define this to enable JPEG decoding */
38#define HAVE_JPEG
39
40/* define this if you have access to the quickscreen */
41#define HAVE_QUICKSCREEN
42
43/* define this if you would like tagcache to build on this target */
44#define HAVE_TAGCACHE
45
46#define LCD_DEPTH 32
47/* Check that but should not matter */
48#define LCD_PIXELFORMAT XRGB8888
49
50#define HAVE_BACKLIGHT
51#define HAVE_BACKLIGHT_BRIGHTNESS
52
53/* Main LCD backlight brightness range and defaults: the backlight driver
54 * has levels from 0 to 2555. But 0 is off so start at 1.
55 */
56#define MIN_BRIGHTNESS_SETTING 1
57#define MAX_BRIGHTNESS_SETTING 255
58#define DEFAULT_BRIGHTNESS_SETTING 70
59
60/* Which backlight fading type? */
61#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING
62
63/* define this if you have a real-time clock */
64#define CONFIG_RTC APPLICATION
65
66/* The number of bytes reserved for loadable codecs */
67#define CODEC_SIZE 0x80000
68
69/* The number of bytes reserved for loadable plugins */
70#define PLUGIN_BUFFER_SIZE 0x100000
71
72/* Define this if you do software codec */
73#define CONFIG_CODEC SWCODEC
74
75#define HAVE_HEADPHONE_DETECTION
76
77/* KeyPad configuration for plugins */
78#define CONFIG_KEYPAD XDUOO_X20_PAD
79
80/* Define this if a programmable hotkey is mapped */
81#define HAVE_HOTKEY
82
83/* define this if the target has volume keys which can be used in the lists */
84#define HAVE_VOLUME_IN_LIST
85
86#ifndef SIMULATOR
87/* We have usb power and can detect usb but it is handled by Linux */
88#define HAVE_USB_POWER
89
90#endif
91
92#define CONFIG_BATTERY_MEASURE PERCENTAGE_MEASURE
93
94/* Linux controlls charging, we can monitor */
95#define CONFIG_CHARGING CHARGING_MONITOR
96
97/* define this if the hardware can be powered off while charging */
98#define HAVE_POWEROFF_WHILE_CHARGING
99
100/* same dimensions as gigabeats */
101#define CONFIG_LCD LCD_INGENIC_LINUX
102
103/* Define this if you have a software controlled poweroff */
104#define HAVE_SW_POWEROFF
105
106/* Define this to the CPU frequency */
107#define CPU_FREQ 504000000
108
109/* No special storage */
110#define CONFIG_STORAGE STORAGE_HOSTFS
111#define HAVE_STORAGE_FLUSH
112
113/* Battery */
114#define BATTERY_TYPES_COUNT 1
115
116/* Audio codec */
117#define HAVE_XDUOO_LINUX_CODEC
118
119/* We don't have hardware controls */
120#define HAVE_SW_TONE_CONTROLS
121
122/* Battery */
123#define BATTERY_CAPACITY_DEFAULT 2400 /* default battery capacity */
124#define BATTERY_CAPACITY_MIN 2400 /* min. capacity selectable */
125#define BATTERY_CAPACITY_MAX 2400 /* max. capacity selectable */
126#define BATTERY_CAPACITY_INC 0 /* capacity increment */
diff --git a/firmware/export/config/xduoox3ii.h b/firmware/export/config/xduoox3ii.h
new file mode 100644
index 0000000000..af63c4f97b
--- /dev/null
+++ b/firmware/export/config/xduoox3ii.h
@@ -0,0 +1,126 @@
1/*
2 * This config file is for the xDuoo X3ii
3 */
4
5/* For Rolo and boot loader */
6#define MODEL_NUMBER 110
7
8#define MODEL_NAME "xDuoo X3ii"
9
10/* LCD dimensions */
11#define LCD_WIDTH 240
12#define LCD_HEIGHT 320
13/* sqrt(240^2 + 320^2) / 2.4 = 166 */
14#define LCD_DPI 166
15
16#ifndef SIMULATOR
17#define CONFIG_PLATFORM (PLATFORM_HOSTED)
18#endif
19
20/* define this if you have a bitmap LCD display */
21#define HAVE_LCD_BITMAP
22
23/* define this if you have a colour LCD */
24#define HAVE_LCD_COLOR
25
26#define HAVE_LCD_ENABLE
27
28/* Define this if the LCD can shut down */
29#define HAVE_LCD_SHUTDOWN
30
31/* define this if you want album art for this target */
32#define HAVE_ALBUMART
33
34/* define this to enable bitmap scaling */
35#define HAVE_BMP_SCALING
36
37/* define this to enable JPEG decoding */
38#define HAVE_JPEG
39
40/* define this if you have access to the quickscreen */
41#define HAVE_QUICKSCREEN
42
43/* define this if you would like tagcache to build on this target */
44#define HAVE_TAGCACHE
45
46#define LCD_DEPTH 32
47/* Check that but should not matter */
48#define LCD_PIXELFORMAT XRGB8888
49
50#define HAVE_BACKLIGHT
51#define HAVE_BACKLIGHT_BRIGHTNESS
52
53/* Main LCD backlight brightness range and defaults: the backlight driver
54 * has levels from 0 to 2555. But 0 is off so start at 1.
55 */
56#define MIN_BRIGHTNESS_SETTING 1
57#define MAX_BRIGHTNESS_SETTING 255
58#define DEFAULT_BRIGHTNESS_SETTING 70
59
60/* Which backlight fading type? */
61#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING
62
63/* define this if you have a real-time clock */
64#define CONFIG_RTC APPLICATION
65
66/* The number of bytes reserved for loadable codecs */
67#define CODEC_SIZE 0x80000
68
69/* The number of bytes reserved for loadable plugins */
70#define PLUGIN_BUFFER_SIZE 0x100000
71
72/* Define this if you do software codec */
73#define CONFIG_CODEC SWCODEC
74
75#define HAVE_HEADPHONE_DETECTION
76
77/* KeyPad configuration for plugins */
78#define CONFIG_KEYPAD XDUOO_X3II_PAD
79
80/* Define this if a programmable hotkey is mapped */
81#define HAVE_HOTKEY
82
83/* define this if the target has volume keys which can be used in the lists */
84#define HAVE_VOLUME_IN_LIST
85
86#ifndef SIMULATOR
87/* We have usb power and can detect usb but it is handled by Linux */
88#define HAVE_USB_POWER
89
90#endif
91
92#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE
93
94/* Linux controlls charging, we can monitor */
95#define CONFIG_CHARGING CHARGING_MONITOR
96
97/* define this if the hardware can be powered off while charging */
98#define HAVE_POWEROFF_WHILE_CHARGING
99
100/* same dimensions as gigabeats */
101#define CONFIG_LCD LCD_INGENIC_LINUX
102
103/* Define this if you have a software controlled poweroff */
104#define HAVE_SW_POWEROFF
105
106/* Define this to the CPU frequency */
107#define CPU_FREQ 504000000
108
109/* No special storage */
110#define CONFIG_STORAGE STORAGE_HOSTFS
111#define HAVE_STORAGE_FLUSH
112
113/* Battery */
114#define BATTERY_TYPES_COUNT 1
115
116/* Audio codec */
117#define HAVE_XDUOO_LINUX_CODEC
118
119/* We don't have hardware controls */
120#define HAVE_SW_TONE_CONTROLS
121
122/* Battery */
123#define BATTERY_CAPACITY_DEFAULT 2000 /* default battery capacity */
124#define BATTERY_CAPACITY_MIN 2000 /* min. capacity selectable */
125#define BATTERY_CAPACITY_MAX 2000 /* max. capacity selectable */
126#define BATTERY_CAPACITY_INC 0 /* capacity increment */
diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h
index 165dd37494..b95f1614eb 100644
--- a/firmware/export/rbpaths.h
+++ b/firmware/export/rbpaths.h
@@ -42,7 +42,7 @@
42 42
43#if !defined(APPLICATION) || defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ 43#if !defined(APPLICATION) || defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \
44 defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || \ 44 defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || \
45 defined(AGPTEK_ROCKER) 45 defined(AGPTEK_ROCKER) || defined(XDUOO_X3II) || defined(XDUOO_X20)
46 46
47#if defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) 47#if defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1)
48#define HOME_DIR "/mnt/media0" 48#define HOME_DIR "/mnt/media0"
diff --git a/firmware/export/xduoolinux_codec.h b/firmware/export/xduoolinux_codec.h
new file mode 100644
index 0000000000..ccd49f09aa
--- /dev/null
+++ b/firmware/export/xduoolinux_codec.h
@@ -0,0 +1,7 @@
1#ifndef __XDUOOLINUX_CODEC__
2#define __XDUOOLINUX_CODEC__
3
4#define AUDIOHW_CAPS (FILTER_ROLL_OFF_CAP)
5AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -127, 0, -30)
6AUDIOHW_SETTING(FILTER_ROLL_OFF, "", 0, 1, 0, 4, 0)
7#endif
diff --git a/firmware/target/hosted/agptek/backlight-target.h b/firmware/target/hosted/backlight-target.h
index e3b8a7bd78..e3b8a7bd78 100644
--- a/firmware/target/hosted/agptek/backlight-target.h
+++ b/firmware/target/hosted/backlight-target.h
diff --git a/firmware/target/hosted/agptek/backlight-agptek.c b/firmware/target/hosted/backlight-unix.c
index 2f00787f72..2f00787f72 100644
--- a/firmware/target/hosted/agptek/backlight-agptek.c
+++ b/firmware/target/hosted/backlight-unix.c
diff --git a/firmware/target/hosted/filesystem-app.c b/firmware/target/hosted/filesystem-app.c
index d9fcd64e2d..b49412ea48 100644
--- a/firmware/target/hosted/filesystem-app.c
+++ b/firmware/target/hosted/filesystem-app.c
@@ -36,8 +36,7 @@
36#include "rbpaths.h" 36#include "rbpaths.h"
37#include "logf.h" 37#include "logf.h"
38 38
39 39#if (defined(AGPTEK_ROCKER) || defined(XDUOO_X3II) || defined(XDUOO_X20)) && !defined(BOOTLOADER)
40#if defined(AGPTEK_ROCKER) && !defined(BOOTLOADER)
41#define PIVOT_ROOT "/mnt/sd_0" 40#define PIVOT_ROOT "/mnt/sd_0"
42#endif 41#endif
43 42
@@ -52,7 +51,8 @@ static const char rbhome[] = HOME_DIR;
52#endif 51#endif
53 52
54#if !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || defined(DX50) || \ 53#if !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || defined(DX50) || \
55 defined(SONY_NWZ_LINUX) || defined(DX90) || defined(AGPTEK_ROCKER)) && \ 54 defined(SONY_NWZ_LINUX) || defined(DX90) || defined(AGPTEK_ROCKER) || \
55 defined(XDUOO_X3II) || defined(XDUOO_X20)) && \
56 !defined(__PCTOOL__) 56 !defined(__PCTOOL__)
57/* Special dirs are user-accessible (and user-writable) dirs which take priority 57/* Special dirs are user-accessible (and user-writable) dirs which take priority
58 * over the ones where Rockbox is installed to. Classic example would be 58 * over the ones where Rockbox is installed to. Classic example would be
diff --git a/firmware/target/hosted/rtc.c b/firmware/target/hosted/rtc.c
index 178e797a8d..488531c77c 100644
--- a/firmware/target/hosted/rtc.c
+++ b/firmware/target/hosted/rtc.c
@@ -42,7 +42,7 @@ int rtc_read_datetime(struct tm *tm)
42 42
43int rtc_write_datetime(const struct tm *tm) 43int rtc_write_datetime(const struct tm *tm)
44{ 44{
45#if defined(AGPTEK_ROCKER) && !defined(WIN32) 45#if !defined(WIN32)
46 struct timeval tv; 46 struct timeval tv;
47 struct tm *tm_time; 47 struct tm *tm_time;
48 48
diff --git a/firmware/target/hosted/sdl/sim-ui-defines.h b/firmware/target/hosted/sdl/sim-ui-defines.h
index 99ae062595..1e96383682 100644
--- a/firmware/target/hosted/sdl/sim-ui-defines.h
+++ b/firmware/target/hosted/sdl/sim-ui-defines.h
@@ -521,6 +521,7 @@
521#define UI_HEIGHT 380 521#define UI_HEIGHT 380
522#define UI_LCD_POSX 29 522#define UI_LCD_POSX 29
523#define UI_LCD_POSY 25 523#define UI_LCD_POSY 25
524
524#elif defined(XDUOO_X3) 525#elif defined(XDUOO_X3)
525#define UI_TITLE "xDuoo X3" 526#define UI_TITLE "xDuoo X3"
526#define UI_WIDTH 192 /* width of GUI window */ 527#define UI_WIDTH 192 /* width of GUI window */
@@ -528,6 +529,20 @@
528#define UI_LCD_POSX 34 529#define UI_LCD_POSX 34
529#define UI_LCD_POSY 73 530#define UI_LCD_POSY 73
530 531
532#elif defined(XDUOO_X3II)
533#define UI_TITLE "xDuoo X3ii"
534#define UI_WIDTH 322 /* width of GUI window */
535#define UI_HEIGHT 609 /* height of GUI window */
536#define UI_LCD_POSX 43
537#define UI_LCD_POSY 62
538
539#elif defined(XDUOO_X20)
540#define UI_TITLE "xDuoo X20"
541#define UI_WIDTH 322 /* width of GUI window */
542#define UI_HEIGHT 609 /* height of GUI window */
543#define UI_LCD_POSX 43
544#define UI_LCD_POSY 62
545
531#elif defined(IHIFI770) 546#elif defined(IHIFI770)
532#define UI_TITLE "iHiFi 770" 547#define UI_TITLE "iHiFi 770"
533#define UI_WIDTH 382 /* width of GUI window */ 548#define UI_WIDTH 382 /* width of GUI window */
@@ -554,4 +569,3 @@
554#endif 569#endif
555 570
556#endif /* #ifndef __UISDL_H__ */ 571#endif /* #ifndef __UISDL_H__ */
557
diff --git a/firmware/target/hosted/agptek/sysfs.c b/firmware/target/hosted/sysfs.c
index 177f338911..177f338911 100644
--- a/firmware/target/hosted/agptek/sysfs.c
+++ b/firmware/target/hosted/sysfs.c
diff --git a/firmware/target/hosted/agptek/sysfs.h b/firmware/target/hosted/sysfs.h
index 639cc1c409..639cc1c409 100644
--- a/firmware/target/hosted/agptek/sysfs.h
+++ b/firmware/target/hosted/sysfs.h
diff --git a/firmware/target/hosted/agptek/system-agptek.c b/firmware/target/hosted/system-hosted.c
index 7f0949daf2..7f0949daf2 100644
--- a/firmware/target/hosted/agptek/system-agptek.c
+++ b/firmware/target/hosted/system-hosted.c
diff --git a/firmware/target/hosted/xduoo/adc-target.h b/firmware/target/hosted/xduoo/adc-target.h
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/firmware/target/hosted/xduoo/adc-target.h
diff --git a/firmware/target/hosted/xduoo/button-target.h b/firmware/target/hosted/xduoo/button-target.h
new file mode 100644
index 0000000000..6cca5c22a0
--- /dev/null
+++ b/firmware/target/hosted/xduoo/button-target.h
@@ -0,0 +1,46 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2018 by Roman Stolyarov
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20#ifndef _BUTTON_TARGET_H_
21#define _BUTTON_TARGET_H_
22
23#define HAS_BUTTON_HOLD
24
25/* Main unit's buttons */
26#define BUTTON_POWER 0x00000001
27#define BUTTON_HOME 0x00000002
28#define BUTTON_OPTION 0x00000004
29#define BUTTON_PREV 0x00000008
30#define BUTTON_NEXT 0x00000010
31#define BUTTON_PLAY 0x00000020
32#define BUTTON_VOL_UP 0x00000040
33#define BUTTON_VOL_DOWN 0x00000080
34
35#define BUTTON_LEFT 0
36#define BUTTON_RIGHT 0
37
38#define BUTTON_MAIN (BUTTON_POWER | BUTTON_HOME | BUTTON_OPTION | BUTTON_PREV | \
39 BUTTON_NEXT | BUTTON_PLAY | BUTTON_VOL_UP | BUTTON_VOL_DOWN)
40
41/* Software power-off */
42#define POWEROFF_BUTTON BUTTON_POWER
43#define POWEROFF_COUNT 25
44
45#endif /* _BUTTON_TARGET_H_ */
46
diff --git a/firmware/target/hosted/xduoo/button-xduoo.c b/firmware/target/hosted/xduoo/button-xduoo.c
new file mode 100644
index 0000000000..9fd1392b89
--- /dev/null
+++ b/firmware/target/hosted/xduoo/button-xduoo.c
@@ -0,0 +1,202 @@
1/***************************************************************************
2 * __________ __ ___
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2017 Marcin Bukat
10 * Copyright (C) 2018 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 bool soft_hold = false;
41#ifndef BOOTLOADER
42static unsigned soft_hold_counter = 0;
43#define SOFT_HOLD_BUTTON BUTTON_POWER
44#define SOFT_HOLD_CNTMAX_1 (HZ)
45#define SOFT_HOLD_CNTMAX_2 (HZ*2)
46#endif
47
48#define NR_POLL_DESC 3
49static struct pollfd poll_fds[NR_POLL_DESC];
50
51static int button_map(int keycode)
52{
53 switch(keycode)
54 {
55 case KEY_BACK:
56 return BUTTON_HOME;
57
58 case KEY_MENU:
59 return BUTTON_OPTION;
60
61 case KEY_UP:
62 return BUTTON_PREV;
63
64 case KEY_DOWN:
65 return BUTTON_NEXT;
66
67 case KEY_ENTER:
68 return BUTTON_PLAY;
69
70 case KEY_VOLUMEUP:
71 return BUTTON_VOL_UP;
72
73 case KEY_VOLUMEDOWN:
74 return BUTTON_VOL_DOWN;
75
76 case KEY_POWER:
77 return BUTTON_POWER;
78
79 default:
80 return 0;
81 }
82}
83
84void button_init_device(void)
85{
86 const char * const input_devs[] = {
87 "/dev/input/event0",
88 "/dev/input/event1",
89 "/dev/input/event2"
90 };
91
92 for(int i = 0; i < NR_POLL_DESC; i++)
93 {
94 int fd = open(input_devs[i], O_RDWR);
95
96 if(fd < 0)
97 {
98 panicf("Cannot open input device: %s\n", input_devs[i]);
99 }
100
101 poll_fds[i].fd = fd;
102 poll_fds[i].events = POLLIN;
103 poll_fds[i].revents = 0;
104 }
105}
106
107int button_read_device(void)
108{
109 static int button_bitmap = 0;
110 struct input_event event;
111
112 /* check if there are any events pending and process them */
113 while(poll(poll_fds, NR_POLL_DESC, 0))
114 {
115 for(int i = 0; i < NR_POLL_DESC; i++)
116 {
117 /* read only if non-blocking */
118 if(poll_fds[i].revents & POLLIN)
119 {
120 int size = read(poll_fds[i].fd, &event, sizeof(event));
121 if(size == (int)sizeof(event))
122 {
123 int keycode = event.code;
124 /* event.value == 1 means press
125 * event.value == 0 means release
126 */
127 bool press = event.value ? true : false;
128
129 /* map linux event code to rockbox button bitmap */
130 if(press)
131 {
132 button_bitmap |= button_map(keycode);
133 }
134 else
135 {
136 button_bitmap &= ~button_map(keycode);
137 }
138 }
139 }
140 }
141 }
142
143#ifndef BOOTLOADER
144 if (button_bitmap == SOFT_HOLD_BUTTON) {
145 soft_hold_counter++;
146 if (soft_hold_counter == SOFT_HOLD_CNTMAX_1) {
147 soft_hold = !soft_hold;
148 backlight_hold_changed(soft_hold);
149 }
150 else
151 if (soft_hold_counter == SOFT_HOLD_CNTMAX_2) {
152 soft_hold = false;
153 backlight_hold_changed(soft_hold);
154 }
155 } else {
156 soft_hold_counter = 0;
157 }
158
159 if((soft_hold) && (button_bitmap != SOFT_HOLD_BUTTON)) {
160 return BUTTON_NONE;
161 }
162#endif
163
164 return button_bitmap;
165}
166
167bool headphones_inserted(void)
168{
169 int status = 0;
170 const char * const sysfs_lo_switch = "/sys/class/switch/lineout/state";
171 const char * const sysfs_hs_switch = "/sys/class/switch/headset/state";
172#ifdef XDUOO_X20
173 const char * const sysfs_bal_switch = "/sys/class/switch/balance/state";
174#endif
175
176 sysfs_get_int(sysfs_lo_switch, &status);
177 if (status) return true;
178
179 sysfs_get_int(sysfs_hs_switch, &status);
180 if (status) return true;
181
182#ifdef XDUOO_X20
183 sysfs_get_int(sysfs_bal_switch, &status);
184 if (status) return true;
185#endif
186
187 return false;
188}
189
190void button_close_device(void)
191{
192 /* close descriptors */
193 for(int i = 0; i < NR_POLL_DESC; i++)
194 {
195 close(poll_fds[i].fd);
196 }
197}
198
199bool button_hold(void)
200{
201 return soft_hold;
202}
diff --git a/firmware/target/hosted/xduoo/debug-xduoo.c b/firmware/target/hosted/xduoo/debug-xduoo.c
new file mode 100644
index 0000000000..33f3ac4b97
--- /dev/null
+++ b/firmware/target/hosted/xduoo/debug-xduoo.c
@@ -0,0 +1,6 @@
1#include <stdbool.h>
2
3bool debug_hw_info(void)
4{
5 return false;
6}
diff --git a/firmware/target/hosted/xduoo/lcd-target.h b/firmware/target/hosted/xduoo/lcd-target.h
new file mode 100644
index 0000000000..bb9b77771b
--- /dev/null
+++ b/firmware/target/hosted/xduoo/lcd-target.h
@@ -0,0 +1,32 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2016 Amaury Pouly
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21#ifndef __LCD_TARGET_H__
22#define __LCD_TARGET_H__
23
24/* needs special ioctl() to redraw updated framebuffer content */
25#define LCD_OPTIMIZED_UPDATE
26#define LCD_OPTIMIZED_UPDATE_RECT
27
28extern fb_data *framebuffer; /* see lcd-xduoo.c */
29#define LCD_FRAMEBUF_ADDR(col, row) (framebuffer + (row)*LCD_WIDTH + (col))
30
31extern void lcd_set_active(bool active);
32#endif /* __LCD_TARGET_H__ */
diff --git a/firmware/target/hosted/xduoo/lcd-xduoo.c b/firmware/target/hosted/xduoo/lcd-xduoo.c
new file mode 100644
index 0000000000..4b3148da03
--- /dev/null
+++ b/firmware/target/hosted/xduoo/lcd-xduoo.c
@@ -0,0 +1,140 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2017 Marcin Bukat
10 * Copyright (C) 2016 Amaury Pouly
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
22#include <stdlib.h>
23#include <unistd.h>
24#include <stdio.h>
25#include <linux/fb.h>
26#include <sys/mman.h>
27#include <sys/ioctl.h>
28#include <fcntl.h>
29#include "lcd.h"
30#include "lcd-target.h"
31#include "backlight-target.h"
32#include "sysfs.h"
33#include "panic.h"
34
35static int fd = -1;
36static struct fb_var_screeninfo vinfo;
37fb_data *framebuffer = 0; /* global variable, see lcd-target.h */
38
39void lcd_init_device(void)
40{
41 const char * const fb_dev = "/dev/fb0";
42 fd = open(fb_dev, O_RDWR);
43 if(fd < 0)
44 {
45 panicf("Cannot open framebuffer: %s\n", fb_dev);
46 }
47
48 /* get fixed and variable information */
49 struct fb_fix_screeninfo finfo;
50 if(ioctl(fd, FBIOGET_FSCREENINFO, &finfo) < 0)
51 {
52 panicf("Cannot read framebuffer fixed information");
53 }
54
55 if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
56 {
57 panicf("Cannot read framebuffer variable information");
58 }
59
60#if 0
61 /* check resolution and framebuffer size */
62 if(vinfo.xres != LCD_WIDTH || vinfo.yres != LCD_HEIGHT || vinfo.bits_per_pixel != LCD_DEPTH)
63 {
64 panicf("Unexpected framebuffer resolution: %dx%dx%d\n", vinfo.xres,
65 vinfo.yres, vinfo.bits_per_pixel);
66 }
67#endif
68 /* Note: we use a framebuffer size of width*height*bbp. We cannot trust the
69 * values returned by the driver for line_length */
70
71 /* map framebuffer */
72 framebuffer = mmap(0, FRAMEBUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
73 if((void *)framebuffer == MAP_FAILED)
74 {
75 panicf("Cannot map framebuffer");
76 }
77
78#ifdef HAVE_LCD_ENABLE
79 lcd_set_active(true);
80#endif
81}
82
83#ifdef HAVE_LCD_SHUTDOWN
84void lcd_shutdown(void)
85{
86 munmap(framebuffer, FRAMEBUFFER_SIZE);
87 close(fd);
88}
89#endif
90
91void lcd_enable(bool on)
92{
93 const char * const sysfs_fb_blank = "/sys/class/graphics/fb0/blank";
94
95 if (lcd_active() != on)
96 {
97 sysfs_set_int(sysfs_fb_blank, on ? 0 : 1);
98 lcd_set_active(on);
99
100 if (on)
101 {
102 send_event(LCD_EVENT_ACTIVATION, NULL);
103 }
104 }
105}
106
107static void redraw(void)
108{
109 ioctl(fd, FBIOPAN_DISPLAY, &vinfo);
110}
111
112extern void lcd_copy_buffer_rect(fb_data *dst, const fb_data *src,
113 int width, int height);
114
115void lcd_update(void)
116{
117 /* Copy the Rockbox framebuffer to the second framebuffer */
118 lcd_copy_buffer_rect(LCD_FRAMEBUF_ADDR(0, 0), FBADDR(0,0),
119 LCD_WIDTH*LCD_HEIGHT, 1);
120 redraw();
121}
122
123void lcd_update_rect(int x, int y, int width, int height)
124{
125 fb_data *dst = LCD_FRAMEBUF_ADDR(x, y);
126 fb_data * src = FBADDR(x,y);
127
128 /* Copy part of the Rockbox framebuffer to the second framebuffer */
129 if (width < LCD_WIDTH)
130 {
131 /* Not full width - do line-by-line */
132 lcd_copy_buffer_rect(dst, src, width, height);
133 }
134 else
135 {
136 /* Full width - copy as one line */
137 lcd_copy_buffer_rect(dst, src, LCD_WIDTH*height, 1);
138 }
139 redraw();
140}
diff --git a/firmware/target/hosted/xduoo/power-xduoo.c b/firmware/target/hosted/xduoo/power-xduoo.c
new file mode 100644
index 0000000000..97a8dd4779
--- /dev/null
+++ b/firmware/target/hosted/xduoo/power-xduoo.c
@@ -0,0 +1,74 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2017 by Marcin Bukat
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20#include <sys/types.h>
21#include <fcntl.h>
22#include <string.h>
23#include <unistd.h>
24#include <stdio.h>
25
26#include "system.h"
27#include "power-xduoo.h"
28#include "power.h"
29#include "panic.h"
30#include "sysfs.h"
31
32const char * const sysfs_bat_voltage =
33 "/sys/class/power_supply/battery/voltage_now";
34
35const char * const sysfs_bat_capacity =
36 "/sys/class/power_supply/battery/capacity";
37
38const char * const sysfs_bat_status =
39 "/sys/class/power_supply/battery/status";
40
41const char * const sysfs_pow_supply =
42 "/sys/class/power_supply/usb/present";
43
44unsigned int xduoo_power_input_status(void)
45{
46 int present = 0;
47 sysfs_get_int(sysfs_pow_supply, &present);
48
49 return present ? POWER_INPUT_USB_CHARGER : POWER_INPUT_NONE;
50}
51
52bool xduoo_power_charging_status(void)
53{
54 char buf[12] = {0};
55 sysfs_get_string(sysfs_bat_status, buf, sizeof(buf));
56
57 return (strncmp(buf, "Charging", 8) == 0);
58}
59
60unsigned int xduoo_power_get_battery_voltage(void)
61{
62 int battery_voltage;
63 sysfs_get_int(sysfs_bat_voltage, &battery_voltage);
64
65 return battery_voltage/1000;
66}
67
68unsigned int xduoo_power_get_battery_capacity(void)
69{
70 int battery_capacity;
71 sysfs_get_int(sysfs_bat_capacity, &battery_capacity);
72
73 return battery_capacity;
74}
diff --git a/firmware/target/hosted/xduoo/power-xduoo.h b/firmware/target/hosted/xduoo/power-xduoo.h
new file mode 100644
index 0000000000..d573865ed2
--- /dev/null
+++ b/firmware/target/hosted/xduoo/power-xduoo.h
@@ -0,0 +1,31 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2017 by Marcin Bukat
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20#ifndef _POWER_XDUOO_H_
21#define _POWER_XDUOO_H_
22
23#include <stdbool.h>
24#include "config.h"
25
26unsigned int xduoo_power_input_status(void);
27bool xduoo_power_charging_status(void);
28unsigned int xduoo_power_get_battery_voltage(void);
29unsigned int xduoo_power_get_battery_capacity(void);
30#endif /* _POWER_XDUOO_H_ */
31
diff --git a/firmware/target/hosted/xduoo/powermgmt-xduoo.c b/firmware/target/hosted/xduoo/powermgmt-xduoo.c
new file mode 100644
index 0000000000..30001934ba
--- /dev/null
+++ b/firmware/target/hosted/xduoo/powermgmt-xduoo.c
@@ -0,0 +1,70 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2017 Marcin Bukat
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20#include "powermgmt.h"
21#include "power.h"
22#include "power-xduoo.h"
23
24const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
25{
26 3470
27};
28
29/* the OF shuts down at this voltage */
30const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
31{
32 3400
33};
34
35/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
36const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
37{
38 { 3400, 3639, 3697, 3723, 3757, 3786, 3836, 3906, 3980, 4050, 4159 }
39};
40
41/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
42const unsigned short const percent_to_volt_charge[11] =
43{
44 3485, 3780, 3836, 3857, 3890, 3930, 3986, 4062, 4158, 4185, 4196
45};
46
47unsigned int power_input_status(void)
48{
49 /* POWER_INPUT_USB_CHARGER, POWER_INPUT_NONE */
50 return xduoo_power_input_status();
51}
52
53#if defined(XDUOO_X3II)
54int _battery_voltage(void)
55{
56 return xduoo_power_get_battery_voltage();
57}
58#endif
59
60#if defined(XDUOO_X20)
61int _battery_level(void)
62{
63 return xduoo_power_get_battery_capacity();
64}
65#endif
66
67bool charging_state(void)
68{
69 return xduoo_power_charging_status();
70}
diff --git a/firmware/target/hosted/xduoo/system-target.h b/firmware/target/hosted/xduoo/system-target.h
new file mode 100644
index 0000000000..830f19fde4
--- /dev/null
+++ b/firmware/target/hosted/xduoo/system-target.h
@@ -0,0 +1,28 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2017 Marcin Bukat
10 * Copyright (C) 2016 Amaury Pouly
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#ifndef __SYSTEM_TARGET_H__
22#define __SYSTEM_TARGET_H__
23
24#include "kernel-unix.h"
25#include "system-hosted.h"
26
27#define NEED_GENERIC_BYTESWAPS
28#endif /* __SYSTEM_TARGET_H__ */
diff --git a/firmware/target/hosted/xduoo/usb-xduoo.c b/firmware/target/hosted/xduoo/usb-xduoo.c
new file mode 100644
index 0000000000..19248ad262
--- /dev/null
+++ b/firmware/target/hosted/xduoo/usb-xduoo.c
@@ -0,0 +1,118 @@
1/***************************************************************************
2 * __________ __ ___
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2018 by Marcin Bukat
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21#include <stdlib.h>
22#include <sys/mount.h>
23#include <string.h>
24#include "config.h"
25#include "disk.h"
26#include "usb.h"
27#include "sysfs.h"
28#include "power.h"
29#include "power-xduoo.h"
30
31static bool adb_mode = false;
32
33/* TODO: implement usb detection properly */
34int usb_detect(void)
35{
36 return power_input_status() == POWER_INPUT_USB_CHARGER ? USB_INSERTED : USB_EXTRACTED;
37}
38
39void usb_enable(bool on)
40{
41 /* Ignore usb enable/disable when ADB is enabled so we can fireup adb shell
42 * without entering ums mode
43 */
44 if (!adb_mode)
45 {
46 sysfs_set_int("/sys/class/android_usb/android0/enable", on ? 1 : 0);
47 }
48}
49
50/* This is called by usb thread after usb extract in order to return
51 * regular FS access
52 *
53 * returns the # of successful mounts
54*/
55int disk_mount_all(void)
56{
57 const char *dev[] = {"/dev/mmcblk0p1", "/dev/mmcblk0"};
58 const char *fs[] = {"vfat", "exfat"};
59
60 sysfs_set_string("/sys/class/android_usb/android0/f_mass_storage/lun/file", "");
61
62 for (int i=0; i<2; i++)
63 {
64 for (int j=0; j<2; j++)
65 {
66 if (mount(dev[i], "/mnt/sd_0", fs[j], 0, NULL) == 0)
67 {
68 return 1;
69 }
70 }
71 }
72
73 return 0;
74}
75
76/* This is called by usb thread after all threads ACKs usb inserted message
77 *
78 * returns the # of successful unmounts
79 */
80int disk_unmount_all(void)
81{
82 if (umount("/mnt/sd_0") == 0)
83 {
84 sysfs_set_string("/sys/class/android_usb/android0/f_mass_storage/lun/file", "/dev/mmcblk0");
85 return 1;
86 }
87
88 return 0;
89}
90
91void usb_init_device(void)
92{
93 char functions[32] = {0};
94
95 /* Check if ADB was activated in bootloader */
96 sysfs_get_string("/sys/class/android_usb/android0/functions", functions, sizeof(functions));
97 adb_mode = (strstr(functions, "adb") == NULL) ? false : true;
98
99 usb_enable(false);
100
101 if (adb_mode)
102 {
103 sysfs_set_string("/sys/class/android_usb/android0/functions", "mass_storage,adb");
104 sysfs_set_string("/sys/class/android_usb/android0/idVendor", "18D1");
105 sysfs_set_string("/sys/class/android_usb/android0/idProduct", "D002");
106 }
107 else
108 {
109 sysfs_set_string("/sys/class/android_usb/android0/functions", "mass_storage");
110 sysfs_set_string("/sys/class/android_usb/android0/idVendor", "C502");
111 sysfs_set_string("/sys/class/android_usb/android0/idProduct", "0029");
112 }
113
114 sysfs_set_string("/sys/class/android_usb/android0/iManufacturer", "Rockbox.org");
115 sysfs_set_string("/sys/class/android_usb/android0/iProduct", "Rockbox media player");
116 sysfs_set_string("/sys/class/android_usb/android0/iSerial", "0123456789ABCDEF");
117 sysfs_set_string("/sys/class/android_usb/android0/f_mass_storage/inquiry_string", "xDuoo 0100");
118}
diff --git a/firmware/target/hosted/xduoo/xduoo.make b/firmware/target/hosted/xduoo/xduoo.make
new file mode 100644
index 0000000000..5c37d27412
--- /dev/null
+++ b/firmware/target/hosted/xduoo/xduoo.make
@@ -0,0 +1,52 @@
1# __________ __ ___.
2# Open \______ \ ____ ____ | | _\_ |__ _______ ___
3# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
4# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
5# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
6# \/ \/ \/ \/ \/
7# $Id$
8#
9
10INCLUDES += -I$(FIRMDIR)/include -I$(FIRMDIR)/export $(TARGET_INC) -I$(BUILDDIR) -I$(APPSDIR)
11
12SIMFLAGS += $(INCLUDES) $(DEFINES) -DHAVE_CONFIG_H $(GCCOPTS)
13
14# bootloader build is sligtly different
15ifneq (,$(findstring bootloader,$(APPSDIR)))
16
17SRC += $(call preprocess, $(APPSDIR)/SOURCES)
18CLEANOBJS += $(BUILDDIR)/bootloader.*
19
20endif #bootloader
21
22.SECONDEXPANSION: # $$(OBJ) is not populated until after this
23
24ifneq (,$(findstring bootloader,$(APPSDIR)))
25# bootloader build
26
27$(BUILDDIR)/bootloader.elf : $$(OBJ) $(FIRMLIB) $(CORE_LIBS)
28 $(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -o $@ $(OBJ) \
29 -L$(BUILDDIR)/firmware -lfirmware \
30 -L$(BUILDDIR)/lib $(call a2lnk,$(CORE_LIBS)) \
31 $(LDOPTS) $(GLOBAL_LDOPTS) -Wl,--gc-sections -Wl,-Map,$(BUILDDIR)/bootloader.map
32
33$(BUILDDIR)/$(BINARY): $(BUILDDIR)/bootloader.elf
34 $(call PRINTS,OC $(@F))$(call objcopy,$^,$@)
35
36else
37# rockbox app build
38
39$(BUILDDIR)/rockbox.elf : $$(OBJ) $(FIRMLIB) $(VOICESPEEXLIB) $(CORE_LIBS)
40 $(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -o $@ $(OBJ) \
41 -L$(BUILDDIR)/firmware -lfirmware \
42 -L$(RBCODEC_BLD)/codecs $(call a2lnk, $(VOICESPEEXLIB)) \
43 -L$(BUILDDIR)/lib $(call a2lnk,$(CORE_LIBS)) \
44 $(LDOPTS) $(GLOBAL_LDOPTS) -Wl,-Map,$(BUILDDIR)/rockbox.map
45
46$(BUILDDIR)/rockbox.x3ii : $(BUILDDIR)/rockbox.elf
47 $(call PRINTS,OC $(@F))$(call objcopy,$^,$@)
48
49$(BUILDDIR)/rockbox.x20 : $(BUILDDIR)/rockbox.elf
50 $(call PRINTS,OC $(@F))$(call objcopy,$^,$@)
51
52endif
diff --git a/tools/configure b/tools/configure
index f6fc50d905..4b2b1ce829 100755
--- a/tools/configure
+++ b/tools/configure
@@ -888,7 +888,6 @@ mipsellinuxcc () {
888 SHARED_LDFLAG="-shared" 888 SHARED_LDFLAG="-shared"
889 SHARED_CFLAGS='-fPIC -fvisibility=hidden' 889 SHARED_CFLAGS='-fPIC -fvisibility=hidden'
890 endian="little" 890 endian="little"
891 app_type="rocker"
892 thread_support="HAVE_SIGALTSTACK_THREADS" 891 thread_support="HAVE_SIGALTSTACK_THREADS"
893 892
894 # Include path 893 # Include path
@@ -1244,7 +1243,7 @@ voiceconfig () {
1244 exit 4 1243 exit 4
1245 fi 1244 fi
1246 fi 1245 fi
1247 1246
1248 echo "Using $ENCODER for encoding voice clips" 1247 echo "Using $ENCODER for encoding voice clips"
1249 1248
1250 # Read custom encoder options from command line 1249 # Read custom encoder options from command line
@@ -1392,7 +1391,7 @@ ARG_ARM_THUMB=
1392ARG_PREFIX="$PREFIX" 1391ARG_PREFIX="$PREFIX"
1393ARG_THREAD_SUPPORT= 1392ARG_THREAD_SUPPORT=
1394ARG_32BIT= 1393ARG_32BIT=
1395err= 1394err=
1396for arg in "$@"; do 1395for arg in "$@"; do
1397 case "$arg" in 1396 case "$arg" in
1398 --ccache) ARG_CCACHE=1;; 1397 --ccache) ARG_CCACHE=1;;
@@ -1565,6 +1564,8 @@ cat <<EOF
1565 229) NWZ-S750 series 1564 229) NWZ-S750 series
1566 ==xDuoo== ==AgpTek== 1565 ==xDuoo== ==AgpTek==
1567 241) X3 240) Rocker 1566 241) X3 240) Rocker
1567 242) X3II
1568 243) X20
1568 1569
1569EOF 1570EOF
1570 1571
@@ -2260,7 +2261,7 @@ fi
2260 t_manufacturer="tcc780x" 2261 t_manufacturer="tcc780x"
2261 t_model="cowond2" 2262 t_model="cowond2"
2262 ;; 2263 ;;
2263 2264
2264 34|iaudiom3) 2265 34|iaudiom3)
2265 target_id=37 2266 target_id=37
2266 modelname="iaudiom3" 2267 modelname="iaudiom3"
@@ -2403,7 +2404,7 @@ fi
2403 t_manufacturer="tcc77x" 2404 t_manufacturer="tcc77x"
2404 t_model="logikdax" 2405 t_model="logikdax"
2405 ;; 2406 ;;
2406 2407
2407 89|creativezenxfistyle) 2408 89|creativezenxfistyle)
2408 target_id=94 2409 target_id=94
2409 modelname="creativezenxfistyle" 2410 modelname="creativezenxfistyle"
@@ -2446,7 +2447,7 @@ fi
2446 t_manufacturer="tms320dm320" 2447 t_manufacturer="tms320dm320"
2447 t_model="creative-zvm" 2448 t_model="creative-zvm"
2448 ;; 2449 ;;
2449 2450
2450 91|zenvisionm60gb) 2451 91|zenvisionm60gb)
2451 target_id=40 2452 target_id=40
2452 modelname="zenvisionm60gb" 2453 modelname="zenvisionm60gb"
@@ -2469,7 +2470,7 @@ fi
2469 t_manufacturer="tms320dm320" 2470 t_manufacturer="tms320dm320"
2470 t_model="creative-zvm" 2471 t_model="creative-zvm"
2471 ;; 2472 ;;
2472 2473
2473 92|zenvision) 2474 92|zenvision)
2474 target_id=39 2475 target_id=39
2475 modelname="zenvision" 2476 modelname="zenvision"
@@ -2717,9 +2718,9 @@ fi
2717 ;; 2718 ;;
2718 2719
2719 54|sansac100) 2720 54|sansac100)
2720 target_id=42 2721 target_id=42
2721 modelname="sansac100" 2722 modelname="sansac100"
2722 target="SANSA_C100" 2723 target="SANSA_C100"
2723 memory=2 2724 memory=2
2724 arm946cc 2725 arm946cc
2725 tool="$rootdir/tools/scramble -add=c100" 2726 tool="$rootdir/tools/scramble -add=c100"
@@ -3117,7 +3118,7 @@ fi
3117 t_manufacturer="s5l8700" 3118 t_manufacturer="s5l8700"
3118 t_model="meizu-m6sl" 3119 t_model="meizu-m6sl"
3119 ;; 3120 ;;
3120 3121
3121 111|meizum6sp) 3122 111|meizum6sp)
3122 target_id=46 3123 target_id=46
3123 modelname="meizum6sp" 3124 modelname="meizum6sp"
@@ -3139,7 +3140,7 @@ fi
3139 t_manufacturer="s5l8700" 3140 t_manufacturer="s5l8700"
3140 t_model="meizu-m6sp" 3141 t_model="meizu-m6sp"
3141 ;; 3142 ;;
3142 3143
3143 112|meizum3) 3144 112|meizum3)
3144 target_id=47 3145 target_id=47
3145 modelname="meizum3" 3146 modelname="meizum3"
@@ -3161,7 +3162,7 @@ fi
3161 t_manufacturer="s5l8700" 3162 t_manufacturer="s5l8700"
3162 t_model="meizu-m3" 3163 t_model="meizu-m3"
3163 ;; 3164 ;;
3164 3165
3165 120|ondavx747) 3166 120|ondavx747)
3166 target_id=45 3167 target_id=45
3167 modelname="ondavx747" 3168 modelname="ondavx747"
@@ -3183,7 +3184,7 @@ fi
3183 t_manufacturer="ingenic_jz47xx" 3184 t_manufacturer="ingenic_jz47xx"
3184 t_model="onda_vx747" 3185 t_model="onda_vx747"
3185 ;; 3186 ;;
3186 3187
3187 121|ondavx767) 3188 121|ondavx767)
3188 target_id=64 3189 target_id=64
3189 modelname="ondavx767" 3190 modelname="ondavx767"
@@ -3205,7 +3206,7 @@ fi
3205 t_manufacturer="ingenic_jz47xx" 3206 t_manufacturer="ingenic_jz47xx"
3206 t_model="onda_vx767" 3207 t_model="onda_vx767"
3207 ;; 3208 ;;
3208 3209
3209 122|ondavx747p) 3210 122|ondavx747p)
3210 target_id=54 3211 target_id=54
3211 modelname="ondavx747p" 3212 modelname="ondavx747p"
@@ -3227,7 +3228,7 @@ fi
3227 t_manufacturer="ingenic_jz47xx" 3228 t_manufacturer="ingenic_jz47xx"
3228 t_model="onda_vx747" 3229 t_model="onda_vx747"
3229 ;; 3230 ;;
3230 3231
3231 123|ondavx777) 3232 123|ondavx777)
3232 target_id=61 3233 target_id=61
3233 modelname="ondavx777" 3234 modelname="ondavx777"
@@ -3249,7 +3250,7 @@ fi
3249 t_manufacturer="ingenic_jz47xx" 3250 t_manufacturer="ingenic_jz47xx"
3250 t_model="onda_vx747" 3251 t_model="onda_vx747"
3251 ;; 3252 ;;
3252 3253
3253 130|lyreproto1) 3254 130|lyreproto1)
3254 target_id=56 3255 target_id=56
3255 modelname="lyreproto1" 3256 modelname="lyreproto1"
@@ -3271,7 +3272,7 @@ fi
3271 t_manufacturer="at91sam" 3272 t_manufacturer="at91sam"
3272 t_model="lyre_proto1" 3273 t_model="lyre_proto1"
3273 ;; 3274 ;;
3274 3275
3275 131|mini2440) 3276 131|mini2440)
3276 target_id=99 3277 target_id=99
3277 modelname="mini2440" 3278 modelname="mini2440"
@@ -3390,7 +3391,7 @@ fi
3390 t_manufacturer="s5l8700" 3391 t_manufacturer="s5l8700"
3391 t_model="yps3" 3392 t_model="yps3"
3392 ;; 3393 ;;
3393 3394
3394 144|samsungypz5) 3395 144|samsungypz5)
3395 target_id=90 3396 target_id=90
3396 modelname="samsungypz5" 3397 modelname="samsungypz5"
@@ -4226,10 +4227,11 @@ fi
4226 4227
4227 240|agptekrocker) 4228 240|agptekrocker)
4228 application="yes" 4229 application="yes"
4230 app_type="rocker"
4229 target_id=97 4231 target_id=97
4230 modelname="agptekrocker" 4232 modelname="agptekrocker"
4231 target="AGPTEK_ROCKER" 4233 target="AGPTEK_ROCKER"
4232 memory=6 4234 memory=8
4233 tool="cp " 4235 tool="cp "
4234 boottool="cp " 4236 boottool="cp "
4235 bmp2rb_mono="$rootdir/tools/bmp2rb -f 0" 4237 bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
@@ -4268,6 +4270,52 @@ fi
4268 t_model="xduoo_x3" 4270 t_model="xduoo_x3"
4269 ;; 4271 ;;
4270 4272
4273 242|xduoox3ii)
4274 target_id=110
4275 application=yes
4276 app_type="xduoo"
4277 modelname="xduoox3ii"
4278 target="XDUOO_X3II"
4279 memory=8
4280 mipsellinuxcc
4281 tool="cp "
4282 boottool="cp "
4283 bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
4284 bmp2rb_native="$rootdir/tools/bmp2rb -f 10"
4285 output="rockbox.x3ii"
4286 bootoutput="bootloader.x3ii"
4287 appextra="recorder:gui:hosted"
4288 plugins="yes"
4289 swcodec="yes"
4290 # architecture, manufacturer and model for the target-tree build
4291 t_cpu="hosted"
4292 t_manufacturer="xduoo"
4293 t_model="xduoo_x3ii"
4294 ;;
4295
4296 243|xduoox20)
4297 target_id=111
4298 application=yes
4299 app_type="xduoo"
4300 modelname="xduoox20"
4301 target="XDUOO_X20"
4302 memory=8
4303 mipsellinuxcc
4304 tool="cp "
4305 boottool="cp "
4306 bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
4307 bmp2rb_native="$rootdir/tools/bmp2rb -f 10"
4308 output="rockbox.x20"
4309 bootoutput="bootloader.x20"
4310 appextra="recorder:gui:hosted"
4311 plugins="yes"
4312 swcodec="yes"
4313 # architecture, manufacturer and model for the target-tree build
4314 t_cpu="hosted"
4315 t_manufacturer="xduoo"
4316 t_model="xduoo_x20"
4317 ;;
4318
4271 250|ihifi770c) 4319 250|ihifi770c)
4272 target_id=107 4320 target_id=107
4273 modelname="ihifi770c" 4321 modelname="ihifi770c"
@@ -4749,7 +4797,7 @@ if [ -z "$arch" ]; then
4749 arch="none" 4797 arch="none"
4750 echo "Warning: Could not determine target arch" 4798 echo "Warning: Could not determine target arch"
4751 fi 4799 fi
4752 if [ "$arch" != "none" ]; then 4800 if [ "$arch" != "none" ]; then
4753 if [ -n "$arch_version" ]; then 4801 if [ -n "$arch_version" ]; then
4754 echo "Automatically selected arch: $arch (ver $arch_version)" 4802 echo "Automatically selected arch: $arch (ver $arch_version)"
4755 else 4803 else
@@ -4789,7 +4837,7 @@ if [ "$ARG_RBDIR" != "" ]; then
4789 rbdir="/"$ARG_RBDIR 4837 rbdir="/"$ARG_RBDIR
4790 else 4838 else
4791 rbdir=$ARG_RBDIR 4839 rbdir=$ARG_RBDIR
4792 fi 4840 fi
4793 echo "Using alternate rockbox dir: ${rbdir}" 4841 echo "Using alternate rockbox dir: ${rbdir}"
4794fi 4842fi
4795 4843
diff --git a/tools/root.make b/tools/root.make
index 72039335da..412dbbc97b 100644
--- a/tools/root.make
+++ b/tools/root.make
@@ -105,6 +105,8 @@ ifneq (,$(findstring bootloader,$(APPSDIR)))
105 include $(ROOTDIR)/firmware/target/hosted/sonynwz/sonynwz.make 105 include $(ROOTDIR)/firmware/target/hosted/sonynwz/sonynwz.make
106 else ifneq (,$(findstring rocker,$(APP_TYPE))) 106 else ifneq (,$(findstring rocker,$(APP_TYPE)))
107 include $(ROOTDIR)/firmware/target/hosted/agptek/rocker.make 107 include $(ROOTDIR)/firmware/target/hosted/agptek/rocker.make
108 else ifneq (,$(findstring xduoo,$(APP_TYPE)))
109 include $(ROOTDIR)/firmware/target/hosted/xduoo/xduoo.make
108 else 110 else
109 include $(APPSDIR)/bootloader.make 111 include $(APPSDIR)/bootloader.make
110 endif 112 endif
@@ -149,6 +151,10 @@ else # core
149 include $(ROOTDIR)/firmware/target/hosted/agptek/rocker.make 151 include $(ROOTDIR)/firmware/target/hosted/agptek/rocker.make
150 endif 152 endif
151 153
154 ifneq (,$(findstring xduoo,$(APP_TYPE)))
155 include $(ROOTDIR)/firmware/target/hosted/xduoo/xduoo.make
156 endif
157
152 ifneq (,$(findstring android_ndk, $(APP_TYPE))) 158 ifneq (,$(findstring android_ndk, $(APP_TYPE)))
153 include $(ROOTDIR)/firmware/target/hosted/ibasso/android_ndk.make 159 include $(ROOTDIR)/firmware/target/hosted/ibasso/android_ndk.make
154 else 160 else