* grub-core/term/at_keyboard.c: Don't poll non-functional AT controller
until it becomes operational.
This commit is contained in:
parent
b0720b4988
commit
0c62a5b28e
3 changed files with 44 additions and 5 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/term/at_keyboard.c: Don't poll non-functional AT controller
|
||||||
|
until it becomes operational.
|
||||||
|
|
||||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/Makefile.core.def (legacy_password_test): Disable
|
* grub-core/Makefile.core.def (legacy_password_test): Disable
|
||||||
|
|
|
@ -42,6 +42,9 @@ static grub_uint8_t grub_keyboard_controller_orig;
|
||||||
static grub_uint8_t grub_keyboard_orig_set;
|
static grub_uint8_t grub_keyboard_orig_set;
|
||||||
static grub_uint8_t current_set;
|
static grub_uint8_t current_set;
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_keyboard_controller_init (void);
|
||||||
|
|
||||||
static const grub_uint8_t set1_mapping[128] =
|
static const grub_uint8_t set1_mapping[128] =
|
||||||
{
|
{
|
||||||
/* 0x00 */ 0 /* Unused */, GRUB_KEYBOARD_KEY_ESCAPE,
|
/* 0x00 */ 0 /* Unused */, GRUB_KEYBOARD_KEY_ESCAPE,
|
||||||
|
@ -223,6 +226,8 @@ static const struct
|
||||||
{0x7d, GRUB_KEYBOARD_KEY_PPAGE},
|
{0x7d, GRUB_KEYBOARD_KEY_PPAGE},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int alive = 0, ping_sent;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
keyboard_controller_wait_until_ready (void)
|
keyboard_controller_wait_until_ready (void)
|
||||||
{
|
{
|
||||||
|
@ -532,12 +537,37 @@ grub_keyboard_getkey (void)
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_at_keyboard_is_alive (void)
|
||||||
|
{
|
||||||
|
if (alive)
|
||||||
|
return 1;
|
||||||
|
if (ping_sent
|
||||||
|
&& KEYBOARD_COMMAND_ISREADY (grub_inb (KEYBOARD_REG_STATUS))
|
||||||
|
&& grub_inb (KEYBOARD_REG_DATA) == 0x55)
|
||||||
|
{
|
||||||
|
grub_keyboard_controller_init ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KEYBOARD_COMMAND_ISREADY (grub_inb (KEYBOARD_REG_STATUS)))
|
||||||
|
{
|
||||||
|
grub_outb (0xaa, KEYBOARD_REG_STATUS);
|
||||||
|
ping_sent = 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* If there is a character pending, return it;
|
/* If there is a character pending, return it;
|
||||||
otherwise return GRUB_TERM_NO_KEY. */
|
otherwise return GRUB_TERM_NO_KEY. */
|
||||||
static int
|
static int
|
||||||
grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused)))
|
grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
|
|
||||||
|
if (!grub_at_keyboard_is_alive ())
|
||||||
|
return GRUB_TERM_NO_KEY;
|
||||||
|
|
||||||
code = grub_keyboard_getkey ();
|
code = grub_keyboard_getkey ();
|
||||||
if (code == -1)
|
if (code == -1)
|
||||||
return GRUB_TERM_NO_KEY;
|
return GRUB_TERM_NO_KEY;
|
||||||
|
@ -574,10 +604,11 @@ grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static void
|
||||||
grub_keyboard_controller_init (struct grub_term_input *term __attribute__ ((unused)))
|
grub_keyboard_controller_init (void)
|
||||||
{
|
{
|
||||||
at_keyboard_status = 0;
|
at_keyboard_status = 0;
|
||||||
|
alive = 1;
|
||||||
/* Drain input buffer. */
|
/* Drain input buffer. */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -600,13 +631,13 @@ grub_keyboard_controller_init (struct grub_term_input *term __attribute__ ((unus
|
||||||
#endif
|
#endif
|
||||||
set_scancodes ();
|
set_scancodes ();
|
||||||
keyboard_controller_led (led_status);
|
keyboard_controller_led (led_status);
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_keyboard_controller_fini (struct grub_term_input *term __attribute__ ((unused)))
|
grub_keyboard_controller_fini (struct grub_term_input *term __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
|
if (!alive)
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
if (grub_keyboard_orig_set)
|
if (grub_keyboard_orig_set)
|
||||||
write_mode (grub_keyboard_orig_set);
|
write_mode (grub_keyboard_orig_set);
|
||||||
grub_keyboard_controller_write (grub_keyboard_controller_orig);
|
grub_keyboard_controller_write (grub_keyboard_controller_orig);
|
||||||
|
@ -622,6 +653,9 @@ grub_at_fini_hw (int noreturn __attribute__ ((unused)))
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_at_restore_hw (void)
|
grub_at_restore_hw (void)
|
||||||
{
|
{
|
||||||
|
if (!alive)
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
|
||||||
/* Drain input buffer. */
|
/* Drain input buffer. */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -641,7 +675,6 @@ grub_at_restore_hw (void)
|
||||||
static struct grub_term_input grub_at_keyboard_term =
|
static struct grub_term_input grub_at_keyboard_term =
|
||||||
{
|
{
|
||||||
.name = "at_keyboard",
|
.name = "at_keyboard",
|
||||||
.init = grub_keyboard_controller_init,
|
|
||||||
.fini = grub_keyboard_controller_fini,
|
.fini = grub_keyboard_controller_fini,
|
||||||
.getkey = grub_at_keyboard_getkey
|
.getkey = grub_at_keyboard_getkey
|
||||||
};
|
};
|
||||||
|
|
|
@ -37,5 +37,6 @@
|
||||||
|
|
||||||
extern void grub_at_keyboard_init (void);
|
extern void grub_at_keyboard_init (void);
|
||||||
extern void grub_at_keyboard_fini (void);
|
extern void grub_at_keyboard_fini (void);
|
||||||
|
int grub_at_keyboard_is_alive (void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue