root/platform/s2is/kbd.c

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

DEFINITIONS

This source file includes following definitions.
  1. get_usb_bit
  2. mykbd_task_proceed
  3. mykbd_task_proceed_2
  4. mykbd_task
  5. wrap_kbd_p1_f
  6. my_kbd_read_keys
  7. my_kbd_read_keys_cont

   1 #include "lolevel.h"
   2 #include "platform.h"
   3 #include "core.h"
   4 #include "conf.h"
   5 #include "keyboard.h"
   6 #include "kbd_common.h"
   7 
   8 long kbd_new_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
   9 long kbd_prev_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
  10 long kbd_mod_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
  11 
  12 KeyMap keymap[] = {
  13     /* tiny bug: key order matters. see kbd_get_pressed_key()
  14      * for example
  15      */
  16     { 1, KEY_UP         , 0x00020000 },
  17     { 1, KEY_DOWN               , 0x00080000 },
  18     { 1, KEY_LEFT               , 0x00010000 },
  19     { 1, KEY_RIGHT              , 0x00040000 },
  20     { 1, KEY_SET                , 0x00100000 },
  21     { 0, KEY_SHOOT_FULL , 0x00000003 },
  22     { 0, KEY_SHOOT_FULL_ONLY, 0x00000002 },
  23     { 0, KEY_SHOOT_HALF , 0x00000001 },
  24     { 1, KEY_ZOOM_IN    , 0x10000000 },
  25     { 1, KEY_ZOOM_IN    , 0x18000000 },
  26     { 1, KEY_ZOOM_OUT   , 0x01000000 },
  27     { 1, KEY_ZOOM_OUT   , 0x05000000 },
  28     { 1, KEY_MENU               , 0x00200000 },
  29     { 1, KEY_DISPLAY    , 0x00002000 },
  30     { 1, KEY_PRINT              , 0x00004000 },
  31     { 1, KEY_ERASE              , 0x00400000 },
  32     { 1, KEY_ISO                , 0x00001000 },
  33     { 1, KEY_FLASH              , 0x00000008 },
  34     { 1, KEY_MF         , 0x00000010 },
  35     { 1, KEY_MACRO              , 0x00000020 },
  36     { 1, KEY_VIDEO              , 0x40000000 },
  37     { 1, KEY_TIMER              , 0x02000000 },
  38     { 0, 0, 0 }
  39 };
  40 
  41 
  42 long physw_copy[3];
  43 
  44 #define NEW_SS (0x2000)
  45 
  46 // bit read in kbd update
  47 static long got_usb_bit = 0;
  48 
  49 int get_usb_bit() 
  50 {
  51         return (got_usb_bit == USB_MASK); 
  52 }
  53  
  54 static char kbd_stack[NEW_SS];
  55 
  56 extern void _platformsub_kbd_fetch_data(long*);
  57 long __attribute__((naked)) wrap_kbd_p1_f();
  58 void __attribute__((naked,noinline)) mykbd_task_proceed_2();
  59 extern void h_kbd_p2_f();
  60 
  61 static void __attribute__((noinline)) mykbd_task_proceed()
  62 {
  63     asm volatile(
  64                  "STMFD   SP!, {R4-R6,LR}\n"
  65                  "SUB     SP, SP, #4\n"
  66                  "ADD     R6, SP, #2\n"
  67                  "B       mykbd_task_proceed_2\n"
  68         );
  69 }
  70 
  71 
  72 void mykbd_task_proceed_2()
  73 {
  74     asm volatile(
  75   "loc_FF82934C:"
  76                  "MOV     R0, #0xA\n"
  77                  "BL      _SleepTask\n"
  78                  "BL      wrap_kbd_p1_f\n"
  79                  "MOV     R5, R0\n"
  80                  "CMP     R5, #1\n"
  81                  "BNE     loc_FF82934C\n"
  82                  "B       h_kbd_p2_f\n"
  83         );
  84 }
  85 
  86 
  87 void __attribute__((naked,noinline))
  88 mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf)
  89 {
  90     (void)ua; (void)ub; (void)uc; (void)ud; (void)ue; (void)uf;
  91     /* WARNING
  92      * Stack pointer manipulation performed here!
  93      * This means (but not limited to):
  94      *  function arguments destroyed;
  95      *  function CAN NOT return properly;
  96      *  MUST NOT call or use stack variables before stack
  97      *  is setup properly;
  98      *
  99      */
 100 
 101     register int i;
 102     register long *newstack;
 103 
 104     newstack = (void*)kbd_stack;
 105 
 106     for (i=0;i<NEW_SS/4;i++)
 107         newstack[i]=0xdededede;
 108 
 109     asm volatile (
 110         "MOV    SP, %0"
 111         :: "r"(((char*)newstack)+NEW_SS)
 112         : "memory"
 113     );
 114 
 115     mykbd_task_proceed();
 116 
 117     /* function can be modified to restore SP here...
 118      */
 119 
 120     _ExitTask();
 121 }
 122 
 123 
 124 long __attribute__((naked,noinline)) wrap_kbd_p1_f()
 125 {
 126     kbd_prev_state[0] = kbd_new_state[0];
 127     kbd_prev_state[1] = kbd_new_state[1];
 128     kbd_prev_state[2] = kbd_new_state[2];
 129 
 130     asm volatile(
 131                 "STMFD   SP!, {R4-R10,LR}\n"
 132                 "LDR     R4, =physw_status-0x30\n"
 133                 "MOV     R0, R4\n"
 134                 "SUB     SP, SP, #0x18\n"
 135                 "BL      my_kbd_read_keys\n"
 136     );
 137 
 138 //    physw_status[0] = physw_status[0] & ~SD_READONLY_FLAG;
 139 
 140     asm volatile(
 141                 "B       _kbd_p1_f_cont\n"
 142     );
 143     return 0; // shut up the compiler
 144 }
 145 
 146 
 147 void __attribute__((naked,noinline)) my_kbd_read_keys()
 148 {
 149     asm volatile(
 150                 "STMFD   SP!, {R4-R11,LR}\n"
 151                 "LDR     R3, =kbd_const_1\n"
 152                 "SUB     SP, SP, #0x18\n"
 153                 "MOV     R5, R0\n"
 154                 "ADD     R0, SP, #0x0C\n"
 155                 "LDR     R4, [R3]\n"
 156                 "BL      _platformsub_kbd_fetch_data\n"
 157                 "ADD     R0, SP, #0x0C\n"
 158                 "BL      my_kbd_read_keys_cont\n"
 159                 "B       _kbd_read_keys_r2\n"
 160     );
 161 }
 162 
 163 
 164 void my_kbd_read_keys_cont(long *canon_key_state)
 165 {
 166     kbd_new_state[0] = canon_key_state[0];
 167     kbd_new_state[1] = canon_key_state[1];
 168     kbd_new_state[2] = canon_key_state[2];
 169 
 170     got_usb_bit = kbd_new_state[USB_IDX] & USB_MASK;
 171 
 172     physw_copy[0] = kbd_new_state[0];
 173     physw_copy[1] = kbd_new_state[1];
 174     physw_copy[2] = kbd_new_state[2];
 175 
 176     if (kbd_process() == 0){
 177         // leave it alone...
 178         physw_status[0] = kbd_new_state[0];
 179         physw_status[1] = kbd_new_state[1];
 180         physw_status[2] = kbd_new_state[2];
 181     } else {
 182         // override keys
 183         physw_status[0] = (kbd_new_state[0] & (~KEYS_MASK0)) |
 184                   (kbd_mod_state[0] & KEYS_MASK0);
 185 
 186         physw_status[1] = (kbd_new_state[1] & (~KEYS_MASK1)) |
 187                   (kbd_mod_state[1] & KEYS_MASK1);
 188 
 189         physw_status[2] = (kbd_new_state[2] & (~KEYS_MASK2)) |
 190                   (kbd_mod_state[2] & KEYS_MASK2);
 191     }
 192 
 193     kbd_update_physw_bits();
 194 
 195     canon_key_state[0] = physw_status[0];
 196     canon_key_state[1] = physw_status[1];
 197     canon_key_state[2] = physw_status[2];
 198 }
 199 

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