allow communication with non-active ps2 devices
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15974 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -270,6 +270,8 @@ init_driver(void)
|
|||||||
if (gDeviceOpenSemaphore < B_OK)
|
if (gDeviceOpenSemaphore < B_OK)
|
||||||
goto err_2;
|
goto err_2;
|
||||||
|
|
||||||
|
status = ps2_dev_init();
|
||||||
|
|
||||||
status = ps2_service_init();
|
status = ps2_service_init();
|
||||||
|
|
||||||
status = install_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL, 0);
|
status = install_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL, 0);
|
||||||
@@ -313,6 +315,7 @@ err_4:
|
|||||||
remove_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL);
|
remove_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL);
|
||||||
err_3:
|
err_3:
|
||||||
ps2_service_exit();
|
ps2_service_exit();
|
||||||
|
ps2_dev_exit();
|
||||||
delete_sem(gDeviceOpenSemaphore);
|
delete_sem(gDeviceOpenSemaphore);
|
||||||
delete_sem(sKbcSem);
|
delete_sem(sKbcSem);
|
||||||
err_2:
|
err_2:
|
||||||
@@ -328,6 +331,7 @@ uninit_driver(void)
|
|||||||
remove_io_interrupt_handler(INT_PS2_MOUSE, &ps2_interrupt, NULL);
|
remove_io_interrupt_handler(INT_PS2_MOUSE, &ps2_interrupt, NULL);
|
||||||
remove_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL);
|
remove_io_interrupt_handler(INT_PS2_KEYBOARD, &ps2_interrupt, NULL);
|
||||||
ps2_service_exit();
|
ps2_service_exit();
|
||||||
|
ps2_dev_exit();
|
||||||
delete_sem(gDeviceOpenSemaphore);
|
delete_sem(gDeviceOpenSemaphore);
|
||||||
delete_sem(sKbcSem);
|
delete_sem(sKbcSem);
|
||||||
put_module(B_ISA_MODULE_NAME);
|
put_module(B_ISA_MODULE_NAME);
|
||||||
|
|||||||
@@ -12,16 +12,49 @@
|
|||||||
#include "ps2_dev.h"
|
#include "ps2_dev.h"
|
||||||
#include "ps2_service.h"
|
#include "ps2_service.h"
|
||||||
|
|
||||||
ps2_dev ps2_device[5] =
|
#define PS2_DEV_COUNT 5
|
||||||
|
|
||||||
|
ps2_dev ps2_device[PS2_DEV_COUNT] =
|
||||||
{
|
{
|
||||||
{ .name = "input/mouse/ps2/0", .active = false },
|
{ .name = "input/mouse/ps2/0", .active = false, .result_sem = -1 },
|
||||||
{ .name = "input/mouse/ps2/1", .active = false },
|
{ .name = "input/mouse/ps2/1", .active = false, .result_sem = -1 },
|
||||||
{ .name = "input/mouse/ps2/2", .active = false },
|
{ .name = "input/mouse/ps2/2", .active = false, .result_sem = -1 },
|
||||||
{ .name = "input/mouse/ps2/3", .active = false },
|
{ .name = "input/mouse/ps2/3", .active = false, .result_sem = -1 },
|
||||||
{ .name = "input/keyboard/at/0", .active = false, .flags = PS2_FLAG_KEYB }
|
{ .name = "input/keyboard/at/0", .active = false, .result_sem = -1, .flags = PS2_FLAG_KEYB }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
ps2_dev_init(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < PS2_DEV_COUNT; i++) {
|
||||||
|
ps2_dev *dev = &ps2_device[i];
|
||||||
|
dev->result_sem = create_sem(0, "ps2 result");
|
||||||
|
if (dev->result_sem < 0)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
return B_OK;
|
||||||
|
err:
|
||||||
|
ps2_dev_exit();
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ps2_dev_exit(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < PS2_DEV_COUNT; i++) {
|
||||||
|
ps2_dev *dev = &ps2_device[i];
|
||||||
|
if (dev->result_sem >= 0) {
|
||||||
|
delete_sem(dev->result_sem);
|
||||||
|
dev->result_sem = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ps2_dev_publish(ps2_dev *dev)
|
ps2_dev_publish(ps2_dev *dev)
|
||||||
{
|
{
|
||||||
@@ -32,12 +65,6 @@ ps2_dev_publish(ps2_dev *dev)
|
|||||||
|
|
||||||
TRACE(("ps2_dev_publish %s\n", dev->name));
|
TRACE(("ps2_dev_publish %s\n", dev->name));
|
||||||
|
|
||||||
dev->result_sem = create_sem(0, "ps2 result");
|
|
||||||
dev->result_buf = NULL;
|
|
||||||
dev->result_buf_idx = 0;
|
|
||||||
dev->result_buf_cnt = 0;
|
|
||||||
dev->flags &= PS2_FLAG_KEYB;
|
|
||||||
|
|
||||||
dev->active = true;
|
dev->active = true;
|
||||||
|
|
||||||
status = devfs_publish_device(dev->name, NULL,
|
status = devfs_publish_device(dev->name, NULL,
|
||||||
@@ -56,8 +83,6 @@ ps2_dev_unpublish(ps2_dev *dev)
|
|||||||
TRACE(("ps2_dev_unpublish %s\n", dev->name));
|
TRACE(("ps2_dev_unpublish %s\n", dev->name));
|
||||||
|
|
||||||
dev->active = false;
|
dev->active = false;
|
||||||
|
|
||||||
delete_sem(dev->result_sem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -66,8 +91,8 @@ ps2_dev_handle_int(ps2_dev *dev, uint8 data)
|
|||||||
{
|
{
|
||||||
if (!dev->active) {
|
if (!dev->active) {
|
||||||
ps2_service_handle_device_added(dev);
|
ps2_service_handle_device_added(dev);
|
||||||
return B_HANDLED_INTERRUPT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->result_buf_cnt) {
|
if (dev->result_buf_cnt) {
|
||||||
dev->result_buf[dev->result_buf_idx] = data;
|
dev->result_buf[dev->result_buf_idx] = data;
|
||||||
dev->result_buf_idx++;
|
dev->result_buf_idx++;
|
||||||
@@ -78,6 +103,10 @@ ps2_dev_handle_int(ps2_dev *dev, uint8 data)
|
|||||||
}
|
}
|
||||||
return B_HANDLED_INTERRUPT;
|
return B_HANDLED_INTERRUPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!dev->active) {
|
||||||
|
return B_HANDLED_INTERRUPT;
|
||||||
|
}
|
||||||
|
|
||||||
// temporary hack...
|
// temporary hack...
|
||||||
if (dev->flags & PS2_FLAG_KEYB)
|
if (dev->flags & PS2_FLAG_KEYB)
|
||||||
@@ -85,3 +114,4 @@ ps2_dev_handle_int(ps2_dev *dev, uint8 data)
|
|||||||
else
|
else
|
||||||
return mouse_handle_int(data);
|
return mouse_handle_int(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ extern ps2_dev ps2_device[5];
|
|||||||
|
|
||||||
#define PS2_FLAG_KEYB 1
|
#define PS2_FLAG_KEYB 1
|
||||||
|
|
||||||
|
status_t ps2_dev_init(void);
|
||||||
|
void ps2_dev_exit(void);
|
||||||
|
|
||||||
void ps2_dev_publish(ps2_dev *dev);
|
void ps2_dev_publish(ps2_dev *dev);
|
||||||
void ps2_dev_unpublish(ps2_dev *dev);
|
void ps2_dev_unpublish(ps2_dev *dev);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user