summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2020-09-12 05:03:12 -0400
committerWilliam Wilgus <me.theuser@yahoo.com>2020-09-13 16:23:24 +0000
commitc62493e98adfd27c16eb2adb2ecd22716813b705 (patch)
treec5d2a0fbdcf145584518289885e7676f82b20a29
parent6b674a6a0a347bd4cb946b37b6e075dc2715f7ac (diff)
downloadrockbox-c62493e98adfd27c16eb2adb2ecd22716813b705.tar.gz
rockbox-c62493e98adfd27c16eb2adb2ecd22716813b705.zip
Xduoo X3 Add tree scrolling FS#13240, Emulate Multibutton presses
Fixes deficiencies with the button system on the X3 The x3 has an interesting button layout. Multiple key presses are NOT supported unless [BUTTON_POWER] is one of the combined keys As you can imagine this causes problems as the power button takes precedence in the button system and initiates a shutdown if the key is held too long instead of BUTTON_POWER use BUTTON_PWRALT in combination with other keys IF using as a prerequsite button then BUTTON_POWER should be used Multiple buttons are emulated by button_read_device but there are a few caveats to be aware of: Button Order Matters! different keys have different priorities, higher priority keys 'overide' the lower priority keys VOLUP[7] VOLDN[6] PREV[5] NEXT[4] PLAY[3] OPTION[2] HOME[1] There will be no true release or repeat events, the user can let off the button pressed initially and it will still continue to appear to be pressed as long as the second key is held Tree scrolling is PLAY+NEXT or PLAY+PREV Change-Id: I88dfee1c70a6a99659e8227f5becacc50cc43910
-rw-r--r--apps/keymaps/keymap-xduoox3.c44
-rw-r--r--apps/plugins/doom/i_video.c2
-rw-r--r--apps/plugins/fft/fft.c2
-rw-r--r--apps/plugins/goban/goban.h2
-rw-r--r--apps/plugins/imageviewer/imageviewer_button.h2
-rw-r--r--apps/plugins/pegbox.c2
-rw-r--r--apps/plugins/rockpaint.c2
-rw-r--r--apps/plugins/sliding_puzzle.c2
-rw-r--r--apps/plugins/sokoban.c2
-rw-r--r--apps/plugins/sudoku/sudoku.h2
-rw-r--r--apps/plugins/text_viewer/tv_button.h2
-rw-r--r--apps/plugins/wormlet.c2
-rw-r--r--firmware/target/mips/ingenic_jz47xx/xduoo_x3/button-target.h2
-rw-r--r--firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c67
14 files changed, 101 insertions, 34 deletions
diff --git a/apps/keymaps/keymap-xduoox3.c b/apps/keymaps/keymap-xduoox3.c
index e73798d4fe..ed217fd722 100644
--- a/apps/keymaps/keymap-xduoox3.c
+++ b/apps/keymaps/keymap-xduoox3.c
@@ -21,6 +21,29 @@
21 21
22/* Button Code Definitions for xDuoo X3 target */ 22/* Button Code Definitions for xDuoo X3 target */
23 23
24
25/* NOTE X3 Button system
26 * The x3 has an interesting button layout. Multiple key presses are
27 * NOT supported unless [BUTTON_POWER] is one of the combined keys
28 * as you can imagine this causes problems as the power button takes
29 * precedence in the button system and initiates a shutdown if the
30 * key is held too long
31 * instead of BUTTON_POWER use BUTTON_PWRALT in combination with other keys
32 * IF using as a prerequsite button then BUTTON_POWER should be used
33 *
34 * Multiple buttons are emulated by button_read_device but there are a few
35 * caveats to be aware of:
36 *
37 * Button Order Matters!
38 * different keys have different priorities, higher priority keys 'overide' the
39 * lower priority keys
40 * VOLUP[7] VOLDN[6] PREV[5] NEXT[4] PLAY[3] OPTION[2] HOME[1]
41 *
42 * There will be no true release or repeat events, the user can let off the button
43 * pressed initially and it will still continue to appear to be pressed as long as
44 * the second key is held
45 * */
46
24#include "config.h" 47#include "config.h"
25#include "action.h" 48#include "action.h"
26#include "button.h" 49#include "button.h"
@@ -67,9 +90,9 @@ static const struct button_mapping button_context_wps[] = {
67 { ACTION_WPS_QUICKSCREEN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION }, 90 { ACTION_WPS_QUICKSCREEN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
68 { ACTION_WPS_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME }, 91 { ACTION_WPS_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
69 92
70 { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_POWER|BUTTON_NEXT, BUTTON_POWER }, 93 { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_PWRALT|BUTTON_NEXT, BUTTON_POWER },
71 { ACTION_WPS_ABSETA_PREVDIR, BUTTON_POWER|BUTTON_PREV, BUTTON_POWER }, 94 { ACTION_WPS_ABSETA_PREVDIR, BUTTON_PWRALT|BUTTON_PREV, BUTTON_POWER },
72 { ACTION_WPS_ABRESET, BUTTON_POWER|BUTTON_PLAY, BUTTON_POWER }, 95 { ACTION_WPS_ABRESET, BUTTON_PWRALT|BUTTON_PLAY, BUTTON_POWER },
73 96
74 LAST_ITEM_IN_LIST 97 LAST_ITEM_IN_LIST
75}; /* button_context_wps */ 98}; /* button_context_wps */
@@ -173,11 +196,21 @@ static const struct button_mapping button_context_settings_vol_is_inc[] = {
173static const struct button_mapping button_context_tree[] = { 196static const struct button_mapping button_context_tree[] = {
174 { ACTION_TREE_WPS, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 197 { ACTION_TREE_WPS, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
175 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, 198 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
176 { ACTION_TREE_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME }, 199 { ACTION_TREE_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME},
177 200
178 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 201 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
179}; /* button_context_tree */ 202}; /* button_context_tree */
180 203
204static const struct button_mapping button_context_listtree_scroll_with_combo[] = {
205 { ACTION_NONE, BUTTON_POWER, BUTTON_NONE },
206 { ACTION_TREE_PGLEFT, BUTTON_PLAY|BUTTON_PREV, BUTTON_NONE },
207 { ACTION_TREE_PGLEFT, BUTTON_PLAY|BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
208 { ACTION_TREE_PGRIGHT, BUTTON_PLAY|BUTTON_NEXT, BUTTON_NONE },
209 { ACTION_TREE_PGRIGHT, BUTTON_PLAY|BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
210
211 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
212}; /* button_context_listtree_scroll_with_combo */
213
181/** Yes/No Screen **/ 214/** Yes/No Screen **/
182static const struct button_mapping button_context_yesnoscreen[] = { 215static const struct button_mapping button_context_yesnoscreen[] = {
183 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE }, 216 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
@@ -256,8 +289,11 @@ const struct button_mapping* get_context_mapping(int context)
256 case CONTEXT_SETTINGS_RECTRIGGER: 289 case CONTEXT_SETTINGS_RECTRIGGER:
257 return button_context_settings_vol_is_inc; 290 return button_context_settings_vol_is_inc;
258 case CONTEXT_TREE: 291 case CONTEXT_TREE:
292 return button_context_listtree_scroll_with_combo;
259 case CONTEXT_MAINMENU: 293 case CONTEXT_MAINMENU:
260 return button_context_tree; 294 return button_context_tree;
295 case CONTEXT_CUSTOM|CONTEXT_TREE:
296 return button_context_tree;
261 case CONTEXT_WPS: 297 case CONTEXT_WPS:
262 return button_context_wps; 298 return button_context_wps;
263 case CONTEXT_YESNOSCREEN: 299 case CONTEXT_YESNOSCREEN:
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c
index 9f367d7d76..fb328639bf 100644
--- a/apps/plugins/doom/i_video.c
+++ b/apps/plugins/doom/i_video.c
@@ -561,7 +561,7 @@ void I_ShutdownGraphics(void)
561#define DOOMBUTTON_LEFT BUTTON_PREV 561#define DOOMBUTTON_LEFT BUTTON_PREV
562#define DOOMBUTTON_RIGHT BUTTON_NEXT 562#define DOOMBUTTON_RIGHT BUTTON_NEXT
563#define DOOMBUTTON_SHOOT BUTTON_PLAY 563#define DOOMBUTTON_SHOOT BUTTON_PLAY
564#define DOOMBUTTON_OPEN (BUTTON_HOME | BUTTON_POWER) 564#define DOOMBUTTON_OPEN (BUTTON_HOME | BUTTON_PWRALT)
565#define DOOMBUTTON_ESC BUTTON_POWER 565#define DOOMBUTTON_ESC BUTTON_POWER
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
diff --git a/apps/plugins/fft/fft.c b/apps/plugins/fft/fft.c
index 9edb02a15e..2ed0263d75 100644
--- a/apps/plugins/fft/fft.c
+++ b/apps/plugins/fft/fft.c
@@ -330,7 +330,7 @@ GREY_INFO_STRUCT
330# define FFT_NEXT_GRAPH BUTTON_NEXT 330# define FFT_NEXT_GRAPH BUTTON_NEXT
331# define FFT_ORIENTATION BUTTON_HOME 331# define FFT_ORIENTATION BUTTON_HOME
332# define FFT_FREQ_SCALE BUTTON_OPTION 332# define FFT_FREQ_SCALE BUTTON_OPTION
333# define FFT_WINDOW (BUTTON_HOME|BUTTON_POWER) 333# define FFT_WINDOW (BUTTON_HOME|BUTTON_PWRALT)
334# define FFT_AMP_SCALE BUTTON_PLAY 334# define FFT_AMP_SCALE BUTTON_PLAY
335# define FFT_QUIT BUTTON_POWER 335# define FFT_QUIT BUTTON_POWER
336 336
diff --git a/apps/plugins/goban/goban.h b/apps/plugins/goban/goban.h
index 8406b540b7..ac02d74f50 100644
--- a/apps/plugins/goban/goban.h
+++ b/apps/plugins/goban/goban.h
@@ -441,7 +441,7 @@
441#define GBN_BUTTON_MENU BUTTON_POWER 441#define GBN_BUTTON_MENU BUTTON_POWER
442#define GBN_BUTTON_PLAY BUTTON_PLAY | BUTTON_REL 442#define GBN_BUTTON_PLAY BUTTON_PLAY | BUTTON_REL
443#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT 443#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
444#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_POWER 444#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_PWRALT
445 445
446#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD) 446#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
447#define GBN_BUTTON_UP BUTTON_HOME 447#define GBN_BUTTON_UP BUTTON_HOME
diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h
index 46813d5e69..7aa96023c6 100644
--- a/apps/plugins/imageviewer/imageviewer_button.h
+++ b/apps/plugins/imageviewer/imageviewer_button.h
@@ -474,7 +474,7 @@
474#define IMGVIEW_PREVIOUS BUTTON_VOL_DOWN 474#define IMGVIEW_PREVIOUS BUTTON_VOL_DOWN
475#define IMGVIEW_PREVIOUS_REPEAT (BUTTON_VOL_DOWN|BUTTON_REPEAT) 475#define IMGVIEW_PREVIOUS_REPEAT (BUTTON_VOL_DOWN|BUTTON_REPEAT)
476#define IMGVIEW_MENU BUTTON_POWER 476#define IMGVIEW_MENU BUTTON_POWER
477#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_POWER) 477#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_PWRALT)
478 478
479#elif CONFIG_KEYPAD == XDUOO_X3II_PAD 479#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
480#define IMGVIEW_ZOOM_PRE BUTTON_PLAY 480#define IMGVIEW_ZOOM_PRE BUTTON_PLAY
diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c
index 4622d2a10e..0a299c995f 100644
--- a/apps/plugins/pegbox.c
+++ b/apps/plugins/pegbox.c
@@ -612,7 +612,7 @@ CONFIG_KEYPAD == MROBE500_PAD
612#elif CONFIG_KEYPAD == XDUOO_X3_PAD 612#elif CONFIG_KEYPAD == XDUOO_X3_PAD
613#define PEGBOX_SELECT BUTTON_PLAY 613#define PEGBOX_SELECT BUTTON_PLAY
614#define PEGBOX_QUIT BUTTON_POWER 614#define PEGBOX_QUIT BUTTON_POWER
615#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME) 615#define PEGBOX_RESTART (BUTTON_PWRALT | BUTTON_HOME)
616#define PEGBOX_LVL_UP BUTTON_VOL_UP 616#define PEGBOX_LVL_UP BUTTON_VOL_UP
617#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 617#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN
618#define PEGBOX_UP BUTTON_HOME 618#define PEGBOX_UP BUTTON_HOME
diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c
index 35d2f21ba7..8e4df10280 100644
--- a/apps/plugins/rockpaint.c
+++ b/apps/plugins/rockpaint.c
@@ -330,7 +330,7 @@
330#elif CONFIG_KEYPAD == XDUOO_X3_PAD 330#elif CONFIG_KEYPAD == XDUOO_X3_PAD
331#define ROCKPAINT_QUIT BUTTON_POWER 331#define ROCKPAINT_QUIT BUTTON_POWER
332#define ROCKPAINT_DRAW BUTTON_PLAY 332#define ROCKPAINT_DRAW BUTTON_PLAY
333#define ROCKPAINT_MENU (BUTTON_HOME | BUTTON_POWER) 333#define ROCKPAINT_MENU (BUTTON_HOME | BUTTON_PWRALT)
334#define ROCKPAINT_TOOLBAR BUTTON_VOL_UP 334#define ROCKPAINT_TOOLBAR BUTTON_VOL_UP
335#define ROCKPAINT_TOOLBAR2 BUTTON_VOL_DOWN 335#define ROCKPAINT_TOOLBAR2 BUTTON_VOL_DOWN
336#define ROCKPAINT_UP BUTTON_HOME 336#define ROCKPAINT_UP BUTTON_HOME
diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c
index 1a77eda721..e8d349defd 100644
--- a/apps/plugins/sliding_puzzle.c
+++ b/apps/plugins/sliding_puzzle.c
@@ -309,7 +309,7 @@ CONFIG_KEYPAD == MROBE500_PAD
309#define PUZZLE_RIGHT BUTTON_NEXT 309#define PUZZLE_RIGHT BUTTON_NEXT
310#define PUZZLE_UP BUTTON_HOME 310#define PUZZLE_UP BUTTON_HOME
311#define PUZZLE_DOWN BUTTON_OPTION 311#define PUZZLE_DOWN BUTTON_OPTION
312#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_POWER) 312#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_PWRALT)
313#define PUZZLE_PICTURE BUTTON_PLAY 313#define PUZZLE_PICTURE BUTTON_PLAY
314 314
315#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD) 315#elif (CONFIG_KEYPAD == XDUOO_X3II_PAD)
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c
index 3cc1555e83..08359d9fcc 100644
--- a/apps/plugins/sokoban.c
+++ b/apps/plugins/sokoban.c
@@ -623,7 +623,7 @@
623#define SOKOBAN_MENU BUTTON_POWER 623#define SOKOBAN_MENU BUTTON_POWER
624#define SOKOBAN_UNDO_PRE BUTTON_PLAY 624#define SOKOBAN_UNDO_PRE BUTTON_PLAY
625#define SOKOBAN_UNDO (BUTTON_PLAY | BUTTON_REL) 625#define SOKOBAN_UNDO (BUTTON_PLAY | BUTTON_REL)
626#define SOKOBAN_REDO (BUTTON_POWER | BUTTON_PLAY) 626#define SOKOBAN_REDO (BUTTON_PWRALT | BUTTON_PLAY)
627#define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN 627#define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN
628#define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_NEXT) 628#define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_NEXT)
629#define SOKOBAN_LEVEL_UP BUTTON_VOL_UP 629#define SOKOBAN_LEVEL_UP BUTTON_VOL_UP
diff --git a/apps/plugins/sudoku/sudoku.h b/apps/plugins/sudoku/sudoku.h
index d1eca7fcd4..434223ef68 100644
--- a/apps/plugins/sudoku/sudoku.h
+++ b/apps/plugins/sudoku/sudoku.h
@@ -402,7 +402,7 @@
402#define SUDOKU_BUTTON_ALTTOGGLE BUTTON_PLAY 402#define SUDOKU_BUTTON_ALTTOGGLE BUTTON_PLAY
403#define SUDOKU_BUTTON_MENU_PRE BUTTON_POWER 403#define SUDOKU_BUTTON_MENU_PRE BUTTON_POWER
404#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL) 404#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL)
405#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_POWER) 405#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_PWRALT)
406 406
407#elif CONFIG_KEYPAD == XDUOO_X3II_PAD 407#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
408#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER 408#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER
diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h
index 4f7634e844..6fcfc24e4f 100644
--- a/apps/plugins/text_viewer/tv_button.h
+++ b/apps/plugins/text_viewer/tv_button.h
@@ -504,7 +504,7 @@
504#define TV_SCREEN_LEFT BUTTON_PREV 504#define TV_SCREEN_LEFT BUTTON_PREV
505#define TV_SCREEN_RIGHT BUTTON_NEXT 505#define TV_SCREEN_RIGHT BUTTON_NEXT
506#define TV_MENU BUTTON_PLAY 506#define TV_MENU BUTTON_PLAY
507#define TV_AUTOSCROLL (BUTTON_POWER | BUTTON_HOME) 507#define TV_AUTOSCROLL (BUTTON_PWRALT | BUTTON_HOME)
508#define TV_LINE_UP BUTTON_HOME 508#define TV_LINE_UP BUTTON_HOME
509#define TV_LINE_DOWN BUTTON_OPTION 509#define TV_LINE_DOWN BUTTON_OPTION
510#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY) 510#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY)
diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c
index 419b258fe5..59f3138c0a 100644
--- a/apps/plugins/wormlet.c
+++ b/apps/plugins/wormlet.c
@@ -360,7 +360,7 @@ CONFIG_KEYPAD == MROBE500_PAD
360#define BTN_DIR_RIGHT BUTTON_NEXT 360#define BTN_DIR_RIGHT BUTTON_NEXT
361#define BTN_STARTPAUSE BUTTON_PLAY 361#define BTN_STARTPAUSE BUTTON_PLAY
362#define BTN_QUIT BUTTON_POWER 362#define BTN_QUIT BUTTON_POWER
363#define BTN_STOPRESET (BUTTON_HOME | BUTTON_POWER) 363#define BTN_STOPRESET (BUTTON_HOME | BUTTON_PWRALT)
364 364
365#elif CONFIG_KEYPAD == XDUOO_X3II_PAD 365#elif CONFIG_KEYPAD == XDUOO_X3II_PAD
366#define BTN_DIR_UP BUTTON_HOME 366#define BTN_DIR_UP BUTTON_HOME
diff --git a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/button-target.h b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/button-target.h
index 2dd94b14bc..9e2800d57b 100644
--- a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/button-target.h
+++ b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/button-target.h
@@ -32,7 +32,7 @@
32#define BUTTON_PLAY 0x00000020 32#define BUTTON_PLAY 0x00000020
33#define BUTTON_VOL_UP 0x00000040 33#define BUTTON_VOL_UP 0x00000040
34#define BUTTON_VOL_DOWN 0x00000080 34#define BUTTON_VOL_DOWN 0x00000080
35 35#define BUTTON_PWRALT 0x00000100 /* BUTTON_POWER combo with other buttons */
36#define BUTTON_LEFT 0 36#define BUTTON_LEFT 0
37#define BUTTON_RIGHT 0 37#define BUTTON_RIGHT 0
38 38
diff --git a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c
index 0f845d96d3..0d251754dd 100644
--- a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c
+++ b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/sadc-xduoo_x3.c
@@ -56,6 +56,8 @@
56#define ADC_MASK 0x0FFF 56#define ADC_MASK 0x0FFF
57 57
58static volatile unsigned short bat_val, key_val; 58static volatile unsigned short bat_val, key_val;
59static volatile int btn_last = BUTTON_NONE;
60static volatile long btn_last_tick;
59 61
60bool headphones_inserted(void) 62bool headphones_inserted(void)
61{ 63{
@@ -108,52 +110,82 @@ bool button_hold(void)
108} 110}
109 111
110/* NOTE: Due to how this is wired, button combinations are not allowed 112/* NOTE: Due to how this is wired, button combinations are not allowed
111 unless one of the two buttons is the POWER 113 * unless one of the two buttons is the POWER
112*/ 114 *
115 * Note --Update 2020
116 * by toggling BOP common I was able to remove BACK, OPTION, PLAY from the
117 * loop selectively and test which keys were pressed but this took two adc rounds
118 * and proved to be minimally useful for the added overhead
119 *
120 * NOW multiple button presses are emulated but button priority needs to be taken
121 * into consideration; higher priority keys 'overide' the lower priority keys
122 * VOLUP[7] VOLDN[6] PREV[5] NEXT[4] PLAY[3] OPTION[2] HOME[1]
123 */
113int button_read_device(void) 124int button_read_device(void)
114{ 125{
126 unsigned short key;
115 int btn = BUTTON_NONE; 127 int btn = BUTTON_NONE;
116 unsigned short key = (key_val & ADC_MASK); 128 int btn_pwr = BUTTON_NONE;
117 129
118 if (button_hold()) 130 if (button_hold())
119 return BUTTON_NONE; 131 return BUTTON_NONE;
120 132
121 if (KEY_IS_DOWN(PIN_BTN_POWER)) 133 if (KEY_IS_DOWN(PIN_BTN_POWER))
122 btn |= BUTTON_POWER; 134 btn_pwr = BUTTON_POWER;
123 135
124 if (!KEY_IS_DOWN(PIN_KEY_INT)) 136 if (!KEY_IS_DOWN(PIN_KEY_INT))
125 return btn; 137 {
138 __intc_mask_irq(IRQ_SADC);
139 REG_SADC_ADENA &= ~ADENA_AUXEN;
140 return btn_pwr;
141 }
142
143 key = (key_val & ADC_MASK);
144
145 /* Don't initiate a new request if we have one pending */
146 if(!(REG_SADC_ADENA & (ADENA_AUXEN)))
147 {
148 REG_SADC_ADENA |= ADENA_AUXEN;
149 }
126 150
127 if (key < 261) 151 if (key < 261)
128 btn |= BUTTON_VOL_UP; 152 btn = BUTTON_VOL_UP;
129 else 153 else
130 if (key < 653) 154 if (key < 653)
131 btn |= BUTTON_VOL_DOWN; 155 btn = BUTTON_VOL_DOWN;
132 else 156 else
133 if (key < 1101) 157 if (key < 1101)
134 btn |= BUTTON_PREV; 158 btn = BUTTON_PREV;
135 else 159 else
136 if (key < 1498) 160 if (key < 1498)
137 btn |= BUTTON_NEXT; 161 btn = BUTTON_NEXT;
138 else 162 else
139 if (key < 1839) 163 if (key < 1839)
140 btn |= BUTTON_PLAY; 164 btn = BUTTON_PLAY;
141 else 165 else
142 if (key < 2213) 166 if (key < 2213)
143 btn |= BUTTON_OPTION; 167 btn = BUTTON_OPTION;
144 else 168 else
145 if (key < 2600) 169 if (key < 2600)
146 btn |= BUTTON_HOME; 170 btn = BUTTON_HOME;
171
172 if (btn_last == BUTTON_NONE && TIME_AFTER(current_tick, btn_last_tick + HZ/20))
173 btn_last = btn;
174
175 if (btn_pwr != BUTTON_NONE)
176 btn |= BUTTON_PWRALT;
147 177
148 return btn; 178 return btn | btn_last;
149} 179}
150 180
151/* called on button press interrupt */ 181/* called on button press interrupt */
152void KEY_INT_IRQ(void) 182void KEY_INT_IRQ(void)
153{ 183{
154 /* Don't initiate a new request if we have one pending */ 184 btn_last = BUTTON_NONE;
155 if(!(REG_SADC_ADENA & (ADENA_AUXEN))) 185 key_val = ADC_MASK;
156 REG_SADC_ADENA |= ADENA_AUXEN; 186 __intc_unmask_irq(IRQ_SADC);
187 REG_SADC_ADENA |= ADENA_AUXEN;
188 btn_last_tick = current_tick;
157} 189}
158 190
159/* Notes on batteries 191/* Notes on batteries
@@ -238,6 +270,7 @@ void adc_init(void)
238 REG_SADC_ADCFG = ADCFG_VBAT_SEL | ADCFG_CMD_AUX(1); /* VBAT_SEL is undocumented but required! */ 270 REG_SADC_ADCFG = ADCFG_VBAT_SEL | ADCFG_CMD_AUX(1); /* VBAT_SEL is undocumented but required! */
239 REG_SADC_ADCLK = (199 << 16) | (1 << 8) | 61; 271 REG_SADC_ADCLK = (199 << 16) | (1 << 8) | 61;
240 system_enable_irq(IRQ_SADC); 272 system_enable_irq(IRQ_SADC);
273 REG_SADC_ADENA |= ADENA_AUXEN | ADENA_VBATEN;
241} 274}
242 275
243void adc_close(void) 276void adc_close(void)
@@ -260,8 +293,6 @@ void SADC(void)
260 if(state & ADCTRL_ARDYM) 293 if(state & ADCTRL_ARDYM)
261 { 294 {
262 key_val = REG_SADC_ADADAT; 295 key_val = REG_SADC_ADADAT;
263 if (KEY_IS_DOWN(PIN_KEY_INT)) /* key(s) are down kick off another read */
264 REG_SADC_ADENA = ADENA_AUXEN;
265 } 296 }
266 else if(UNLIKELY(state & ADCTRL_VRDYM)) 297 else if(UNLIKELY(state & ADCTRL_VRDYM))
267 { 298 {