source: trunk/platform/ixus75_sd750/kbd.c @ 560

Revision 560, 7.4 KB checked in by reyalp, 5 years ago (diff)

ixus75_sd750: find zoom_status, enable CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO, use generic/capt_seq.c, set svn:eol-style
lua examples: clean up indentation

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