~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/drivers/char/dn_keyb.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.