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

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [armnommu/] [drivers/] [char/] [keyb_ps2.c] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1622 jcastillo
/*
2
 * linux/arch/arm/drivers/block/keyb_ps2.c
3
 *
4
 * Keyboard driver for RPC ARM Linux.
5
 *
6
 * Note!!! This driver talks directly to the keyboard.
7
 */
8
 
9
#include <linux/sched.h>
10
#include <linux/interrupt.h>
11
#include <linux/tty.h>
12
#include <linux/tty_flip.h>
13
#include <linux/mm.h>
14
#include <linux/malloc.h>
15
#include <linux/ptrace.h>
16
#include <linux/signal.h>
17
#include <linux/timer.h>
18
#include <linux/random.h>
19
#include <linux/ctype.h>
20
 
21
#include <asm/bitops.h>
22
#include <asm/irq.h>
23
#include <asm/hardware.h>
24
#include <asm/io.h>
25
#include <asm/system.h>
26
 
27
extern void kbd_keyboardkey(unsigned int keycode, unsigned int up_flag);
28
extern void kbd_reset(void);
29
extern void kbd_setregs(struct pt_regs *regs);
30
 
31
#define IRQ_KEYBOARDRX 15
32
 
33
#define VERSION 100
34
 
35
#define KBD_REPORT_ERR
36
#define KBD_REPORT_UNKN
37
 
38
#define KBD_ESCAPEE0    0xe0            /* in */
39
#define KBD_ESCAPEE1    0xe1            /* in */
40
 
41
#define ESCE0(x)        (0xe000|(x))
42
#define ESCE1(x)        (0xe100|(x))
43
 
44
#define KBD_BAT         0xaa            /* in */
45
#define KBD_SETLEDS     0xed            /* out */
46
#define KBD_ECHO        0xee            /* in/out */
47
#define KBD_BREAK       0xf0            /* in */
48
#define KBD_TYPRATEDLY  0xf3            /* out */
49
#define KBD_SCANENABLE  0xf4            /* out */
50
#define KBD_DEFDISABLE  0xf5            /* out */
51
#define KBD_DEFAULT     0xf6            /* out */
52
#define KBD_ACK         0xfa            /* in */
53
#define KBD_DIAGFAIL    0xfd            /* in */
54
#define KBD_RESEND      0xfe            /* in/out */
55
#define KBD_RESET       0xff            /* out */
56
 
57
#define CODE_BREAK      1
58
#define CODE_ESCAPEE0   2
59
#define CODE_ESCAPEE1   4
60
#define CODE_ESCAPE12   8
61
 
62
#define K_NONE          0x7f
63
#define K_ESC           0x00
64
#define K_F1            0x01
65
#define K_F2            0x02
66
#define K_F3            0x03
67
#define K_F4            0x04
68
#define K_F5            0x05
69
#define K_F6            0x06
70
#define K_F7            0x07
71
#define K_F8            0x08
72
#define K_F9            0x09
73
#define K_F10           0x0a
74
#define K_F11           0x0b
75
#define K_F12           0x0c
76
#define K_PRNT          0x0d
77
#define K_SCRL          0x0e
78
#define K_BRK           0x0f
79
#define K_AGR           0x10
80
#define K_1             0x11
81
#define K_2             0x12
82
#define K_3             0x13
83
#define K_4             0x14
84
#define K_5             0x15
85
#define K_6             0x16
86
#define K_7             0x17
87
#define K_8             0x18
88
#define K_9             0x19
89
#define K_0             0x1a
90
#define K_MINS          0x1b
91
#define K_EQLS          0x1c
92
#define K_BKSP          0x1e
93
#define K_INS           0x1f
94
#define K_HOME          0x20
95
#define K_PGUP          0x21
96
#define K_NUML          0x22
97
#define KP_SLH          0x23
98
#define KP_STR          0x24
99
#define KP_MNS          0x3a
100
#define K_TAB           0x26
101
#define K_Q             0x27
102
#define K_W             0x28
103
#define K_E             0x29
104
#define K_R             0x2a
105
#define K_T             0x2b
106
#define K_Y             0x2c
107
#define K_U             0x2d
108
#define K_I             0x2e
109
#define K_O             0x2f
110
#define K_P             0x30
111
#define K_LSBK          0x31
112
#define K_RSBK          0x32
113
#define K_ENTR          0x47
114
#define K_DEL           0x34
115
#define K_END           0x35
116
#define K_PGDN          0x36
117
#define KP_7            0x37
118
#define KP_8            0x38
119
#define KP_9            0x39
120
#define KP_PLS          0x4b
121
#define K_CAPS          0x5d
122
#define K_A             0x3c
123
#define K_S             0x3d
124
#define K_D             0x3e
125
#define K_F             0x3f
126
#define K_G             0x40
127
#define K_H             0x41
128
#define K_J             0x42
129
#define K_K             0x43
130
#define K_L             0x44
131
#define K_SEMI          0x45
132
#define K_SQOT          0x46
133
#define K_HASH          0x1d
134
#define KP_4            0x48
135
#define KP_5            0x49
136
#define KP_6            0x4a
137
#define K_LSFT          0x4c
138
#define K_BSLH          0x33
139
#define K_Z             0x4e
140
#define K_X             0x4f
141
#define K_C             0x50
142
#define K_V             0x51
143
#define K_B             0x52
144
#define K_N             0x53
145
#define K_M             0x54
146
#define K_COMA          0x55
147
#define K_DOT           0x56
148
#define K_FSLH          0x57
149
#define K_RSFT          0x58
150
#define K_UP            0x59
151
#define KP_1            0x5a
152
#define KP_2            0x5b
153
#define KP_3            0x5c
154
#define KP_ENT          0x67
155
#define K_LCTL          0x3b
156
#define K_LALT          0x5e
157
#define K_SPCE          0x5f
158
#define K_RALT          0x60
159
#define K_RCTL          0x61
160
#define K_LEFT          0x62
161
#define K_DOWN          0x63
162
#define K_RGHT          0x64
163
#define KP_0            0x65
164
#define KP_DOT          0x66
165
 
166
static unsigned char keycode_translate[256] =
167
{
168
/* 00 */  K_NONE, K_F9  , K_NONE, K_F5  , K_F3  , K_F1  , K_F2  , K_F12 ,
169
/* 08 */  K_NONE, K_F10 , K_F8  , K_F6  , K_F4  , K_TAB , K_AGR , K_NONE,
170
/* 10 */  K_NONE, K_LALT, K_LSFT, K_NONE, K_LCTL, K_Q   , K_1   , K_NONE,
171
/* 18 */  K_NONE, K_NONE, K_Z   , K_S   , K_A   , K_W   , K_2   , K_NONE,
172
/* 20 */  K_NONE, K_C   , K_X   , K_D   , K_E   , K_4   , K_3   , K_NONE,
173
/* 28 */  K_NONE, K_SPCE, K_V   , K_F   , K_T   , K_R   , K_5   , K_NONE,
174
/* 30 */  K_NONE, K_N   , K_B   , K_H   , K_G   , K_Y   , K_6   , K_NONE,
175
/* 38 */  K_NONE, K_NONE, K_M   , K_J   , K_U   , K_7   , K_8   , K_NONE,
176
/* 40 */  K_NONE, K_COMA, K_K   , K_I   , K_O   , K_0   , K_9   , K_NONE,
177
/* 48 */  K_NONE, K_DOT , K_FSLH, K_L   , K_SEMI, K_P   , K_MINS, K_NONE,
178
/* 50 */  K_NONE, K_NONE, K_SQOT, K_NONE, K_LSBK, K_EQLS, K_NONE, K_NONE,
179
/* 58 */  K_CAPS, K_RSFT, K_ENTR, K_RSBK, K_NONE, K_HASH, K_NONE, K_NONE,
180
/* 60 */  K_NONE, K_BSLH, K_NONE, K_NONE, K_NONE, K_NONE, K_BKSP, K_NONE,
181
/* 68 */  K_NONE, KP_1  , K_NONE, KP_4  , KP_7  , K_NONE, K_NONE, K_NONE,
182
/* 70 */  KP_0  , KP_DOT, KP_2  , KP_5  , KP_6  , KP_8  , K_ESC , K_NUML,
183
/* 78 */  K_F11 , KP_PLS, KP_3  , KP_MNS, KP_STR, KP_9  , K_SCRL, K_NONE,
184
          K_NONE, K_NONE, K_NONE, K_F7  , K_NONE, K_NONE, K_NONE, K_NONE,
185
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
186
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
187
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
188
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
189
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
190
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
191
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
192
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
193
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
194
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
195
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
196
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
197
          K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE
198
};
199
 
200
static void kbd_drv_key(unsigned int keycode, unsigned int up_flag)
201
{
202
        kbd_keyboardkey(keycode, up_flag);
203
}
204
 
