/trunk/kernel/genarch/include/kbd/z8530.h |
---|
37,10 → 37,9 |
#ifndef KERN_Z8530_H_ |
#define KERN_Z8530_H_ |
#include <irq.h> |
#include <typedefs.h> |
#define Z8530_INTRCV_DATA0 0x39 /* hardcoded for use in Simics */ |
extern bool z8530_belongs_to_kernel; |
extern void z8530_init(void); |
49,6 → 48,8 |
extern void z8530_release(void); |
extern void z8530_interrupt(void); |
extern char z8530_key_read(chardev_t *d); |
extern irq_ownership_t z8530_claim(void); |
extern void z8530_irq_handler(irq_t *irq, void *arg, ...); |
#endif |
/trunk/kernel/genarch/include/kbd/ns16550.h |
---|
38,6 → 38,7 |
#define KERN_NS16550_H_ |
#include <typedefs.h> |
#include <irq.h> |
extern void ns16550_init(void); |
extern void ns16550_poll(void); |
44,6 → 45,8 |
extern void ns16550_grab(void); |
extern void ns16550_release(void); |
extern char ns16550_key_read(chardev_t *d); |
extern irq_ownership_t ns16550_claim(void); |
extern void ns16550_irq_handler(irq_t *irq, void *arg, ...); |
#endif |
/trunk/kernel/genarch/src/kbd/ns16550.c |
---|
39,6 → 39,7 |
#include <genarch/kbd/scanc.h> |
#include <genarch/kbd/scanc_sun.h> |
#include <arch/drivers/ns16550.h> |
#include <irq.h> |
#include <arch/interrupt.h> |
#include <cpu.h> |
#include <arch/asm.h> |
160,5 → 161,16 |
} |
} |
irq_ownership_t ns16550_claim(void) |
{ |
/* TODO */ |
return IRQ_ACCEPT; |
} |
void ns16550_irq_handler(irq_t *irq, void *arg, ...) |
{ |
panic("Not yet implemented.\n"); |
} |
/** @} |
*/ |
/trunk/kernel/genarch/src/kbd/z8530.c |
---|
39,8 → 39,10 |
#include <genarch/kbd/scanc.h> |
#include <genarch/kbd/scanc_sun.h> |
#include <arch/drivers/z8530.h> |
#include <irq.h> |
#include <arch/interrupt.h> |
#include <arch/drivers/kbd.h> |
#include <arch/drivers/fhc.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
169,5 → 171,26 |
} |
} |
irq_ownership_t z8530_claim(void) |
{ |
return (z8530_read_a(RR0) & RR0_RCA); |
} |
void z8530_irq_handler(irq_t *irq, void *arg, ...) |
{ |
/* |
* So far, we know we got this interrupt through the FHC. |
* Since we don't have enough information about the FHC and |
* because the interrupt looks like level sensitive, |
* we cannot handle it by scheduling one of the level |
* interrupt traps. Process the interrupt directly. |
*/ |
if (z8530_belongs_to_kernel) |
z8530_interrupt(); |
else |
ipc_irq_send_notif(0); |
fhc_clear_interrupt(central_fhc, irq->inr); |
} |
/** @} |
*/ |