Subversion Repositories HelenOS

Rev

Rev 1787 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1787 Rev 1928
Line 31... Line 31...
31
 */
31
 */
32
/** @file
32
/** @file
33
 */
33
 */
34
 
34
 
35
#include <arch/drivers/cuda.h>
35
#include <arch/drivers/cuda.h>
-
 
36
#include <ddi/irq.h>
36
#include <arch/asm.h>
37
#include <arch/asm.h>
37
#include <console/console.h>
38
#include <console/console.h>
38
#include <console/chardev.h>
39
#include <console/chardev.h>
39
#include <arch/drivers/pic.h>
40
#include <arch/drivers/pic.h>
40
#include <sysinfo/sysinfo.h>
41
#include <sysinfo/sysinfo.h>
41
#include <interrupt.h>
42
#include <interrupt.h>
42
#include <stdarg.h>
43
#include <stdarg.h>
43
 
44
 
-
 
45
#define CUDA_IRQ 10
44
#define SPECIAL     '?'
46
#define SPECIAL     '?'
45
 
47
 
46
#define PACKET_ADB  0x00
48
#define PACKET_ADB  0x00
47
#define PACKET_CUDA 0x01
49
#define PACKET_CUDA 0x01
48
 
50
 
Line 58... Line 60...
58
#define TACK 0x10
60
#define TACK 0x10
59
#define TIP 0x20
61
#define TIP 0x20
60
 
62
 
61
 
63
 
62
static volatile uint8_t *cuda = NULL;
64
static volatile uint8_t *cuda = NULL;
-
 
65
static irq_t cuda_irq;      /**< Cuda's IRQ. */
-
 
66
 
63
static iroutine vector;
67
static ipc_notif_cfg_t saved_notif_cfg;
64
 
68
 
65
 
69
 
66
static char lchars[0x80] = {
70
static char lchars[0x80] = {
67
    'a',
71
    'a',
68
    's',
72
    's',
Line 246... Line 250...
246
        return data[2];
250
        return data[2];
247
   
251
   
248
    return -1;
252
    return -1;
249
}
253
}
250
 
254
 
251
static void cuda_irq(int n, istate_t *istate)
255
static void cuda_irq_handler(irq_t *irq, void *arg, ...)
252
{
256
{
-
 
257
    if (irq->notif_cfg.answerbox)
-
 
258
        ipc_irq_send_notif(irq);
-
 
259
    else {
253
    int scan_code = cuda_get_scancode();
260
        int scan_code = cuda_get_scancode();
254
   
261
       
255
    if (scan_code != -1) {
262
        if (scan_code != -1) {
256
        uint8_t scancode = (uint8_t) scan_code;
263
            uint8_t scancode = (uint8_t) scan_code;
257
        if ((scancode & 0x80) != 0x80)
264
            if ((scancode & 0x80) != 0x80)
258
            chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
265
                chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
-
 
266
        }
259
    }
267
    }
260
}
268
}
261
 
269
 
-
 
270
static irq_ownership_t cuda_claim(void)
-
 
271
{
-
 
272
    return IRQ_ACCEPT;
-
 
273
}
-
 
274
 
262
 
275
 
263
/** Initialize keyboard and service interrupts using kernel routine */
276
/** Initialize keyboard and service interrupts using kernel routine */
264
void cuda_grab(void)
277
void cuda_grab(void)
265
{
278
{
-
 
279
    if (cuda_irq.notif_cfg.answerbox) {
266
    vector = int_register(CUDA_IRQ, "cuda", cuda_irq);
280
        saved_notif_cfg = cuda_irq.notif_cfg;
-
 
281
        cuda_irq.notif_cfg.answerbox = NULL;
-
 
282
        cuda_irq.notif_cfg.code = NULL;
-
 
283
        cuda_irq.notif_cfg.method = 0;
-
 
284
        cuda_irq.notif_cfg.counter = 0;
-
 
285
    }
267
}
286
}
268
 
287
 
269
 
288
 
270
/** Resume the former interrupt vector */
289
/** Resume the former interrupt vector */
271
void cuda_release(void)
290
void cuda_release(void)
272
{
291
{
273
    if (vector)
292
    if (saved_notif_cfg.answerbox)
274
        int_register(CUDA_IRQ, "user_interrupt", vector);
293
        cuda_irq.notif_cfg = saved_notif_cfg;
275
}
294
}
276
 
295
 
277
 
296
 
278
void cuda_init(uintptr_t base, size_t size)
297
void cuda_init(devno_t devno, uintptr_t base, size_t size)
279
{
298
{
280
    cuda = (uint8_t *) hw_map(base, size);
299
    cuda = (uint8_t *) hw_map(base, size); 
281
   
-
 
282
    int_register(CUDA_IRQ, "cuda", cuda_irq);
-
 
283
    pic_enable_interrupt(CUDA_IRQ);
-
 
284
   
300
   
285
    chardev_initialize("cuda_kbd", &kbrd, &ops);
301
    chardev_initialize("cuda_kbd", &kbrd, &ops);
286
    stdin = &kbrd;
302
    stdin = &kbrd;
287
   
303
   
-
 
304
    irq_initialize(&cuda_irq);
-
 
305
    cuda_irq.devno = devno;
-
 
306
    cuda_irq.inr = CUDA_IRQ;
-
 
307
    cuda_irq.claim = cuda_claim;
-
 
308
    cuda_irq.handler = cuda_irq_handler;
-
 
309
    irq_register(&cuda_irq);
-
 
310
   
-
 
311
    pic_enable_interrupt(CUDA_IRQ);
-
 
312
 
288
    sysinfo_set_item_val("cuda", NULL, true);
313
    sysinfo_set_item_val("kbd", NULL, true);
-
 
314
    sysinfo_set_item_val("kbd.devno", NULL, devno);
289
    sysinfo_set_item_val("cuda.irq", NULL, CUDA_IRQ);
315
    sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ);
-
 
316
    sysinfo_set_item_val("kbd.address.virtual", NULL, base);
-
 
317
 
-
 
318
    cuda_grab();
290
}
319
}
291
 
320
 
292
 
321
 
293
void send_packet(const uint8_t kind, index_t count, ...)
322
void send_packet(const uint8_t kind, index_t count, ...)
294
{
323
{