205
static inline void kbd_drv_sendbyte(unsigned char val)
206
{
207
        while(!(inb(IOMD_KCTRL) & (1 << 7)));
208
        outb(val, IOMD_KARTTX);
209
}
210
 
211
static unsigned char status;
212
static unsigned char ncodes;
213
static unsigned char bi;
214
static unsigned char buffer[4];
215
 
216
static inline void kbd_drv_reset(void)
217
{
218
        status = 0;
219
        kbd_reset();
220
}
221
 
222
static void handle_rawcode(int keyval)
223
{
224
        int keysym;
225
 
226
        if (keyval > 0x83) {
227
                switch (keyval) {
228
                        case KBD_ESCAPEE0:
229
                                ncodes = 2;
230
                                bi = 0;
231
                                break;
232
                        case KBD_ESCAPEE1:
233
                                ncodes = 3;
234
                                bi = 0;
235
                                break;
236
                        case KBD_BREAK:
237
                                status |= CODE_BREAK;
238
                        default:
239
                                return;
240
                }
241
        }
242
 
243
        if (ncodes) {
244
                buffer[bi++] = keyval;
245
                ncodes -= 1;
246
                if (ncodes)
247
                        return;
248
                keysym = K_NONE;
249
                switch (buffer[0] << 8 | buffer[1]) {
250
                case ESCE0(0x11): keysym = K_RALT; break;
251
                case ESCE0(0x14): keysym = K_RCTL; break;
252
                case ESCE0(0x4a): keysym = KP_SLH; break;
253
                case ESCE0(0x5a): keysym = KP_ENT; break;
254
                case ESCE0(0x69): keysym = K_END;  break;
255
                case ESCE0(0x6b): keysym = K_LEFT; break;
256
                case ESCE0(0x6c): keysym = K_HOME; break;
257
                case ESCE0(0x70): keysym = K_INS;  break;
258
                case ESCE0(0x71): keysym = K_DEL;  break;
259
                case ESCE0(0x72): keysym = K_DOWN; break;
260
                case ESCE0(0x74): keysym = K_RGHT; break;
261
                case ESCE0(0x75): keysym = K_UP;   break;
262
                case ESCE0(0x7a): keysym = K_PGDN; break;
263
                case ESCE0(0x7c): keysym = K_PRNT; break;
264
                case ESCE0(0x7d): keysym = K_PGUP; break;
265
                case ESCE1(0x14):
266
                        if (buffer[2] == 0x77)
267
                                keysym = K_BRK;
268
                        break;
269
                case ESCE0(0x12):               /* ignore escaped shift key */
270
                        status = 0;
271
                        return;
272
                }
273
        } else {
274
                bi = 0;
275
                keysym = keycode_translate[keyval];
276
        }
277
 
278
        if (keysym != K_NONE)
279
                kbd_drv_key(keysym, status & CODE_BREAK);
280
        status = 0;
281
}
282
 
283
void kbd_drv_setleds(unsigned int leds)
284
{
285
        kbd_drv_sendbyte(KBD_SETLEDS);
286
        kbd_drv_sendbyte(leds);
287
        kbd_drv_sendbyte(KBD_SCANENABLE);
288
}
289
 
290
static void kbd_drv_rx(int irq, void *dev_id, struct pt_regs *regs)
291
{
292
        kbd_setregs(regs);
293
 
294
        while (inb(IOMD_KCTRL) & (1 << 5))
295
                handle_rawcode(inb(IOMD_KARTRX));
296
        mark_bh(KEYBOARD_BH);
297
}
298
 
299
static void kbd_drv_tx(int irq, void *dev_id, struct pt_regs *regs)
300
{
301
}
302
 
303
int kbd_drv_init (void)
304
{
305
        unsigned long flags;
306
 
307
        save_flags_cli (flags);
308
        if (request_irq (IRQ_KEYBOARDRX, kbd_drv_rx, 0, "keyboard", NULL) != 0)
309
                panic("Could not allocate keyboard receive IRQ!");
310
        if (request_irq (IRQ_KEYBOARDTX, kbd_drv_tx, 0, "keyboard", NULL) != 0)
311
                panic("Could not allocate keyboard transmit IRQ!");
312
        disable_irq (IRQ_KEYBOARDTX);
313
        (void)IOMD_KARTRX;
314
        restore_flags (flags);
315
 
316
        printk (KERN_INFO "Keyboard driver v%d.%02d\n", VERSION/100, VERSION%100);
317
        return 0;
318
}

powered by: WebSVN 2.1.0

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