root/platform/sx10/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
  4. wrap_kbd_p1_f
  5. my_kbd_read_keys
  6. kbd_fetch_data
  7. jogdial_control
  8. Get_JogDial
  9. get_jogdial_direction

   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 extern void _platformsub_kbd_fetch_data(long*);
  11 
  12 #define NEW_SS (0x2000)
  13 
  14 int get_usb_bit() 
  15 {
  16         long usb_physw[3];
  17         usb_physw[USB_IDX] = 0;
  18         _kbd_read_keys_r2(usb_physw);
  19         return(( usb_physw[USB_IDX] & USB_MASK)==USB_MASK) ; 
  20 }
  21 
  22 
  23 static char kbd_stack[NEW_SS];
  24 
  25 KeyMap keymap[] = {
  26         /* tiny bug: key order matters. see kbd_get_pressed_key()
  27          * for example
  28          */
  29 
  30     { 0, KEY_PLAYBACK        ,0x00004000 }, // Found @0xffb0ad5c, levent 0x601  
  31     { 0, KEY_SHOOT_FULL      ,0x00000003 }, // Found @0xffb0ad44, levent 0x01
  32     { 0, KEY_SHOOT_FULL_ONLY ,0x00000002 }, // Found @0xffb0ad44, levent 0x01
  33     { 0, KEY_SHOOT_HALF      ,0x00000001 }, // Found @0xffb0ad38, levent 0x00
  34 
  35     { 1, KEY_PRINT                   ,0x00800000 },
  36     { 1, KEY_FLASH           ,0x00100000 },
  37     { 1, KEY_ZOOM_OUT        ,0x00040000 },
  38     { 1, KEY_ZOOM_IN         ,0x00008000 },
  39     { 1, KEY_LEFT            ,0x00002000 }, // Found @0xffb0ae1c, levent 0x06
  40     { 1, KEY_MENU            ,0x00004000 }, // Found @0xffb0ae28, levent 0x09
  41     { 1, KEY_RIGHT           ,0x00001000 }, // Found @0xffb0ae10, levent 0x07
  42     { 1, KEY_DOWN            ,0x00000800 }, // Found @0xffb0ae04, levent 0x05
  43     { 1, KEY_UP              ,0x00000400 }, // Found @0xffb0adf8, levent 0x04
  44     { 1, KEY_DISPLAY         ,0x00000200 }, // Found @0xffb0adec, levent 0x0a
  45     { 1, KEY_SET             ,0x00000100 }, // Found @0xffb0ade0, levent 0x08
  46     { 1, KEY_ERASE                   ,0x00000080 },
  47     { 1, KEY_EXPO_CORR       ,0x00000040 },
  48     { 1, KEY_VIDEO           ,0x00000020 }, // Found @0xffb0adbc, levent 0x12  
  49     { 0, 0, 0 }
  50 };
  51 
  52 
  53 long __attribute__((naked)) wrap_kbd_p1_f();
  54 
  55 
  56 static void __attribute__((noinline)) mykbd_task_proceed()
  57 {
  58         while (physw_run){
  59                 _SleepTask(10);
  60                 
  61                 if (wrap_kbd_p1_f() == 1){ // autorepeat ?
  62                         _kbd_p2_f();
  63                 }
  64         }
  65 }
  66 
  67 void __attribute__((naked,noinline)) mykbd_task()
  68 {
  69     /* WARNING
  70      * Stack pointer manipulation performed here!
  71      * This means (but not limited to):
  72      *  function arguments destroyed;
  73      *  function CAN NOT return properly;
  74      *  MUST NOT call or use stack variables before stack
  75      *  is setup properly;
  76      *
  77      */
  78 
  79         register int i;
  80         register long *newstack;
  81 
  82         newstack = (void*)kbd_stack;
  83 
  84         for (i=0;i<NEW_SS/4;i++)
  85                 newstack[i]=0xdededede;
  86 
  87         asm volatile (
  88                 "MOV    SP, %0"
  89                 :: "r"(((char*)newstack)+NEW_SS)
  90                 : "memory"
  91         );
  92 
  93         mykbd_task_proceed();
  94 
  95         /* function can be modified to restore SP here...
  96          */
  97 
  98         _ExitTask();
  99 }
 100 
 101 
 102 long __attribute__((naked,noinline)) wrap_kbd_p1_f()
 103 {
 104 
 105         asm volatile(
 106                 "STMFD   SP!, {R1-R5,LR}\n"
 107                 "MOV     R4, #0\n"
 108                 "BL      my_kbd_read_keys\n"
 109                 "B       _kbd_p1_f_cont\n"
 110         );
 111         return 0; // shut up the compiler
 112 }
 113 
 114 int jogdial_stopped=0;
 115 
 116 void my_kbd_read_keys()
 117 {
 118     kbd_update_key_state();
 119 
 120     _kbd_read_keys_r2(physw_status);
 121 
 122     kbd_update_physw_bits();
 123 }
 124 
 125 void kbd_fetch_data(long *dst)
 126 {
 127     _platformsub_kbd_fetch_data(dst);
 128 }
 129 
 130 void jogdial_control(int n) {
 131     // this camera did not have jog_position defined
 132     /*
 133     if (jogdial_stopped && !n) {
 134         // If re-enabling jogdial set the task code current & previous positions to the actual
 135         // dial positions so that the change won't get processed by the firmware
 136         jog_position[0] = jog_position[2] = rear_dial_position;   // Rear dial
 137     }
 138     */
 139     jogdial_stopped = n;
 140 }
 141 
 142 static int new_jogdial=0, old_jogdial=0;
 143 
 144 int Get_JogDial(void){
 145  return (*(int*)0xC0240104)>>16;
 146 }
 147 
 148 long get_jogdial_direction(void) { 
 149  old_jogdial=new_jogdial;
 150  new_jogdial=Get_JogDial();
 151  if (old_jogdial<new_jogdial) return JOGDIAL_LEFT; 
 152  else if (old_jogdial>new_jogdial) return JOGDIAL_RIGHT;
 153  else return 0;
 154 }
 155 

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