root/platform/a490/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

   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 int get_usb_bit() 
  13 {
  14         long usb_physw[3];
  15         usb_physw[USB_IDX] = 0;
  16         _kbd_read_keys_r2(usb_physw);
  17         return(( usb_physw[USB_IDX] & USB_MASK)==USB_MASK) ; 
  18 }
  19 
  20 KeyMap keymap[] = {
  21     /* tiny bug: key order matters. see kbd_get_pressed_key()
  22     * for example
  23     */
  24 
  25     { 0, KEY_PLAYBACK  , 0x00020000 }, // Playback
  26 
  27     { 2, KEY_SHOOT_FULL , 0x00000030 }, // 0x00000010 (KEY_SHOOT_HALF) + 0x00000020 (KEY_SHOOT_FULL_ONLY)
  28     { 2, KEY_SHOOT_FULL_ONLY, 0x00000020 },
  29     { 2, KEY_SHOOT_HALF , 0x00000010 },
  30     
  31     { 2, KEY_UP         , 0x00100000 },
  32     { 2, KEY_DOWN       , 0x00200000 },
  33     { 2, KEY_LEFT       , 0x00400000 },
  34     { 2, KEY_RIGHT      , 0x00000004 },
  35     { 2, KEY_SET        , 0x00000100 },
  36     { 2, KEY_ZOOM_IN    , 0x00000080 },
  37     { 2, KEY_ZOOM_OUT   , 0x00000040 },
  38     { 2, KEY_MENU       , 0x01000000 },
  39     { 2, KEY_DISPLAY    , 0x00800000 }, // MODE button, actually
  40     { 0, 0, 0 }
  41 };
  42 
  43 
  44 long __attribute__((naked)) wrap_kbd_p1_f();
  45 
  46 void __attribute__((noinline)) mykbd_task()
  47 {
  48         /* Initialize our own kbd_new_state[] array with the
  49            current physical status. (inspired by the S90 port)
  50            */
  51         kbd_new_state[0] = physw_status[0];
  52         kbd_new_state[1] = physw_status[1];
  53         kbd_new_state[2] = physw_status[2] ^ KEYS_INV2;
  54         while (physw_run){
  55                 _SleepTask(10);
  56                 
  57                 if (wrap_kbd_p1_f() == 1){ // autorepeat ?
  58                         _kbd_p2_f();
  59                 }
  60         }
  61         _ExitTask();
  62 }
  63 
  64 
  65 long __attribute__((naked,noinline)) wrap_kbd_p1_f()
  66 {
  67         asm volatile(
  68                         "STMFD   SP!, {R1-R5,LR}\n"
  69                         "MOV     R4, #0\n"
  70                         //"BL      _kbd_read_keys\n"       // replaces kbd_fetch_data()
  71                         "BL      my_kbd_read_keys\n"     // +
  72                         "B       _kbd_p1_f_cont\n"       // continue
  73         );
  74         
  75         return 0; // shut up the compiler
  76 }
  77 
  78 void my_kbd_read_keys()
  79 {
  80         kbd_prev_state[0] = kbd_new_state[0];
  81         //kbd_prev_state[1] = kbd_new_state[1];
  82         kbd_prev_state[2] = kbd_new_state[2];
  83 
  84     extern void _kbd_read_keys(void);
  85     _kbd_read_keys();
  86         
  87         kbd_new_state[0] = physw_status[0];
  88         kbd_new_state[1] = physw_status[1];
  89         kbd_new_state[2] = physw_status[2] ^ KEYS_INV2;
  90         
  91         if (kbd_process() == 0){
  92                 // leave it alone...
  93         } else {
  94         // override keys
  95         physw_status[0] = (kbd_new_state[0] | KEYS_MASK0) & (~KEYS_MASK0 | kbd_mod_state[0]);
  96         //physw_status[1] = (kbd_new_state[1] | KEYS_MASK1) & (~KEYS_MASK1 | kbd_mod_state[1]);
  97         physw_status[2] = ((kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2])) ^ KEYS_INV2;
  98         }
  99     // usb and SD read-only are standard
 100     kbd_update_physw_bits();
 101 }

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