source: trunk/platform/a3300/kbd.c @ 1620

Revision 1620, 7.6 KB checked in by philmoz, 16 months ago (diff)

Merged revision(s) 1617 from branches/release-1_0:
Updates to A3300 IS from mk11174. Includes new firmware version 1.00d.
http://chdk.setepontos.com/index.php?topic=650.msg80579#msg80579

  • Property svn:eol-style set to native
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
13long kbd_new_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
14static long kbd_prev_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
15static long kbd_mod_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
16
17static long last_kbd_key = 0;
18
19static long alt_mode_key_mask = 0x00000030; // disp + set
20extern void _GetKbdState(long*);
21
22// override key and feather bits to avoid feather osd messing up chdk display in ALT mode
23#define KEYS_MASK0 (0x00000000)
24#define KEYS_MASK1 (0x00000000)
25#define KEYS_MASK2 (0x0000F0BF)         //set to avoid canon menu being effected while in Alt mode
26 
27#define LED_AF 0xC02200F4
28#define NEW_SS (0x2000)
29
30#define SD_READONLY_FLAG (0x00020000)
31#define SD_READONLY_IDX     2
32
33#define USB_MASK (0x04000000)
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
45#ifndef MALLOCD_STACK
46static char kbd_stack[NEW_SS];
47#endif
48
49static KeyMap keymap[] = {
50
51    { 2, KEY_SHOOT_FULL      ,0x00003000 }, // Found @0xffb5dc9c, levent 0x01
52    { 2, KEY_SHOOT_FULL_ONLY ,0x00002000 }, // Found @0xffb5dc9c, levent 0x01
53    { 2, KEY_UP              ,0x00000001 }, // Found @0xffb5dc3c, levent 0x04
54    { 2, KEY_DOWN            ,0x00000002 }, // Found @0xffb5dc44, levent 0x05
55    { 2, KEY_SHOOT_HALF      ,0x00001000 }, // Found @0xffb5dc94, levent 0x00
56    { 2, KEY_LEFT            ,0x00000004 }, // Found @0xffb5dc4c, levent 0x06
57    { 2, KEY_RIGHT           ,0x00000008 }, // Found @0xffb5dc54, levent 0x07
58    { 2, KEY_SET             ,0x00000010 }, // Found @0xffb5dc5c, levent 0x08
59    { 2, KEY_DISPLAY         ,0x00000020 }, // Found @0xffb5dc64, levent 0x0a
60    { 2, KEY_MENU            ,0x00000080 }, // Found @0xffb5dc74, levent 0x09
61    { 2, KEY_ZOOM_OUT        ,0x00004000 }, // Found @0xffb5dca4, levent 0x03
62    { 2, KEY_ZOOM_IN         ,0x00008000 }, // Found @0xffb5dcac, levent 0x02
63        { 2, KEY_PRINT           ,0x00000030 }, // Doesn't exist, DISP + SET for ALT menu
64        { 0, 0, 0 }
65};
66
67void kbd_set_alt_mode_key_mask(long key)
68{
69        int i;
70        for (i=0; keymap[i].hackkey; ++i) {
71                if (keymap[i].hackkey == key) {
72                        alt_mode_key_mask = keymap[i].canonkey;
73                        return;
74                }
75        }
76}
77
78
79extern long __attribute__((naked)) wrap_kbd_p1_f() {
80       
81
82        asm volatile(
83                "STMFD  SP!, {R1-R7,LR} \n"
84                "MOV    R5, #0 \n"
85                //"BL           _kbd_read_keys \n"
86                "BL             my_kbd_read_keys \n"    // pacthed
87                "B              _kbd_p1_f_cont \n"
88        );
89        return 0; // shut up the compiler
90}
91       
92       
93static void __attribute__((noinline)) mykbd_task_proceed() {
94       
95        while (physw_run) {
96        _SleepTask(*((int*)(0x1C30 + 0x8))); //  @FF834160 + FF834168
97
98                if (wrap_kbd_p1_f() == 1) {   // autorepeat ?
99                _kbd_p2_f();
100        }
101    }
102}
103
104// no stack manipulation needed here, since we create the task directly
105void __attribute__((naked,noinline)) mykbd_task() {
106        mykbd_task_proceed();
107       
108// function can be modified to restore SP here...
109        _ExitTask();
110}
111
112
113void my_kbd_read_keys() {
114               
115
116    kbd_prev_state[0] = kbd_new_state[0];
117    kbd_prev_state[1] = kbd_new_state[1];
118    kbd_prev_state[2] = kbd_new_state[2];
119
120        _GetKbdState( kbd_new_state );
121        _kbd_read_keys_r2( kbd_new_state);
122       
123
124       
125    if (kbd_process() == 0) {
126        // we read keyboard state with _kbd_read_keys()
127                physw_status[0] = kbd_new_state[0];
128                physw_status[1] = kbd_new_state[1];
129                physw_status[2] = kbd_new_state[2];             
130
131    } else {
132        // override keys
133        physw_status[0] = (kbd_new_state[0] | KEYS_MASK0) & (~KEYS_MASK0 | kbd_mod_state[0]);
134        physw_status[1] = (kbd_new_state[1] | KEYS_MASK1) & (~KEYS_MASK1 | kbd_mod_state[1]);
135        physw_status[2] = (kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2]);
136
137    }
138       
139        usb_remote_key(physw_status[USB_IDX]) ;
140
141        if (conf.remote_enable) {
142                physw_status[USB_IDX] = physw_status[USB_IDX] & ~(SD_READONLY_FLAG | USB_MASK);
143        } else {
144                physw_status[USB_IDX] = physw_status[USB_IDX] & ~SD_READONLY_FLAG;
145        }
146
147        }
148
149void kbd_key_press(long key) {
150   
151        int i;
152    for (i=0;keymap[i].hackkey;i++){
153        if (keymap[i].hackkey == key){
154            kbd_mod_state[keymap[i].grp] &= ~keymap[i].canonkey;
155            return;
156        }
157    }
158}
159
160void kbd_key_release(long key) {
161 
162   int i;
163    for (i=0;keymap[i].hackkey;i++) {
164        if (keymap[i].hackkey == key){
165            kbd_mod_state[keymap[i].grp] |= keymap[i].canonkey;
166            return;
167        }
168    }
169}
170
171void kbd_key_release_all() {
172   
173        kbd_mod_state[0] |= KEYS_MASK0;
174    kbd_mod_state[1] |= KEYS_MASK1;
175    kbd_mod_state[2] |= KEYS_MASK2;
176}
177
178long kbd_is_key_pressed(long key) {
179 
180        int i;
181    for (i=0;keymap[i].hackkey;i++) {
182        if (keymap[i].hackkey == key) {
183            return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0;
184        }
185    }
186    return 0;
187}
188
189long kbd_is_key_clicked(long key) {
190   
191        int i;
192    for (i=0;keymap[i].hackkey;i++) {
193        if (keymap[i].hackkey == key){
194            return ((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
195                ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0);
196        }
197    }
198    return 0;
199}
200
201long kbd_get_pressed_key() {
202   
203        int i;
204    for (i=0;keymap[i].hackkey;i++) {
205        if ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) {
206            return keymap[i].hackkey;
207        }
208    }
209    return 0;
210}
211
212long kbd_get_clicked_key() {
213
214   int i;
215    for (i=0;keymap[i].hackkey;i++) {
216        if (((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) && ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0)) {
217            return keymap[i].hackkey;
218        }
219    }
220    return 0;
221}
222
223void kbd_reset_autoclicked_key() {
224
225        last_kbd_key = 0;
226}
227
228long kbd_get_autoclicked_key() {
229   
230        static long last_kbd_time = 0, press_count = 0;
231    register long key, t;
232
233    key=kbd_get_clicked_key();
234    if (key) {
235        last_kbd_key = key;
236        press_count = 0;
237        last_kbd_time = get_tick_count();
238        return key;
239    } else {
240        if (last_kbd_key && kbd_is_key_pressed(last_kbd_key)) {
241            t = get_tick_count();
242            if (t-last_kbd_time>((press_count)?175:500)) {
243                ++press_count;
244                last_kbd_time = t;
245                return last_kbd_key;
246            } else {
247                return 0;
248            }
249        } else {
250            last_kbd_key = 0;
251            return 0;
252        }
253    }
254}
255
256#ifdef CAM_USE_ZOOM_FOR_MF
257    long kbd_use_zoom_as_mf() {
258
259        static long v;
260        static long zoom_key_pressed = 0;
261
262        if (kbd_is_key_pressed(KEY_ZOOM_IN) && (mode_get()&MODE_MASK) == MODE_REC) {
263            get_property_case(PROPCASE_FOCUS_MODE, &v, 4);
264            if (v) {
265                kbd_key_release_all();
266                kbd_key_press(KEY_RIGHT);
267                zoom_key_pressed = KEY_ZOOM_IN;
268                return 1;
269            }
270        } else {
271            if (zoom_key_pressed==KEY_ZOOM_IN) {
272                kbd_key_release(KEY_RIGHT);
273                zoom_key_pressed = 0;
274                return 1;
275            }
276        }
277        if (kbd_is_key_pressed(KEY_ZOOM_OUT) && (mode_get()&MODE_MASK) == MODE_REC) {
278            get_property_case(PROPCASE_FOCUS_MODE, &v, 4);
279            if (v) {
280                kbd_key_release_all();
281                kbd_key_press(KEY_LEFT);
282                zoom_key_pressed = KEY_ZOOM_OUT;
283                return 1;
284            }
285        } else {
286            if (zoom_key_pressed==KEY_ZOOM_OUT) {
287                kbd_key_release(KEY_LEFT);
288                zoom_key_pressed = 0;
289                return 1;
290            }
291        }
292        return 0;
293    }
294#endif
Note: See TracBrowser for help on using the repository browser.