summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Arigo <markarigo@gmail.com>2008-02-24 04:12:16 +0000
committerMark Arigo <markarigo@gmail.com>2008-02-24 04:12:16 +0000
commitd829075a0003fd5a976d5e2303b0317d3dc63ea8 (patch)
treefd5838c65cedc6d2b889ba1a332f99e53553ca7c
parentf928c8f0f854a91323b19357021bcaef9a7cc27e (diff)
downloadrockbox-d829075a0003fd5a976d5e2303b0317d3dc63ea8.tar.gz
rockbox-d829075a0003fd5a976d5e2303b0317d3dc63ea8.zip
Driver for the Synaptics touchpad on the m:robe 100 based on the 3-wire interface spec. Needs some tweaking as it's too sensitive with the default hardware settings. For now, the vertical strip is divided into up/select/down buttons. Also, redo the keymap (using the Gigabeat as a starting point), but it still needs a good bit of work.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16400 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/debug_menu.c6
-rw-r--r--apps/keymaps/keymap-mr100.c534
-rw-r--r--apps/plugins/lib/pluginlib_actions.c35
-rw-r--r--firmware/target/arm/olympus/mrobe-100/button-mr100.c564
-rw-r--r--firmware/target/arm/olympus/mrobe-100/button-target.h39
-rw-r--r--firmware/target/arm/system-pp502x.c8
-rw-r--r--uisimulator/sdl/button.c34
7 files changed, 886 insertions, 334 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index d1463c7353..8cd1fedf5b 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -987,10 +987,12 @@ static bool dbg_spdif(void)
987#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD 987#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
988# define DEBUG_CANCEL BUTTON_REC 988# define DEBUG_CANCEL BUTTON_REC
989 989
990#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) || \ 990#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
991 (CONFIG_KEYPAD == MROBE100_PAD)
992# define DEBUG_CANCEL BUTTON_REW 991# define DEBUG_CANCEL BUTTON_REW
993 992
993#elif (CONFIG_KEYPAD == MROBE100_PAD)
994# define DEBUG_CANCEL BUTTON_MENU
995
994#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ 996#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
995 (CONFIG_KEYPAD == SANSA_C200_PAD) 997 (CONFIG_KEYPAD == SANSA_C200_PAD)
996# define DEBUG_CANCEL BUTTON_LEFT 998# define DEBUG_CANCEL BUTTON_LEFT
diff --git a/apps/keymaps/keymap-mr100.c b/apps/keymaps/keymap-mr100.c
index 572f510fb9..2d6b616d5d 100644
--- a/apps/keymaps/keymap-mr100.c
+++ b/apps/keymaps/keymap-mr100.c
@@ -7,7 +7,7 @@
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) Barry Wardell 2006 10 * Copyright (C) 2008 Mark Arigo
11 * 11 *
12 * All files in this archive are subject to the GNU General Public License. 12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement. 13 * See the file COPYING in the source tree root for full license agreement.
@@ -17,331 +17,314 @@
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19 19
20/* Button Code Definitions for Olympus m:robe 100 target 20/* Button Code Definitions for the Olympus m:robe 100 */
21 NOTE: COPIED FROM IRIVER H10, NEEDS ADAPTING TO MROBE 100 */ 21#include <stdio.h>
22#include <string.h>
23#include <stdlib.h>
22 24
23#include "config.h" 25#include "config.h"
24#include "action.h" 26#include "action.h"
25#include "button.h" 27#include "button.h"
26#include "settings.h" 28#include "settings.h"
27 29
28/* {Action Code, Button code, Prereq button code } */ 30/*
29
30/*
31 * The format of the list is as follows 31 * The format of the list is as follows
32 * { Action Code, Button code, Prereq button code } 32 * { Action Code, Button code, Prereq button code }
33 * if there's no need to check the previous button's value, use BUTTON_NONE 33 * if there's no need to check the previous button's value, use BUTTON_NONE
34 * Insert LAST_ITEM_IN_LIST at the end of each mapping 34 * Insert LAST_ITEM_IN_LIST at the end of each mapping
35 */ 35 */
36
37/* CONTEXT_CUSTOM's used in this file...
38
39CONTEXT_CUSTOM|CONTEXT_TREE = the standard list/tree defines (without directions)
40CONTEXT_CUSTOM|CONTEXT_SETTINGS = the direction keys for the eq/col picker screens
41 i.e where up/down is inc/dec
42 CONTEXT_SETTINGS = up/down is prev/next, l/r is inc/dec
43
44*/
45
46
36static const struct button_mapping button_context_standard[] = { 47static const struct button_mapping button_context_standard[] = {
37 { ACTION_STD_PREV, BUTTON_SCROLL_UP, BUTTON_NONE }, 48 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
38 { ACTION_STD_PREVREPEAT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, 49 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
39 { ACTION_STD_NEXT, BUTTON_SCROLL_DOWN, BUTTON_NONE }, 50 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
40 { ACTION_STD_NEXTREPEAT, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 51 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
41
42 { ACTION_STD_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
43 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
44 { ACTION_STD_CONTEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
45 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
46 { ACTION_STD_QUICKSCREEN, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
47
48 /* TODO: this is a bit of a hack so that we can exit some debug screens
49 * (audio, tagcache, dircache, hwinfo, stack, ports). They don't like it
50 * when ACTION_STD_CANCEL has anything other than BUTTON_NONE for prereq.
51 */
52 { ACTION_STD_CANCEL, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
53 52
54 LAST_ITEM_IN_LIST 53 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
55}; /* button_context_standard */ 54 { ACTION_STD_CANCEL, BUTTON_DISPLAY, BUTTON_NONE },
55 { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE },
56 56
57static const struct button_mapping remote_button_context_standard[] = { 57 { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT },
58 { ACTION_STD_PREV, BUTTON_RC_VOL_UP, BUTTON_NONE }, 58
59 { ACTION_STD_PREVREPEAT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 59 { ACTION_STD_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
60 { ACTION_STD_NEXT, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 60 { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
61 { ACTION_STD_NEXTREPEAT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 61
62 { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
63 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
62 64
63 LAST_ITEM_IN_LIST 65 LAST_ITEM_IN_LIST
64}; /* remote_button_context_standard */ 66}; /* button_context_standard */
67
65 68
66static const struct button_mapping button_context_wps[] = { 69static const struct button_mapping button_context_wps[] = {
67 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 70 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
68 { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT,BUTTON_PLAY }, 71 { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
69 { ACTION_WPS_SKIPPREV, BUTTON_REW|BUTTON_REL, BUTTON_REW},
70 { ACTION_WPS_SEEKBACK, BUTTON_REW|BUTTON_REPEAT, BUTTON_NONE },
71 { ACTION_WPS_STOPSEEK, BUTTON_REW|BUTTON_REL, BUTTON_REW|BUTTON_REPEAT },
72 { ACTION_WPS_SKIPNEXT, BUTTON_FF|BUTTON_REL, BUTTON_FF },
73 { ACTION_WPS_SEEKFWD, BUTTON_FF|BUTTON_REPEAT, BUTTON_NONE },
74 { ACTION_WPS_STOPSEEK, BUTTON_FF|BUTTON_REL, BUTTON_FF|BUTTON_REPEAT },
75
76 { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_POWER|BUTTON_FF, BUTTON_POWER },
77 { ACTION_WPS_ABSETA_PREVDIR, BUTTON_POWER|BUTTON_REW, BUTTON_POWER },
78 { ACTION_WPS_ABRESET, BUTTON_POWER|BUTTON_PLAY, BUTTON_POWER },
79
80 { ACTION_WPS_VOLDOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE },
81 { ACTION_WPS_VOLDOWN, BUTTON_SCROLL_DOWN|BUTTON_REPEAT,BUTTON_NONE },
82 { ACTION_WPS_VOLUP, BUTTON_SCROLL_UP, BUTTON_NONE },
83 { ACTION_WPS_VOLUP, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE },
84
85 { ACTION_WPS_BROWSE, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
86 { ACTION_WPS_CONTEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
87 { ACTION_WPS_QUICKSCREEN, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
88 { ACTION_WPS_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
89 { ACTION_WPS_PITCHSCREEN, BUTTON_PLAY|BUTTON_LEFT, BUTTON_PLAY },
90 { ACTION_WPS_ID3SCREEN, BUTTON_PLAY|BUTTON_RIGHT, BUTTON_PLAY },
91
92 LAST_ITEM_IN_LIST
93}; /* button_context_wps */
94 72
95static const struct button_mapping remote_button_context_wps[] = { 73 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
96 { ACTION_WPS_PLAY, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, 74 { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
97 { ACTION_WPS_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT,BUTTON_RC_PLAY },
98 { ACTION_WPS_SKIPPREV, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW},
99 { ACTION_WPS_SEEKBACK, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE },
100 { ACTION_WPS_STOPSEEK, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW|BUTTON_REPEAT },
101 { ACTION_WPS_SKIPNEXT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
102 { ACTION_WPS_SEEKFWD, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE },
103 { ACTION_WPS_STOPSEEK, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF|BUTTON_REPEAT },
104
105 { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
106 { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
107 { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE },
108 { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
109 75
110 { ACTION_WPS_PITCHSCREEN, BUTTON_RC_PLAY|BUTTON_LEFT, BUTTON_RC_PLAY }, 76 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
111 { ACTION_WPS_ID3SCREEN, BUTTON_RC_PLAY|BUTTON_RIGHT, BUTTON_RC_PLAY }, 77 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
112 78 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
113 LAST_ITEM_IN_LIST 79 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
114}; /* remote_button_context_wps */
115
116static const struct button_mapping button_context_settings[] = {
117 { ACTION_SETTINGS_INC, BUTTON_SCROLL_UP, BUTTON_NONE },
118 { ACTION_SETTINGS_INCREPEAT,BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE },
119 { ACTION_SETTINGS_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE },
120 { ACTION_SETTINGS_DECREPEAT,BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
121 { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE },
122 { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
123 { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE },
124 { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
125 { ACTION_SETTINGS_RESET, BUTTON_PLAY, BUTTON_NONE },
126
127 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
128}; /* button_context_settings */
129 80
130static const struct button_mapping button_context_list[] = { 81 { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
131 { ACTION_LISTTREE_PGUP, BUTTON_REW|BUTTON_REL, BUTTON_REW }, 82 { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE },
132 { ACTION_LISTTREE_PGDOWN, BUTTON_FF|BUTTON_REL, BUTTON_FF }, 83 { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
84 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
133 85
134 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 86 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
135}; /* button_context_list */ 87 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
88
89 { ACTION_WPS_BROWSE, BUTTON_DISPLAY|BUTTON_REL, BUTTON_DISPLAY },
90 { ACTION_WPS_ABSETB_NEXTDIR,BUTTON_DISPLAY|BUTTON_RIGHT, BUTTON_NONE },
91 { ACTION_WPS_ABSETA_PREVDIR,BUTTON_DISPLAY|BUTTON_LEFT, BUTTON_NONE },
92 { ACTION_WPS_ABRESET, BUTTON_DISPLAY|BUTTON_SELECT, BUTTON_NONE },
93 { ACTION_WPS_PITCHSCREEN, BUTTON_DISPLAY|BUTTON_UP, BUTTON_DISPLAY },
94 { ACTION_WPS_PITCHSCREEN, BUTTON_DISPLAY|BUTTON_DOWN, BUTTON_DISPLAY },
95 { ACTION_WPS_ID3SCREEN, BUTTON_DISPLAY|BUTTON_MENU, BUTTON_NONE },
136 96
137static const struct button_mapping remote_button_context_list[] = { 97 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
138 { ACTION_LISTTREE_PGUP, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
139 { ACTION_LISTTREE_PGDOWN, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
140 98
99 LAST_ITEM_IN_LIST
100}; /* button_context_wps */
101
102static const struct button_mapping button_context_list[] = {
103 { ACTION_LISTTREE_PGUP, BUTTON_DISPLAY|BUTTON_UP, BUTTON_DISPLAY },
104 { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_DISPLAY|BUTTON_UP },
105 { ACTION_LISTTREE_PGUP, BUTTON_DISPLAY|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
106 { ACTION_LISTTREE_PGDOWN, BUTTON_DISPLAY|BUTTON_DOWN, BUTTON_DISPLAY },
107 { ACTION_LISTTREE_PGDOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_DISPLAY|BUTTON_DOWN },
108 { ACTION_LISTTREE_PGDOWN, BUTTON_DISPLAY|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
109
141 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 110 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
142}; /* button_context_list */ 111}; /* button_context_list */
143 112
144static const struct button_mapping button_context_tree[] = { 113static const struct button_mapping button_context_tree[] = {
145 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 114 { ACTION_TREE_WPS, BUTTON_DISPLAY|BUTTON_REL, BUTTON_DISPLAY },
146 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 115 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
147 116 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
148 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 117 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
149}; /* button_context_tree */ 118 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
150 119
151static const struct button_mapping remote_button_context_tree[] = { 120 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
152 { ACTION_TREE_WPS, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
153 { ACTION_TREE_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
154
155 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
156}; /* button_context_tree */ 121}; /* button_context_tree */
157 122
158static const struct button_mapping button_context_listtree_scroll_without_combo[] = { 123static const struct button_mapping button_context_listtree_scroll_with_combo[] = {
159 { ACTION_TREE_ROOT_INIT, BUTTON_REW|BUTTON_REPEAT, BUTTON_REW }, 124 { ACTION_NONE, BUTTON_DISPLAY, BUTTON_NONE },
160 { ACTION_TREE_PGLEFT, BUTTON_REW|BUTTON_REPEAT, BUTTON_NONE }, 125 { ACTION_TREE_PGLEFT, BUTTON_DISPLAY|BUTTON_LEFT, BUTTON_DISPLAY },
161 { ACTION_TREE_PGRIGHT, BUTTON_FF|BUTTON_REPEAT, BUTTON_NONE }, 126 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_DISPLAY|BUTTON_LEFT },
162 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), 127 { ACTION_TREE_PGLEFT, BUTTON_DISPLAY|BUTTON_LEFT, BUTTON_LEFT|BUTTON_REL },
163}; /* button_context_listtree_scroll_without_combo */ 128 { ACTION_TREE_ROOT_INIT, BUTTON_DISPLAY|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_DISPLAY|BUTTON_LEFT },
129 { ACTION_TREE_PGLEFT, BUTTON_DISPLAY|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
130 { ACTION_TREE_PGRIGHT, BUTTON_DISPLAY|BUTTON_RIGHT, BUTTON_DISPLAY },
131 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_DISPLAY|BUTTON_RIGHT },
132 { ACTION_TREE_PGRIGHT, BUTTON_DISPLAY|BUTTON_RIGHT, BUTTON_RIGHT|BUTTON_REL },
133 { ACTION_TREE_PGRIGHT, BUTTON_DISPLAY|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
164 134
165static const struct button_mapping remote_button_context_listtree_scroll_without_combo[] = {
166 { ACTION_TREE_ROOT_INIT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
167 { ACTION_TREE_PGLEFT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE },
168 { ACTION_TREE_PGRIGHT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE },
169 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), 135 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
170}; /* button_context_listtree_scroll_without_combo */ 136};
171 137
172static const struct button_mapping button_context_listtree_scroll_with_combo[] = { 138static const struct button_mapping button_context_listtree_scroll_without_combo[] = {
173 { ACTION_LISTTREE_PGUP, BUTTON_REW|BUTTON_REPEAT, BUTTON_REW }, 139 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
174 { ACTION_LISTTREE_PGDOWN, BUTTON_FF|BUTTON_REPEAT, BUTTON_FF }, 140 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
175 { ACTION_TREE_PGLEFT, BUTTON_REW|BUTTON_PLAY, BUTTON_PLAY }, 141 { ACTION_TREE_ROOT_INIT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
176 { ACTION_TREE_PGLEFT, BUTTON_REW|BUTTON_REL, BUTTON_REW|BUTTON_PLAY }, 142 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
177 { ACTION_TREE_PGLEFT, BUTTON_REW|BUTTON_PLAY, BUTTON_REW|BUTTON_REL }, 143 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
178 { ACTION_TREE_ROOT_INIT, BUTTON_REW|BUTTON_PLAY|BUTTON_REPEAT, BUTTON_REW|BUTTON_PLAY }, 144 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
179 { ACTION_TREE_PGLEFT, BUTTON_REW|BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 145 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
180 { ACTION_TREE_PGRIGHT, BUTTON_FF|BUTTON_PLAY, BUTTON_PLAY }, 146 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
181 { ACTION_TREE_PGRIGHT, BUTTON_FF|BUTTON_REL, BUTTON_FF|BUTTON_PLAY }, 147 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
182 { ACTION_TREE_PGRIGHT, BUTTON_FF|BUTTON_PLAY, BUTTON_FF|BUTTON_REL },
183 { ACTION_TREE_PGRIGHT, BUTTON_FF|BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
184 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
185}; /* button_context_listtree_scroll_with_combo */
186
187static const struct button_mapping remote_button_context_listtree_scroll_with_combo[] = {
188 { ACTION_LISTTREE_PGUP, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
189 { ACTION_LISTTREE_PGDOWN, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
190 { ACTION_TREE_PGLEFT, BUTTON_RC_REW|BUTTON_RC_PLAY, BUTTON_RC_PLAY },
191 { ACTION_TREE_PGLEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW|BUTTON_RC_PLAY },
192 { ACTION_TREE_PGLEFT, BUTTON_RC_REW|BUTTON_RC_PLAY, BUTTON_RC_REW|BUTTON_REL },
193 { ACTION_TREE_ROOT_INIT, BUTTON_RC_REW|BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_REW|BUTTON_RC_PLAY },
194 { ACTION_TREE_PGLEFT, BUTTON_RC_REW|BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE },
195 { ACTION_TREE_PGRIGHT, BUTTON_RC_FF|BUTTON_RC_PLAY, BUTTON_RC_PLAY },
196 { ACTION_TREE_PGRIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF|BUTTON_RC_PLAY },
197 { ACTION_TREE_PGRIGHT, BUTTON_RC_FF|BUTTON_RC_PLAY, BUTTON_RC_FF|BUTTON_REL },
198 { ACTION_TREE_PGRIGHT, BUTTON_RC_FF|BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE },
199 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), 148 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
200}; /* button_context_listtree_scroll_with_combo */ 149};
150
151static const struct button_mapping button_context_settings[] = {
152 { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
153 { ACTION_SETTINGS_INCREPEAT,BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
154 { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
155 { ACTION_SETTINGS_DECREPEAT,BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
156 { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE },
157 { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
158 { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE },
159 { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
160 { ACTION_SETTINGS_RESET, BUTTON_DISPLAY, BUTTON_NONE },
161
162 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
163}; /* button_context_settings */
164
165static const struct button_mapping button_context_settings_right_is_inc[] = {
166 { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE },
167 { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
168 { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE },
169 { ACTION_SETTINGS_DECREPEAT,BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
170 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
171 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
172 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
173 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
174 { ACTION_SETTINGS_RESET, BUTTON_DISPLAY, BUTTON_NONE },
175
176 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
177}; /* button_context_settingsgraphical */
201 178
202static const struct button_mapping button_context_yesno[] = { 179static const struct button_mapping button_context_yesno[] = {
203 { ACTION_YESNO_ACCEPT, BUTTON_RIGHT, BUTTON_NONE }, 180 { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE },
204 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 181
182 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
205}; /* button_context_settings_yesno */ 183}; /* button_context_settings_yesno */
206 184
207static const struct button_mapping button_context_quickscreen[] = { 185static const struct button_mapping button_context_colorchooser[] = {
208 { ACTION_QS_DOWNINV, BUTTON_SCROLL_UP, BUTTON_NONE }, 186 { ACTION_STD_OK, BUTTON_DISPLAY|BUTTON_REL, BUTTON_NONE },
209 { ACTION_QS_DOWNINV, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE },
210 { ACTION_QS_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE },
211 { ACTION_QS_DOWN, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
212 { ACTION_QS_LEFT, BUTTON_REW, BUTTON_NONE },
213 { ACTION_QS_LEFT, BUTTON_REW|BUTTON_REPEAT, BUTTON_NONE },
214 { ACTION_QS_RIGHT, BUTTON_FF, BUTTON_NONE },
215 { ACTION_QS_RIGHT, BUTTON_FF|BUTTON_REPEAT, BUTTON_NONE },
216
217 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
218}; /* button_context_quickscreen */
219 187
220static const struct button_mapping remote_button_context_quickscreen[] = { 188 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS),
221 { ACTION_QS_DOWNINV, BUTTON_RC_VOL_UP, BUTTON_NONE }, 189}; /* button_context_colorchooser */
222 { ACTION_QS_DOWNINV, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
223 { ACTION_QS_DOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
224 { ACTION_QS_DOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
225 { ACTION_QS_LEFT, BUTTON_RC_REW, BUTTON_NONE },
226 { ACTION_QS_LEFT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE },
227 { ACTION_QS_RIGHT, BUTTON_RC_FF, BUTTON_NONE },
228 { ACTION_QS_RIGHT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE },
229
230 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
231}; /* button_context_quickscreen */
232 190
233static const struct button_mapping button_context_settings_right_is_inc[] = { 191static const struct button_mapping button_context_eq[] = {
234 { ACTION_SETTINGS_INC, BUTTON_SCROLL_UP, BUTTON_NONE }, 192 { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
235 { ACTION_SETTINGS_INCREPEAT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE },
236 { ACTION_SETTINGS_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE },
237 { ACTION_SETTINGS_DECREPEAT, BUTTON_SCROLL_DOWN|BUTTON_REPEAT,BUTTON_NONE },
238 { ACTION_STD_PREV, BUTTON_REW, BUTTON_NONE },
239 { ACTION_STD_PREVREPEAT, BUTTON_REW|BUTTON_REPEAT, BUTTON_NONE },
240 { ACTION_STD_NEXT, BUTTON_FF, BUTTON_NONE },
241 { ACTION_STD_NEXTREPEAT, BUTTON_FF|BUTTON_REPEAT, BUTTON_NONE },
242 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
243 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
244 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
245 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
246 193
247 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 194 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS),
248}; /* button_context_settings_right_is_inc */ 195}; /* button_context_eq */
196
197/** Bookmark Screen **/
198static const struct button_mapping button_context_bmark[] = {
199 { ACTION_BMS_DELETE, BUTTON_DISPLAY, BUTTON_NONE },
200
201 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
202}; /* button_context_bmark */
203
204static const struct button_mapping button_context_time[] = {
205 { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE },
206 { ACTION_STD_OK, BUTTON_DISPLAY, BUTTON_NONE },
207
208 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
209}; /* button_context_time */
210
211static const struct button_mapping button_context_quickscreen[] = {
212 { ACTION_QS_DOWNINV, BUTTON_UP, BUTTON_NONE },
213 { ACTION_QS_DOWNINV, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
214 { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE },
215 { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
216 { ACTION_QS_LEFT, BUTTON_LEFT, BUTTON_NONE },
217 { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
218 { ACTION_QS_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
219 { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
220 { ACTION_STD_CANCEL, BUTTON_MENU, BUTTON_NONE },
221
222 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
223}; /* button_context_quickscreen */
249 224
250static const struct button_mapping button_context_pitchscreen[] = { 225static const struct button_mapping button_context_pitchscreen[] = {
251 { ACTION_PS_INC_SMALL, BUTTON_SCROLL_UP, BUTTON_NONE }, 226 { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE },
252 { ACTION_PS_INC_BIG, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, 227 { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
253 { ACTION_PS_DEC_SMALL, BUTTON_SCROLL_DOWN, BUTTON_NONE }, 228 { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE },
254 { ACTION_PS_DEC_BIG, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 229 { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
255 { ACTION_PS_NUDGE_LEFT, BUTTON_REW, BUTTON_NONE }, 230 { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE },
256 { ACTION_PS_NUDGE_LEFTOFF, BUTTON_REW|BUTTON_REL, BUTTON_NONE }, 231 { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE },
257 { ACTION_PS_NUDGE_RIGHT, BUTTON_FF, BUTTON_NONE }, 232 { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
258 { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_FF|BUTTON_REL, BUTTON_NONE }, 233 { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE },
259 { ACTION_PS_TOGGLE_MODE, BUTTON_POWER, BUTTON_NONE }, 234 { ACTION_PS_TOGGLE_MODE, BUTTON_SELECT, BUTTON_NONE },
260 { ACTION_PS_RESET, BUTTON_PLAY, BUTTON_NONE }, 235 { ACTION_PS_RESET, BUTTON_DISPLAY, BUTTON_NONE },
261 { ACTION_PS_EXIT, BUTTON_LEFT, BUTTON_NONE }, 236 { ACTION_PS_EXIT, BUTTON_MENU, BUTTON_NONE },
262 237
263 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 238 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
264}; /* button_context_pitchscreen */ 239}; /* button_context_pitchcreen */
265
266static const struct button_mapping remote_button_context_pitchscreen[] = {
267 { ACTION_PS_INC_SMALL, BUTTON_RC_VOL_UP, BUTTON_NONE },
268 { ACTION_PS_INC_BIG, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
269 { ACTION_PS_DEC_SMALL, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
270 { ACTION_PS_DEC_BIG, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
271 { ACTION_PS_NUDGE_LEFT, BUTTON_RC_REW, BUTTON_NONE },
272 { ACTION_PS_NUDGE_LEFTOFF, BUTTON_RC_REW|BUTTON_REL, BUTTON_NONE },
273 { ACTION_PS_NUDGE_RIGHT, BUTTON_RC_FF, BUTTON_NONE },
274 { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RC_FF|BUTTON_REL, BUTTON_NONE },
275 { ACTION_PS_RESET, BUTTON_RC_PLAY, BUTTON_NONE },
276
277 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
278}; /* button_context_pitchscreen */
279 240
280static const struct button_mapping button_context_keyboard[] = { 241static const struct button_mapping button_context_keyboard[] = {
281 { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, 242 { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE },
282 { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, 243 { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
283 { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, 244 { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
284 { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, 245 { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
285 { ACTION_KBD_SELECT, BUTTON_REW, BUTTON_NONE }, 246 { ACTION_KBD_CURSOR_LEFT, BUTTON_DISPLAY|BUTTON_LEFT, BUTTON_NONE },
286 { ACTION_KBD_DONE, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 247 { ACTION_KBD_CURSOR_LEFT, BUTTON_DISPLAY|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
287 { ACTION_KBD_ABORT, BUTTON_POWER, BUTTON_NONE }, 248 { ACTION_KBD_CURSOR_RIGHT, BUTTON_DISPLAY|BUTTON_RIGHT, BUTTON_NONE },
288 { ACTION_KBD_UP, BUTTON_SCROLL_UP, BUTTON_NONE }, 249 { ACTION_KBD_CURSOR_RIGHT, BUTTON_DISPLAY|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
289 { ACTION_KBD_UP, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, 250 { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE },
290 { ACTION_KBD_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE }, 251 { ACTION_KBD_PAGE_FLIP, BUTTON_DISPLAY|BUTTON_MENU, BUTTON_NONE },
291 { ACTION_KBD_DOWN, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 252 { ACTION_KBD_DONE, BUTTON_DISPLAY|BUTTON_REL, BUTTON_DISPLAY },
292 { ACTION_KBD_MORSE_INPUT, BUTTON_REW|BUTTON_PLAY, BUTTON_NONE }, 253 { ACTION_KBD_ABORT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
293 { ACTION_KBD_MORSE_SELECT, BUTTON_REW|BUTTON_REL, BUTTON_NONE }, 254 { ACTION_KBD_BACKSPACE, BUTTON_MENU, BUTTON_NONE },
255 { ACTION_KBD_BACKSPACE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE },
256 { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE },
257 { ACTION_KBD_UP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
258 { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE },
259 { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
260 { ACTION_KBD_MORSE_INPUT, BUTTON_DISPLAY|BUTTON_POWER, BUTTON_NONE },
261 { ACTION_KBD_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
294 262
295 LAST_ITEM_IN_LIST 263 LAST_ITEM_IN_LIST
296}; /* button_context_keyboard */ 264}; /* button_context_keyboard */
297 265
298static const struct button_mapping button_context_bmark[] = { 266/*****************************************************************************
299 { ACTION_BMS_DELETE, BUTTON_REW, BUTTON_NONE }, 267 * Remote control mappings
300 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 268 *****************************************************************************/
301}; /* button_context_bmark */
302 269
303const struct button_mapping button_context_recscreen[] = { 270static const struct button_mapping remote_button_context_standard[] = {
304 { ACTION_REC_PAUSE, BUTTON_PLAY, BUTTON_NONE }, 271 { ACTION_STD_PREV, BUTTON_RC_PLAY, BUTTON_NONE },
305 272 { ACTION_STD_PREVREPEAT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE },
306 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) 273 { ACTION_STD_NEXT, BUTTON_RC_DISPLAY, BUTTON_NONE },
307}; /* button_context_recscreen */ 274 { ACTION_STD_NEXTREPEAT, BUTTON_RC_DISPLAY|BUTTON_REPEAT,BUTTON_NONE },
275 { ACTION_STD_CANCEL, BUTTON_RC_REW, BUTTON_NONE },
276 { ACTION_STD_OK, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
277 { ACTION_STD_CONTEXT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
278 { ACTION_STD_MENU, BUTTON_RC_FAV, BUTTON_NONE },
279
280 LAST_ITEM_IN_LIST
281};
282
283static const struct button_mapping remote_button_context_wps[] = {
284 { ACTION_WPS_PLAY, BUTTON_RC_PLAY, BUTTON_NONE },
285
286 { ACTION_WPS_SKIPNEXT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
287 { ACTION_WPS_SKIPPREV, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
288
289 { ACTION_WPS_SEEKBACK, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE },
290 { ACTION_WPS_SEEKFWD, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE },
291 { ACTION_WPS_STOPSEEK, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW|BUTTON_REPEAT },
292 { ACTION_WPS_STOPSEEK, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF|BUTTON_REPEAT },
293
294 { ACTION_WPS_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
295 { ACTION_WPS_MENU, BUTTON_RC_FAV, BUTTON_NONE },
296
297 { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
298 { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
299 { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
300 { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE },
301
302 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
303};
304
305static const struct button_mapping remote_button_context_tree[] = {
306 { ACTION_TREE_WPS, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
307 { ACTION_TREE_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
308 { ACTION_STD_CANCEL, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE },
309
310 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
311};
308 312
309static const struct button_mapping* get_context_mapping_remote( int context ) 313static const struct button_mapping* get_context_mapping_remote( int context )
310{ 314{
311 context ^= CONTEXT_REMOTE; 315 context ^= CONTEXT_REMOTE;
312 316
313 switch (context) 317 switch (context)
314 { 318 {
315 case CONTEXT_STD:
316 case CONTEXT_MAINMENU:
317 return remote_button_context_standard;
318
319 case CONTEXT_WPS: 319 case CONTEXT_WPS:
320 return remote_button_context_wps; 320 return remote_button_context_wps;
321 321 case CONTEXT_MAINMENU:
322 case CONTEXT_LIST:
323 return remote_button_context_list;
324 case CONTEXT_TREE: 322 case CONTEXT_TREE:
325 if (global_settings.hold_lr_for_scroll_in_list)
326 return remote_button_context_listtree_scroll_without_combo;
327 else
328 return remote_button_context_listtree_scroll_with_combo;
329 case CONTEXT_CUSTOM|CONTEXT_TREE:
330 return remote_button_context_tree; 323 return remote_button_context_tree;
331
332 case CONTEXT_QUICKSCREEN:
333 return remote_button_context_quickscreen;
334 case CONTEXT_PITCHSCREEN:
335 return remote_button_context_pitchscreen;
336 case CONTEXT_RECSCREEN:
337 return button_context_recscreen;
338
339 default:
340 return remote_button_context_standard;
341 } 324 }
325 return remote_button_context_standard;
342} 326}
343 327
344/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
345const struct button_mapping* get_context_mapping(int context) 328const struct button_mapping* get_context_mapping(int context)
346{ 329{
347 if (context&CONTEXT_REMOTE) 330 if (context&CONTEXT_REMOTE)
@@ -351,17 +334,16 @@ const struct button_mapping* get_context_mapping(int context)
351 { 334 {
352 case CONTEXT_STD: 335 case CONTEXT_STD:
353 return button_context_standard; 336 return button_context_standard;
354
355 case CONTEXT_WPS: 337 case CONTEXT_WPS:
356 return button_context_wps; 338 return button_context_wps;
357 339
358 case CONTEXT_LIST: 340 case CONTEXT_LIST:
359 return button_context_list; 341 return button_context_list;
360 case CONTEXT_TREE:
361 case CONTEXT_MAINMENU: 342 case CONTEXT_MAINMENU:
343 case CONTEXT_TREE:
362 if (global_settings.hold_lr_for_scroll_in_list) 344 if (global_settings.hold_lr_for_scroll_in_list)
363 return button_context_listtree_scroll_without_combo; 345 return button_context_listtree_scroll_without_combo;
364 else 346 else
365 return button_context_listtree_scroll_with_combo; 347 return button_context_listtree_scroll_with_combo;
366 case CONTEXT_CUSTOM|CONTEXT_TREE: 348 case CONTEXT_CUSTOM|CONTEXT_TREE:
367 return button_context_tree; 349 return button_context_tree;
@@ -369,13 +351,18 @@ const struct button_mapping* get_context_mapping(int context)
369 case CONTEXT_SETTINGS: 351 case CONTEXT_SETTINGS:
370 return button_context_settings; 352 return button_context_settings;
371 case CONTEXT_CUSTOM|CONTEXT_SETTINGS: 353 case CONTEXT_CUSTOM|CONTEXT_SETTINGS:
354 return button_context_settings_right_is_inc;
355
372 case CONTEXT_SETTINGS_COLOURCHOOSER: 356 case CONTEXT_SETTINGS_COLOURCHOOSER:
357 return button_context_colorchooser;
373 case CONTEXT_SETTINGS_EQ: 358 case CONTEXT_SETTINGS_EQ:
359 return button_context_eq;
360
374 case CONTEXT_SETTINGS_TIME: 361 case CONTEXT_SETTINGS_TIME:
375 return button_context_settings_right_is_inc; 362 return button_context_time;
376 363
377 case CONTEXT_YESNOSCREEN: 364 case CONTEXT_YESNOSCREEN:
378 return button_context_yesno; 365 return button_context_yesno;
379 case CONTEXT_BOOKMARKSCREEN: 366 case CONTEXT_BOOKMARKSCREEN:
380 return button_context_bmark; 367 return button_context_bmark;
381 case CONTEXT_QUICKSCREEN: 368 case CONTEXT_QUICKSCREEN:
@@ -384,11 +371,6 @@ const struct button_mapping* get_context_mapping(int context)
384 return button_context_pitchscreen; 371 return button_context_pitchscreen;
385 case CONTEXT_KEYBOARD: 372 case CONTEXT_KEYBOARD:
386 return button_context_keyboard; 373 return button_context_keyboard;
387 case CONTEXT_RECSCREEN: 374 }
388 return button_context_recscreen;
389
390 default:
391 return button_context_standard;
392 }
393 return button_context_standard; 375 return button_context_standard;
394} 376}
diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c
index ce90ad9004..85b65b26e4 100644
--- a/apps/plugins/lib/pluginlib_actions.c
+++ b/apps/plugins/lib/pluginlib_actions.c
@@ -73,7 +73,8 @@ const struct button_mapping generic_directions[] =
73 || (CONFIG_KEYPAD == ARCHOS_AV300_PAD) \ 73 || (CONFIG_KEYPAD == ARCHOS_AV300_PAD) \
74 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \ 74 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \
75 || (CONFIG_KEYPAD == SANSA_C200_PAD) \ 75 || (CONFIG_KEYPAD == SANSA_C200_PAD) \
76 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) 76 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) \
77 || (CONFIG_KEYPAD == MROBE100_PAD)
77 { PLA_UP, BUTTON_UP, BUTTON_NONE}, 78 { PLA_UP, BUTTON_UP, BUTTON_NONE},
78 { PLA_DOWN, BUTTON_DOWN, BUTTON_NONE}, 79 { PLA_DOWN, BUTTON_DOWN, BUTTON_NONE},
79 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE}, 80 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
@@ -112,8 +113,7 @@ const struct button_mapping generic_directions[] =
112 {PLA_DOWN_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, 113 {PLA_DOWN_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
113 {PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, 114 {PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
114 {PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, 115 {PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
115#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) \ 116#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
116 || (CONFIG_KEYPAD == MROBE100_PAD)
117 { PLA_UP, BUTTON_SCROLL_UP, BUTTON_NONE}, 117 { PLA_UP, BUTTON_SCROLL_UP, BUTTON_NONE},
118 { PLA_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE}, 118 { PLA_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE},
119 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE}, 119 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
@@ -150,10 +150,11 @@ const struct button_mapping generic_left_right_fire[] =
150{ 150{
151#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \ 151#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
152 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \ 152 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \
153 || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \ 153 || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \
154 || (CONFIG_KEYPAD == GIGABEAT_PAD) \ 154 || (CONFIG_KEYPAD == GIGABEAT_PAD) \
155 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \ 155 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \
156 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) 156 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) \
157 || (CONFIG_KEYPAD == MROBE100_PAD)
157 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE}, 158 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
158 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE}, 159 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE},
159 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, 160 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
@@ -205,8 +206,7 @@ const struct button_mapping generic_left_right_fire[] =
205 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, 206 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
206 { PLA_FIRE, BUTTON_SELECT, BUTTON_NONE}, 207 { PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
207 { PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_NONE}, 208 { PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_NONE},
208#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) \ 209#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
209 || (CONFIG_KEYPAD == MROBE100_PAD)
210 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE}, 210 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
211 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE}, 211 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE},
212 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, 212 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
@@ -312,8 +312,7 @@ const struct button_mapping generic_actions[] =
312 {PLA_MENU, BUTTON_DOWN, BUTTON_NONE}, 312 {PLA_MENU, BUTTON_DOWN, BUTTON_NONE},
313 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE}, 313 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
314 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, 314 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
315#elif CONFIG_KEYPAD == IRIVER_H10_PAD \ 315#elif CONFIG_KEYPAD == IRIVER_H10_PAD
316 || (CONFIG_KEYPAD == MROBE100_PAD)
317 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE}, 316 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE},
318 {PLA_START, BUTTON_PLAY, BUTTON_NONE}, 317 {PLA_START, BUTTON_PLAY, BUTTON_NONE},
319 {PLA_MENU, BUTTON_FF, BUTTON_NONE}, 318 {PLA_MENU, BUTTON_FF, BUTTON_NONE},
@@ -331,6 +330,12 @@ const struct button_mapping generic_actions[] =
331 {PLA_MENU, BUTTON_RC_MODE, BUTTON_NONE}, 330 {PLA_MENU, BUTTON_RC_MODE, BUTTON_NONE},
332 {PLA_FIRE, BUTTON_RC_HEART, BUTTON_NONE}, 331 {PLA_FIRE, BUTTON_RC_HEART, BUTTON_NONE},
333 {PLA_FIRE_REPEAT, BUTTON_RC_HEART|BUTTON_REPEAT, BUTTON_NONE}, 332 {PLA_FIRE_REPEAT, BUTTON_RC_HEART|BUTTON_REPEAT, BUTTON_NONE},
333#elif CONFIG_KEYPAD == MROBE100_PAD
334 {PLA_QUIT, BUTTON_DISPLAY, BUTTON_NONE},
335 {PLA_START, BUTTON_PLAY, BUTTON_NONE},
336 {PLA_MENU, BUTTON_MENU, BUTTON_NONE},
337 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
338 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
334#elif (CONFIG_KEYPAD == COWOND2_PAD) 339#elif (CONFIG_KEYPAD == COWOND2_PAD)
335 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE}, 340 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE},
336 {PLA_START, BUTTON_UP, BUTTON_NONE}, 341 {PLA_START, BUTTON_UP, BUTTON_NONE},
@@ -347,14 +352,15 @@ const struct button_mapping generic_increase_decrease[] =
347{ 352{
348#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \ 353#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
349 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \ 354 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \
350 || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \ 355 || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \
351 || (CONFIG_KEYPAD == GIGABEAT_PAD) \ 356 || (CONFIG_KEYPAD == GIGABEAT_PAD) \
352 || (CONFIG_KEYPAD == RECORDER_PAD) \ 357 || (CONFIG_KEYPAD == RECORDER_PAD) \
353 || (CONFIG_KEYPAD == ARCHOS_AV300_PAD) \ 358 || (CONFIG_KEYPAD == ARCHOS_AV300_PAD) \
354 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \ 359 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \
355 || (CONFIG_KEYPAD == ONDIO_PAD) \ 360 || (CONFIG_KEYPAD == ONDIO_PAD) \
356 || (CONFIG_KEYPAD == COWOND2_PAD) \ 361 || (CONFIG_KEYPAD == COWOND2_PAD) \
357 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) 362 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) \
363 || (CONFIG_KEYPAD == MROBE100_PAD)
358 {PLA_INC, BUTTON_UP, BUTTON_NONE}, 364 {PLA_INC, BUTTON_UP, BUTTON_NONE},
359 {PLA_DEC, BUTTON_DOWN, BUTTON_NONE}, 365 {PLA_DEC, BUTTON_DOWN, BUTTON_NONE},
360 {PLA_INC_REPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, 366 {PLA_INC_REPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE},
@@ -375,8 +381,7 @@ const struct button_mapping generic_increase_decrease[] =
375#elif CONFIG_KEYPAD == PLAYER_PAD 381#elif CONFIG_KEYPAD == PLAYER_PAD
376 {PLA_INC, BUTTON_STOP, BUTTON_NONE}, 382 {PLA_INC, BUTTON_STOP, BUTTON_NONE},
377 {PLA_DEC, BUTTON_PLAY, BUTTON_NONE}, 383 {PLA_DEC, BUTTON_PLAY, BUTTON_NONE},
378#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) \ 384#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
379 || (CONFIG_KEYPAD == MROBE100_PAD)
380 {PLA_INC, BUTTON_SCROLL_UP, BUTTON_NONE}, 385 {PLA_INC, BUTTON_SCROLL_UP, BUTTON_NONE},
381 {PLA_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE}, 386 {PLA_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE},
382 {PLA_INC_REPEAT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE}, 387 {PLA_INC_REPEAT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE},
diff --git a/firmware/target/arm/olympus/mrobe-100/button-mr100.c b/firmware/target/arm/olympus/mrobe-100/button-mr100.c
index 49561cb8d7..43db2c5f6d 100644
--- a/firmware/target/arm/olympus/mrobe-100/button-mr100.c
+++ b/firmware/target/arm/olympus/mrobe-100/button-mr100.c
@@ -27,14 +27,562 @@
27#include "backlight-target.h" 27#include "backlight-target.h"
28#include "system.h" 28#include "system.h"
29 29
30void button_init_device(void) 30#define LOGF_ENABLE
31#include "logf.h"
32
33/* Driver for the Synaptics Touchpad based on the "Synaptics Modular Embedded
34 Protocol: 3-Wire Interface Specification" documentation */
35
36#define ACK (GPIOD_INPUT_VAL & 0x1)
37#define ACK_HI GPIOD_OUTPUT_VAL |= 0x1
38#define ACK_LO GPIOD_OUTPUT_VAL &= ~0x1
39
40#define CLK ((GPIOD_INPUT_VAL & 0x2) >> 1)
41#define CLK_HI GPIOD_OUTPUT_VAL |= 0x2
42#define CLK_LO GPIOD_OUTPUT_VAL &= ~0x2
43
44#define DATA ((GPIOD_INPUT_VAL & 0x4) >> 2)
45#define DATA_HI GPIOD_OUTPUT_EN |= 0x4; GPIOD_OUTPUT_VAL |= 0x4
46#define DATA_LO GPIOD_OUTPUT_EN |= 0x4; GPIOD_OUTPUT_VAL &= ~0x4
47
48#define LO 0
49#define HI 1
50
51#define STATUS_READY 1
52#define READ_RETRY 8
53#define READ_ERROR -1
54
55#define HELLO_HEADER 0x19
56#define HELLO_ID 0x1
57#define BUTTONS_HEADER 0x1a
58#define BUTTONS_ID 0x9
59#define ABSOLUTE_HEADER 0x0b
60
61static int syn_status = 0;
62static int int_btn = BUTTON_NONE;
63
64static int syn_wait_clk_change(unsigned int val)
65{
66 int i;
67
68 for (i = 0; i < 10000; i++)
69 {
70 if (CLK == val)
71 return 1;
72 }
73
74 return 0;
75}
76
77static inline int syn_get_data(void)
78{
79 GPIOD_OUTPUT_EN &= ~0x4;
80 return DATA;
81}
82
83static void syn_wait_guest_flush(void)
84{
85 /* Flush receiving (flushee) state:
86 handshake until DATA goes high during P3 stage */
87 if (CLK == LO)
88 {
89 ACK_HI; /* P1 -> P2 */
90 syn_wait_clk_change(HI); /* P2 -> P3 */
91 }
92
93 while (syn_get_data() == LO)
94 {
95 ACK_HI; /* P3 -> P0 */
96 syn_wait_clk_change(LO); /* P0 -> P1 */
97 ACK_LO; /* P1 -> P2 */
98 syn_wait_clk_change(HI); /* P2 -> P3 */
99 }
100
101 /* Continue handshaking until back to P0 */
102 ACK_HI; /* P3 -> P0 */
103}
104
105static void syn_flush(void)
106{
107 int i;
108
109 logf("syn_flush...");
110
111 /* Flusher holds DATA low for at least 36 handshake cycles */
112 DATA_LO;
113
114 for (i = 0; i < 36; i++)
115 {
116 syn_wait_clk_change(LO); /* P0 -> P1 */
117 ACK_LO; /* P1 -> P2 */
118 syn_wait_clk_change(HI); /* P2 -> P3 */
119 ACK_HI; /* P3 -> P0 */
120 }
121
122 /* Raise DATA in P1 stage */
123 syn_wait_clk_change(LO); /* P0 -> P1 */
124 DATA_HI;
125
126 /* After a flush, the flushing device enters a flush-receiving (flushee)
127 state */
128 syn_wait_guest_flush();
129}
130
131static int syn_send_data(int *data, int len)
132{
133 int i, bit;
134 int parity = 0;
135
136 logf("syn_send_data...");
137
138 /* 1. Lower DATA line to issue a request-to-send to guest */
139 DATA_LO;
140
141 /* 2. Wait for guest to lower CLK */
142 syn_wait_clk_change(LO);
143
144 /* 3. Lower ACK (with DATA still low) */
145 ACK_LO;
146
147 /* 4. Wait for guest to raise CLK */
148 syn_wait_clk_change(HI);
149
150 /* 5. Send data */
151 for (i = 0; i < len; i++)
152 {
153 logf(" sending byte: %d", data[i]);
154
155 bit = 0;
156 while (bit < 8)
157 {
158 /* 5a. Drive data low if bit is 0, or high if bit is 1 */
159 if (data[i] & (1 << bit))
160 {
161 DATA_HI;
162 parity++;
163 }
164 else
165 {
166 DATA_LO;
167 }
168 bit++;
169
170 /* 5b. Invert ACK to indicate that the data bit is ready */
171 ACK_HI;
172
173 /* 5c. Wait for guest to invert CLK */
174 syn_wait_clk_change(LO);
175
176 /* Repeat for next bit */
177 if (data[i] & (1 << bit))
178 {
179 DATA_HI;
180 parity++;
181 }
182 else
183 {
184 DATA_LO;
185 }
186 bit++;
187
188 ACK_LO;
189
190 syn_wait_clk_change(HI);
191 }
192 }
193
194 /* 7. Transmission termination sequence: */
195 /* 7a. Host may put parity bit on DATA. Hosts that do not generate
196 parity should set DATA high. Parity is 1 if there's an odd
197 number of '1' bits, or 0 if there's an even number of '1' bits. */
198 parity = parity % 2;
199 logf(" send parity = %d", parity);
200 if (parity)
201 {
202 DATA_HI;
203 }
204 else
205 {
206 DATA_LO;
207 }
208
209 /* 7b. Raise ACK to indicate that the optional parity bit is ready */
210 ACK_HI;
211
212 /* 7c. Guest lowers CLK */
213 syn_wait_clk_change(LO);
214
215 /* 7d. Pull DATA high (if parity bit was 0) */
216 DATA_HI;
217
218 /* 7e. Lower ACK to indicate that the stop bit is ready */
219 ACK_LO;
220
221 /* 7f. Guest raises CLK */
222 syn_wait_clk_change(HI);
223
224 /* 7g. If DATA is low, guest is flushing this transfer. Host should
225 enter the flushee state. */
226 if (syn_get_data() == LO)
227 {
228 logf(" module flushing");
229 syn_wait_guest_flush();
230 return -1;
231 }
232
233 /* 7h. Host raises ACK and the link enters the idle state */
234 ACK_HI;
235
236 return len;
237}
238
239static int syn_read_data(int *data, int data_len)
31{ 240{
32 /* taken from the mr-100 bootloader (offset 0x1e72) */ 241 int i, len, bit, parity, tmp;
33 //~ DEV_EN |= 0x20000; /* enable the touchpad ?? */ 242 int *data_ptr;
243
244 logf("syn_read_data...");
245
246 /* 1. Guest drives CLK low */
247 if (CLK != LO)
248 return 0;
249
250 /* 1a. If the host is willing to receive a packet it lowers ACK */
251 ACK_LO;
252
253 /* 2. Guest may issue a request-to-send by lowering DATA. If the
254 guest decides not to transmit a packet, it may abort the
255 transmission by not lowering DATA. */
256
257 /* 3. The guest raises CLK */
258 syn_wait_clk_change(HI);
259
260 /* 4. If the guest is still driving DATA low, the transfer is commited
261 to occur. Otherwise, the transfer is aborted. In either case,
262 the host raises ACK. */
263 if (syn_get_data() == HI)
264 {
265 logf(" read abort");
266
267 ACK_HI;
268 return READ_ERROR;
269 }
270 else
271 {
272 ACK_HI;
273 }
274
275 /* 5. Read the incoming data packet */
276 i = 0;
277 len = 0;
278 parity = 0;
279 while (i <= len)
280 {
281 bit = 0;
282
283 if (i < data_len)
284 data_ptr = &data[i];
285 else
286 data_ptr = &tmp;
287
288 *data_ptr = 0;
289 while (bit < 8)
290 {
291 /* 5b. Guset inverts CLK to indicate that data is ready */
292 syn_wait_clk_change(LO);
293
294 /* 5d. Read the data bit from DATA */
295 if (syn_get_data() == HI)
296 {
297 *data_ptr |= (1 << bit);
298 parity++;
299 }
300 bit++;
34 301
302 /* 5e. Invert ACK to indicate that data has been read */
303 ACK_LO;
304
305 /* Repeat for next bit */
306 syn_wait_clk_change(HI);
307
308 if (syn_get_data() == HI)
309 {
310 *data_ptr |= (1 << bit);
311 parity++;
312 }
313 bit++;
314
315 ACK_HI;
316 }
317
318 /* First byte is the packet header */
319 if (i == 0)
320 {
321 /* Format control (bit 3) should be 1 */
322 if (*data_ptr & 0x8)
323 {
324 /* Packet length is bits 0:2 */
325 len = *data_ptr & 0x7;
326 logf(" packet length = %d", len);
327 }
328 else
329 {
330 logf(" invalid format ctrl bit");
331 return READ_ERROR;
332 }
333 }
334
335 i++;
336 }
337
338 /* 7. Transmission termination cycle */
339 /* 7a. The guest generates a parity bit on DATA */
340 /* 7b. The host waits for guest to lower CLK */
341 syn_wait_clk_change(LO);
342
343 /* 7c. The host verifies the parity bit is correct */
344 parity = parity % 2;
345 logf(" parity check: %d / %d", syn_get_data(), parity);
346 /* TODO: parity error handling */
347
348 /* 7d. The host lowers ACK */
349 ACK_LO;
350
351 /* 7e. The host waits for the guest to raise CLK indicating
352 that the stop bit is ready */
353 syn_wait_clk_change(HI);
354
355 /* 7f. The host reads DATA and verifies that it is 1 */
356 if (syn_get_data() == LO)
357 {
358 logf(" framing error");
359
360 ACK_HI;
361 return READ_ERROR;
362 }
363
364 ACK_HI;
365
366 return len;
367}
368
369static int syn_read_device(int *data, int len)
370{
371 int i;
372 int ret = READ_ERROR;
373
374 for (i = 0; i < READ_RETRY; i++)
375 {
376 if (syn_wait_clk_change(LO))
377 {
378 /* module is sending data */
379 ret = syn_read_data(data, len);
380 if (ret != READ_ERROR)
381 return ret;
382
383 syn_flush();
384 }
385 else
386 {
387 /* module is idle */
388 return 0;
389 }
390 }
391
392 return ret;
393}
394
395static int syn_reset(void)
396{
397 int val, id;
398 int data[2];
399
400 logf("syn_reset...");
401
402 /* reset module 0 */
403 val = (0 << 4) | (1 << 3) | 0;
404 syn_send_data(&val, 1);
405
406 val = syn_read_device(data, 2);
407 if (val == 1)
408 {
409 val = data[0] & 0xff; /* packet header */
410 id = (data[1] >> 4) & 0xf; /* packet id */
411 if ((val == HELLO_HEADER) && (id == HELLO_ID))
412 {
413 logf(" module 0 reset");
414 return 1;
415 }
416 }
417
418 logf(" reset failed");
419 return 0;
420}
421
422#if defined(ROCKBOX_HAS_LOGF) && defined(LOGF_ENABLE)
423static void syn_info(void)
424{
425 int i, val;
426 int data[8];
427
428 logf("syn_info...");
429
430 /* module base info */
431 logf("module base info:");
432 data[0] = (0 << 4) | (0 << 3) | 1;
433 data[1] = 0x80;
434 syn_send_data(data, 2);
435 val = syn_read_device(data, 8);
436 if (val > 0)
437 {
438 for (i = 0; i < 8; i++)
439 logf(" data[%d] = 0x%02x", i, data[i]);
440 }
441
442 /* module product info */
443 logf("module product info:");
444 data[0] = (0 << 4) | (0 << 3) | 1;
445 data[1] = 0x81;
446 syn_send_data(data, 2);
447 val = syn_read_device(data, 8);
448 if (val > 0)
449 {
450 for (i = 0; i < 8; i++)
451 logf(" data[%d] = 0x%02x", i, data[i]);
452 }
453
454 /* module serialization */
455 logf("module serialization:");
456 data[0] = (0 << 4) | (0 << 3) | 1;
457 data[1] = 0x82;
458 syn_send_data(data, 2);
459 val = syn_read_device(data, 8);
460 if (val > 0)
461 {
462 for (i = 0; i < 8; i++)
463 logf(" data[%d] = 0x%02x", i, data[i]);
464 }
465
466 /* 1-D sensor info */
467 logf("1-d sensor info:");
468 data[0] = (0 << 4) | (0 << 3) | 1;
469 data[1] = 0x80 + 0x20;
470 syn_send_data(data, 2);
471 val = syn_read_device(data, 8);
472 if (val > 0)
473 {
474 for (i = 0; i < 8; i++)
475 logf(" data[%d] = 0x%02x", i, data[i]);
476 }
477}
478#endif
479
480void button_init_device(void)
481{
35 /* enable touchpad leds */ 482 /* enable touchpad leds */
36 GPIOA_ENABLE |= 0xff; 483 GPIOA_ENABLE |= BUTTONLIGHT_ALL;
37 GPIOA_OUTPUT_EN |= BUTTONLIGHT_ALL; 484 GPIOA_OUTPUT_EN |= BUTTONLIGHT_ALL;
485
486 /* enable touchpad */
487 GPO32_ENABLE |= 0x40000000;
488 GPO32_VAL &= ~0x40000000;
489
490 /* enable ACK, CLK, DATA lines */
491 GPIOD_ENABLE |= (0x1 | 0x2 | 0x4);
492
493 GPIOD_OUTPUT_EN |= 0x1; /* ACK */
494 GPIOD_OUTPUT_VAL |= 0x1; /* high */
495
496 GPIOD_OUTPUT_EN &= ~0x2; /* CLK */
497
498 GPIOD_OUTPUT_EN |= 0x4; /* DATA */
499 GPIOD_OUTPUT_VAL |= 0x4; /* high */
500
501 syn_flush();
502
503 if (syn_reset())
504 {
505#if defined(ROCKBOX_HAS_LOGF) && defined(LOGF_ENABLE)
506 syn_info();
507#endif
508
509 syn_status = STATUS_READY;
510
511 /* enable interrupts */
512 GPIOD_INT_LEV &= ~0x2;
513 GPIOD_INT_CLR |= 0x2;
514 GPIOD_INT_EN |= 0x2;
515
516 CPU_INT_EN |= HI_MASK;
517 CPU_HI_INT_EN |= GPIO0_MASK;
518 }
519}
520
521/*
522 * Button interrupt handler
523 */
524void button_int(void)
525{
526 int data[4];
527 int val, id;
528
529 int_btn = BUTTON_NONE;
530
531 if (syn_status == STATUS_READY)
532 {
533 /* disable interrupt while we read the touchpad */
534 GPIOD_INT_EN &= ~0x2;
535
536 val = syn_read_device(data, 4);
537 if (val > 0)
538 {
539 val = data[0] & 0xff; /* packet header */
540 id = (data[1] >> 4) & 0xf; /* packet id */
541
542 logf("button_read_device...");
543 logf(" data[0] = 0x%08x", data[0]);
544 logf(" data[1] = 0x%08x", data[1]);
545 logf(" data[2] = 0x%08x", data[2]);
546 logf(" data[3] = 0x%08x", data[3]);
547
548 if ((val == BUTTONS_HEADER) && (id == BUTTONS_ID))
549 {
550 /* Buttons packet - touched one of the 5 "buttons" */
551 if (data[1] & 0x1)
552 int_btn |= BUTTON_PLAY;
553 if (data[1] & 0x2)
554 int_btn |= BUTTON_MENU;
555 if (data[1] & 0x4)
556 int_btn |= BUTTON_LEFT;
557 if (data[1] & 0x8)
558 int_btn |= BUTTON_DISPLAY;
559 if (data[2] & 0x1)
560 int_btn |= BUTTON_RIGHT;
561
562 /* An Absolute packet should follow which we ignore */
563 val = syn_read_device(data, 4);
564
565 logf(" int_btn = 0x%04x", int_btn);
566 }
567 else if (val == ABSOLUTE_HEADER)
568 {
569 /* Absolute packet - the finger is on the vertical strip.
570 Position ranges from 1-4095, with 1 at the bottom. */
571 val = ((data[1] >> 4) << 8) | data[2]; /* position */
572 if ((val > 0) && (val <= 1365))
573 int_btn |= BUTTON_DOWN;
574 else if ((val > 1365) && (val <= 2730))
575 int_btn |= BUTTON_SELECT;
576 else if ((val > 2730) && (val <= 4095))
577 int_btn |= BUTTON_UP;
578 }
579 }
580
581 /* re-enable interrupts */
582 GPIOD_INT_LEV &= ~0x2;
583 GPIOD_INT_CLR |= 0x2;
584 GPIOD_INT_EN |= 0x2;
585 }
38} 586}
39 587
40/* 588/*
@@ -42,11 +590,11 @@ void button_init_device(void)
42 */ 590 */
43int button_read_device(void) 591int button_read_device(void)
44{ 592{
45 int btn = BUTTON_NONE; 593 int btn = int_btn;
46 594
47 if(~GPIOA_INPUT_VAL & 0x40) 595 if (~GPIOA_INPUT_VAL & 0x40)
48 btn |= BUTTON_POWER; 596 btn |= BUTTON_POWER;
49 597
50 return btn; 598 return btn;
51} 599}
52 600
diff --git a/firmware/target/arm/olympus/mrobe-100/button-target.h b/firmware/target/arm/olympus/mrobe-100/button-target.h
index c7d9114004..78b37f6ba6 100644
--- a/firmware/target/arm/olympus/mrobe-100/button-target.h
+++ b/firmware/target/arm/olympus/mrobe-100/button-target.h
@@ -28,6 +28,7 @@
28bool button_hold(void); 28bool button_hold(void);
29void button_init_device(void); 29void button_init_device(void);
30int button_read_device(void); 30int button_read_device(void);
31void button_int(void);
31 32
32#define POWEROFF_BUTTON BUTTON_POWER 33#define POWEROFF_BUTTON BUTTON_POWER
33#define POWEROFF_COUNT 10 34#define POWEROFF_COUNT 10
@@ -36,25 +37,33 @@ int button_read_device(void);
36 for the H10 keypad & remote. THESE ARE NOT CORRECT! */ 37 for the H10 keypad & remote. THESE ARE NOT CORRECT! */
37 38
38/* Main unit's buttons */ 39/* Main unit's buttons */
39#define BUTTON_POWER 0x00000001 40#define BUTTON_PLAY 0x00000001
40#define BUTTON_LEFT 0x00000002 41#define BUTTON_MENU 0x00000002
41#define BUTTON_RIGHT 0x00000004 42#define BUTTON_LEFT 0x00000004
42#define BUTTON_REW 0x00000008 43#define BUTTON_DISPLAY 0x00000008
43#define BUTTON_PLAY 0x00000010 44#define BUTTON_RIGHT 0x00000010
44#define BUTTON_FF 0x00000020 45#define BUTTON_SELECT 0x00000020
45#define BUTTON_SCROLL_UP 0x00000040 46#define BUTTON_UP 0x00000040
46#define BUTTON_SCROLL_DOWN 0x00000080 47#define BUTTON_SLIDE_UP 0x00000080
47#define BUTTON_MAIN (BUTTON_POWER|BUTTON_O|BUTTON_BACK|BUTTON_REW\ 48#define BUTTON_DOWN 0x00000100
48 |BUTTON_PLAY|BUTTON_FF) 49#define BUTTON_SLIDE_DOWN 0x00000200
50#define BUTTON_POWER 0x00000400
51#define BUTTON_MAIN (BUTTON_PLAY|BUTTON_MENU|BUTTON_LEFT|BUTTON_DISPLAY\
52 |BUTTON_RIGHT|BUTTON_SELECT|BUTTON_UP|BUTTON_SLIDE_UP\
53 |BUTTON_DOWN|BUTTON_SLIDE_DOWN|BUTTON_POWER)
49 54
50/* Remote control's buttons */ 55/* Remote control's buttons */
51#define BUTTON_RC_REW 0x00080000 56#define BUTTON_RC_PLAY 0x00010000
52#define BUTTON_RC_PLAY 0x00100000 57#define BUTTON_RC_REW 0x00020000
53#define BUTTON_RC_FF 0x00200000 58#define BUTTON_RC_FF 0x00040000
59#define BUTTON_RC_DISPLAY 0x00080000
60#define BUTTON_RC_FAV 0x00100000
61#define BUTTON_RC_MODE 0x00200000
54#define BUTTON_RC_VOL_UP 0x00400000 62#define BUTTON_RC_VOL_UP 0x00400000
55#define BUTTON_RC_VOL_DOWN 0x00800000 63#define BUTTON_RC_VOL_DOWN 0x00800000
56#define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN\ 64#define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_REW|BUTTON_RC_FF|\
57 |BUTTON_RC_REW|BUTTON_RC_FF) 65 |BUTTON_RC_DISPLAY|BUTTON_RC_FAV|BUTTON_RC_MODE\
66 |BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN)
58#define RC_POWEROFF_BUTTON BUTTON_RC_PLAY 67#define RC_POWEROFF_BUTTON BUTTON_RC_PLAY
59 68
60#endif /* _BUTTON_TARGET_H_ */ 69#endif /* _BUTTON_TARGET_H_ */
diff --git a/firmware/target/arm/system-pp502x.c b/firmware/target/arm/system-pp502x.c
index 0b5e9e1c13..3dd802a3ed 100644
--- a/firmware/target/arm/system-pp502x.c
+++ b/firmware/target/arm/system-pp502x.c
@@ -35,6 +35,9 @@ extern void microsd_int(void); /* Sansa E200 and C200 */
35extern void button_int(void); 35extern void button_int(void);
36extern void clickwheel_int(void); 36extern void clickwheel_int(void);
37#endif 37#endif
38#ifdef MROBE_100
39extern void button_int(void);
40#endif
38 41
39void irq(void) 42void irq(void)
40{ 43{
@@ -66,6 +69,11 @@ void irq(void)
66 if (GPIOL_INT_STAT & 0x08) 69 if (GPIOL_INT_STAT & 0x08)
67 microsd_int(); 70 microsd_int();
68 } 71 }
72#elif defined(MROBE_100)
73 else if (CPU_HI_INT_STAT & GPIO0_MASK) {
74 if (GPIOD_INT_STAT & 0x2)
75 button_int();
76 }
69#endif 77#endif
70#ifdef HAVE_USBSTACK 78#ifdef HAVE_USBSTACK
71 else if (CPU_INT_STAT & USB_MASK) { 79 else if (CPU_INT_STAT & USB_MASK) {
diff --git a/uisimulator/sdl/button.c b/uisimulator/sdl/button.c
index cea65c9fa6..0b347c9322 100644
--- a/uisimulator/sdl/button.c
+++ b/uisimulator/sdl/button.c
@@ -673,6 +673,15 @@ void button_event(int key, bool pressed)
673 break; 673 break;
674 674
675#elif CONFIG_KEYPAD == MROBE100_PAD 675#elif CONFIG_KEYPAD == MROBE100_PAD
676 case SDLK_KP1:
677 new_btn = BUTTON_DISPLAY;
678 break;
679 case SDLK_KP7:
680 new_btn = BUTTON_MENU;
681 break;
682 case SDLK_KP9:
683 new_btn = BUTTON_PLAY;
684 break;
676 case SDLK_KP4: 685 case SDLK_KP4:
677 case SDLK_LEFT: 686 case SDLK_LEFT:
678 new_btn = BUTTON_LEFT; 687 new_btn = BUTTON_LEFT;
@@ -683,32 +692,21 @@ void button_event(int key, bool pressed)
683 break; 692 break;
684 case SDLK_KP8: 693 case SDLK_KP8:
685 case SDLK_UP: 694 case SDLK_UP:
686 new_btn = BUTTON_SCROLL_UP; 695 new_btn = BUTTON_UP;
687 break; 696 break;
688 case SDLK_KP2: 697 case SDLK_KP2:
689 case SDLK_DOWN: 698 case SDLK_DOWN:
690 new_btn = BUTTON_SCROLL_DOWN; 699 new_btn = BUTTON_DOWN;
691 break; 700 break;
692 case SDLK_KP_PLUS: 701 case SDLK_KP5:
693 case SDLK_F8: 702 case SDLK_SPACE:
694 new_btn = BUTTON_POWER; 703 new_btn = BUTTON_SELECT;
695 break; 704 break;
705 case SDLK_F8:
696 case SDLK_ESCAPE: 706 case SDLK_ESCAPE:
697 new_btn = BUTTON_POWER; 707 new_btn = BUTTON_POWER;
698 break; 708 break;
699 case SDLK_KP_DIVIDE: 709
700 case SDLK_F1:
701 new_btn = BUTTON_REW;
702 break;
703 case SDLK_KP_MULTIPLY:
704 case SDLK_F2:
705 new_btn = BUTTON_FF;
706 break;
707 case SDLK_KP5:
708 case SDLK_SPACE:
709 new_btn = BUTTON_PLAY;
710 break;
711
712#elif CONFIG_KEYPAD == COWOND2_PAD 710#elif CONFIG_KEYPAD == COWOND2_PAD
713 case SDLK_KP4: 711 case SDLK_KP4:
714 case SDLK_LEFT: 712 case SDLK_LEFT: