add usb keymap support
This commit is contained in:
parent
e55e09628d
commit
5ef4e08416
4 changed files with 157 additions and 235 deletions
|
@ -29,43 +29,40 @@
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
static struct grub_keyboard_layout layout_us = {
|
static struct grub_keyboard_layout layout_us = {
|
||||||
.at = {
|
.keyboard_map = {
|
||||||
.keyboard_map = {
|
/* 0x00 */ '\0', GRUB_TERM_ESC, '1', '2', '3', '4', '5', '6',
|
||||||
/* 0x00 */ '\0', GRUB_TERM_ESC, '1', '2', '3', '4', '5', '6',
|
/* 0x08 */ '7', '8', '9', '0', '-', '=', GRUB_TERM_BACKSPACE, GRUB_TERM_TAB,
|
||||||
/* 0x08 */ '7', '8', '9', '0',
|
/* 0x10 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
|
||||||
/* 0x0c */ '-', '=', GRUB_TERM_BACKSPACE, GRUB_TERM_TAB,
|
/* 0x18 */ 'o', 'p', '[', ']', '\n', '\0', 'a', 's',
|
||||||
/* 0x10 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
|
/* 0x20 */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
|
||||||
/* 0x18 */ 'o', 'p', '[', ']', '\n', '\0', 'a', 's',
|
/* 0x28 */ '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v',
|
||||||
/* 0x20 */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
|
/* 0x30 */ 'b', 'n', 'm', ',', '.', '/', '\0', '*',
|
||||||
/* 0x28 */ '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v',
|
/* 0x38 */ '\0', ' ', '\0', GRUB_TERM_KEY_F1,
|
||||||
/* 0x30 */ 'b', 'n', 'm', ',', '.', '/', '\0', '*',
|
/* 0x3c */ GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3,
|
||||||
/* 0x38 */ '\0', ' ', '\0', GRUB_TERM_KEY_F1,
|
/* 0x3e */ GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5,
|
||||||
/* 0x3c */ GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3,
|
/* 0x40 */ GRUB_TERM_KEY_F6, GRUB_TERM_KEY_F7,
|
||||||
/* 0x3e */ GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5,
|
/* 0x42 */ GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9,
|
||||||
/* 0x40 */ GRUB_TERM_KEY_F6, GRUB_TERM_KEY_F7,
|
/* 0x44 */ GRUB_TERM_KEY_F10, '\0', '\0', GRUB_TERM_KEY_HOME,
|
||||||
/* 0x42 */ GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9,
|
/* 0x48 */ GRUB_TERM_KEY_UP, GRUB_TERM_KEY_NPAGE, '-', GRUB_TERM_KEY_LEFT,
|
||||||
/* 0x44 */ GRUB_TERM_KEY_F10, '\0', '\0', GRUB_TERM_KEY_HOME,
|
/* 0x4c */ GRUB_TERM_KEY_CENTER, GRUB_TERM_KEY_RIGHT,
|
||||||
/* 0x48 */ GRUB_TERM_KEY_UP, GRUB_TERM_KEY_NPAGE, '-', GRUB_TERM_KEY_LEFT,
|
/* 0x4e */ '+', GRUB_TERM_KEY_END,
|
||||||
/* 0x4c */ GRUB_TERM_KEY_CENTER, GRUB_TERM_KEY_RIGHT,
|
/* 0x50 */ GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_PPAGE,
|
||||||
/* 0x4e */ '+', GRUB_TERM_KEY_END,
|
/* 0x52 */ GRUB_TERM_KEY_INSERT, GRUB_TERM_KEY_DC,
|
||||||
/* 0x50 */ GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_PPAGE,
|
/* 0x54 */ '\0', '\0', '\\', GRUB_TERM_KEY_F11,
|
||||||
/* 0x52 */ GRUB_TERM_KEY_INSERT, GRUB_TERM_KEY_DC,
|
/* 0x58 */ GRUB_TERM_KEY_F12, '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
/* 0x54 */ '\0', '\0', '\\', GRUB_TERM_KEY_F11,
|
/* 0x60 */ '\0', '\0', '\0', '\0',
|
||||||
/* 0x58 */ GRUB_TERM_KEY_F12, '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
/* 0x64 */ '\0', GRUB_TERM_KEY_UP, GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_LEFT,
|
||||||
/* 0x60 */ '\0', '\0', '\0', '\0',
|
/* 0x68 */ GRUB_TERM_KEY_RIGHT
|
||||||
/* 0x64 */ '\0', GRUB_TERM_KEY_UP, GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_LEFT,
|
},
|
||||||
/* 0x68 */ GRUB_TERM_KEY_RIGHT
|
.keyboard_map_shift = {
|
||||||
},
|
'\0', '\0', '!', '@', '#', '$', '%', '^',
|
||||||
.keyboard_map_shift = {
|
'&', '*', '(', ')', '_', '+', '\0', '\0',
|
||||||
'\0', '\0', '!', '@', '#', '$', '%', '^',
|
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
|
||||||
'&', '*', '(', ')', '_', '+', '\0', '\0',
|
'O', 'P', '{', '}', '\n', '\0', 'A', 'S',
|
||||||
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
|
'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
|
||||||
'O', 'P', '{', '}', '\n', '\0', 'A', 'S',
|
'\"', '~', '\0', '|', 'Z', 'X', 'C', 'V',
|
||||||
'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
|
'B', 'N', 'M', '<', '>', '?',
|
||||||
'\"', '~', '\0', '|', 'Z', 'X', 'C', 'V',
|
[0x56] = '|'
|
||||||
'B', 'N', 'M', '<', '>', '?',
|
|
||||||
[0x56] = '|'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,33 +77,33 @@ map_key_core (int code, int status, int *alt_gr_consumed)
|
||||||
{
|
{
|
||||||
if (status & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT))
|
if (status & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT))
|
||||||
{
|
{
|
||||||
if (grub_current_layout->at.keyboard_map_shift_l3[code])
|
if (grub_current_layout->keyboard_map_shift_l3[code])
|
||||||
{
|
{
|
||||||
*alt_gr_consumed = 1;
|
*alt_gr_consumed = 1;
|
||||||
return grub_current_layout->at.keyboard_map_shift_l3[code];
|
return grub_current_layout->keyboard_map_shift_l3[code];
|
||||||
}
|
}
|
||||||
else if (grub_current_layout->at.keyboard_map_shift[code])
|
else if (grub_current_layout->keyboard_map_shift[code])
|
||||||
{
|
{
|
||||||
*alt_gr_consumed = 1;
|
*alt_gr_consumed = 1;
|
||||||
return grub_current_layout->at.keyboard_map_l3[code]
|
return grub_current_layout->keyboard_map_l3[code]
|
||||||
| GRUB_TERM_SHIFT;
|
| GRUB_TERM_SHIFT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (grub_current_layout->at.keyboard_map_shift[code])
|
else if (grub_current_layout->keyboard_map_shift[code])
|
||||||
{
|
{
|
||||||
*alt_gr_consumed = 1;
|
*alt_gr_consumed = 1;
|
||||||
return grub_current_layout->at.keyboard_map_l3[code];
|
return grub_current_layout->keyboard_map_l3[code];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (status & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT))
|
if (status & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT))
|
||||||
{
|
{
|
||||||
if (grub_current_layout->at.keyboard_map_shift[code])
|
if (grub_current_layout->keyboard_map_shift[code])
|
||||||
return grub_current_layout->at.keyboard_map_shift[code];
|
return grub_current_layout->keyboard_map_shift[code];
|
||||||
else
|
else
|
||||||
return grub_current_layout->at.keyboard_map[code] | GRUB_TERM_SHIFT;
|
return grub_current_layout->keyboard_map[code] | GRUB_TERM_SHIFT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return grub_current_layout->at.keyboard_map[code];
|
return grub_current_layout->keyboard_map[code];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
|
@ -204,35 +201,20 @@ grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map); i++)
|
for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map); i++)
|
||||||
newmap->at.keyboard_map[i] = grub_le_to_cpu32(newmap->at.keyboard_map[i]);
|
newmap->keyboard_map[i] = grub_le_to_cpu32(newmap->keyboard_map[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map_shift); i++)
|
for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map_shift); i++)
|
||||||
newmap->at.keyboard_map_shift[i]
|
newmap->keyboard_map_shift[i]
|
||||||
= grub_le_to_cpu32(newmap->at.keyboard_map_shift[i]);
|
= grub_le_to_cpu32(newmap->keyboard_map_shift[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map_l3); i++)
|
for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map_l3); i++)
|
||||||
newmap->at.keyboard_map_l3[i]
|
newmap->keyboard_map_l3[i]
|
||||||
= grub_le_to_cpu32(newmap->at.keyboard_map_l3[i]);
|
= grub_le_to_cpu32(newmap->keyboard_map_l3[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map_shift_l3); i++)
|
for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map_shift_l3); i++)
|
||||||
newmap->at.keyboard_map_shift_l3[i]
|
newmap->keyboard_map_shift_l3[i]
|
||||||
= grub_le_to_cpu32(newmap->at.keyboard_map_shift_l3[i]);
|
= grub_le_to_cpu32(newmap->keyboard_map_shift_l3[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->usb.keyboard_map); i++)
|
|
||||||
newmap->usb.keyboard_map[i] = grub_le_to_cpu32(newmap->usb.keyboard_map[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->usb.keyboard_map_shift); i++)
|
|
||||||
newmap->usb.keyboard_map_shift[i]
|
|
||||||
= grub_le_to_cpu32(newmap->usb.keyboard_map_shift[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->usb.keyboard_map_l3); i++)
|
|
||||||
newmap->usb.keyboard_map_l3[i]
|
|
||||||
= grub_le_to_cpu32(newmap->usb.keyboard_map_l3[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (newmap->usb.keyboard_map_shift_l3); i++)
|
|
||||||
newmap->usb.keyboard_map_shift_l3[i]
|
|
||||||
= grub_le_to_cpu32(newmap->usb.keyboard_map_shift_l3[i]);
|
|
||||||
|
|
||||||
grub_current_layout = newmap;
|
grub_current_layout = newmap;
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,11 @@
|
||||||
|
|
||||||
#define GRUB_KEYBOARD_LAYOUTS_FILEMAGIC "GRUBLAYO"
|
#define GRUB_KEYBOARD_LAYOUTS_FILEMAGIC "GRUBLAYO"
|
||||||
#define GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE (sizeof(GRUB_KEYBOARD_LAYOUTS_FILEMAGIC) - 1)
|
#define GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE (sizeof(GRUB_KEYBOARD_LAYOUTS_FILEMAGIC) - 1)
|
||||||
#define GRUB_KEYBOARD_LAYOUTS_VERSION 5
|
#define GRUB_KEYBOARD_LAYOUTS_VERSION 6
|
||||||
|
|
||||||
#define GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE 128
|
#define GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE 128
|
||||||
|
|
||||||
struct grub_keyboard_layout_kbd
|
struct grub_keyboard_layout
|
||||||
{
|
{
|
||||||
grub_uint32_t keyboard_map[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
grub_uint32_t keyboard_map[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
||||||
grub_uint32_t keyboard_map_shift[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
grub_uint32_t keyboard_map_shift[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
||||||
|
@ -33,12 +33,6 @@ struct grub_keyboard_layout_kbd
|
||||||
grub_uint32_t keyboard_map_shift_l3[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
grub_uint32_t keyboard_map_shift_l3[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct grub_keyboard_layout
|
|
||||||
{
|
|
||||||
struct grub_keyboard_layout_kbd at;
|
|
||||||
struct grub_keyboard_layout_kbd usb;
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned grub_term_map_key (int code, int status);
|
unsigned grub_term_map_key (int code, int status);
|
||||||
|
|
||||||
#endif /* GRUB_KEYBOARD_LAYOUTS */
|
#endif /* GRUB_KEYBOARD_LAYOUTS */
|
||||||
|
|
|
@ -25,39 +25,45 @@
|
||||||
#include <grub/usb.h>
|
#include <grub/usb.h>
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/time.h>
|
#include <grub/time.h>
|
||||||
|
#include <grub/keyboard_layouts.h>
|
||||||
|
|
||||||
|
|
||||||
static unsigned keyboard_map[128] =
|
|
||||||
{
|
|
||||||
'\0', '\0', '\0', '\0', 'a', 'b', 'c', 'd',
|
|
||||||
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
|
|
||||||
'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
|
||||||
'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
|
|
||||||
'3', '4', '5', '6', '7', '8', '9', '0',
|
|
||||||
'\n', GRUB_TERM_ESC, GRUB_TERM_BACKSPACE, GRUB_TERM_TAB, ' ', '-', '=', '[',
|
|
||||||
']', '\\', '#', ';', '\'', '`', ',', '.',
|
|
||||||
'/', '\0', GRUB_TERM_KEY_F1, GRUB_TERM_KEY_F2,
|
|
||||||
GRUB_TERM_KEY_F3, GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5, GRUB_TERM_KEY_F6,
|
|
||||||
GRUB_TERM_KEY_F7, GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9, GRUB_TERM_KEY_F10,
|
|
||||||
GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12, '\0', '\0',
|
|
||||||
'\0', GRUB_TERM_KEY_INSERT, GRUB_TERM_KEY_HOME, GRUB_TERM_KEY_PPAGE,
|
|
||||||
GRUB_TERM_KEY_DC, GRUB_TERM_KEY_END, GRUB_TERM_KEY_NPAGE, GRUB_TERM_KEY_RIGHT,
|
|
||||||
GRUB_TERM_KEY_LEFT, GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_UP,
|
|
||||||
[0x64] = '\\'
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned keyboard_map_shift[128] =
|
static grub_uint8_t usb_to_at_map[128] =
|
||||||
{
|
{
|
||||||
'\0', '\0', '\0', '\0', 'A', 'B', 'C', 'D',
|
/* 0x00 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
|
/* 0x04 */ 0x1e /* a */, 0x30 /* b */, 0x2e /* c */, 0x20 /* d */,
|
||||||
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
|
/* 0x08 */ 0x12 /* e */, 0x21 /* f */, 0x22 /* g */, 0x23 /* h */,
|
||||||
'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@',
|
/* 0x0c */ 0x17 /* i */, 0x24 /* j */, 0x25 /* k */, 0x26 /* l */,
|
||||||
'#', '$', '%', '^', '&', '*', '(', ')',
|
/* 0x10 */ 0x32 /* m */, 0x31 /* n */, 0x18 /* o */, 0x19 /* p */,
|
||||||
'\n', '\0', '\0', '\0', ' ', '_', '+', '{',
|
/* 0x14 */ 0x10 /* q */, 0x13 /* r */, 0x1f /* s */, 0x14 /* t */,
|
||||||
'}', '|', '#', ':', '"', '`', '<', '>',
|
/* 0x18 */ 0x16 /* u */, 0x2f /* v */, 0x11 /* w */, 0x2d /* x */,
|
||||||
'?',
|
/* 0x1c */ 0x15 /* y */, 0x2c /* z */, 0x02 /* 1 */, 0x03 /* 2 */,
|
||||||
[0x64] = '|'
|
/* 0x20 */ 0x04 /* 3 */, 0x05 /* 4 */, 0x06 /* 5 */, 0x07 /* 6 */,
|
||||||
};
|
/* 0x24 */ 0x08 /* 7 */, 0x09 /* 8 */, 0x0a /* 9 */, 0x0b /* 0 */,
|
||||||
|
/* 0x28 */ 0x1c /* Enter */, 0x01 /* Escape */, 0x0e /* \b */, 0x0f /* \t */,
|
||||||
|
/* 0x2c */ 0x39 /* Space */, 0x4a /* - */, 0x0d /* = */, 0x1a /* [ */,
|
||||||
|
/* 0x30 */ 0x1b /* ] */, 0x2b /* \ */, 0x00, 0x27 /* ; */,
|
||||||
|
/* 0x34 */ 0x28 /* " */, 0x29 /* ` */, 0x33 /* , */, 0x34 /* . */,
|
||||||
|
/* 0x38 */ 0x35 /* / */, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x3c */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x40 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x44 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x48 */ 0x00, 0x00, 0x47 /* HOME */, 0x51 /* PPAGE */,
|
||||||
|
/* 0x4c */ 0x53 /* DC */, 0x4f /* END */, 0x49 /* NPAGE */, 0x4d /* RIGHT */,
|
||||||
|
/* 0x50 */ 0x4b /* LEFT */, 0x50 /* DOWN */, 0x48 /* UP */, 0x00,
|
||||||
|
/* 0x54 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x58 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x5c */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x60 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x64 */ 0x56 /* 102nd key. */, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x68 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x6c */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x70 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x74 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x78 */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 0x7c */ 0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
||||||
|
|
||||||
static grub_usb_device_t usbdev;
|
static grub_usb_device_t usbdev;
|
||||||
|
|
||||||
|
@ -74,6 +80,35 @@ static grub_usb_device_t usbdev;
|
||||||
#define USB_HID_SET_IDLE 0x0A
|
#define USB_HID_SET_IDLE 0x0A
|
||||||
#define USB_HID_SET_PROTOCOL 0x0B
|
#define USB_HID_SET_PROTOCOL 0x0B
|
||||||
|
|
||||||
|
#define GRUB_USB_KEYBOARD_LEFT_CTRL 0x01
|
||||||
|
#define GRUB_USB_KEYBOARD_LEFT_SHIFT 0x02
|
||||||
|
#define GRUB_USB_KEYBOARD_LEFT_ALT 0x04
|
||||||
|
#define GRUB_USB_KEYBOARD_RIGHT_CTRL 0x10
|
||||||
|
#define GRUB_USB_KEYBOARD_RIGHT_SHIFT 0x20
|
||||||
|
#define GRUB_USB_KEYBOARD_RIGHT_ALT 0x40
|
||||||
|
|
||||||
|
static int
|
||||||
|
interpret_status (grub_uint8_t data0)
|
||||||
|
{
|
||||||
|
int mods = 0;
|
||||||
|
|
||||||
|
/* Check Shift, Control, and Alt status. */
|
||||||
|
if (data0 & GRUB_USB_KEYBOARD_LEFT_SHIFT)
|
||||||
|
mods |= GRUB_TERM_STATUS_LSHIFT;
|
||||||
|
if (data0 & GRUB_USB_KEYBOARD_RIGHT_SHIFT)
|
||||||
|
mods |= GRUB_TERM_STATUS_RSHIFT;
|
||||||
|
if (data0 & GRUB_USB_KEYBOARD_LEFT_CTRL)
|
||||||
|
mods |= GRUB_TERM_STATUS_LCTRL;
|
||||||
|
if (data0 & GRUB_USB_KEYBOARD_RIGHT_CTRL)
|
||||||
|
mods |= GRUB_TERM_STATUS_RCTRL;
|
||||||
|
if (data0 & GRUB_USB_KEYBOARD_LEFT_ALT)
|
||||||
|
mods |= GRUB_TERM_STATUS_LALT;
|
||||||
|
if (data0 & GRUB_USB_KEYBOARD_RIGHT_ALT)
|
||||||
|
mods |= GRUB_TERM_STATUS_RALT;
|
||||||
|
|
||||||
|
return mods;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
grub_usb_hid (void)
|
grub_usb_hid (void)
|
||||||
{
|
{
|
||||||
|
@ -127,7 +162,7 @@ static int
|
||||||
grub_usb_keyboard_checkkey (struct grub_term_input *term __attribute__ ((unused)))
|
grub_usb_keyboard_checkkey (struct grub_term_input *term __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
grub_uint8_t data[8];
|
grub_uint8_t data[8];
|
||||||
int key;
|
int key = 0;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
grub_uint64_t currtime;
|
grub_uint64_t currtime;
|
||||||
int timeout = 50;
|
int timeout = 50;
|
||||||
|
@ -154,39 +189,14 @@ grub_usb_keyboard_checkkey (struct grub_term_input *term __attribute__ ((unused)
|
||||||
data[0], data[1], data[2], data[3],
|
data[0], data[1], data[2], data[3],
|
||||||
data[4], data[5], data[6], data[7]);
|
data[4], data[5], data[6], data[7]);
|
||||||
|
|
||||||
#define GRUB_USB_KEYBOARD_LEFT_CTRL 0x01
|
if (usb_to_at_map[data[2]] == 0)
|
||||||
#define GRUB_USB_KEYBOARD_LEFT_SHIFT 0x02
|
|
||||||
#define GRUB_USB_KEYBOARD_LEFT_ALT 0x04
|
|
||||||
#define GRUB_USB_KEYBOARD_RIGHT_CTRL 0x10
|
|
||||||
#define GRUB_USB_KEYBOARD_RIGHT_SHIFT 0x20
|
|
||||||
#define GRUB_USB_KEYBOARD_RIGHT_ALT 0x40
|
|
||||||
|
|
||||||
/* Check if the Shift key was pressed. */
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_LEFT_SHIFT
|
|
||||||
|| data[0] & GRUB_USB_KEYBOARD_RIGHT_SHIFT)
|
|
||||||
{
|
|
||||||
if (keyboard_map_shift[data[2]])
|
|
||||||
key = keyboard_map_shift[data[2]];
|
|
||||||
else
|
|
||||||
key = keyboard_map[data[2]] | GRUB_TERM_SHIFT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
key = keyboard_map[data[2]];
|
|
||||||
|
|
||||||
if (key == 0)
|
|
||||||
grub_printf ("Unknown key 0x%x detected\n", data[2]);
|
grub_printf ("Unknown key 0x%x detected\n", data[2]);
|
||||||
|
else
|
||||||
|
key = grub_term_map_key (usb_to_at_map[data[2]], interpret_status (data[0]));
|
||||||
|
|
||||||
/* Check if the Ctrl key was pressed. */
|
grub_errno = GRUB_ERR_NONE;
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_LEFT_CTRL
|
|
||||||
|| data[0] & GRUB_USB_KEYBOARD_RIGHT_CTRL)
|
|
||||||
key |= GRUB_TERM_CTRL;
|
|
||||||
|
|
||||||
/* Check if the Alt key was pressed. */
|
return key;
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_LEFT_ALT)
|
|
||||||
key |= GRUB_TERM_ALT;
|
|
||||||
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_RIGHT_ALT)
|
|
||||||
key |= GRUB_TERM_ALT;
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Wait until the key is released. */
|
/* Wait until the key is released. */
|
||||||
|
@ -203,8 +213,6 @@ grub_usb_keyboard_checkkey (struct grub_term_input *term __attribute__ ((unused)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
grub_errno = GRUB_ERR_NONE;
|
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +292,6 @@ static int
|
||||||
grub_usb_keyboard_getkeystatus (struct grub_term_input *term __attribute__ ((unused)))
|
grub_usb_keyboard_getkeystatus (struct grub_term_input *term __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
grub_uint8_t data[8];
|
grub_uint8_t data[8];
|
||||||
int mods = 0;
|
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
grub_uint64_t currtime;
|
grub_uint64_t currtime;
|
||||||
int timeout = 50;
|
int timeout = 50;
|
||||||
|
@ -322,23 +329,9 @@ grub_usb_keyboard_getkeystatus (struct grub_term_input *term __attribute__ ((unu
|
||||||
data[0], data[1], data[2], data[3],
|
data[0], data[1], data[2], data[3],
|
||||||
data[4], data[5], data[6], data[7]);
|
data[4], data[5], data[6], data[7]);
|
||||||
|
|
||||||
/* Check Shift, Control, and Alt status. */
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_LEFT_SHIFT)
|
|
||||||
mods |= GRUB_TERM_STATUS_LSHIFT;
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_RIGHT_SHIFT)
|
|
||||||
mods |= GRUB_TERM_STATUS_RSHIFT;
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_LEFT_CTRL)
|
|
||||||
mods |= GRUB_TERM_STATUS_LCTRL;
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_RIGHT_CTRL)
|
|
||||||
mods |= GRUB_TERM_STATUS_RCTRL;
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_LEFT_ALT)
|
|
||||||
mods |= GRUB_TERM_STATUS_LALT;
|
|
||||||
if (data[0] & GRUB_USB_KEYBOARD_RIGHT_ALT)
|
|
||||||
mods |= GRUB_TERM_STATUS_RALT;
|
|
||||||
|
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
|
||||||
return mods;
|
return interpret_status (data[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct grub_term_input grub_usb_keyboard_term =
|
static struct grub_term_input grub_usb_keyboard_term =
|
||||||
|
|
|
@ -46,26 +46,6 @@ struct console_grub_equivalence
|
||||||
grub_uint32_t grub;
|
grub_uint32_t grub;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int at_to_usb_map[128] =
|
|
||||||
{
|
|
||||||
0, 41, 30, 31, 32, 33, 34, 35,
|
|
||||||
36, 37, 38, 39, 45, 46, 42, 43,
|
|
||||||
20, 26, 8, 21, 23, 28, 24, 12,
|
|
||||||
18, 19, 47, 48, 40, 0, 4, 22,
|
|
||||||
7, 9, 10, 11, 13, 14, 15, 51,
|
|
||||||
52, 53, 0, 49, 29, 27, 6, 25,
|
|
||||||
5, 17, 16, 54, 55, 56, 0, 0,
|
|
||||||
0, 44, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 74,
|
|
||||||
82, 78, 45, 80, 0, 79, 0, 77,
|
|
||||||
81, 75, 0, 76, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct console_grub_equivalence console_grub_equivalences[] = {
|
static struct console_grub_equivalence console_grub_equivalences[] = {
|
||||||
{"KP_1", '1'},
|
{"KP_1", '1'},
|
||||||
{"KP_2", '2'},
|
{"KP_2", '2'},
|
||||||
|
@ -108,20 +88,20 @@ Report bugs to <%s>.\n", program_name, PACKAGE_BUGREPORT);
|
||||||
void
|
void
|
||||||
add_special_keys (struct grub_keyboard_layout *layout)
|
add_special_keys (struct grub_keyboard_layout *layout)
|
||||||
{
|
{
|
||||||
layout->at.keyboard_map[71] = GRUB_TERM_KEY_HOME;
|
layout->keyboard_map[71] = GRUB_TERM_KEY_HOME;
|
||||||
layout->at.keyboard_map[72] = GRUB_TERM_KEY_UP;
|
layout->keyboard_map[72] = GRUB_TERM_KEY_UP;
|
||||||
layout->at.keyboard_map[73] = GRUB_TERM_KEY_NPAGE;
|
layout->keyboard_map[73] = GRUB_TERM_KEY_NPAGE;
|
||||||
layout->at.keyboard_map[75] = GRUB_TERM_KEY_LEFT;
|
layout->keyboard_map[75] = GRUB_TERM_KEY_LEFT;
|
||||||
layout->at.keyboard_map[77] = GRUB_TERM_KEY_RIGHT;
|
layout->keyboard_map[77] = GRUB_TERM_KEY_RIGHT;
|
||||||
layout->at.keyboard_map[79] = GRUB_TERM_KEY_END;
|
layout->keyboard_map[79] = GRUB_TERM_KEY_END;
|
||||||
layout->at.keyboard_map[80] = GRUB_TERM_KEY_DOWN;
|
layout->keyboard_map[80] = GRUB_TERM_KEY_DOWN;
|
||||||
layout->at.keyboard_map[81] = GRUB_TERM_KEY_PPAGE;
|
layout->keyboard_map[81] = GRUB_TERM_KEY_PPAGE;
|
||||||
layout->at.keyboard_map[83] = GRUB_TERM_KEY_DC;
|
layout->keyboard_map[83] = GRUB_TERM_KEY_DC;
|
||||||
|
|
||||||
layout->at.keyboard_map[101] = GRUB_TERM_KEY_UP;
|
layout->keyboard_map[101] = GRUB_TERM_KEY_UP;
|
||||||
layout->at.keyboard_map[102] = GRUB_TERM_KEY_DOWN;
|
layout->keyboard_map[102] = GRUB_TERM_KEY_DOWN;
|
||||||
layout->at.keyboard_map[103] = GRUB_TERM_KEY_LEFT;
|
layout->keyboard_map[103] = GRUB_TERM_KEY_LEFT;
|
||||||
layout->at.keyboard_map[104] = GRUB_TERM_KEY_RIGHT;
|
layout->keyboard_map[104] = GRUB_TERM_KEY_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char
|
static char
|
||||||
|
@ -159,35 +139,20 @@ write_file (char* filename, struct grub_keyboard_layout *layout)
|
||||||
|
|
||||||
version = grub_cpu_to_le32 (GRUB_KEYBOARD_LAYOUTS_VERSION);
|
version = grub_cpu_to_le32 (GRUB_KEYBOARD_LAYOUTS_VERSION);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map); i++)
|
for (i = 0; i < ARRAY_SIZE (layout->keyboard_map); i++)
|
||||||
layout->at.keyboard_map[i] = grub_cpu_to_le32(layout->at.keyboard_map[i]);
|
layout->keyboard_map[i] = grub_cpu_to_le32(layout->keyboard_map[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map_shift); i++)
|
for (i = 0; i < ARRAY_SIZE (layout->keyboard_map_shift); i++)
|
||||||
layout->at.keyboard_map_shift[i]
|
layout->keyboard_map_shift[i]
|
||||||
= grub_cpu_to_le32(layout->at.keyboard_map_shift[i]);
|
= grub_cpu_to_le32(layout->keyboard_map_shift[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map_l3); i++)
|
for (i = 0; i < ARRAY_SIZE (layout->keyboard_map_l3); i++)
|
||||||
layout->at.keyboard_map_l3[i]
|
layout->keyboard_map_l3[i]
|
||||||
= grub_cpu_to_le32(layout->at.keyboard_map_l3[i]);
|
= grub_cpu_to_le32(layout->keyboard_map_l3[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map_shift_l3); i++)
|
for (i = 0; i < ARRAY_SIZE (layout->keyboard_map_shift_l3); i++)
|
||||||
layout->at.keyboard_map_shift_l3[i]
|
layout->keyboard_map_shift_l3[i]
|
||||||
= grub_cpu_to_le32(layout->at.keyboard_map_shift_l3[i]);
|
= grub_cpu_to_le32(layout->keyboard_map_shift_l3[i]);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map); i++)
|
|
||||||
layout->usb.keyboard_map[i] = grub_cpu_to_le32(layout->usb.keyboard_map[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map_shift); i++)
|
|
||||||
layout->usb.keyboard_map_shift[i]
|
|
||||||
= grub_cpu_to_le32(layout->usb.keyboard_map_shift[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map_l3); i++)
|
|
||||||
layout->usb.keyboard_map_l3[i]
|
|
||||||
= grub_cpu_to_le32(layout->usb.keyboard_map_l3[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map_shift_l3); i++)
|
|
||||||
layout->usb.keyboard_map_shift_l3[i]
|
|
||||||
= grub_cpu_to_le32(layout->usb.keyboard_map_shift_l3[i]);
|
|
||||||
|
|
||||||
fp_output = fopen (filename, "w");
|
fp_output = fopen (filename, "w");
|
||||||
|
|
||||||
|
@ -258,28 +223,16 @@ write_keymaps (char *keymap, char *file_basename)
|
||||||
normal, shift, normalalt, shiftalt);
|
normal, shift, normalalt, shiftalt);
|
||||||
if (keycode < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE)
|
if (keycode < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE)
|
||||||
{
|
{
|
||||||
layout.at.keyboard_map[keycode] = get_grub_code (normal);
|
layout.keyboard_map[keycode] = get_grub_code (normal);
|
||||||
layout.at.keyboard_map_shift[keycode] = get_grub_code (shift);
|
layout.keyboard_map_shift[keycode] = get_grub_code (shift);
|
||||||
layout.at.keyboard_map_l3[keycode] = get_grub_code (normalalt);
|
layout.keyboard_map_l3[keycode] = get_grub_code (normalalt);
|
||||||
layout.at.keyboard_map_shift_l3[keycode]
|
layout.keyboard_map_shift_l3[keycode]
|
||||||
= get_grub_code (shiftalt);
|
= get_grub_code (shiftalt);
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE; i++)
|
|
||||||
{
|
|
||||||
layout.usb.keyboard_map[at_to_usb_map[i]] = layout.at.keyboard_map[i];
|
|
||||||
layout.usb.keyboard_map_shift[at_to_usb_map[i]]
|
|
||||||
= layout.at.keyboard_map_shift[i];
|
|
||||||
layout.usb.keyboard_map_l3[at_to_usb_map[i]]
|
|
||||||
= layout.at.keyboard_map_l3[i];
|
|
||||||
layout.usb.keyboard_map_shift_l3[at_to_usb_map[i]]
|
|
||||||
= layout.at.keyboard_map_shift_l3[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (ok == 0)
|
if (ok == 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "ERROR: no keycodes found. Check output of %s %s.\n",
|
fprintf (stderr, "ERROR: no keycodes found. Check output of %s %s.\n",
|
||||||
|
|
Loading…
Reference in a new issue