OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [char/] [dn_keyb.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
#include <linux/sched.h>
2
#include <linux/interrupt.h>
3
#include <linux/errno.h>
4
#include <linux/keyboard.h>
5
#include <linux/delay.h>
6
#include <linux/timer.h>
7
#include <linux/kd.h>
8
#include <linux/kbd_ll.h>
9
#include <linux/random.h>
10
#include <linux/kernel.h>
11
#include <linux/module.h>
12
#include <linux/poll.h>
13
#include <linux/miscdevice.h>
14
#include <linux/init.h>
15
 
16
#include <asm/setup.h>
17
#include <asm/irq.h>
18
#include <asm/apollohw.h>
19
#include <asm/uaccess.h>
20
 
21
#include "busmouse.h"
22
 
23
#define DNKEY_CAPS 0x7e
24
#define BREAK_FLAG 0x80
25
#define DNKEY_REPEAT_DELAY 50
26
#define DNKEY_CTRL 0x43
27
#define DNKEY_LSHIFT 0x5e
28
#define DNKEY_RSHIFT 0x6a
29
#define DNKEY_REPT 0x5d
30
#define DNKEY_REPEAT 0x7f
31
#define DNKEY_LALT 0x75
32
#define DNKEY_RALT 0x77
33
 
34
#define APOLLO_KEYB_CMD_ENTRIES 16
35
#define APOLLO_KBD_MODE_KEYB   0x01
36
#define APOLLO_KBD_MODE_MOUSE   0x02
37
#define APOLLO_KBD_MODE_CHANGE 0xff
38
 
39
static u_char keyb_cmds[APOLLO_KEYB_CMD_ENTRIES];
40
static short keyb_cmd_read=0, keyb_cmd_write=0;
41
static int keyb_cmd_transmit=0;
42
static int msedev;
43
 
44
static unsigned int kbd_mode=APOLLO_KBD_MODE_KEYB;
45
 
46
#if 0
47
static void debug_keyb_timer_handler(unsigned long ignored);
48
static u_char debug_buf1[4096],debug_buf2[4096],*debug_buf=&debug_buf1[0];
49
static u_char *shadow_buf=&debug_buf2[0];
50
static short debug_buf_count=0;
51
static int debug_buf_overrun=0,debug_timer_running=0;
52
static unsigned long debug_buffer_updated=0;
53
static struct timer_list debug_keyb_timer = { function: debug_keyb_timer_handler };
54
#endif
55
 
56
static u_short dnplain_map[NR_KEYS] __initdata = {
57
/*         ins     del     del     F1      F2      F3      F4
58
           mark    line    char                                 */
59
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
60
/* F5      F6      F7      F8      F9      F0      Again   Read */
61
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
62
/* Edit    Exit    Hold    Copy    Paste   Grow            ESC  */
63
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf01b,
64
/* 1       2       3       4       5       6       7       8    */
65
   0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038,
66
/* 9       0       -       =       `       Back            |<--
67
                                           Space                */
68
   0xf039, 0xf030, 0xf02d, 0xf03d, 0xf060, 0xf07f, 0xf200, 0xf200,
69
/* Shell   -->|                    Tab     q       w       e
70
   Cmd                                                          */
71
   0xf200, 0xf200, 0xf200, 0xf200, 0xf009, 0xfb71, 0xfb77, 0xfb65,
72
/* r       t       y       u       i       o       p       [    */
73
   0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, 0xfb6f, 0xfb70, 0xf05b,
74
/* ]               Del             7       8       9       +    */
75
   0xf05d, 0xf200, 0xf200, 0xf200, 0xf307, 0xf308, 0xf300, 0xf30a,
76
/* [<--]   Up      [-->]   Ctrl                    a       s    */
77
   0xf200, 0xf600, 0xf200, 0xf702, 0xf200, 0xf200, 0xfb61, 0xfb73,
78
/* d       f       g       h       j       k       l       ;    */
79
   0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b,
80
/* '               Return  \               4       5       6    */
81
   0xf027, 0xf200, 0xf201, 0xf05c, 0xf200, 0xf304, 0xf305, 0xf306,
82
/* -       <--     Next    -->             Rept    Shift
83
                   Window                                       */
84
   0xf30b, 0xf601, 0xf200, 0xf602, 0xf200, 0xf200, 0xf700, 0xf200,
85
/* z       x       c       v       b       n       m       ,    */
86
   0xfb7a, 0xfb78, 0xfb63, 0xfb76, 0xfb62, 0xfb6e, 0xfb6d, 0xf02c,
87
/* .       /       Shift           Pop             1       2    */
88
   0xf02e, 0xf02f, 0xf700, 0xf200, 0xf200, 0xf200, 0xf301, 0xf302,
89
/* 3               PgUp    Down    PgDn    Alt     Space   Alt  */
90
   0xf303, 0xf200, 0xf118, 0xf603, 0xf119, 0xf703, 0xf020, 0xf701,
91
/*         0               .       Enter                        */
92
   0xf200, 0xf300, 0xf200, 0xf310, 0xf30e, 0xf200, 0xf700, 0xf200,
93
};
94
 
95
static u_short dnshift_map[NR_KEYS] __initdata = {
96
/*         ins     del     del     F1      F2      F3      F4
97
           mark    line    char                                 */
98
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
99
/* F5      F6      F7      F8      F9      F0      Again   Read */
100
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
101
/* Save    Abort   Help    Cut     Undo    Grow            ESC  */
102
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf01b,
103
/* !       @       #       $       %       ^       &       *    */
104
   0xf021, 0xf040, 0xf023, 0xf024, 0xf025, 0xf05e, 0xf026, 0xf02a,
105
/* (       )       _       +       ~       Back            |<--
106
                                           Space                */
107
   0xf028, 0xf029, 0xf05f, 0xf02b, 0xf07e, 0xf07f, 0xf200, 0xf200,
108
/* Shell   -->|                    Tab     Q       W       E
109
   Cmd                                                          */
110
   0xf200, 0xf200, 0xf200, 0xf200, 0xf009, 0xfb51, 0xfb57, 0xfb45,
111
/* R       T       Y       U       I       O       P       {    */
112
   0xfb52, 0xfb54, 0xfb59, 0xfb55, 0xfb49, 0xfb4f, 0xfb50, 0xf07b,
113
/* }               Del             7       8       9       +    */
114
   0xf07d, 0xf200, 0xf200, 0xf200, 0xf307, 0xf308, 0xf300, 0xf30a,
115
/* [<--]   Up      [-->]   Ctrl                    A       S    */
116
   0xf200, 0xf600, 0xf200, 0xf702, 0xf200, 0xf200, 0xfb41, 0xfb53,
117
/* D       F       G       H       J       K       L       :    */
118
   0xfb44, 0xfb46, 0xfb47, 0xfb48, 0xfb4a, 0xfb4b, 0xfb4c, 0xf03a,
119
/* "               Return  |               4       5       6    */
120
   0xf022, 0xf200, 0xf201, 0xf07c, 0xf200, 0xf304, 0xf305, 0xf306,
121
/* -       <--     Next    -->             Rept    Shift
122
                   Window                                       */
123
   0xf30b, 0xf601, 0xf200, 0xf602, 0xf200, 0xf200, 0xf700, 0xf200,
124
/* Z       X       C       V       B       N       M       <    */
125
   0xfb5a, 0xfb58, 0xfb43, 0xfb56, 0xfb42, 0xfb4e, 0xfb4d, 0xf03c,
126
/* >       ?       Shift           Pop             1       2    */
127
   0xf03e, 0xf03f, 0xf700, 0xf200, 0xf200, 0xf200, 0xf301, 0xf302,
128
/* 3               PgUp    Down    PgDn    Alt     Space   Alt  */
129
   0xf303, 0xf200, 0xf118, 0xf603, 0xf119, 0xf703, 0xf020, 0xf701,
130
/*         0               .       Enter                        */
131
   0xf200, 0xf300, 0xf200, 0xf310, 0xf30e, 0xf200, 0xf708, 0xf200,
132
};
133
 
134
static u_short dnctrl_map[NR_KEYS] __initdata = {
135
/*         ins     del     del     F1      F2      F3      F4
136
           mark    line    char                                 */
137
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
138
/* F5      F6      F7      F8      F9      F0      Again   Read */
139
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
140
/* Save    Abort   Help    Cut     Undo    Grow            ESC  */
141
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf01b,
142
/* !       @       #       $       %       ^       &       *    */
143
   0xf200, 0xf000, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf07f,
144
/* (       )       _       +       ~       Back            |<--
145
                                           Space                */
146
   0xf200, 0xf200, 0xf01f, 0xf200, 0xf01c, 0xf200, 0xf200, 0xf200,
147
/* Shell   -->|                    Tab     Q       W       E
148
   Cmd                                                          */
149
   0xf200, 0xf200, 0xf200, 0xf200, 0xf009, 0xf011, 0xf017, 0xf005,
150
/* R       T       Y       U       I       O       P       {    */
151
   0xf012, 0xf014, 0xf019, 0xf015, 0xf009, 0xf00f, 0xf010, 0xf01b,
152
/* }               Del             7       8       9       +    */
153
   0xf01d, 0xf200, 0xf200, 0xf200, 0xf307, 0xf308, 0xf300, 0xf30a,
154
/* [<--]   Up      [-->]   Ctrl                    A       S    */
155
   0xf200, 0xf600, 0xf200, 0xf702, 0xf200, 0xf200, 0xfb01, 0xfb53,
156
/* D       F       G       H       J       K       L       :    */
157
   0xf004, 0xf006, 0xf007, 0xf008, 0xf00a, 0xf00b, 0xf00c, 0xf200,
158
/* "               Return  |               4       5       6    */
159
   0xf200, 0xf200, 0xf201, 0xf01c, 0xf200, 0xf304, 0xf305, 0xf306,
160
/* -       <--     Next    -->             Rept    Shift
161
                   Window                                       */
162
   0xf30b, 0xf601, 0xf200, 0xf602, 0xf200, 0xf200, 0xf704, 0xf200,
163
/* Z       X       C       V       B       N       M       <    */
164
   0xf01a, 0xf018, 0xf003, 0xf016, 0xf002, 0xf00e, 0xf01d, 0xf03c,
165
/* >       ?       Shift           Pop             1       2    */
166
   0xf03e, 0xf03f, 0xf705, 0xf200, 0xf200, 0xf200, 0xf301, 0xf302,
167
/* 3               PgUp    Down    PgDn    Alt     Space   Alt  */
168
   0xf303, 0xf200, 0xf118, 0xf603, 0xf119, 0xf703, 0xf020, 0xf701,
169
/*         0               .       Enter                        */
170
   0xf200, 0xf300, 0xf200, 0xf310, 0xf30e, 0xf200, 0xf200, 0xf200,
171
};
172
 
173
static u_short dnalt_map[NR_KEYS] __initdata = {
174
/*         ins     del     del     F1      F2      F3      F4
175
           mark    line    char                                 */
176
   0xf200, 0xf200, 0xf200, 0xf200, 0xf500, 0xf501, 0xf502, 0xf503,
177
/* F5      F6      F7      F8      F9      F0      Again   Read */
178
   0xf504, 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf200, 0xf200,
179
/* Edit    Exit    Hold    Copy    Paste   Grow            ESC  */
180
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf01b,
181
/* 1       2       3       4       5       6       7       8    */
182
   0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836, 0xf837, 0xf838,
183
/* 9       0       -       =       `       Back            |<--
184
                                           Space                */
185
   0xf839, 0xf830, 0xf82d, 0xf83d, 0xf860, 0xf87f, 0xf200, 0xf200,
186
/* Shell   -->|                    Tab     q       w       e
187
   Cmd                                                          */
188
   0xf200, 0xf200, 0xf200, 0xf200, 0xf809, 0xf871, 0xf877, 0xf865,
189
/* r       t       y       u       i       o       p       [    */
190
   0xf872, 0xf874, 0xf879, 0xf875, 0xf869, 0xf86f, 0xf870, 0xf85b,
191
/* ]               Del             7       8       9       +    */
192
   0xf05d, 0xf200, 0xf200, 0xf200, 0xf307, 0xf308, 0xf300, 0xf30a,
193
/* [<--]   Up      [-->]   Ctrl                    a       s    */
194
   0xf200, 0xf600, 0xf200, 0xf702, 0xf200, 0xf200, 0xf861, 0xf873,
195
/* d       f       g       h       j       k       l       ;    */
196
   0xf864, 0xf866, 0xf867, 0xf868, 0xf86a, 0xf86b, 0xf86c, 0xf03b,
197
/* '               Return  \               4       5       6    */
198
   0xf027, 0xf200, 0xf201, 0xf05c, 0xf200, 0xf304, 0xf305, 0xf306,
199
/* -       <--     Next    -->             Rept    Shift
200
                   Window                                       */
201
   0xf30b, 0xf601, 0xf200, 0xf602, 0xf200, 0xf200, 0xf704, 0xf200,
202
/* z       x       c       v       b       n       m       ,    */
203
   0xf87a, 0xf878, 0xf863, 0xf876, 0xf862, 0xf86e, 0xf86d, 0xf82c,
204
/* .       /       Shift           Pop             1       2    */
205
   0xf82e, 0xf82f, 0xf705, 0xf200, 0xf200, 0xf200, 0xf301, 0xf302,
206
/* 3               PgUp    Down    PgDn    Alt     Space   Alt  */
207
   0xf303, 0xf200, 0xf118, 0xf603, 0xf119, 0xf703, 0xf820, 0xf701,
208
/*         0               .       Enter                        */
209
   0xf200, 0xf300, 0xf200, 0xf310, 0xf30e, 0xf200, 0xf200, 0xf200,
210
};
211
 
212
static u_short dnaltgr_map[NR_KEYS] __initdata = {
213
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
214
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
215
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
216
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
217
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
218
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
219
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
220
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
221
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
222
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
223
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
224
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
225
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
226
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
227
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
228
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
229
};
230
 
231
static u_short dnshift_ctrl_map[NR_KEYS] __initdata = {
232
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
233
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
234
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
235
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
236
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
237
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
238
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
239
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
240
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
241
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
242
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
243
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
244
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
245
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
246
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
247
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
248
};
249
 
250
static u_short dnctrl_alt_map[NR_KEYS] __initdata = {
251
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
252
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
253
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
254
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
255
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
256
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
257
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
258
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
259
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
260
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
261
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
262
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
263
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
264
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
265
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
266
   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
267
};
268
 
269
#if 0
270
static void debug_keyb_timer_handler(unsigned long ignored) {
271
 
272
        unsigned long flags;
273
        u_char *swap;
274
        short length,i;
275
 
276
        if (time_after(jiffies, debug_buffer_updated + 100)) {
277
                save_flags(flags);
278
                cli();
279
                length=debug_buf_count;
280
                swap=debug_buf;
281
                debug_buf=shadow_buf;
282
                shadow_buf=swap;
283
                debug_buf_count=0;
284
                debug_timer_running=0;
285
                restore_flags(flags);
286
                for(i=1;length;length--,i++)
287
                        printk("%02x%c",*(swap++), (i % 25) ? ' ' : '\n');
288
                printk("\n");
289
        }
290
        else {
291
                debug_keyb_timer.expires=jiffies+10;
292
                add_timer(&debug_keyb_timer);
293
        }
294
}
295
#endif
296
 
297
static void dn_keyb_process_key_event(unsigned char scancode) {
298
 
299
        static unsigned char lastscancode;
300
        unsigned char prev_scancode=lastscancode;
301
        static unsigned int lastkeypress;
302
 
303
        lastscancode=scancode;
304
 
305
        /*  printk("scan: %02x, lastscan: %02X, prev_scancode: %02X\n",scancode,lastscancode,prev_scancode); */
306
 
307
        if(prev_scancode==APOLLO_KBD_MODE_CHANGE) {
308
                kbd_mode=scancode;
309
/*              printk("modechange: %d\n",scancode); */
310
        }
311
        else if((scancode & (~BREAK_FLAG)) == DNKEY_CAPS) {
312
        /* printk("handle_scancode: %02x\n",DNKEY_CAPS); */
313
                handle_scancode(DNKEY_CAPS, 1);
314
                /*    printk("handle_scancode: %02x\n",BREAK_FLAG | DNKEY_CAPS); */
315
                handle_scancode(DNKEY_CAPS, 0);
316
        }
317
        else if( (scancode == DNKEY_REPEAT) && (prev_scancode < 0x7e) &&
318
                        !(prev_scancode==DNKEY_CTRL || prev_scancode==DNKEY_LSHIFT ||
319
                prev_scancode==DNKEY_RSHIFT || prev_scancode==DNKEY_REPT ||
320
                prev_scancode==DNKEY_LALT || prev_scancode==DNKEY_RALT)) {
321
                        if (time_after(jiffies, lastkeypress + DNKEY_REPEAT_DELAY)) {
322
                        /*      printk("handle_scancode: %02x\n",prev_scancode); */
323
                                handle_scancode(prev_scancode, 1);
324
                                }
325
                                lastscancode=prev_scancode;
326
                        }
327
        else {
328
        /*      printk("handle_scancode: %02x\n",scancode);  */
329
                        handle_scancode(scancode & ~BREAK_FLAG, !(scancode & BREAK_FLAG));
330
                        lastkeypress=jiffies;
331
        }
332
}
333
 
334
static void dn_keyb_process_mouse_event(unsigned char mouse_data) {
335
 
336
        static short mouse_byte_count=0;
337
        static u_char mouse_packet[3];
338
        short buttons;
339
        int dx, dy;
340
 
341
        mouse_packet[mouse_byte_count++]=mouse_data;
342
 
343
        if(mouse_byte_count==3) {
344
                if(mouse_packet[0]==APOLLO_KBD_MODE_CHANGE) {
345
                        kbd_mode=mouse_packet[1];
346
                        mouse_byte_count=0;
347
/*                      printk("modechange: %d\n",mouse_packet[1]); */
348
                        if(kbd_mode==APOLLO_KBD_MODE_KEYB)
349
                                dn_keyb_process_key_event(mouse_packet[2]);
350
                }
351
                if((mouse_packet[0] & 0x8f) == 0x80) {
352
                        buttons = (mouse_packet[0] >> 4) & 0x7;
353
                        dx = mouse_packet[1] == 0xff ? 0 : (signed char)mouse_packet[1];
354
                        dy = mouse_packet[2] == 0xff ? 0 : (signed char)mouse_packet[2];
355
                        busmouse_add_movementbuttons(msedev, dx, dy, buttons);
356
                        mouse_byte_count=0;
357
/*                      printk("mouse: %d, %d, %x\n",mouse_x,mouse_y,buttons); */
358
                }
359
        }
360
}
361
 
362
static void dn_keyb_int(int irq, void *dummy, struct pt_regs *fp) {
363
 
364
        unsigned char data;
365
        unsigned long flags;
366
        int scn2681_ints;
367
 
368
        do {
369
                scn2681_ints=sio01.isr_imr & 3;
370
                if(scn2681_ints & 2) {
371
                        data=sio01.rhra_thra;
372
#if 0
373
                        if(debug_buf_count<4096) {
374
                                debug_buf[debug_buf_count++]=data;
375
                                debug_buffer_updated=jiffies;
376
                                if(!debug_timer_running) {
377
                                        debug_keyb_timer.expires=jiffies+10;
378
                                        add_timer(&debug_keyb_timer);
379
                                        debug_timer_running=1;
380
                                }
381
                        }
382
                        else
383
                                debug_buf_overrun=1;
384
#endif
385
                        if(sio01.sra_csra & 0x10) {
386
                                printk("whaa overrun !\n");
387
                                continue;
388
                        }
389
 
390
                        if(kbd_mode==APOLLO_KBD_MODE_KEYB)
391
                                dn_keyb_process_key_event(data);
392
                        else
393
                                dn_keyb_process_mouse_event(data);
394
                }
395
 
396
                if(scn2681_ints & 1) {
397
                        save_flags(flags);
398
                        cli();
399
                        if(keyb_cmd_write!=keyb_cmd_read) {
400
                                sio01.rhra_thra=keyb_cmds[keyb_cmd_read++];
401
                                if(keyb_cmd_read==APOLLO_KEYB_CMD_ENTRIES)
402
                                        keyb_cmd_read=0;
403
                                keyb_cmd_transmit=1;
404
                        }
405
                        else {
406
                                keyb_cmd_transmit=0;
407
                                sio01.BRGtest_cra=9;
408
                        }
409
                        restore_flags(flags);
410
                }
411
        } while(scn2681_ints) ;
412
}
413
 
414
void write_keyb_cmd(u_short length, u_char *cmd) {
415
 
416
        unsigned long flags;
417
 
418
        if((keyb_cmd_write==keyb_cmd_read) && keyb_cmd_transmit)
419
                return;
420
 
421
        save_flags(flags);
422
        cli();
423
        for(;length;length--) {
424
                keyb_cmds[keyb_cmd_write++]=*(cmd++);
425
                if(keyb_cmd_write==keyb_cmd_read)
426
                        return;
427
                if(keyb_cmd_write==APOLLO_KEYB_CMD_ENTRIES)
428
                        keyb_cmd_write=0;
429
        }
430
        if(!keyb_cmd_transmit)  {
431
           sio01.BRGtest_cra=5;
432
        }
433
        restore_flags(flags);
434
 
435
}
436
 
437
static struct busmouse apollo_mouse = {
438
        APOLLO_MOUSE_MINOR, "apollomouse", THIS_MODULE, NULL, NULL, 7
439
};
440
 
441
int __init dn_keyb_init(void){
442
 
443
/*  printk("dn_keyb_init\n"); */
444
 
445
  memcpy(key_maps[0], dnplain_map, sizeof(plain_map));
446
  memcpy(key_maps[1], dnshift_map, sizeof(plain_map));
447
  memcpy(key_maps[2], dnaltgr_map, sizeof(plain_map));
448
  memcpy(key_maps[4], dnctrl_map, sizeof(plain_map));
449
  memcpy(key_maps[5], dnshift_ctrl_map, sizeof(plain_map));
450
  memcpy(key_maps[8], dnalt_map, sizeof(plain_map));
451
  memcpy(key_maps[12], dnctrl_alt_map, sizeof(plain_map));
452
 
453
 
454
  msedev=register_busmouse(&apollo_mouse);
455
  if (msedev < 0)
456
      printk(KERN_WARNING "Unable to install Apollo mouse driver.\n");
457
   else
458
      printk(KERN_INFO "Apollo mouse installed.\n");
459
 
460
  /* program UpDownMode */
461
 
462
  while(!(sio01.sra_csra & 0x4));
463
  sio01.rhra_thra=0xff;
464
 
465
  while(!(sio01.sra_csra & 0x4));
466
  sio01.rhra_thra=0x1;
467
 
468
  request_irq(1, dn_keyb_int,0,NULL,NULL);
469
 
470
  /* enable receive int on DUART */
471
  sio01.isr_imr=3;
472
 
473
  return 0;
474
 
475
}
476
 
477
int dn_dummy_kbdrate(struct kbd_repeat *k) {
478
 
479
  printk("dn_dummy_kbdrate\n");
480
 
481
  return 0;
482
 
483
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.