source: trunk/platform/g9/kbd.c @ 1344

Revision 1344, 14.5 KB checked in by philmoz, 20 months ago (diff)

Implement the full shutter press without releasing half-press logic:
http://chdk.setepontos.com/index.php?topic=1444.0

  • 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"
6extern void _GetKbdState(long* buffer);
7
8typedef struct {
9        short grp;
10        short hackkey;
11        long canonkey;
12} KeyMap;
13
14
15static long kbd_new_state[3];
16static long kbd_prev_state[3];
17static long kbd_mod_state[3];
18static KeyMap keymap[];
19static long last_kbd_key = 0;
20static long alt_mode_key_mask = 0x00001000; 
21static long alt_mode_key_reg  = 1;     
22static int usb_power=0;
23static int remote_key, remote_count;
24static int shoot_counter=0;
25#define DELAY_TIMEOUT 10000
26
27#define KEYS_MASK0 (0xC0000000)
28#define KEYS_MASK1 (0x1F1F1018)
29#define KEYS_MASK2 (0x00000000)
30 
31#define NEW_SS (0x2000)
32#define SD_READONLY_FLAG (0x20000)
33
34#define USB_MASK (0x40000)
35
36#ifndef MALLOCD_STACK
37static char kbd_stack[NEW_SS];
38#endif
39
40void kbd_fetch_data(long*);
41
42long __attribute__((naked)) wrap_kbd_p1_f() ;
43
44void wait_until_remote_button_is_released(void)
45{
46int count1;
47int count2;
48int tick,tick2,tick3;
49int nSW;
50int prev_usb_power,cur_usb_power;
51
52 // ------ add by Masuji SUTO (start) --------------
53    static int nMode;
54 // ------ add by Masuji SUTO (end)   --------------
55
56asm volatile ("STMFD SP!, {R0-R11,LR}\n"); // store R0-R11 and LR in stack
57
58debug_led(1);
59tick = get_tick_count();
60tick2 = tick;
61static long usb_physw[3];
62if (conf.synch_enable && conf.ricoh_ca1_mode && conf.remote_enable && (!shooting_get_drive_mode()|| (shooting_get_drive_mode()==1) || ((shooting_get_drive_mode()==2) && state_shooting_progress != SHOOTING_PROGRESS_PROCESSING)))                                     
63// if (conf.synch_enable && conf.ricoh_ca1_mode && conf.remote_enable)                                         // synch mode enable so wait for USB to disconnect
64  {
65// ------ add by Masuji SUTO (start) --------------
66        nMode=0;
67        usb_physw[2] = 0;                                             // makes sure USB bit is cleared.
68        _kbd_read_keys_r2(usb_physw);
69        if((usb_physw[2] & USB_MASK)==USB_MASK) nMode=1;
70// ------ add by Masuji SUTO (end)   --------------
71
72if(conf.ricoh_ca1_mode && conf.remote_enable)
73{
74        if(shooting_get_drive_mode() ==1 && state_shooting_progress == SHOOTING_PROGRESS_PROCESSING){                   //continuous-shooting mode
75                if(conf.bracket_type>2){
76                        if(shoot_counter<2) shutter_int=3;
77                        shoot_counter--;
78                        }
79                else{   
80                prev_usb_power=0;
81                nSW = 0;
82                do
83                        {     
84            usb_physw[2] = 0;                                             // makes sure USB bit is cleared.
85           _kbd_read_keys_r2(usb_physw);
86                        cur_usb_power = (usb_physw[2] & USB_MASK)==USB_MASK;
87                        if(cur_usb_power){
88                                if(!prev_usb_power){
89                                        tick2 = get_tick_count();
90                                        prev_usb_power=cur_usb_power;
91                                        }
92                                else{
93                                        if((int)get_tick_count()-tick2>1000) {debug_led(0);}
94                                        }
95                                }
96                        else{
97                                if(prev_usb_power){
98                                        tick3 = (int)get_tick_count()-tick2;
99                                        if(nSW==10) {
100                                                if(tick3>50) shutter_int=1;
101                                                nSW=20;
102                                                }
103                                        if(nSW==0 && tick3>0) {
104                                                if(tick3<50) {
105                                                nSW=10;
106                                                }
107                                        else{
108                                                if(tick3>1000) shutter_int=1;
109                                                        nSW=20;
110                                                }
111                                        }
112                                        prev_usb_power=cur_usb_power;
113                                        }
114                                }
115                                               
116                        if((int)get_tick_count()-tick >= DELAY_TIMEOUT) {nSW=20;shutter_int=2;}
117                        }
118                 while(nSW<20);
119                 }
120                }               //continuous-shooting mode
121        else{           // normal mode
122                        shoot_counter=0;
123                        if(conf.bracket_type>2){
124                                shoot_counter=(conf.bracket_type-2)*2;
125                                }
126   do
127         {     
128            usb_physw[2] = 0;                                             // makes sure USB bit is cleared.
129           _kbd_read_keys_r2(usb_physw);
130           }
131 //  while(((usb_physw[2] & USB_MASK)==USB_MASK) && ((int)get_tick_count()-tick < DELAY_TIMEOUT));
132// ------ modif by Masuji SUTO (start) --------------
133        while(((((usb_physw[2] & USB_MASK)!=USB_MASK) && (nMode==0)) || (((usb_physw[2] & USB_MASK)==USB_MASK) && (nMode==1))) && ((int)get_tick_count()-tick < DELAY_TIMEOUT));
134// ------ modif by Masuji SUTO (end)   --------------
135        }
136 }
137
138else
139   {
140
141      do
142          {
143            usb_physw[2] = 0;                                             // makes sure USB bit is cleared.
144           _kbd_read_keys_r2(usb_physw);
145             
146           }
147        while((usb_physw[2]&USB_MASK) &&  ((int)get_tick_count()-tick < DELAY_TIMEOUT));
148    }
149
150  }
151
152if (conf.synch_delay_enable && conf.synch_delay_value>0)                                // if delay is switched on and greater than 0
153  {
154    for (count1=0;count1<conf.synch_delay_value+(conf.synch_delay_coarse_value*1000);count1++) // wait delay_value * 0.1ms
155    {
156      for (count2=0;count2<1400;count2++)            // delay approx. 0.1ms
157        {
158        }
159     }
160  }
161
162debug_led(0);
163asm volatile ("LDMFD SP!, {R0-R11,LR}\n"); // restore R0-R11 and LR from stack
164}
165
166static void __attribute__((noinline)) mykbd_task_proceed()
167{
168    while (physw_run){
169        _SleepTask(10);
170       
171        if (wrap_kbd_p1_f() == 1){ // autorepeat ?
172            _kbd_p2_f();
173        }
174    }
175}
176
177void __attribute__((naked,noinline))
178mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf)
179{
180    /* WARNING
181     * Stack pointer manipulation performed here!
182     * This means (but not limited to):
183     *  function arguments destroyed;
184     *  function CAN NOT return properly;
185     *  MUST NOT call or use stack variables before stack
186     *  is setup properly;
187     *
188     */
189
190    register int i;
191    register long *newstack;
192
193#ifndef MALLOCD_STACK
194    newstack = (void*)kbd_stack;
195#else
196    newstack = malloc(NEW_SS);
197#endif
198
199    for (i=0;i<NEW_SS/4;i++)
200        newstack[i]=0xdededede;
201
202    asm volatile (
203        "MOV    SP, %0"
204        :: "r"(((char*)newstack)+NEW_SS)
205        : "memory"
206    );
207       
208    mykbd_task_proceed();
209
210    /* function can be modified to restore SP here...
211     */
212
213    _ExitTask();
214}
215
216
217long __attribute__((naked,noinline)) wrap_kbd_p1_f()
218{
219
220    asm volatile(
221                "STMFD   SP!, {R1-R5,LR}\n"
222                "MOV     R4, #0\n"
223                "BL      my_kbd_read_keys\n"
224                "B       _kbd_p1_f_cont\n"             
225    );
226    return 0; // shut up the compiler
227}
228
229
230void my_kbd_read_keys()
231
232    kbd_prev_state[0] = kbd_new_state[0];
233    kbd_prev_state[1] = kbd_new_state[1];
234    kbd_prev_state[2] = kbd_new_state[2];
235
236    _kbd_pwr_on();
237
238//    kbd_fetch_data(kbd_new_state);
239        _GetKbdState(kbd_new_state); //FF849300
240
241    if (kbd_process() == 0){
242        // leave it alone...
243        physw_status[0] = kbd_new_state[0];
244        physw_status[1] = kbd_new_state[1];
245        physw_status[2] = kbd_new_state[2];
246    } else {
247        // override keys
248        physw_status[0] = (kbd_new_state[0] & (~KEYS_MASK0)) |
249                          (kbd_mod_state[0] & KEYS_MASK0);
250
251        physw_status[1] = (kbd_new_state[1] & (~KEYS_MASK1)) |
252                          (kbd_mod_state[1] & KEYS_MASK1);
253
254        physw_status[2] = (kbd_new_state[2] & (~KEYS_MASK2)) |
255                          (kbd_mod_state[2] & KEYS_MASK2);
256    }
257
258    _kbd_read_keys_r2(physw_status);
259
260//    physw_status[2] = physw_status[2] & ~SD_READONLY_FLAG;
261
262
263    remote_key = (physw_status[2] & USB_MASK)==USB_MASK;
264      if (remote_key)     remote_count += 1;
265      else if (remote_count) {
266         usb_power = remote_count;
267         remote_count = 0;
268      }
269
270    if (conf.remote_enable) {
271      physw_status[2] = physw_status[2] & ~(SD_READONLY_FLAG | USB_MASK);
272     }
273    else        physw_status[2] = physw_status[2] & ~SD_READONLY_FLAG;
274
275    _kbd_pwr_off();
276       
277}
278
279
280int get_usb_power(int edge)
281{
282        int x;
283
284        if (edge) return remote_key;
285        x = usb_power;
286        usb_power = 0;
287        return x;
288}
289
290/****************/
291void kbd_set_alt_mode_key_mask(long key)
292{
293    int i;
294    for (i=0; keymap[i].hackkey; ++i) {
295        if (keymap[i].hackkey == key) {
296            alt_mode_key_mask = keymap[i].canonkey;
297            alt_mode_key_reg  = keymap[i].grp;
298            return;
299        }
300    }
301}
302
303void kbd_key_press(long key)
304{
305    int i;
306    for (i=0;keymap[i].hackkey;i++){
307        if (keymap[i].hackkey == key){
308            kbd_mod_state[keymap[i].grp] &= ~keymap[i].canonkey;
309            return;
310        }
311    }
312}
313
314void kbd_key_release(long key)
315{
316    int i;
317    for (i=0;keymap[i].hackkey;i++){
318        if (keymap[i].hackkey == key){
319            kbd_mod_state[keymap[i].grp] |= keymap[i].canonkey;
320            return;
321        }
322    }
323}
324
325void kbd_key_release_all()
326{
327  kbd_mod_state[0] |= KEYS_MASK0;
328  kbd_mod_state[1] |= KEYS_MASK1;
329  kbd_mod_state[2] |= KEYS_MASK2;
330}
331
332long kbd_is_key_pressed(long key)
333{
334    int i;
335    for (i=0;keymap[i].hackkey;i++){
336        if (keymap[i].hackkey == key){
337            return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0;
338        }
339    }
340    return 0;
341}
342
343long kbd_is_key_clicked(long key)
344{
345    int i;
346    for (i=0;keymap[i].hackkey;i++){
347        if (keymap[i].hackkey == key){
348            return ((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
349                    ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0);
350        }
351    }
352    return 0;
353}
354
355long kbd_get_pressed_key()
356{
357    int i;
358    for (i=0;keymap[i].hackkey;i++){
359        if ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0){
360            return keymap[i].hackkey;
361        }
362    }
363    return 0;
364}
365
366long kbd_get_clicked_key()
367{
368    int i;
369    for (i=0;keymap[i].hackkey;i++){
370        if (((kbd_prev_state[keymap[i].grp] & keymap[i].canonkey) != 0) &&
371            ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0)){
372            return keymap[i].hackkey;
373        }
374    }
375    return 0;
376}
377
378void kbd_reset_autoclicked_key() {
379    last_kbd_key = 0;
380}
381
382long kbd_get_autoclicked_key() {
383    static long last_kbd_time = 0, press_count = 0;
384    register long key, t;
385
386    key=kbd_get_clicked_key();
387    if (key) {
388        last_kbd_key = key;
389        press_count = 0;
390        last_kbd_time = get_tick_count();
391        return key;
392    } else {
393        if (last_kbd_key && kbd_is_key_pressed(last_kbd_key)) {
394            t = get_tick_count();
395            if (t-last_kbd_time>((press_count)?175:500)) {
396                ++press_count;
397                last_kbd_time = t;
398                return last_kbd_key;
399            } else {
400                return 0;
401            }
402        } else {
403            last_kbd_key = 0;
404            return 0;
405        }
406    }
407       
408       
409}
410
411long kbd_use_zoom_as_mf() {/*  Íåçà÷åì, â G7 åñòü êîëåñî äëÿ ýòîãî
412    static long v;
413    static long zoom_key_pressed = 0;
414
415    if (kbd_is_key_pressed(KEY_ZOOM_IN) && (mode_get()&MODE_MASK) == MODE_REC) {
416        get_property_case(PROPCASE_FOCUS_MODE, &v, 4);
417        if (v) {
418            kbd_key_release_all();
419            kbd_key_press(KEY_RIGHT);
420            zoom_key_pressed = KEY_ZOOM_IN;
421            return 1;
422        }
423    } else {
424        if (zoom_key_pressed==KEY_ZOOM_IN) {
425            kbd_key_release(KEY_RIGHT);
426            zoom_key_pressed = 0;
427            return 1;
428        }
429    }
430    if (kbd_is_key_pressed(KEY_ZOOM_OUT) && (mode_get()&MODE_MASK) == MODE_REC) {
431        get_property_case(PROPCASE_FOCUS_MODE, &v, 4);
432        if (v) {
433            kbd_key_release_all();
434            kbd_key_press(KEY_LEFT);
435            zoom_key_pressed = KEY_ZOOM_OUT;
436            return 1;
437        }
438    } else {
439        if (zoom_key_pressed==KEY_ZOOM_OUT) {
440            kbd_key_release(KEY_LEFT);
441            zoom_key_pressed = 0;
442            return 1;
443        }
444    }*/
445    return 0;
446}
447
448
449static KeyMap keymap[] = {
450    /* tiny bug: key order matters. see kbd_get_pressed_key()
451     * for example
452     */
453        { 1, KEY_UP                     , 0x00100000 }, // g7
454        { 1, KEY_DOWN           , 0x00080000 }, // g7
455        { 1, KEY_LEFT           , 0x00010000 }, // g7
456        { 1, KEY_RIGHT          , 0x00040000 }, // g7
457        { 1, KEY_SET            , 0x00020000 }, // g7
458        { 0, KEY_SHOOT_FULL     , 0xC0000000 }, // g7
459    { 0, KEY_SHOOT_FULL_ONLY, 0x80000000 },
460        { 0, KEY_SHOOT_HALF     , 0x40000000 }, // g7
461        { 1, KEY_ZOOM_IN        , 0x00000010 }, // g7
462        { 1, KEY_ZOOM_OUT       , 0x00000008 }, // g7
463        { 1, KEY_MENU           , 0x08000000 }, // g7
464        { 1, KEY_DISPLAY        , 0x04000000 }, // g7
465        { 1, KEY_PRINT          , 0x00001000 }, // g7
466        { 1, KEY_ERASE          , 0x01000000 }, // g7
467        { 1, KEY_EXPO_CORR  , 0x02000000 }, // g7
468        { 1, KEY_MICROPHONE , 0x10000000 }, // g7
469//      { 0, KEY_PLAY       , 0x00020000 }, // g9
470//        { 1, KEY_DUMMY        , 0x00000000 },//
471        { 0, 0, 0 }
472};
473
474void kbd_fetch_data(long *dst)
475{
476    volatile long *mmio0 = (void*)0xc0220200;
477    volatile long *mmio1 = (void*)0xc0220204;
478    volatile long *mmio2 = (void*)0xc0220208;
479
480    dst[0] = *mmio0;
481    dst[1] = *mmio1;
482    dst[2] = *mmio2 & 0xffff;
483}
484
485// KEYS_MASK0 (0xC0000000)
486// KEYS_MASK1 (0x3F1F1018)
487// KEYS_MASK2 (0x00000000)
488
489//       1 - C2008000
490//0b0000 0000 0000 0000  1000 0000 0000 0000  - 0x00008000      - ?
491//0b0000 0000 0000 0010  0000 0000 0000 0000  - KEY_PLAY                - MODE_REC  / MODE_PLAY
492//0b0000 0010 0000 0000  0000 0000 0000 0000  - 0x02000000     
493//0b0100 0000 0000 0000  0000 0000 0000  0000  - KEY_SHOOT_HALF
494//0b1100 0000 0000 0000  0000 0000 0000  0000  - KEY_SHOOT_FULL
495
496//       2 - 1F1F1418
497//0b0000 0000 0000 0000  0000 0000 0000 0111    -ISO            000 - 100; 001 - 80; 010 - 200; 011 - HI; 100 - 800; 101-1600; 110 - 400; 111 - AUTO;
498//0b0000 0000 0000 0000  0000 0000 0000 1000  -KEY_ZOOM_OUT
499//0b0000 0000 0000 0000  0000 0000 0001  0000  -KEY_ZOOM_OUT
500//0b0000 0000 0000 0000  0000 0000 0010  0000  - 0x00000020     - ?
501//0b0000 0000 0000 0000  0000 0000 0100  0000  - 0x00000040     - ?
502//0b0000 0000 0000 0000  0000 0000 1000  0000  - 0x00000080     - ?
503//0b0000 0000 0000 0000  0000  1111   0000 0000 -ShotMode  0010 - C1; 0011 - C2; 0100 - Av; 0101 - Tv; 0110 - M; 0111 - P; 1100 - PANORAME; 1101-VIDEO; 1110 - SCN; 1111 - AUTO;   
504//0b0000 0000 0000 0000  0001 0000 0000  0000  - KEY_PRINT
505//0b0000 0000 0000 0000  0010 0000 0000  0000  - 0x00002000     - ?
506//0b0000 0000 0000 0000  0100 0000 0000  0000  - 0x00004000     - ?
507//0b0000 0000 0000 0000  1000 0000 0000  0000  - 0x00008000     - ?
508
509//0b0000 0000 0000 0001  0000 0000 0000  0000  - NOT KEY_LEFT
510//0b0000 0000 0000 0010  0000 0000 0000  0000  - NOT KEY_SET
511//0b0000 0000 0000 0100  0000 0000 0000  0000  - NOT KEY_RIGHT
512//0b0000 0000 0000 1000  0000 0000 0000  0000  - NOT KEY_DOWN
513//0b0000 0000 0001 0000  0000 0000 0000  0000  - NOT KEY_UP
514
515//0b0000 0000 0010 0000  0000 0000 0000  0000  - 0x00200000     - ?
516//0b0000 0000 0100 0000  0000 0000 0000  0000  - 0x00400000     - ?
517//0b0000 0000 1000 0000  0000 0000 0000  0000  - 0x00800000     - ?
518
519//0b0000 0001 0000 0000  0000 0000 0000  0000  - NOT KEY_ERASE
520//0b0000 0010 0000 0000  0000 0000 0000  0000  - NOT KEY_EXPO_CORR
521//0b0000 0100 0000 0000  0000 0000 0000  0000  - NOT KEY_DISPLAY
522//0b0000 1000 0000 0000  0000 0000 0000  0000  - NOT KEY_MENU
523//0b0001 0000 0000 0000  0000 0000 0000  0000  - NOT KEY_MICROPHONE
524
525//0b0010 0000 0000 0000  0000 0000 0000  0000  - 0x20000000     - ?`
526//0b0100 0000 0000 0000  0000 0000 0000  0000  - 0x40000000     - ?`
527//0b1000 0000 0000 0000  0000 0000 0000  0000  - 0x80000000     - ?`
528//       3 -00020004
529//0b0000 0000 0000 0000  0000 0000 0000  0100  - 0x00000004     -? COVER BATTERY
530//0b0000 0000 0000 0010  0000 0000 0000  0000  - 0x00020000     -? COVER BATTERY
531//0b0000 0000 0000 0100  0000 0000 0000  0000  - USB_MASK = 0x00040000
532
533
534/*
535void kbd_set_alt_mode_key_mask(long key)
536{
537    int i;
538    for (i=0; keymap[i].hackkey; ++i) {
539        if (keymap[i].hackkey == key) {
540            alt_mode_key_mask = keymap[i].canonkey;
541            return;
542        }
543    }
544}
545*/
Note: See TracBrowser for help on using the repository browser.