1 #include <devices/keyboard.h>
3 #include <palacios/vmm.h>
4 #include <palacios/vmm_types.h>
6 extern struct vmm_os_hooks *os_hooks;
8 extern void SerialPrint(const char *format, ...);
12 #define KEYBOARD_DATA_REG 0x60
13 #define KEYBOARD_CONTROL_REG 0x64
15 #define KEYBOARD_IRQ 0x1
19 struct keyboard_internal {
21 // figure this out later - it should be the internal state of the keyboard buffer and
22 // the emulated status, etc.
23 // which should be fed from the underlying OS and drained via this interface
29 int keyboard_reset_device(struct vm_device * dev)
31 // struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
33 SerialPrint("keyboard: reset device\n");
44 int keyboard_start_device(struct vm_device *dev)
46 SerialPrint("keyboard: start device\n");
51 int keyboard_stop_device(struct vm_device *dev)
53 SerialPrint("keyboard: stop device\n");
60 int keyboard_write_control_port(ushort_t port,
63 struct vm_device * dev)
65 //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
68 uchar_t data = *((uchar_t*)src);
69 PrintDebug("keyboard: write of 0x%x to control port\n",data);
70 Out_Byte(KEYBOARD_CONTROL_REG,data);
73 PrintDebug("keyboard: unknown size write to control port!\n");
78 int keyboard_read_control_port(ushort_t port,
81 struct vm_device * dev)
83 //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
87 PrintDebug("keyboard: read from control port: ");
88 data=In_Byte(KEYBOARD_CONTROL_REG);
89 PrintDebug("0x%x\n",data);
93 PrintDebug("keyboard: unknown size read from control port!\n");
98 int keyboard_write_data_port(ushort_t port,
101 struct vm_device * dev)
103 //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
106 uchar_t data = *((uchar_t*)src);
107 PrintDebug("keyboard: write of 0x%x to data port\n",data);
108 Out_Byte(KEYBOARD_DATA_REG,data);
111 PrintDebug("keyboard: unknown size write to data port!\n");
116 int keyboard_read_data_port(ushort_t port,
119 struct vm_device * dev)
121 //struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
125 PrintDebug("keyboard: read from data port: ");
126 data=In_Byte(KEYBOARD_DATA_REG);
127 PrintDebug("0x%x\n",data);
128 memcpy(dest,&data,1);
131 PrintDebug("keyboard: unknown size read from data port!\n");
137 int keyboard_interrupt(uint_t irq,
138 struct vm_device * dev)
140 PrintDebug("keyboard: interrupt\n");
146 int keyboard_init_device(struct vm_device * dev)
149 // struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
151 SerialPrint("keyboard: init_device\n");
153 // Would read state here
155 keyboard_reset_device(dev);
158 dev_hook_io(dev, KEYBOARD_DATA_REG, &keyboard_read_data_port, &keyboard_write_data_port);
159 dev_hook_io(dev, KEYBOARD_CONTROL_REG, &keyboard_read_control_port, &keyboard_write_control_port);
162 // currently assume this is done in vm.c?
163 //dev_hook_irq(dev,KEYBOARD_IRQ,&keyboard_interrupt);
169 int keyboard_deinit_device(struct vm_device *dev)
173 //dev_unhook_irq(dev,KEYBOARD_IRQ);
174 dev_unhook_io(dev, KEYBOARD_DATA_REG);
175 dev_unhook_io(dev, KEYBOARD_CONTROL_REG);
177 keyboard_reset_device(dev);
185 static struct vm_device_ops dev_ops = {
186 .init = keyboard_init_device,
187 .deinit = keyboard_deinit_device,
188 .reset = keyboard_reset_device,
189 .start = keyboard_start_device,
190 .stop = keyboard_stop_device,
196 struct vm_device *create_keyboard() {
197 struct keyboard_internal * keyboard_state = os_hooks->malloc(sizeof(struct keyboard_internal));
199 struct vm_device *device = create_device("KEYBOARD", &dev_ops, keyboard_state);