These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / drivers / usb / usbkbd.h
1 #ifndef _USBKBD_H
2 #define _USBKBD_H
3
4 /** @file
5  *
6  * USB keyboard driver
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
12 #include <assert.h>
13 #include <ipxe/usb.h>
14 #include <ipxe/usbhid.h>
15
16 /** Keyboard protocol */
17 #define USBKBD_PROTOCOL 1
18
19 /** A USB keyboard report */
20 struct usb_keyboard_report {
21         /** Modifier keys */
22         uint8_t modifiers;
23         /** Reserved */
24         uint8_t reserved;
25         /** Keycodes */
26         uint8_t keycode[6];
27 } __attribute__ (( packed ));
28
29 /** USB modifier keys */
30 enum usb_keyboard_modifier {
31         /** Left Ctrl key */
32         USBKBD_CTRL_LEFT = 0x01,
33         /** Left Shift key */
34         USBKBD_SHIFT_LEFT = 0x02,
35         /** Left Alt key */
36         USBKBD_ALT_LEFT = 0x04,
37         /** Left GUI key */
38         USBKBD_GUI_LEFT = 0x08,
39         /** Right Ctrl key */
40         USBKBD_CTRL_RIGHT = 0x10,
41         /** Right Shift key */
42         USBKBD_SHIFT_RIGHT = 0x20,
43         /** Right Alt key */
44         USBKBD_ALT_RIGHT = 0x40,
45         /** Right GUI key */
46         USBKBD_GUI_RIGHT = 0x80,
47 };
48
49 /** Either Ctrl key */
50 #define USBKBD_CTRL ( USBKBD_CTRL_LEFT | USBKBD_CTRL_RIGHT )
51
52 /** Either Shift key */
53 #define USBKBD_SHIFT ( USBKBD_SHIFT_LEFT | USBKBD_SHIFT_RIGHT )
54
55 /** Either Alt key */
56 #define USBKBD_ALT ( USBKBD_ALT_LEFT | USBKBD_ALT_RIGHT )
57
58 /** Either GUI key */
59 #define USBKBD_GUI ( USBKBD_GUI_LEFT | USBKBD_GUI_RIGHT )
60
61 /** USB keycodes */
62 enum usb_keycode {
63         USBKBD_KEY_A = 0x04,
64         USBKBD_KEY_Z = 0x1d,
65         USBKBD_KEY_1 = 0x1e,
66         USBKBD_KEY_0 = 0x27,
67         USBKBD_KEY_ENTER = 0x28,
68         USBKBD_KEY_SPACE = 0x2c,
69         USBKBD_KEY_MINUS = 0x2d,
70         USBKBD_KEY_SLASH = 0x38,
71         USBKBD_KEY_CAPSLOCK = 0x39,
72         USBKBD_KEY_UP = 0x52,
73 };
74
75 /** Keyboard idle duration (in 4ms units)
76  *
77  * This is a policy decision.  We choose to use an autorepeat rate of
78  * approximately 40ms.
79  */
80 #define USBKBD_IDLE_DURATION 10 /* 10 x 4ms = 40ms */
81
82 /** Keyboard auto-repeat hold-off (in units of USBKBD_IDLE_DURATION)
83  *
84  * This is a policy decision.  We choose to use an autorepeat delay of
85  * approximately 500ms.
86  */
87 #define USBKBD_HOLDOFF 12 /* 12 x 40ms = 480ms */
88
89 /** Interrupt endpoint maximum fill level
90  *
91  * When idling, we are likely to poll the USB endpoint at only the
92  * 18.2Hz system timer tick rate.  With a typical observed bInterval
93  * of 10ms (which will be rounded down to 8ms by the HCI drivers),
94  * this gives approximately 7 completions per poll.
95  */
96 #define USBKBD_INTR_MAX_FILL 8
97
98 /** Keyboard buffer size
99  *
100  * Must be a power of two.
101  */
102 #define USBKBD_BUFSIZE 8
103
104 /** A USB keyboard device */
105 struct usb_keyboard {
106         /** Name */
107         const char *name;
108         /** List of all USB keyboards */
109         struct list_head list;
110
111         /** USB bus */
112         struct usb_bus *bus;
113         /** USB human interface device */
114         struct usb_hid hid;
115
116         /** Most recent keyboard report */
117         struct usb_keyboard_report report;
118         /** Most recently pressed non-modifier key (if any) */
119         unsigned int keycode;
120         /** Autorepeat hold-off time (in number of completions reported) */
121         unsigned int holdoff;
122
123         /** Keyboard buffer
124          *
125          * This stores iPXE key values.
126          */
127         unsigned int key[USBKBD_BUFSIZE];
128         /** Keyboard buffer producer counter */
129         unsigned int prod;
130         /** Keyboard buffer consumer counter */
131         unsigned int cons;
132         /** Keyboard buffer sub-consumer counter
133          *
134          * This represents the index within the ANSI escape sequence
135          * corresponding to an iPXE key value.
136          */
137         unsigned int subcons;
138 };
139
140 /**
141  * Calculate keyboard buffer fill level
142  *
143  * @v kbd               USB keyboard
144  * @ret fill            Keyboard buffer fill level
145  */
146 static inline __attribute__ (( always_inline )) unsigned int
147 usbkbd_fill ( struct usb_keyboard *kbd ) {
148         unsigned int fill = ( kbd->prod - kbd->cons );
149
150         assert ( fill <= USBKBD_BUFSIZE );
151         return fill;
152 }
153
154 #endif /* _USBKBD_H */