root/platform/ixus255_elph330hs/kbd.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. get_usb_bit
  2. mykbd_task
  3. wrap_kbd_p1_f
  4. my_kbd_read_keys
  5. kbd_fetch_data

   1 #include "lolevel.h"
   2 #include "platform.h"
   3 #include "keyboard.h"
   4 #include "kbd_common.h"
   5 
   6 long kbd_new_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
   7 long kbd_prev_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
   8 long kbd_mod_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
   9 
  10 // TODO aliases for direction keys probably not good
  11 // power probably shouldn't be included at all
  12 // Found in RAM
  13 KeyMap keymap[] = {
  14     { 0, KEY_UP              , 0x00000040 },
  15     { 0, KEY_EXPO_CORR       , 0x00000040 },
  16     { 0, KEY_DOWN            , 0x00000800 },
  17     { 0, KEY_DISPLAY         , 0x00000800 },
  18     { 0, KEY_LEFT            , 0x00000400 },
  19     { 0, KEY_MACRO           , 0x00000400 },
  20     { 0, KEY_RIGHT           , 0x00000080 },
  21     { 0, KEY_FLASH           , 0x00000080 },
  22     { 0, KEY_MENU            , 0x00000001 },
  23     { 0, KEY_SET             , 0x00000002 },
  24     { 0, KEY_VIDEO           , 0x00000020 },
  25     { 1, KEY_SHOOT_FULL      , 0x00300000 },
  26     { 1, KEY_SHOOT_FULL_ONLY , 0x00200000 },
  27     { 1, KEY_SHOOT_HALF      , 0x00100000 },
  28     { 1, KEY_POWER           , 0x00400000 },
  29     { 1, KEY_PLAYBACK        , 0x00800000 },
  30     { 2, KEY_ZOOM_IN         , 0x00001000 },
  31     { 2, KEY_ZOOM_OUT        , 0x00004000 },
  32     { 0, 0, 0 }
  33 };
  34 // Note: auto/manual switch is 0x00000010 in word index 0
  35 
  36 extern void _GetKbdState(long*);
  37 
  38 int get_usb_bit() 
  39 {
  40         long usb_physw[3];
  41         usb_physw[USB_IDX] = 0;
  42         _kbd_read_keys_r2(usb_physw);
  43         return(( usb_physw[USB_IDX] & USB_MASK)==USB_MASK) ; 
  44 }
  45 
  46 
  47 void kbd_fetch_data(long*);
  48 
  49 long __attribute__((naked)) wrap_kbd_p1_f();
  50 
  51 // no stack manipulation needed here, since we create the task directly
  52 void __attribute__((noinline))
  53 mykbd_task()
  54 {
  55         while (physw_run){ 
  56                 _SleepTask(physw_sleep_delay); // =0x1DEC + 8 @FF030F14
  57 
  58                 if (wrap_kbd_p1_f() == 1){ // autorepeat ?
  59                         _kbd_p2_f();
  60                 }
  61         }
  62 
  63     _ExitTask();
  64 }
  65 
  66 
  67 long __attribute__((naked,noinline)) wrap_kbd_p1_f()
  68 {
  69     asm volatile(
  70                 "STMFD   SP!, {R1-R7,LR} \n"
  71                 "MOV     R5, #0 \n"
  72                 "BL      my_kbd_read_keys \n"
  73                 "B           _kbd_p1_f_cont \n"
  74     );
  75     return 0;
  76 }
  77 
  78 
  79 void my_kbd_read_keys()
  80 {
  81     kbd_update_key_state();
  82     kbd_update_physw_bits();
  83 }
  84 
  85 void kbd_fetch_data(long *dst)
  86 {
  87     _GetKbdState(dst);
  88     _kbd_read_keys_r2(dst);
  89 }

/* [<][>][^][v][top][bottom][index][help] */