1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
/* Portions copyright (c) 2003 James Scott, Intel Research Cambridge */
/*
* Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard
* and mouse commands
*/
/* Based on:
* linux/include/asm-i386/keyboard.h
*
* Created 3 Nov 1996 by Geert Uytterhoeven
*/
#ifndef _XEN_KEYBOARD_H
#define _XEN_KEYBOARD_H
#ifdef __KERNEL__
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/kd.h>
#include <linux/pm.h>
#include <asm/io.h>
extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode);
extern int pckbd_getkeycode(unsigned int scancode);
extern int pckbd_translate(unsigned char scancode, unsigned char *keycode,
char raw_mode);
extern char pckbd_unexpected_up(unsigned char keycode);
extern void pckbd_leds(unsigned char leds);
extern void pckbd_init_hw(void);
extern int pckbd_pm_resume(struct pm_dev *, pm_request_t, void *);
extern pm_callback pm_kbd_request_override;
extern unsigned char pckbd_sysrq_xlate[128];
#define kbd_setkeycode pckbd_setkeycode
#define kbd_getkeycode pckbd_getkeycode
#define kbd_translate pckbd_translate
#define kbd_unexpected_up pckbd_unexpected_up
#define kbd_leds pckbd_leds
#define kbd_init_hw pckbd_init_hw
#define kbd_sysrq_xlate pckbd_sysrq_xlate
#define SYSRQ_KEY 0x54
/* THIS SECTION TALKS TO XEN TO DO PS2 SUPPORT */
#include <asm/hypervisor-ifs/kbd.h>
#include <asm/hypervisor-ifs/hypervisor-if.h>
#define kbd_controller_present xen_kbd_controller_present
static inline int xen_kbd_controller_present ()
{
return start_info.flags & SIF_INITDOMAIN;
}
/* resource allocation */
#define kbd_request_region() \
do { } while (0)
#define kbd_request_irq(handler) \
do { \
int irq = bind_virq_to_irq(VIRQ_PS2); \
request_irq(irq, handler, 0, "ps/2", NULL); \
} while ( 0 )
/* could implement these with command to xen to filter mouse stuff... */
#define aux_request_irq(hand, dev_id) 0
#define aux_free_irq(dev_id) do { } while(0)
/* Some stoneage hardware needs delays after some operations. */
#define kbd_pause() do { } while(0)
static unsigned char kbd_current_scancode = 0;
static unsigned char kbd_read_input(void)
{
return kbd_current_scancode;
}
static unsigned char kbd_read_status(void)
{
long res;
res = HYPERVISOR_kbd_op(KBD_OP_READ,0);
if ( res<0 )
{
kbd_current_scancode = 0;
return 0; /* error with our request - wrong domain? */
}
kbd_current_scancode = KBD_CODE_SCANCODE(res);
return KBD_CODE_STATUS(res);
}
#define kbd_write_output(val) HYPERVISOR_kbd_op(KBD_OP_WRITEOUTPUT, val);
#define kbd_write_command(val) HYPERVISOR_kbd_op(KBD_OP_WRITECOMMAND, val);
#endif /* __KERNEL__ */
#endif /* _XEN_KEYBOARD_H */
|