diff --git a/devicemodel/core/console.c b/devicemodel/core/console.c index 18b23322b..6f916bf95 100644 --- a/devicemodel/core/console.c +++ b/devicemodel/core/console.c @@ -24,6 +24,7 @@ * SUCH DAMAGE. */ +#include #include #include @@ -91,6 +92,14 @@ console_kbd_register(kbd_event_func_t event_cb, void *arg, int pri) } } +void +console_kbd_unregister(void) +{ + console.kbd_event_cb = NULL; + console.kbd_arg = NULL; + console.kbd_priority = 0; +} + void console_ptr_register(ptr_event_func_t event_cb, void *arg, int pri) { @@ -101,6 +110,14 @@ console_ptr_register(ptr_event_func_t event_cb, void *arg, int pri) } } +void +console_ptr_unregister() +{ + console.ptr_event_cb = NULL; + console.ptr_arg = NULL; + console.ptr_priority = 0; +} + void console_key_event(int down, uint32_t keysym) { diff --git a/devicemodel/hw/platform/atkbdc.c b/devicemodel/hw/platform/atkbdc.c index d0049c93c..0ced38759 100644 --- a/devicemodel/hw/platform/atkbdc.c +++ b/devicemodel/hw/platform/atkbdc.c @@ -42,93 +42,12 @@ #include "pci_core.h" #include "irq.h" #include "lpc.h" +#include "atkbdc.h" #include "ps2kbd.h" #include "ps2mouse.h" #include "vmm.h" #include "vmmapi.h" -#define KBD_DATA_PORT 0x60 - -#define KBD_STS_CTL_PORT 0x64 - -#define KBDC_RESET 0xfe - -#define KBD_DEV_IRQ 1 -#define AUX_DEV_IRQ 12 - -/* controller commands */ -#define KBDC_SET_COMMAND_BYTE 0x60 -#define KBDC_GET_COMMAND_BYTE 0x20 -#define KBDC_DISABLE_AUX_PORT 0xa7 -#define KBDC_ENABLE_AUX_PORT 0xa8 -#define KBDC_TEST_AUX_PORT 0xa9 -#define KBDC_TEST_CTRL 0xaa -#define KBDC_TEST_KBD_PORT 0xab -#define KBDC_DISABLE_KBD_PORT 0xad -#define KBDC_ENABLE_KBD_PORT 0xae -#define KBDC_READ_INPORT 0xc0 -#define KBDC_READ_OUTPORT 0xd0 -#define KBDC_WRITE_OUTPORT 0xd1 -#define KBDC_WRITE_KBD_OUTBUF 0xd2 -#define KBDC_WRITE_AUX_OUTBUF 0xd3 -#define KBDC_WRITE_TO_AUX 0xd4 - -/* controller command byte (set by KBDC_SET_COMMAND_BYTE) */ -#define KBD_TRANSLATION 0x40 -#define KBD_SYS_FLAG_BIT 0x04 -#define KBD_DISABLE_KBD_PORT 0x10 -#define KBD_DISABLE_AUX_PORT 0x20 -#define KBD_ENABLE_AUX_INT 0x02 -#define KBD_ENABLE_KBD_INT 0x01 -#define KBD_KBD_CONTROL_BITS (KBD_DISABLE_KBD_PORT | KBD_ENABLE_KBD_INT) -#define KBD_AUX_CONTROL_BITS (KBD_DISABLE_AUX_PORT | KBD_ENABLE_AUX_INT) - -/* controller status bits */ -#define KBDS_KBD_BUFFER_FULL 0x01 -#define KBDS_SYS_FLAG 0x04 -#define KBDS_CTRL_FLAG 0x08 -#define KBDS_AUX_BUFFER_FULL 0x20 - -/* controller output port */ -#define KBDO_KBD_OUTFULL 0x10 -#define KBDO_AUX_OUTFULL 0x20 - -#define RAMSZ 32 -#define FIFOSZ 15 -#define CTRL_CMD_FLAG 0x8000 - -struct kbd_dev { - bool irq_active; - int irq; - - uint8_t buffer[FIFOSZ]; - int brd, bwr; - int bcnt; -}; - -struct aux_dev { - bool irq_active; - int irq; -}; - -struct atkbdc_base { - struct vmctx *ctx; - pthread_mutex_t mtx; - - struct ps2kbd_info *ps2kbd; - struct ps2mouse_info *ps2mouse; - - uint8_t status; /* status register */ - uint8_t outport; /* controller output port */ - uint8_t ram[RAMSZ]; /* byte0 = controller config */ - - uint32_t curcmd; /* current command for next byte */ - uint32_t ctrlbyte; - - struct kbd_dev kbd; - struct aux_dev aux; -}; - static void atkbdc_assert_kbd_intr(struct atkbdc_base *base) { diff --git a/devicemodel/hw/platform/ps2kbd.c b/devicemodel/hw/platform/ps2kbd.c index 87b059f82..d6dba7024 100644 --- a/devicemodel/hw/platform/ps2kbd.c +++ b/devicemodel/hw/platform/ps2kbd.c @@ -475,3 +475,11 @@ ps2kbd_init(struct atkbdc_base *base) return kbd; } + +void +ps2kbd_deinit(struct atkbdc_base *base) +{ + console_kbd_unregister(); + free(base->ps2kbd); + base->ps2kbd = NULL; +} diff --git a/devicemodel/hw/platform/ps2mouse.c b/devicemodel/hw/platform/ps2mouse.c index f158825c1..b72a2c3c7 100644 --- a/devicemodel/hw/platform/ps2mouse.c +++ b/devicemodel/hw/platform/ps2mouse.c @@ -410,3 +410,12 @@ ps2mouse_init(struct atkbdc_base *base) return mouse; } + +void +ps2mouse_deinit(struct atkbdc_base *base) +{ + console_ptr_unregister(); + fifo_reset(base->ps2mouse); + free(base->ps2mouse); + base->ps2mouse = NULL; +} diff --git a/devicemodel/include/atkbdc.h b/devicemodel/include/atkbdc.h index 7920ae11c..0fe62e235 100644 --- a/devicemodel/include/atkbdc.h +++ b/devicemodel/include/atkbdc.h @@ -29,9 +29,90 @@ #ifndef _ATKBDC_H_ #define _ATKBDC_H_ -struct atkbdc_base; +#define KBD_DATA_PORT 0x60 + +#define KBD_STS_CTL_PORT 0x64 + +#define KBDC_RESET 0xfe + +#define KBD_DEV_IRQ 1 +#define AUX_DEV_IRQ 12 + +/* controller commands */ +#define KBDC_SET_COMMAND_BYTE 0x60 +#define KBDC_GET_COMMAND_BYTE 0x20 +#define KBDC_DISABLE_AUX_PORT 0xa7 +#define KBDC_ENABLE_AUX_PORT 0xa8 +#define KBDC_TEST_AUX_PORT 0xa9 +#define KBDC_TEST_CTRL 0xaa +#define KBDC_TEST_KBD_PORT 0xab +#define KBDC_DISABLE_KBD_PORT 0xad +#define KBDC_ENABLE_KBD_PORT 0xae +#define KBDC_READ_INPORT 0xc0 +#define KBDC_READ_OUTPORT 0xd0 +#define KBDC_WRITE_OUTPORT 0xd1 +#define KBDC_WRITE_KBD_OUTBUF 0xd2 +#define KBDC_WRITE_AUX_OUTBUF 0xd3 +#define KBDC_WRITE_TO_AUX 0xd4 + +/* controller command byte (set by KBDC_SET_COMMAND_BYTE) */ +#define KBD_TRANSLATION 0x40 +#define KBD_SYS_FLAG_BIT 0x04 +#define KBD_DISABLE_KBD_PORT 0x10 +#define KBD_DISABLE_AUX_PORT 0x20 +#define KBD_ENABLE_AUX_INT 0x02 +#define KBD_ENABLE_KBD_INT 0x01 +#define KBD_KBD_CONTROL_BITS (KBD_DISABLE_KBD_PORT | KBD_ENABLE_KBD_INT) +#define KBD_AUX_CONTROL_BITS (KBD_DISABLE_AUX_PORT | KBD_ENABLE_AUX_INT) + +/* controller status bits */ +#define KBDS_KBD_BUFFER_FULL 0x01 +#define KBDS_SYS_FLAG 0x04 +#define KBDS_CTRL_FLAG 0x08 +#define KBDS_AUX_BUFFER_FULL 0x20 + +/* controller output port */ +#define KBDO_KBD_OUTFULL 0x10 +#define KBDO_AUX_OUTFULL 0x20 + +#define RAMSZ 32 +#define FIFOSZ 15 +#define CTRL_CMD_FLAG 0x8000 + struct vmctx; +struct kbd_dev { + bool irq_active; + int irq; + + uint8_t buffer[FIFOSZ]; + int brd, bwr; + int bcnt; +}; + +struct aux_dev { + bool irq_active; + int irq; +}; + +struct atkbdc_base { + struct vmctx *ctx; + pthread_mutex_t mtx; + + struct ps2kbd_info *ps2kbd; + struct ps2mouse_info *ps2mouse; + + uint8_t status; /* status register */ + uint8_t outport; /* controller output port */ + uint8_t ram[RAMSZ]; /* byte0 = controller config */ + + uint32_t curcmd; /* current command for next byte */ + uint32_t ctrlbyte; + + struct kbd_dev kbd; + struct aux_dev aux; +}; + void atkbdc_init(struct vmctx *ctx); void atkbdc_event(struct atkbdc_base *base, int iskbd); diff --git a/devicemodel/include/console.h b/devicemodel/include/console.h index f48b3e339..881040619 100644 --- a/devicemodel/include/console.h +++ b/devicemodel/include/console.h @@ -45,9 +45,11 @@ void console_fb_register(fb_render_func_t render_cb, void *arg); void console_refresh(void); void console_kbd_register(kbd_event_func_t event_cb, void *arg, int pri); +void console_kbd_unregister(void); void console_key_event(int down, uint32_t keysym); void console_ptr_register(ptr_event_func_t event_cb, void *arg, int pri); +void console_ptr_unregister(void); void console_ptr_event(uint8_t button, int x, int y); #endif /* _CONSOLE_H_ */ diff --git a/devicemodel/include/ps2kbd.h b/devicemodel/include/ps2kbd.h index a1a6247c4..8dd16f9f0 100644 --- a/devicemodel/include/ps2kbd.h +++ b/devicemodel/include/ps2kbd.h @@ -32,6 +32,7 @@ struct atkbdc_base; struct ps2kbd_info *ps2kbd_init(struct atkbdc_base *base); +void ps2kbd_deinit(struct atkbdc_base *base); int ps2kbd_read(struct ps2kbd_info *kbd, uint8_t *val); void ps2kbd_write(struct ps2kbd_info *kbd, uint8_t val); diff --git a/devicemodel/include/ps2mouse.h b/devicemodel/include/ps2mouse.h index 856365101..ccb18228a 100644 --- a/devicemodel/include/ps2mouse.h +++ b/devicemodel/include/ps2mouse.h @@ -32,6 +32,7 @@ struct atkbdc_base; struct ps2mouse_info *ps2mouse_init(struct atkbdc_base *base); +void ps2mouse_deinit(struct atkbdc_base *base); int ps2mouse_read(struct ps2mouse_info *mouse, uint8_t *val); void ps2mouse_write(struct ps2mouse_info *mouse, uint8_t val, int insert);