This source file includes following definitions.
- mykbd_task_proceed
- mykbd_task
- wrap_kbd_p1_f
- my_kbd_read_keys
- kbd_fetch_data
1 #include "lolevel.h"
2 #include "platform.h"
3 #include "keyboard.h"
4 #include "kbd_common.h"
5
6 #define NEW_SS (0x2000)
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 {2, KEY_UP , 0x00000001 },
17 {2, KEY_DOWN , 0x00000002 },
18 {2, KEY_LEFT , 0x00000008 },
19 {2, KEY_RIGHT , 0x00000004 },
20 {2, KEY_SET , 0x00000100 },
21 {2, KEY_SHOOT_FULL, 0x00000030 },
22 {2, KEY_SHOOT_FULL_ONLY, 0x00000020 },
23 {2, KEY_SHOOT_HALF, 0x00000010 },
24 {2, KEY_ZOOM_IN , 0x00000040 },
25 {2, KEY_ZOOM_OUT , 0x00000080 },
26 {2, KEY_MENU , 0x00000200 },
27 {2, KEY_DISPLAY , 0x00000400 },
28 {2, KEY_PRINT , 0x00001000 },
29 {0, 0, 0 }
30 };
31
32
33 static char kbd_stack[NEW_SS];
34
35 long __attribute__((naked)) wrap_kbd_p1_f();
36
37 static void __attribute__((noinline)) mykbd_task_proceed()
38 {
39 while (physw_run){
40 _SleepTask(10);
41
42
43
44 if (wrap_kbd_p1_f() == 1)
45 {
46 _kbd_p2_f();
47 }
48
49 }
50 }
51
52 void __attribute__((naked,noinline)) mykbd_task()
53 {
54
55
56
57
58
59
60
61
62
63
64 register int i;
65 register long *newstack;
66
67 newstack = (void*)kbd_stack;
68
69 for (i=0;i<NEW_SS/4;i++)
70 newstack[i]=0xdededede;
71
72 asm volatile (
73 "MOV SP, %0"
74 :: "r"(((char*)newstack)+NEW_SS)
75 : "memory"
76 );
77
78 mykbd_task_proceed();
79
80
81
82
83 _ExitTask();
84 }
85
86
87 long __attribute__((naked,noinline)) wrap_kbd_p1_f()
88 {
89
90 asm volatile(
91 "STMFD SP!, {R4-R7,LR}\n"
92 "SUB SP, SP, #0xC\n"
93
94 "BL my_kbd_read_keys\n"
95 "B _kbd_p1_f_cont\n"
96 );
97 return 0;
98 }
99
100 #if CAM_FEATURE_FEATHER
101
102 #endif
103
104 #define IN(base, value) ((value < base + 20) && (value > base - 20))
105
106
107
108
109 void my_kbd_read_keys()
110 {
111
112 static int taskFeatherID = 0;
113
114 if (taskFeatherID == 0) {
115 taskFeatherID = _taskNameToId("tFeather");
116
117 }
118
119
120 if(kbd_update_key_state() == 0) {
121 _taskResume(taskFeatherID);
122 } else {
123 _taskSuspend(taskFeatherID);
124
125 if ((kbd_mod_state[2] & KEYS_MASK2)!=KEYS_MASK2) {
126 _taskResume(taskFeatherID);
127 }
128 }
129 kbd_update_physw_bits();
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162 }
163
164 extern void _GetKbdState(long *dst);
165
166 void kbd_fetch_data(long *dst)
167 {
168 _kbd_pwr_on();
169 _GetKbdState(dst);
170 _kbd_read_keys_r2(dst);
171 _kbd_pwr_off();
172 }
173