usb_hid now uses our kernel ring_buffer implementation even on BeOS

fixes bug #722


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18392 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2006-08-04 19:24:08 +00:00
parent 6a6c43798f
commit 78f9905a57
3 changed files with 19 additions and 33 deletions
@@ -3,14 +3,22 @@ SubDir HAIKU_TOP src add-ons kernel drivers input usb_hid ;
SetSubDirSupportedPlatformsBeOSCompatible ;
SubDirSysHdrs $(HAIKU_TOP) headers os drivers ;
UsePrivateHeaders input ;
UsePrivateHeaders [ FDirName kernel util ] input ;
local buffer_impl = ;
if $(TARGET_PLATFORM) != haiku {
buffer_impl = ring_buffer.cpp ;
}
KernelAddon usb_hid : kernel drivers bin :
hid.c
hidparse.c
devlist.c
$(buffer_impl)
;
SEARCH on [ FGristFiles ring_buffer.cpp ] = [ FDirName $(HAIKU_TOP) src system kernel util ] ;
ObjectHdrs [ FGristFiles hid$(SUFOBJ) ]
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR) preferences devices ] ;
@@ -342,7 +342,7 @@ create_device(const usb_device *dev, const usb_interface_info *ii,
device->insns = NULL;
device->num_insns = 0;
device->flags = 0;
device->cbuf = cbuf_init(384);
device->rbuf = create_ring_buffer(384);
device->is_keyboard = isKeyboard;
// default values taken from the PS/2 driver
@@ -360,9 +360,9 @@ remove_device(hid_device_info *device)
assert(device != NULL);
cancel_timer(&device->repeat_timer.timer);
if (device->cbuf != NULL) {
cbuf_delete(device->cbuf);
device->cbuf = NULL;
if (device->rbuf != NULL) {
delete_ring_buffer(device->rbuf);
device->rbuf = NULL;
}
delete_area(device->buffer_area);
@@ -380,7 +380,7 @@ write_key(hid_device_info *device, uint32 key, bool down)
raw.is_keydown = down;
raw.timestamp = system_time();
cbuf_putn(device->cbuf, &raw, sizeof(raw_key_info));
ring_buffer_write(device->rbuf, (const uint8*)&raw, sizeof(raw_key_info));
release_sem_etc(device->sem_cb, 1, B_DO_NOT_RESCHEDULE);
}
@@ -571,7 +571,7 @@ interpret_mouse_buffer(hid_device_info *device)
info.modifiers = 0;
info.timestamp = device->timestamp;
cbuf_putn(device->cbuf, &info, sizeof(info));
ring_buffer_write(device->rbuf, (const uint8*)&info, sizeof(info));
release_sem_etc(device->sem_cb, 1, B_DO_NOT_RESCHEDULE);
}
@@ -920,7 +920,7 @@ hid_device_control(driver_cookie *cookie, uint32 op,
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
if (err != B_OK)
return err;
cbuf_getn(device->cbuf, arg, sizeof(raw_key_info));
ring_buffer_user_read(device->rbuf, arg, sizeof(raw_key_info));
return err;
break;
@@ -934,7 +934,7 @@ hid_device_control(driver_cookie *cookie, uint32 op,
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
if (err != B_OK)
return err;
cbuf_getn(device->cbuf, arg, sizeof(mouse_movement));
ring_buffer_user_read(device->rbuf, arg, sizeof(mouse_movement));
return err;
break;
case MS_NUM_EVENTS:
+2 -24
View File
@@ -13,6 +13,7 @@
#define _HID_H_
#include "hidparse.h"
#include "ring_buffer.h"
#include <Drivers.h>
#include <USB.h>
@@ -26,29 +27,6 @@
#define DPRINTF_ERR(x) dprintf x
#endif
/* Undocumented kernel cbuf_* functions */
struct cbuffer_t;
typedef struct cbuffer_t cbuffer;
size_t cbuf_getn_no_lock(cbuffer *, char *, size_t);
size_t cbuf_putn_no_lock(cbuffer *, char *, size_t);
cbuffer *cbuf_init(size_t size);
void cbuf_delete(cbuffer *buffer);
char cbuf_get(cbuffer *);
bool cbuf_mt(cbuffer *);
bool cbuf_full(cbuffer *);
status_t cbuf_put(cbuffer *, char);
status_t cbuf_unput(cbuffer *);
void cbuf_flush(cbuffer *);
size_t cbuf_size(cbuffer *);
size_t cbuf_avail(cbuffer *);
size_t cbuf_free(cbuffer *);
size_t cbuf_putn(cbuffer *, void *, size_t num_bytes);
size_t cbuf_getn(cbuffer *, void *, size_t num_bytes);
cpu_status cbuf_lock(cbuffer *);
void cbuf_unlock(cbuffer *, cpu_status);
/* driver specific definitions */
#define DRIVER_NAME "usb_hid"
@@ -87,7 +65,7 @@ typedef struct hid_device_info {
uint16 ifno;
char name[30];
cbuffer *cbuf;
struct ring_buffer *rbuf;
bool active;
int open;