experimental keybaord controller command execution

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15936 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen 2006-01-13 13:42:43 +00:00
parent 6c718e9525
commit 8f0970fa79
1 changed files with 52 additions and 0 deletions

View File

@ -59,6 +59,9 @@ static sem_id sResultOwnerSemaphore;
static uint8 *sResultBuffer;
static int32 sResultBytes;
static sem_id sKbcSem;
static int32 sIgnoreInterrupts = 0;
inline uint8
ps2_read_ctrl()
@ -118,6 +121,10 @@ void
ps2_flush()
{
int i;
acquire_sem(sKbcSem);
atomic_add(&sIgnoreInterrupts, 1);
for (i = 0; i < 64; i++) {
uint8 ctrl;
uint8 data;
@ -128,9 +135,43 @@ ps2_flush()
TRACE(("ps2_flush: ctrl 0x%02x, data 0x%02x (%s)\n", ctrl, data, (ctrl & PS2_STATUS_MOUSE_DATA) ? "mouse" : "keyb"));
snooze(100);
}
atomic_add(&sIgnoreInterrupts, -1);
release_sem(sKbcSem);
}
status_t
ps2_command(uint8 cmd, const void *out, int in_count, void *out, int out_count)
{
status_t res;
int i;
acquire_sem(sKbcSem);
atomic_add(&sIgnoreInterrupts, 1);
res = ps2_wait_write();
if (res == B_OK)
ps2_write_ctrl(cmd);
for (i = 0; res == B_OK && i < out_count; i++) {
res = ps2_wait_write();
if (res == B_OK)
ps2_write_data((const uint8 *)out[i]);
}
for (i = 0; res == B_OK && i < in_count; i++) {
res = ps2_wait_read();
if (res == B_OK)
(uint8 *)in[i] = ps2_read_data();
}
atomic_add(&sIgnoreInterrupts, -1);
release_sem(sKbcSem);
return res;
}
// #pragma mark -
@ -145,6 +186,11 @@ ps2_interrupt(void* cookie)
if (!(ctrl & PS2_STATUS_OUTPUT_BUFFER_FULL))
return B_UNHANDLED_INTERRUPT;
if (atomic_get(&sIgnoreInterrupts)) {
TRACE(("ps2_interrupt: ignoring, ctrl 0x%02x (%s)\n", ctrl, (ctrl & PS2_STATUS_MOUSE_DATA) ? "mouse" : "keyb"));
return B_HANDLED_INTERRUPT;
}
data = ps2_read_data();
TRACE(("ps2_interrupt: ctrl 0x%02x, data 0x%02x (%s)\n", ctrl, data, (ctrl & PS2_STATUS_MOUSE_DATA) ? "mouse" : "keyb"));
@ -180,6 +226,8 @@ publish_devices(void)
kDevices[index++] = NULL;
//status_t devfs_publish_device(const char *path, NULL, device_hooks *calls);
return (const char **)kDevices;
}
@ -205,6 +253,8 @@ init_driver(void)
if (status < B_OK)
goto err_1;
sKbcSem = create_sem(1, "ps/2 keyb ctrl");
gDeviceOpenSemaphore = create_sem(1, "ps/2 open");
if (gDeviceOpenSemaphore < B_OK)
goto err_2;
@ -230,6 +280,7 @@ err_4:
remove_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL);
err_3:
delete_sem(gDeviceOpenSemaphore);
delete_sem(sKbcSem);
err_2:
put_module(B_ISA_MODULE_NAME);
err_1:
@ -243,5 +294,6 @@ uninit_driver(void)
remove_io_interrupt_handler(INT_PS2_MOUSE, &ps2_interrupt, NULL);
remove_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL);
delete_sem(gDeviceOpenSemaphore);
delete_sem(sKbcSem);
put_module(B_ISA_MODULE_NAME);
}