summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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