source: trunk/platform/ixus90_sd790/kbd.c @ 217

Revision 217, 9.2 KB checked in by CHDKLover, 3 years ago (diff)

Aktualisierung auf Rev. 864, 865, 866, 867 offizieller Trunk

ixus90_sd790 hinzugefügt
strtoul hinzugefügt
fix: LUA Hexzahlenbehandlung
In lua können jetzt beliebige Funktionspointer aufgerufen werden

Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "conf.h"
6
7typedef struct {
8        short grp;
9        short hackkey;
10        long canonkey;
11} KeyMap;
12
13
14static long kbd_new_state[3];
15static long kbd_prev_state[3];
16static long kbd_mod_state[3];
17static KeyMap keymap[];
18static long last_kbd_key = 0;
19static long alt_mode_key_mask = 0x00000800;
20static int usb_power=0;
21static int remote_key, remote_count;
22
23#define KEYS_MASK0 (0x00000000)
24#define KEYS_MASK1 (0x00000000)
25#define KEYS_MASK2 (0x0FFF)
26
27#define NEW_SS (0x2000)
28#define SD_READONLY_FLAG (0x20000)
29
30#define FEATURE_FEATHER 0
31#define USB_MASK (0x40000)
32#define USB_REG 2
33
34#ifndef MALLOCD_STACK
35static char kbd_stack[NEW_SS];
36#endif
37
38void kbd_fetch_data(long*);
39
40long __attribute__((naked)) wrap_kbd_p1_f() ;
41
42static void __attribute__((noinline)) mykbd_task_proceed()
43{
44    while (physw_run){
45                _SleepTask(10);
46
47                if (wrap_kbd_p1_f() == 1){ // autorepeat ?
48                _kbd_p2_f();
49                }
50    }
51}
52
53void __attribute__((naked,noinline))
54mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf)
55{
56    /* WARNING
57     * Stack pointer manipulation performed here!
58     * This means (but not limited to):
59     *  function arguments destroyed;
60     *  function CAN NOT return properly;
61     *  MUST NOT call or use stack variables before stack
62     *  is setup properly;
63     *
64     */
65
66    register int i;
67    register long *newstack;
68
69#ifndef MALLOCD_STACK
70    newstack = (void*)kbd_stack;
71#else
72    newstack = malloc(NEW_SS);
73#endif
74
75    for (i=0;i<NEW_SS/4;i++)
76        newstack[i]=0xdededede;
77
78    asm volatile (
79        "MOV    SP, %0\n"
80        :: "r"(((char*)newstack)+NEW_SS)
81        : "memory"
82    );
83
84    mykbd_task_proceed();
85
86    /* function can be modified to restore SP here...
87     */
88
89    _ExitTask();
90}
91
92
93long __attribute__((naked,noinline)) wrap_kbd_p1_f()
94{
95
96    asm volatile(
97                "STMFD   SP!, {R1-R5,LR}\n"
98                "MOV     R4, #0\n"
99                "BL      my_kbd_read_keys\n"
100                                //"BL      _kbd_read_keys\n"
101                "B       _kbd_p1_f_cont\n"
102    );
103    return 0; // shut up the compiler
104}
105
106#if FEATURE_FEATHER
107extern int touch_keys_angle;
108extern int * touch_keys_sema;
109int touch_keys_sema_stored;
110#endif
111
112//extern void touch_wheel_print_on();
113//extern void touch_wheel_print_off();
114
115volatile int jogdial_stopped=0;
116
117void my_kbd_read_keys()
118{
119    kbd_prev_state[0] = kbd_new_state[0];
120    kbd_prev_state[1] = kbd_new_state[1];
121    kbd_prev_state[2] = kbd_new_state[2];
122
123    _kbd_pwr_on();
124
125    kbd_fetch_data(kbd_new_state);
126
127    if (kbd_process() == 0){
128                // leave it alone...
129                physw_status[0] = kbd_new_state[0];
130                physw_status[1] = kbd_new_state[1];
131                physw_status[2] = kbd_new_state[2] | alt_mode_key_mask;
132                jogdial_stopped=0;
133
134#if FEATURE_FEATHER
135        if (*touch_keys_sema == 0) {
136            *touch_keys_sema = touch_keys_sema_stored;
137        }
138#endif
139    } else {
140                // override keys
141                physw_status[0] = (kbd_new_state[0] & (~KEYS_MASK0)) |
142                                  (kbd_mod_state[0] & KEYS_MASK0);
143
144                physw_status[1] = (kbd_new_state[1] & (~KEYS_MASK1)) |
145                                  (kbd_mod_state[1] & KEYS_MASK1);
146
147                physw_status[2] = (kbd_new_state[2] & (~KEYS_MASK2)) |
148                                  (kbd_mod_state[2] & KEYS_MASK2);
149
150                if ((jogdial_stopped==0) && !state_kbd_script_run) {
151                        jogdial_stopped=1; get_jogdial_direction();
152                } else if (jogdial_stopped && state_kbd_script_run) {
153                        jogdial_stopped=0;
154                }
155
156#if FEATURE_FEATHER
157        if (*touch_keys_sema != 0) {
158            touch_keys_sema_stored = *touch_keys_sema;
159            *touch_keys_sema = 0;
160        }
161        // We still need this sema when simulating key presses
162        if (/*kbd_mod_state[0] != KEYS_MASK0 || kbd_mod_state[1] != KEYS_MASK1 || */kbd_mod_state[2] != KEYS_MASK2) {
163            *touch_keys_sema = touch_keys_sema_stored;
164        }
165#endif
166    }
167
168    _kbd_read_keys_r2(physw_status);
169
170//    physw_status[2] = physw_status[2] & ~SD_READONLY_FLAG;
171
172
173    remote_key = (physw_status[2] & USB_MASK)==USB_MASK;
174
175    if (conf.remote_enable) {
176      remote_key = (physw_status[2] & USB_MASK)==USB_MASK;
177      if (remote_key)  remote_count += 1;
178      else if (remote_count) {
179         usb_power = remote_count;
180         remote_count = 0;
181      }
182      physw_status[2] = physw_status[2] & ~(SD_READONLY_FLAG | USB_MASK);
183     }
184    else physw_status[2] = physw_status[2] & ~SD_READONLY_FLAG;
185
186    _kbd_pwr_off();
187}
188
189
190int get_usb_power(int edge)
191{
192        int x;
193
194        if (edge) return remote_key;
195        x = usb_power;
196        usb_power = 0;
197        return x;
198        return 0;
199}
200
201/****************/
202
203
204void kbd_key_press(long key)
205{
206    int i;
207    for (i=0;keymap[i].hackkey;i++){
208        if (keymap[i].hackkey == key){
209            kbd_mod_state[keymap[i].grp] &= ~keymap[i].canonkey;
210            return;
211        }
212    }
213}
214
215void kbd_key_release(long key)
216{
217    int i;
218    for (i=0;keymap[i].hackkey;i++){
219        if (keymap[i].hackkey == key){
220            kbd_mod_state[keymap[i].grp] |= keymap[i].canonkey;
221            return;
222        }
223    }
224}
225
226void kbd_key_release_all()
227{
228  kbd_mod_state[0] |= KEYS_MASK0;
229  kbd_mod_state[1] |= KEYS_MASK1;
230  kbd_mod_state[2] |= KEYS_MASK2;
231}
232
233long kbd_is_key_pressed(long key)
234{
235    int i;
236    for (i=0;keymap[i].hackkey;i++){
237        if (keymap[i].hackkey == key){
238            return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0;
239        }
240    }
241    return 0;
242}
243
244long kbd_is_key_clicked(long key)
245{
246    int i;
247    for (i=0;keymap[i].hackkey;i++){
248        if (keymap[i].hackkey == key){
249            return ((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
250                    ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0);
251        }
252    }
253    return 0;
254}
255
256long kbd_get_pressed_key()
257{
258    int i;
259    for (i=0;keymap[i].hackkey;i++){
260        if ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0){
261            return keymap[i].hackkey;
262        }
263    }
264    return 0;
265}
266
267long kbd_get_clicked_key()
268{
269    int i;
270    for (i=0;keymap[i].hackkey;i++){
271        if (((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
272            ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0)){
273            return keymap[i].hackkey;
274        }
275    }
276    return 0;
277}
278
279void kbd_reset_autoclicked_key() {
280    last_kbd_key = 0;
281}
282
283long kbd_get_autoclicked_key() {
284    static long last_kbd_time = 0, press_count = 0;
285    register long key, t;
286
287    key=kbd_get_clicked_key();
288    if (key) {
289        last_kbd_key = key;
290        press_count = 0;
291        last_kbd_time = get_tick_count();
292        return key;
293    } else {
294        if (last_kbd_key && kbd_is_key_pressed(last_kbd_key)) {
295            t = get_tick_count();
296            if (t-last_kbd_time>((press_count)?175:500)) {
297                ++press_count;
298                last_kbd_time = t;
299                return last_kbd_key;
300            } else {
301                return 0;
302            }
303        } else {
304            last_kbd_key = 0;
305            return 0;
306        }
307    }
308       
309       
310}
311
312long kbd_use_zoom_as_mf() {
313    static long v;
314    static long zoom_key_pressed = 0;
315
316    if (kbd_is_key_pressed(KEY_ZOOM_IN) && (mode_get()&MODE_MASK) == MODE_REC) {
317        get_property_case(PROPCASE_FOCUS_MODE, &v, 4);
318        if (v) {
319            kbd_key_release_all();
320            kbd_key_press(KEY_RIGHT);
321            zoom_key_pressed = KEY_ZOOM_IN;
322            return 1;
323        }
324    } else {
325        if (zoom_key_pressed==KEY_ZOOM_IN) {
326            kbd_key_release(KEY_RIGHT);
327            zoom_key_pressed = 0;
328            return 1;
329        }
330    }
331    if (kbd_is_key_pressed(KEY_ZOOM_OUT) && (mode_get()&MODE_MASK) == MODE_REC) {
332        get_property_case(PROPCASE_FOCUS_MODE, &v, 4);
333        if (v) {
334            kbd_key_release_all();
335            kbd_key_press(KEY_LEFT);
336            zoom_key_pressed = KEY_ZOOM_OUT;
337            return 1;
338        }
339    } else {
340        if (zoom_key_pressed==KEY_ZOOM_OUT) {
341            kbd_key_release(KEY_LEFT);
342            zoom_key_pressed = 0;
343            return 1;
344        }
345    }
346    return 0;
347}
348
349
350static KeyMap keymap[] = {
351    /* tiny bug: key order matters. see kbd_get_pressed_key()
352     * for example
353     */
354        { 2, KEY_UP             , 0x00000080 },
355        { 2, KEY_DOWN           , 0x00000040 },
356        { 2, KEY_LEFT           , 0x00000010 },
357        { 2, KEY_RIGHT          , 0x00000020 },
358        { 2, KEY_SET            , 0x00000100 },
359        { 2, KEY_SHOOT_FULL     , 0x00000003 },
360        { 2, KEY_SHOOT_HALF     , 0x00000001 },
361        { 2, KEY_ZOOM_IN        , 0x00000004 },
362        { 2, KEY_ZOOM_OUT       , 0x00000008 },
363        { 2, KEY_MENU           , 0x00000400 },
364        { 2, KEY_DISPLAY        , 0x00000200 },
365        { 2, KEY_PRINT          , 0x00000800 },
366        { 0, 0, 0 }
367};
368
369static int new_jogdial=0, old_jogdial=0;
370
371int Get_JogDial(void)
372{
373        // ??? \todo 0xC0240000+0x104 @ FF842A44  // address from sub above aJogdail (sub_FF84B8D8)
374        return (*(int*)0xC0240104)>>16;
375}
376
377long get_jogdial_direction(void)
378{
379        old_jogdial=new_jogdial;
380        new_jogdial=Get_JogDial();
381
382        if (old_jogdial<new_jogdial) {
383                return JOGDIAL_LEFT;
384        } else if (old_jogdial>new_jogdial) {
385                return JOGDIAL_RIGHT;
386        } else {
387                return 0;
388        }
389}
390
391void kbd_fetch_data(long *dst)
392{
393    volatile long *mmio0 = (void*)0xc0220200;
394    volatile long *mmio1 = (void*)0xc0220204;
395    volatile long *mmio2 = (void*)0xc0220208;
396
397    dst[0] = *mmio0;
398    dst[1] = *mmio1;
399    dst[2] = *mmio2 & 0xffff;
400}
Note: See TracBrowser for help on using the repository browser.