root/platform/a800/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 values for kbd.c. Additional keys may be present, only common values included here.
  21 KeyMap keymap[] = {
  22     { 0, KEY_PLAYBACK        ,0x00020000 }, // Playback => ALT Mode
  23     { 2, KEY_ZOOM_OUT        ,0x00000040 }, // Found @0xffe9db40, levent 0x03
  24     { 2, KEY_ZOOM_IN         ,0x00000080 }, // Found @0xffe9db48, levent 0x02
  25     { 2, KEY_SET             ,0x00000100 }, // Found @0xffe9db50, levent 0x08
  26     { 2, KEY_RIGHT           ,0x00000200 }, // Found @0xffe9db58, levent 0x07
  27     { 2, KEY_UP              ,0x02000000 }, // Found @0xffe9db90, levent 0x04
  28     { 2, KEY_DOWN            ,0x04000000 }, // Found @0xffe9db98, levent 0x05
  29     { 2, KEY_LEFT            ,0x08000000 }, // Found @0xffe9dba0, levent 0x06
  30     { 2, KEY_MENU            ,0x20000000 }, // Found @0xffe9dbb0, levent 0x09
  31     { 2, KEY_SHOOT_FULL      ,0x00000030 }, // Found @0xffe9db38, levent 0x01
  32     { 2, KEY_SHOOT_FULL_ONLY ,0x00000020 }, // Found @0xffe9db38, levent 0x01
  33     { 2, KEY_SHOOT_HALF      ,0x00000010 }, // Found @0xffe9db30, levent 0x00
  34     { 2, KEY_MODE            ,0x10000000 }, // OSD
  35     { 0, 0, 0 }
  36 };
  37 
  38 
  39 long __attribute__((naked)) wrap_kbd_p1_f();
  40 
  41 
  42 void __attribute__((noinline)) mykbd_task()
  43 {
  44         /* Initialize our own kbd_new_state[] array with the
  45            current physical status. (inspired by the S90 port)
  46            */
  47         kbd_new_state[0] = physw_status[0];
  48         kbd_new_state[1] = physw_status[1];
  49         kbd_new_state[2] = physw_status[2] ^ KEYS_INV2;
  50         while (physw_run){
  51                 _SleepTask(physw_sleep_delay);
  52                 if (wrap_kbd_p1_f() == 1){ // autorepeat ?
  53                         _kbd_p2_f();
  54                 }
  55         }
  56         _ExitTask();
  57 }
  58 
  59 
  60 long __attribute__((naked,noinline)) wrap_kbd_p1_f()
  61 {
  62         asm volatile(
  63                         "STMFD   SP!, {R1-R7,LR}\n"     // anterior "STMFD   SP!, {R1-R7,LR}\n"
  64                         "MOV     R5, #0\n" // anterior "MOV     R4, #0\n"
  65                         //"BL      _kbd_read_keys\n"       // replaces kbd_fetch_data()
  66                         "BL      my_kbd_read_keys\n"     // +
  67                         "B       _kbd_p1_f_cont\n"       // continue
  68         );
  69         
  70         return 0; // shut up the compiler
  71 }
  72 
  73 
  74 void my_kbd_read_keys()
  75 {
  76         kbd_prev_state[0] = kbd_new_state[0];
  77         //kbd_prev_state[1] = kbd_new_state[1];
  78         kbd_prev_state[2] = kbd_new_state[2];
  79         
  80     extern void _kbd_read_keys(void);
  81     _kbd_read_keys();
  82         
  83         kbd_new_state[0] = physw_status[0];
  84         kbd_new_state[1] = physw_status[1];
  85         kbd_new_state[2] = physw_status[2] ^ KEYS_INV2;
  86 
  87         if (kbd_process() == 0){//core\kbd.c =>pode simular outras teclas (kbd_key_press/release)
  88                 // leave it alone...
  89         } else {
  90         // override keys
  91         physw_status[0] = (kbd_new_state[0] | KEYS_MASK0) & (~KEYS_MASK0 | kbd_mod_state[0]);
  92         //physw_status[1] = (kbd_new_state[1] | KEYS_MASK1) & (~KEYS_MASK1 | kbd_mod_state[1]);
  93         physw_status[2] = ((kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2])) ^ KEYS_INV2;
  94         }
  95     // usb and SD read-only are standard
  96     kbd_update_physw_bits();
  97 }

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