This source file includes following definitions.
- get_usb_bit
- mykbd_task_proceed
- mykbd_task_proceed_2
- mykbd_task
- wrap_kbd_p1_f
- my_kbd_read_keys
- 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
14
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
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
92
93
94
95
96
97
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
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
139
140 asm volatile(
141 "B _kbd_p1_f_cont\n"
142 );
143 return 0;
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
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
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