1 #include <devices/keyboard.h>
3 #include <palacios/vmm.h>
4 #include <palacios/vmm_types.h>
6 #define KEYBOARD_DEBUG 1
9 #define KEYBOARD_DEBUG_PRINT(first, rest...) PrintDebug(first, ##rest)
11 #define KEYBOARD_DEBUG_PRINT(first, rest...)
15 #define KEYBOARD_DATA_REG 0x60
16 #define KEYBOARD_CONTROL_REG 0x64
18 #define KEYBOARD_IRQ 0x1
22 // The currently targetted keyboard
23 static struct vm_device *thekeyboard=NULL;
26 struct keyboard_internal {
27 // read* is what is seen when reads are done from the VM
29 uchar_t read_scancode;
30 // write* is where we put the writes from the VM
32 uchar_t write_scancode;
34 uchar_t status_byte; // for on-board uC
36 uchar_t input_queue; // input queue is for communication *to* the on-board uC
37 uint_t input_queue_len; // num items queued
38 uchar_t output_queue; // output queue is for communcation *from* the on-board uC
39 uint_t output_queue_len; // num items queued
43 static struct vm_device *demultiplex_injected_key(uchar_t status, uchar_t scancode)
45 // this currently does nothing
49 int keyboard_interrupt(uint_t irq,struct vm_device * dev);
51 void deliver_key_to_vmm(uchar_t status, uchar_t scancode)
53 struct vm_device *dev = demultiplex_injected_key(status,scancode);
55 struct keyboard_internal *state = (struct keyboard_internal *)dev->private_data;
57 KEYBOARD_DEBUG_PRINT("keyboard: injected status 0x%x, and scancode 0x%x\n", status,scancode);
59 // This is wrong - the read status should be some combination of the
60 // status/scancode within the VM, and that of the actual device
61 state->read_status=status;
62 state->read_scancode=scancode;
64 keyboard_interrupt(KEYBOARD_IRQ,dev);
68 int keyboard_reset_device(struct vm_device * dev)
70 struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
72 memset(data,0,sizeof(struct keyboard_internal));
74 KEYBOARD_DEBUG_PRINT("keyboard: reset device\n");
84 int keyboard_start_device(struct vm_device *dev)
86 KEYBOARD_DEBUG_PRINT("keyboard: start device\n");
91 int keyboard_stop_device(struct vm_device *dev)
93 KEYBOARD_DEBUG_PRINT("keyboard: stop device\n");
100 int keyboard_write_control_port(ushort_t port,
103 struct vm_device * dev)
105 struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data;
108 uchar_t data = *((uchar_t*)src);
109 KEYBOARD_DEBUG_PRINT("keyboard: write of 0x%x to control port\n",data);
110 state->write_status=data;
113 KEYBOARD_DEBUG_PRINT("keyboard: unknown size write to control port!\n");
118 int keyboard_read_control_port(ushort_t port,
121 struct vm_device * dev)
123 struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data;
127 KEYBOARD_DEBUG_PRINT("keyboard: read from control port: ");
128 data=state->read_status;
129 KEYBOARD_DEBUG_PRINT("0x%x\n",data);
130 memcpy(dest,&data,length);
133 KEYBOARD_DEBUG_PRINT("keyboard: unknown size read from control port!\n");
138 int keyboard_write_data_port(ushort_t port,
141 struct vm_device * dev)
143 struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data;
146 uchar_t data = *((uchar_t*)src);
147 KEYBOARD_DEBUG_PRINT("keyboard: write of 0x%x to data port\n",data);
148 state->write_scancode=data;
151 KEYBOARD_DEBUG_PRINT("keyboard: unknown size write to data port!\n");
156 int keyboard_read_data_port(ushort_t port,
159 struct vm_device * dev)
161 struct keyboard_internal *state = (struct keyboard_internal *) dev->private_data;
165 KEYBOARD_DEBUG_PRINT("keyboard: read from data port: ");
166 data=state->read_scancode;
167 KEYBOARD_DEBUG_PRINT("0x%x\n",data);
168 memcpy(dest,&data,1);
171 KEYBOARD_DEBUG_PRINT("keyboard: unknown size read from data port!\n");
177 int keyboard_interrupt(uint_t irq,
178 struct vm_device * dev)
180 KEYBOARD_DEBUG_PRINT("keyboard: interrupt\n");
182 dev->vm->vm_ops.raise_irq(dev->vm,irq);
189 int keyboard_init_device(struct vm_device * dev)
192 // struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data;
194 KEYBOARD_DEBUG_PRINT("keyboard: init_device\n");
196 // Would read state here
198 keyboard_reset_device(dev);
201 dev_hook_io(dev, KEYBOARD_DATA_REG, &keyboard_read_data_port, &keyboard_write_data_port);
202 dev_hook_io(dev, KEYBOARD_CONTROL_REG, &keyboard_read_control_port, &keyboard_write_control_port);
205 // We do not hook the IRQ here. Instead, the underlying device driver
206 // is responsible to call us back
212 int keyboard_deinit_device(struct vm_device *dev)
215 dev_unhook_io(dev, KEYBOARD_DATA_REG);
216 dev_unhook_io(dev, KEYBOARD_CONTROL_REG);
218 keyboard_reset_device(dev);
226 static struct vm_device_ops dev_ops = {
227 .init = keyboard_init_device,
228 .deinit = keyboard_deinit_device,
229 .reset = keyboard_reset_device,
230 .start = keyboard_start_device,
231 .stop = keyboard_stop_device,
237 struct vm_device *create_keyboard() {
239 if (thekeyboard!=NULL) {
240 KEYBOARD_DEBUG_PRINT("keyboard: creating >1 keyboard device. This will probably fail!\n");
243 struct keyboard_internal * keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal));
245 struct vm_device *device = create_device("KEYBOARD", &dev_ops, keyboard_state);