source: trunk/platform/sx150is/kbd.c @ 1607

Revision 1607, 6.8 KB checked in by philmoz, 16 months ago (diff)

Merged revision(s) 1606 from branches/release-1_0:
Update SX150IS keymap array (thx hiker_jon)
http://chdk.setepontos.com/index.php?topic=6953.msg80393#msg80393

  • Property svn:eol-style set to native
Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "conf.h"
5#include "keyboard.h"
6
7typedef struct {
8        short grp;
9        short hackkey;
10        long canonkey;
11} KeyMap;
12
13
14long kbd_new_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
15static long kbd_prev_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
16static long kbd_mod_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
17
18static KeyMap keymap[];
19static long last_kbd_key = 0;
20static long alt_mode_key_mask = 0x00005000;
21static long alt_mode_key_reg  = 2;
22
23volatile int jogdial_stopped=0;
24
25
26#define KEYS_MASK0 (0x00000000)
27#define KEYS_MASK1 (0x0000F000)
28#define KEYS_MASK2 (0x00007F00)
29
30#define SD_READONLY_FLAG    (0x20000) // Found @0xffb90df0, levent 0x20a
31#define SD_READONLY_IDX     2
32
33#define USB_MASK              (0x00040000) // Found @0xffb90df8, levent 0x202
34#define USB_IDX             2
35
36extern void usb_remote_key( int ) ;
37int get_usb_bit()
38{
39        long usb_physw[3];
40        usb_physw[USB_IDX] = 0;
41        _kbd_read_keys_r2(usb_physw);
42        return(( usb_physw[USB_IDX] & USB_MASK)==USB_MASK) ;
43}
44
45extern void _platformsub_kbd_fetch_data(long*);
46extern void _GetKbdState(long* buffer);
47
48static KeyMap keymap[] = {
49        // Order IS important. kbd_get_pressed_key will walk down this table 
50        // and take the first matching mask. Notice that KEY_SHOOT_HALF is 
51        // always pressed if KEY_SHOOT_FULL is. --MarcusSt
52    { 2, KEY_VIDEO     , 0x00000010 },
53    { 2, KEY_PLAYBACK  , 0x00000040 },
54        { 2, KEY_UP        , 0x00000100 },
55        { 2, KEY_DOWN      , 0x00000200 },
56        { 2, KEY_RIGHT     , 0x00000400 },
57        { 2, KEY_LEFT      , 0x00000800 },
58        { 2, KEY_SET       , 0x00001000 },
59        { 2, KEY_MENU      , 0x00002000 },
60        { 2, KEY_PRINT     , 0x00005000 }, // SET+DISP
61        { 2, KEY_DISPLAY   , 0x00004000 },
62        { 2, KEY_ERASE     , 0x00008000 },
63        { 1, KEY_ZOOM_IN   , 0x00004000 },
64        { 1, KEY_ZOOM_OUT  , 0x00008000 },
65        { 1, KEY_SHOOT_FULL, 0x00003000 },
66    { 1, KEY_SHOOT_FULL_ONLY, 0x00002000 },
67        { 1, KEY_SHOOT_HALF, 0x00001000 },
68        { 0, 0, 0 }
69};
70
71void kbd_fetch_data(long*);
72
73long __attribute__((naked)) wrap_kbd_p1_f() ;
74
75
76static void __attribute__((noinline)) mykbd_task_proceed()
77{
78
79        /* Initialize our own kbd_new_state[] array with the
80           current physical status.
81           */
82        kbd_new_state[0] = physw_status[0];
83        kbd_new_state[1] = physw_status[1];
84        kbd_new_state[2] = physw_status[2];
85
86        while (physw_run){
87                _SleepTask(10);
88               
89                if (wrap_kbd_p1_f() == 1){ // autorepeat ?
90                        _kbd_p2_f();
91                }
92    }
93}
94
95
96void __attribute__((naked,noinline))
97mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf)
98{
99       
100        mykbd_task_proceed();
101    /* function can be modified to restore SP here...
102     */
103    _ExitTask();
104
105}
106
107long __attribute__((naked,noinline)) wrap_kbd_p1_f()
108{
109        // Modified to reflect sx150 code @FF8345D0
110    asm volatile(
111                "STMFD   SP!, {R1-R7,LR}\n"
112                "MOV     R5, #0\n"
113                "BL      my_kbd_read_keys\n"
114                "B       _kbd_p1_f_cont\n"
115    );
116
117 return 0; // shut up the compiler
118}
119
120
121void my_kbd_read_keys()
122{
123        static long i=0;
124
125        kbd_prev_state[0] = kbd_new_state[0];
126        kbd_prev_state[1] = kbd_new_state[1];
127        kbd_prev_state[2] = kbd_new_state[2];
128
129        _GetKbdState(kbd_new_state);
130
131        if (kbd_process() == 0) {
132                // leave it alone...
133                physw_status[0] = kbd_new_state[0];
134                physw_status[1] = kbd_new_state[1];
135                physw_status[2] = kbd_new_state[2];
136                //physw_status[0] |= alt_mode_key_mask;
137                jogdial_stopped=0;
138        }
139        else {
140                // override keys
141                physw_status[0] = (kbd_new_state[0] & (~KEYS_MASK0)) | (kbd_mod_state[0] & KEYS_MASK0);
142                physw_status[1] = (kbd_new_state[1] & (~KEYS_MASK1)) | (kbd_mod_state[1] & KEYS_MASK1);
143                physw_status[2] = (kbd_new_state[2] & (~KEYS_MASK2)) | (kbd_mod_state[2] & KEYS_MASK2);
144                if (!jogdial_stopped && !state_kbd_script_run) {
145                        jogdial_stopped=1;
146                        get_jogdial_direction();
147                }
148                else if (jogdial_stopped && state_kbd_script_run)
149                        jogdial_stopped=0;
150        }
151
152        _kbd_read_keys_r2(physw_status);
153
154        usb_remote_key(physw_status[USB_IDX]) ;
155
156        if (conf.remote_enable) {
157                physw_status[USB_IDX] = physw_status[USB_IDX] & ~(SD_READONLY_FLAG | USB_MASK);
158        } else {
159                physw_status[USB_IDX] = physw_status[USB_IDX] & ~SD_READONLY_FLAG;
160        }
161
162}
163
164void kbd_set_alt_mode_key_mask(long key)
165{
166    int i;
167    for (i=0; keymap[i].hackkey; ++i) {
168        if (keymap[i].hackkey == key) {
169            alt_mode_key_mask = keymap[i].canonkey;
170            alt_mode_key_reg  = keymap[i].grp;
171            return;
172        }
173    }
174}
175
176
177void kbd_key_press(long key)
178{
179    int i;
180    for (i=0;keymap[i].hackkey;i++){
181        if (keymap[i].hackkey == key){
182            kbd_mod_state[keymap[i].grp] &= ~keymap[i].canonkey;
183            return;
184        }
185    }
186}
187
188
189void kbd_key_release(long key)
190{
191    int i;
192    for (i=0;keymap[i].hackkey;i++){
193        if (keymap[i].hackkey == key){
194            kbd_mod_state[keymap[i].grp] |= keymap[i].canonkey;
195            return;
196        }
197    }
198}
199
200void kbd_key_release_all()
201{
202  kbd_mod_state[0] |= KEYS_MASK0;
203  kbd_mod_state[1] |= KEYS_MASK1;
204  kbd_mod_state[2] |= KEYS_MASK2;
205}
206
207long kbd_is_key_pressed(long key)
208{
209    int i;
210    for (i=0;keymap[i].hackkey;i++){
211        if (keymap[i].hackkey == key){
212            return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0;
213        }
214    }
215    return 0;
216}
217
218long kbd_is_key_clicked(long key)
219{
220                int i;
221                for (i=0;keymap[i].hackkey;i++){
222                if (keymap[i].hackkey == key){
223                        return ((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
224                                ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0);
225                }
226                }
227                return 0;
228}
229
230long kbd_get_pressed_key()
231{
232    int i;
233    for (i=0;keymap[i].hackkey;i++){
234        if ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0){
235            return keymap[i].hackkey;
236        }
237    }
238    return 0;
239}
240
241long kbd_get_clicked_key()
242{
243    int i;
244    for (i=0;keymap[i].hackkey;i++){
245        if (((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
246            ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0)){
247            return keymap[i].hackkey;
248        }
249    }
250    return 0;
251}
252
253void kbd_reset_autoclicked_key() {
254    last_kbd_key = 0;
255}
256
257long kbd_get_autoclicked_key() {
258    static long last_kbd_time = 0, press_count = 0;
259    register long key, t;
260
261    key=kbd_get_clicked_key();
262    if (key) {
263        last_kbd_key = key;
264        press_count = 0;
265        last_kbd_time = get_tick_count();
266        return key;
267    } else {
268        if (last_kbd_key && kbd_is_key_pressed(last_kbd_key)) {
269            t = get_tick_count();
270            if (t-last_kbd_time>((press_count)?175:500)) {
271                ++press_count;
272                last_kbd_time = t;
273                return last_kbd_key;
274            } else {
275                return 0;
276            }
277        } else {
278            last_kbd_key = 0;
279            return 0;
280        }
281    }
282}
283
284
285
286long kbd_use_zoom_as_mf() {
287        return 0;
288}
289
290
291
292int Get_JogDial(void) {
293 return (*(int*)0xC0240104)>>16;
294}
295
296
297
298long get_jogdial_direction(void) {
299        static int new_jogdial = 0;
300        int old_jogdial = 0;
301
302        old_jogdial = new_jogdial;
303        new_jogdial = Get_JogDial();
304
305        if (old_jogdial < new_jogdial)
306                return JOGDIAL_LEFT;
307        else if (old_jogdial > new_jogdial)
308                return JOGDIAL_RIGHT;
309        else
310                return 0;
311}
Note: See TracBrowser for help on using the repository browser.