* Keyboard repeat is no longer crashing, in fact it's just working now :-)

* More minor cleanup.
* All that's missing is to make the keyboard repeat delay/rate configurable,
  but that can be done later (and is pretty simple, too).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18260 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-07-25 00:47:02 +00:00
parent bcf475ec65
commit eaf9428ba1
+27 -17
View File
@@ -24,6 +24,10 @@
#define MAX_BUTTONS 16 #define MAX_BUTTONS 16
static status_t hid_device_added(const usb_device *dev, void **cookie);
static status_t hid_device_removed(void *cookie);
typedef struct driver_cookie { typedef struct driver_cookie {
struct driver_cookie *next; struct driver_cookie *next;
hid_device_info *device; hid_device_info *device;
@@ -32,7 +36,14 @@ typedef struct driver_cookie {
int32 api_version = B_CUR_DRIVER_API_VERSION; int32 api_version = B_CUR_DRIVER_API_VERSION;
const char *hid_driver_name = "hid"; const char *hid_driver_name = "hid";
usb_module_info *usb; static usb_notify_hooks sNotifyHooks = {
hid_device_added, hid_device_removed
};
#define SUPPORTED_DEVICES 1
static usb_support_descriptor sSupportedDevices[SUPPORTED_DEVICES] = {
{ USB_HID_DEVICE_CLASS, 0, 0, 0, 0 },
};
const uint32 modifier_table[] = { const uint32 modifier_table[] = {
KEY_ControlL, KEY_ControlL,
@@ -261,6 +272,8 @@ const uint32 key_table[] = {
0x00, // unmapped 0x00, // unmapped
}; };
usb_module_info *usb;
static int sKeyboardDeviceNumber = 0; static int sKeyboardDeviceNumber = 0;
static int sMouseDeviceNumber = 0; static int sMouseDeviceNumber = 0;
static const char *sKeyboardBaseName = "input/keyboard/usb/"; static const char *sKeyboardBaseName = "input/keyboard/usb/";
@@ -293,14 +306,14 @@ create_device(const usb_device *dev, const usb_interface_info *ii,
return NULL; return NULL;
device->sem_cb = sem = create_sem(0, DRIVER_NAME "_cb"); device->sem_cb = sem = create_sem(0, DRIVER_NAME "_cb");
if (sem < 0) { if (sem < B_OK) {
DPRINTF_ERR((MY_ID "create_sem() failed %d\n", (int)sem)); DPRINTF_ERR((MY_ID "create_sem() failed %d\n", (int)sem));
free(device); free(device);
return NULL; return NULL;
} }
device->sem_lock = sem = create_sem(1, DRIVER_NAME "_lock"); device->sem_lock = sem = create_sem(1, DRIVER_NAME "_lock");
if (sem < 0) { if (sem < B_OK) {
DPRINTF_ERR((MY_ID "create_sem() failed %d\n", (int)sem)); DPRINTF_ERR((MY_ID "create_sem() failed %d\n", (int)sem));
delete_sem(device->sem_cb); delete_sem(device->sem_cb);
free(device); free(device);
@@ -311,7 +324,7 @@ create_device(const usb_device *dev, const usb_interface_info *ii,
device->buffer_area = area = create_area(area_name, device->buffer_area = area = create_area(area_name,
(void **) &device->buffer, B_ANY_KERNEL_ADDRESS, (void **) &device->buffer, B_ANY_KERNEL_ADDRESS,
B_PAGE_SIZE, B_CONTIGUOUS, B_READ_AREA | B_WRITE_AREA); B_PAGE_SIZE, B_CONTIGUOUS, B_READ_AREA | B_WRITE_AREA);
if (area < 0) { if (area < B_OK) {
DPRINTF_ERR((MY_ID "create_area() failed %d\n", (int)area)); DPRINTF_ERR((MY_ID "create_area() failed %d\n", (int)area));
delete_sem(device->sem_cb); delete_sem(device->sem_cb);
delete_sem(device->sem_lock); delete_sem(device->sem_lock);
@@ -332,8 +345,9 @@ create_device(const usb_device *dev, const usb_interface_info *ii,
device->is_keyboard = isKeyboard; device->is_keyboard = isKeyboard;
// default values taken from the PS/2 driver // default values taken from the PS/2 driver
device->repeat_rate = ((31 - 0x0b) * 280) / 31 + 20; device->repeat_rate = 35000;
device->repeat_delay = 500000; device->repeat_delay = 300000;
device->repeat_timer.device = device;
return device; return device;
} }
@@ -343,6 +357,7 @@ void
remove_device(hid_device_info *device) remove_device(hid_device_info *device)
{ {
assert(device != NULL); assert(device != NULL);
cancel_timer(&device->repeat_timer.timer);
if (device->cbuf != NULL) { if (device->cbuf != NULL) {
cbuf_delete(device->cbuf); cbuf_delete(device->cbuf);
@@ -812,6 +827,7 @@ hid_device_added(const usb_device *dev, void **cookie)
return B_OK; return B_OK;
} }
static status_t static status_t
hid_device_removed(void *cookie) hid_device_removed(void *cookie)
{ {
@@ -822,6 +838,7 @@ hid_device_removed (void *cookie)
DPRINTF_INFO((MY_ID "device_removed(%s)\n", device->name)); DPRINTF_INFO((MY_ID "device_removed(%s)\n", device->name));
usb->cancel_queued_transfers (device->ept->handle); usb->cancel_queued_transfers (device->ept->handle);
remove_device_info(device); remove_device_info(device);
if (device->open == 0) { if (device->open == 0) {
if (device->insns != NULL) if (device->insns != NULL)
free(device->insns); free(device->insns);
@@ -830,18 +847,10 @@ hid_device_removed (void *cookie)
DPRINTF_INFO((MY_ID "%s still open\n", device->name)); DPRINTF_INFO((MY_ID "%s still open\n", device->name));
device->active = false; device->active = false;
} }
return B_OK; return B_OK;
} }
static usb_notify_hooks sNotifyHooks = {
hid_device_added, hid_device_removed
};
#define SUPPORTED_DEVICES 1
usb_support_descriptor my_supported_devices [SUPPORTED_DEVICES] = {
{ USB_HID_DEVICE_CLASS, 0, 0, 0, 0 },
};
static status_t static status_t
hid_device_open(const char *name, uint32 flags, hid_device_open(const char *name, uint32 flags,
@@ -1014,12 +1023,13 @@ init_driver(void)
if (get_module(B_USB_MODULE_NAME, (module_info **)&usb) != B_OK) if (get_module(B_USB_MODULE_NAME, (module_info **)&usb) != B_OK)
return B_ERROR; return B_ERROR;
if ((gDeviceListLock = create_sem (1, "dev_list_lock")) < 0) { gDeviceListLock = create_sem(1, "dev_list_lock");
if (gDeviceListLock < B_OK) {
put_module(B_USB_MODULE_NAME); put_module(B_USB_MODULE_NAME);
return gDeviceListLock; return gDeviceListLock;
} }
usb->register_driver(hid_driver_name, my_supported_devices, usb->register_driver(hid_driver_name, sSupportedDevices,
SUPPORTED_DEVICES, NULL); SUPPORTED_DEVICES, NULL);
usb->install_notify(hid_driver_name, &sNotifyHooks); usb->install_notify(hid_driver_name, &sNotifyHooks);
DPRINTF_INFO((MY_ID "init_driver() OK\n")); DPRINTF_INFO((MY_ID "init_driver() OK\n"));