Subversion Repositories HelenOS

Rev

Rev 3927 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3927 Rev 3928
Line 39... Line 39...
39
#include <genarch/kbd/i8042.h>
39
#include <genarch/kbd/i8042.h>
40
#include <arch/drivers/kbd.h>
40
#include <arch/drivers/kbd.h>
41
#include <genarch/kbd/key.h>
41
#include <genarch/kbd/key.h>
42
#include <genarch/kbd/scanc.h>
42
#include <genarch/kbd/scanc.h>
43
#include <genarch/kbd/scanc_pc.h>
43
#include <genarch/kbd/scanc_pc.h>
44
#include <arch/drivers/i8042.h>
-
 
45
#include <cpu.h>
44
#include <cpu.h>
46
#include <arch/asm.h>
45
#include <arch/asm.h>
47
#include <arch.h>
46
#include <arch.h>
48
#include <console/chardev.h>
47
#include <console/chardev.h>
49
#include <console/console.h>
48
#include <console/console.h>
50
#include <interrupt.h>
49
#include <interrupt.h>
51
#include <sysinfo/sysinfo.h>
50
#include <sysinfo/sysinfo.h>
52
#include <ipc/irq.h>
51
#include <ipc/irq.h>
53
 
52
 
-
 
53
#define i8042_DATA  0x60
-
 
54
#define i8042_STATUS    0x64
-
 
55
 
54
/* Keyboard commands. */
56
/* Keyboard commands. */
55
#define KBD_ENABLE  0xf4
57
#define KBD_ENABLE  0xf4
56
#define KBD_DISABLE 0xf5
58
#define KBD_DISABLE 0xf5
57
#define KBD_ACK     0xfa
59
#define KBD_ACK     0xfa
58
 
60
 
Line 134... Line 136...
134
        ipc_irq_send_notif(irq);
136
        ipc_irq_send_notif(irq);
135
    else {
137
    else {
136
        uint8_t data;
138
        uint8_t data;
137
        uint8_t status;
139
        uint8_t status;
138
       
140
       
139
        while (((status = i8042_status_read()) & i8042_BUFFER_FULL_MASK)) {
141
        while (((status = pio_read_8(i8042_STATUS)) &
-
 
142
            i8042_BUFFER_FULL_MASK)) {
140
            data = i8042_data_read();
143
            data = pio_read_8(i8042_DATA);
141
           
144
           
142
            if ((status & i8042_MOUSE_DATA))
145
            if ((status & i8042_MOUSE_DATA))
143
                continue;
146
                continue;
144
 
147
 
145
            if (data & KEY_RELEASE)
148
            if (data & KEY_RELEASE)
Line 149... Line 152...
149
        }
152
        }
150
    }
153
    }
151
}
154
}
152
 
155
 
153
/** Initialize i8042. */
156
/** Initialize i8042. */
-
 
157
void
154
void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr)
158
i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno,
-
 
159
    inr_t mouse_inr)
155
{
160
{
156
    chardev_initialize("i8042_kbd", &kbrd, &ops);
161
    chardev_initialize("i8042_kbd", &kbrd, &ops);
157
    stdin = &kbrd;
162
    stdin = &kbrd;
158
   
163
   
159
    irq_initialize(&i8042_kbd_irq);
164
    irq_initialize(&i8042_kbd_irq);
Line 176... Line 181...
176
    /*
181
    /*
177
     * Clear input buffer.
182
     * Clear input buffer.
178
     * Number of iterations is limited to prevent infinite looping.
183
     * Number of iterations is limited to prevent infinite looping.
179
     */
184
     */
180
    int i;
185
    int i;
181
    for (i = 0; (i8042_status_read() & i8042_BUFFER_FULL_MASK) && i < 100; i++) {
186
    for (i = 0; (pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK) &&
-
 
187
        i < 100; i++) {
182
        i8042_data_read();
188
        (void) pio_read_8(i8042_DATA);
183
    }
189
    }
184
   
190
   
185
    sysinfo_set_item_val("kbd", NULL, true);
191
    sysinfo_set_item_val("kbd", NULL, true);
186
    sysinfo_set_item_val("kbd.devno", NULL, kbd_devno);
192
    sysinfo_set_item_val("kbd.devno", NULL, kbd_devno);
187
    sysinfo_set_item_val("kbd.inr", NULL, kbd_inr);
193
    sysinfo_set_item_val("kbd.inr", NULL, kbd_inr);
Line 210... Line 216...
210
    char ch;
216
    char ch;
211
   
217
   
212
    while (!(ch = active_read_buff_read())) {
218
    while (!(ch = active_read_buff_read())) {
213
        uint8_t x;
219
        uint8_t x;
214
       
220
       
215
        while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK));
221
        while (!(pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK))
-
 
222
            ;
216
       
223
       
217
        x = i8042_data_read();
224
        x = pio_read_8(i8042_STATUS);
218
        if (x & KEY_RELEASE)
225
        if (x & KEY_RELEASE)
219
            key_released(x ^ KEY_RELEASE);
226
            key_released(x ^ KEY_RELEASE);
220
        else
227
        else
221
            active_read_key_pressed(x);
228
            active_read_key_pressed(x);
222
    }
229
    }