* 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:
@@ -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/";
|
||||||
@@ -288,34 +301,34 @@ create_device(const usb_device *dev, const usb_interface_info *ii,
|
|||||||
base_name = sMouseBaseName;
|
base_name = sMouseBaseName;
|
||||||
}
|
}
|
||||||
|
|
||||||
device = malloc (sizeof (hid_device_info));
|
device = malloc(sizeof(hid_device_info));
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
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);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf (area_name, DRIVER_NAME "_buffer%d", number);
|
sprintf(area_name, DRIVER_NAME "_buffer%d", number);
|
||||||
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);
|
||||||
free (device);
|
free(device);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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);
|
||||||
@@ -624,7 +639,7 @@ usb_callback(void *cookie, uint32 busStatus,
|
|||||||
// #pragma mark - device hooks
|
// #pragma mark - device hooks
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
hid_device_added(const usb_device *dev, void **cookie)
|
hid_device_added(const usb_device *dev, void **cookie)
|
||||||
{
|
{
|
||||||
hid_device_info *device;
|
hid_device_info *device;
|
||||||
@@ -812,36 +827,30 @@ hid_device_added(const usb_device *dev, void **cookie)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static status_t
|
|
||||||
hid_device_removed (void *cookie)
|
static status_t
|
||||||
|
hid_device_removed(void *cookie)
|
||||||
{
|
{
|
||||||
hid_device_info *device = cookie;
|
hid_device_info *device = cookie;
|
||||||
|
|
||||||
assert (cookie != NULL);
|
assert (cookie != NULL);
|
||||||
|
|
||||||
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);
|
||||||
remove_device (device);
|
remove_device(device);
|
||||||
} else {
|
} else {
|
||||||
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,
|
||||||
@@ -977,15 +986,15 @@ hid_device_free(driver_cookie *cookie)
|
|||||||
{
|
{
|
||||||
hid_device_info *device;
|
hid_device_info *device;
|
||||||
|
|
||||||
assert (cookie != NULL && cookie->device != NULL);
|
assert(cookie != NULL && cookie->device != NULL);
|
||||||
device = cookie->device;
|
device = cookie->device;
|
||||||
DPRINTF_INFO ((MY_ID "free(%s)\n", device->name));
|
DPRINTF_INFO((MY_ID "free(%s)\n", device->name));
|
||||||
|
|
||||||
free (cookie);
|
free(cookie);
|
||||||
if (device->open > 0)
|
if (device->open > 0)
|
||||||
DPRINTF_INFO ((MY_ID "%d opens left\n", device->open));
|
DPRINTF_INFO((MY_ID "%d opens left\n", device->open));
|
||||||
else if (!device->active) {
|
else if (!device->active) {
|
||||||
DPRINTF_INFO ((MY_ID "removed %s\n", device->name));
|
DPRINTF_INFO((MY_ID "removed %s\n", device->name));
|
||||||
if (device->insns != NULL)
|
if (device->insns != NULL)
|
||||||
free (device->insns);
|
free (device->insns);
|
||||||
remove_device (device);
|
remove_device (device);
|
||||||
@@ -1009,17 +1018,18 @@ init_hardware(void)
|
|||||||
status_t
|
status_t
|
||||||
init_driver(void)
|
init_driver(void)
|
||||||
{
|
{
|
||||||
DPRINTF_INFO ((MY_ID "init_driver() " __DATE__ " " __TIME__ "\n"));
|
DPRINTF_INFO((MY_ID "init_driver() " __DATE__ " " __TIME__ "\n"));
|
||||||
|
|
||||||
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"));
|
||||||
|
|||||||
Reference in New Issue
Block a user