Subversion Repositories HelenOS

Rev

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

Rev 3022 Rev 4055
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 <ipc/irq.h>
-
 
37
#include <arch/asm.h>
36
#include <arch/asm.h>
38
#include <console/console.h>
37
#include <console/console.h>
39
#include <console/chardev.h>
38
#include <console/chardev.h>
40
#include <arch/drivers/pic.h>
39
#include <arch/drivers/pic.h>
41
#include <sysinfo/sysinfo.h>
40
#include <sysinfo/sysinfo.h>
Line 234... Line 233...
234
};
233
};
235
 
234
 
236
 
235
 
237
int cuda_get_scancode(void)
236
int cuda_get_scancode(void)
238
{
237
{
-
 
238
    if (cuda) {
239
    uint8_t kind;
239
        uint8_t kind;
240
    uint8_t data[4];
240
        uint8_t data[4];
241
   
241
       
242
    receive_packet(&kind, 4, data);
242
        receive_packet(&kind, 4, data);
243
   
243
       
244
    if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c))
244
        if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c))
245
        return data[2];
245
            return data[2];
-
 
246
    }
246
   
247
   
247
    return -1;
248
    return -1;
248
}
249
}
249
 
250
 
250
static void cuda_irq_handler(irq_t *irq, void *arg, ...)
251
static void cuda_irq_handler(irq_t *irq)
251
{
252
{
252
    if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
-
 
253
        ipc_irq_send_notif(irq);
-
 
254
    else {
-
 
255
        int scan_code = cuda_get_scancode();
253
    int scan_code = cuda_get_scancode();
256
       
254
       
257
        if (scan_code != -1) {
255
    if (scan_code != -1) {
258
            uint8_t scancode = (uint8_t) scan_code;
256
        uint8_t scancode = (uint8_t) scan_code;
259
            if ((scancode & 0x80) != 0x80)
257
        if ((scancode & 0x80) != 0x80)
260
                chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
258
            chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
261
        }
-
 
262
    }
259
    }
263
}
260
}
264
 
261
 
265
static irq_ownership_t cuda_claim(void)
262
static irq_ownership_t cuda_claim(irq_t *irq)
266
{
263
{
267
    return IRQ_ACCEPT;
264
    return IRQ_ACCEPT;
268
}
265
}
269
 
266
 
270
 
-
 
271
/** Initialize keyboard and service interrupts using kernel routine */
-
 
272
void cuda_grab(void)
-
 
273
{
-
 
274
    ipl_t ipl = interrupts_disable();
-
 
275
    spinlock_lock(&cuda_irq.lock);
-
 
276
    cuda_irq.notif_cfg.notify = false;
-
 
277
    spinlock_unlock(&cuda_irq.lock);
-
 
278
    interrupts_restore(ipl);
-
 
279
}
-
 
280
 
-
 
281
 
-
 
282
/** Resume the former interrupt vector */
-
 
283
void cuda_release(void)
-
 
284
{
-
 
285
    ipl_t ipl = interrupts_disable();
-
 
286
    spinlock_lock(&cuda_irq.lock);
-
 
287
    if (cuda_irq.notif_cfg.answerbox)
-
 
288
        cuda_irq.notif_cfg.notify = true;
-
 
289
    spinlock_unlock(&cuda_irq.unlock);
-
 
290
    interrupts_restore(ipl);
-
 
291
}
-
 
292
 
-
 
293
 
-
 
294
void cuda_init(devno_t devno, uintptr_t base, size_t size)
267
void cuda_init(devno_t devno, uintptr_t base, size_t size)
295
{
268
{
296
    cuda = (uint8_t *) hw_map(base, size); 
269
    cuda = (uint8_t *) hw_map(base, size);
297
   
270
   
298
    chardev_initialize("cuda_kbd", &kbrd, &ops);
271
    chardev_initialize("cuda_kbd", &kbrd, &ops);
299
    stdin = &kbrd;
272
    stdin = &kbrd;
300
   
273
   
301
    irq_initialize(&cuda_irq);
274
    irq_initialize(&cuda_irq);
Line 304... Line 277...
304
    cuda_irq.claim = cuda_claim;
277
    cuda_irq.claim = cuda_claim;
305
    cuda_irq.handler = cuda_irq_handler;
278
    cuda_irq.handler = cuda_irq_handler;
306
    irq_register(&cuda_irq);
279
    irq_register(&cuda_irq);
307
   
280
   
308
    pic_enable_interrupt(CUDA_IRQ);
281
    pic_enable_interrupt(CUDA_IRQ);
309
 
282
   
310
    sysinfo_set_item_val("kbd", NULL, true);
283
    sysinfo_set_item_val("kbd", NULL, true);
311
    sysinfo_set_item_val("kbd.devno", NULL, devno);
284
    sysinfo_set_item_val("kbd.devno", NULL, devno);
312
    sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ);
285
    sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ);
313
    sysinfo_set_item_val("kbd.address.virtual", NULL, base);
286
    sysinfo_set_item_val("kbd.address.virtual", NULL, base);
314
}
287
}
Line 343... Line 316...
343
        "b 0\n"
316
        "b 0\n"
344
    );
317
    );
345
}
318
}
346
 
319
 
347
void arch_reboot(void) {
320
void arch_reboot(void) {
-
 
321
    if (cuda)
348
    send_packet(PACKET_CUDA, 1, CUDA_RESET);
322
        send_packet(PACKET_CUDA, 1, CUDA_RESET);
-
 
323
   
349
    asm volatile (
324
    asm volatile (
350
        "b 0\n"
325
        "b 0\n"
351
    );
326
    );
352
}
327
}
353
 
328