From 7593e461e39ce20c4127c060ca01100d6a1e6a1e Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Mon, 16 Jan 2006 13:43:23 +0000 Subject: [PATCH] allow communication with non-active ps2 devices git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15974 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/input/ps2_hid_new/common.c | 4 ++ .../drivers/input/ps2_hid_new/ps2_dev.c | 60 ++++++++++++++----- .../drivers/input/ps2_hid_new/ps2_dev.h | 3 + 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/add-ons/kernel/drivers/input/ps2_hid_new/common.c b/src/add-ons/kernel/drivers/input/ps2_hid_new/common.c index b7bb27e205..53c00ac32e 100644 --- a/src/add-ons/kernel/drivers/input/ps2_hid_new/common.c +++ b/src/add-ons/kernel/drivers/input/ps2_hid_new/common.c @@ -270,6 +270,8 @@ init_driver(void) if (gDeviceOpenSemaphore < B_OK) goto err_2; + status = ps2_dev_init(); + status = ps2_service_init(); 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); err_3: ps2_service_exit(); + ps2_dev_exit(); delete_sem(gDeviceOpenSemaphore); delete_sem(sKbcSem); 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_KEYBOARD, &ps2_interrupt, NULL); ps2_service_exit(); + ps2_dev_exit(); delete_sem(gDeviceOpenSemaphore); delete_sem(sKbcSem); put_module(B_ISA_MODULE_NAME); diff --git a/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.c b/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.c index ce0157dc73..89f269849e 100644 --- a/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.c +++ b/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.c @@ -12,16 +12,49 @@ #include "ps2_dev.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/1", .active = false }, - { .name = "input/mouse/ps2/2", .active = false }, - { .name = "input/mouse/ps2/3", .active = false }, - { .name = "input/keyboard/at/0", .active = false, .flags = PS2_FLAG_KEYB } + { .name = "input/mouse/ps2/0", .active = false, .result_sem = -1 }, + { .name = "input/mouse/ps2/1", .active = false, .result_sem = -1 }, + { .name = "input/mouse/ps2/2", .active = false, .result_sem = -1 }, + { .name = "input/mouse/ps2/3", .active = false, .result_sem = -1 }, + { .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 ps2_dev_publish(ps2_dev *dev) { @@ -32,12 +65,6 @@ ps2_dev_publish(ps2_dev *dev) 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; 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)); dev->active = false; - - delete_sem(dev->result_sem); } @@ -66,8 +91,8 @@ ps2_dev_handle_int(ps2_dev *dev, uint8 data) { if (!dev->active) { ps2_service_handle_device_added(dev); - return B_HANDLED_INTERRUPT; } + if (dev->result_buf_cnt) { dev->result_buf[dev->result_buf_idx] = data; dev->result_buf_idx++; @@ -78,6 +103,10 @@ ps2_dev_handle_int(ps2_dev *dev, uint8 data) } return B_HANDLED_INTERRUPT; } + + if (!dev->active) { + return B_HANDLED_INTERRUPT; + } // temporary hack... if (dev->flags & PS2_FLAG_KEYB) @@ -85,3 +114,4 @@ ps2_dev_handle_int(ps2_dev *dev, uint8 data) else return mouse_handle_int(data); } + diff --git a/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.h b/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.h index a338f94557..8715db8817 100644 --- a/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.h +++ b/src/add-ons/kernel/drivers/input/ps2_hid_new/ps2_dev.h @@ -30,6 +30,9 @@ extern ps2_dev ps2_device[5]; #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_unpublish(ps2_dev *dev);