mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-23 15:32:25 +00:00
ps2_drv: read configuration before self tests
It turned out that the controller configuration can change during the self tests, so now it is read before running the tests and restored afterwards. Fixes #1260.
This commit is contained in:
parent
81af714949
commit
0be264d7d2
@ -231,37 +231,45 @@ class I8042
|
||||
*/
|
||||
void reset()
|
||||
{
|
||||
int ret;
|
||||
unsigned char configuration;
|
||||
unsigned char ret;
|
||||
|
||||
/* disable keyboard and mouse */
|
||||
_command(CMD_KBD_DISABLE);
|
||||
_command(CMD_AUX_DISABLE);
|
||||
|
||||
/* read remaining data in controller */
|
||||
while (_output_buffer_full()) _data();
|
||||
|
||||
/* get configuration (can change during the self tests) */
|
||||
_command(CMD_READ);
|
||||
configuration = _wait_data();
|
||||
/* query xlate bit */
|
||||
_kbd_xlate = !!(configuration & CTRL_XLATE);
|
||||
|
||||
/* run self tests */
|
||||
_command(CMD_TEST);
|
||||
if ((ret = _wait_data()) != RET_TEST_OK) {
|
||||
Genode::printf("i8042: self test failed (%x)\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
_command(CMD_KBD_TEST);
|
||||
if ((ret = _wait_data()) != RET_KBD_TEST_OK) {
|
||||
Genode::printf("i8042: kbd test failed (%x)\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
_command(CMD_AUX_TEST);
|
||||
if ((ret = _wait_data()) != RET_AUX_TEST_OK) {
|
||||
Genode::printf("i8042: aux test failed (%x)\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* query xlate bit */
|
||||
_command(CMD_READ);
|
||||
ret = _wait_data();
|
||||
_kbd_xlate = !!(ret & CTRL_XLATE);
|
||||
|
||||
/* enable interrupts for keyboard and mouse at the controller */
|
||||
ret |= CTRL_KBD_INT | CTRL_AUX_INT;
|
||||
configuration |= CTRL_KBD_INT | CTRL_AUX_INT;
|
||||
_command(CMD_WRITE);
|
||||
_data(ret);
|
||||
_data(configuration);
|
||||
|
||||
/* enable keyboard and mouse */
|
||||
_command(CMD_KBD_ENABLE);
|
||||
|
Loading…
Reference in New Issue
Block a user