From 78f9905a575cfec5a730c9e73a0acd64c9ad7505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 4 Aug 2006 19:24:08 +0000 Subject: [PATCH] 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 --- .../kernel/drivers/input/usb_hid/Jamfile | 10 ++++++- .../kernel/drivers/input/usb_hid/hid.c | 16 ++++++------ .../kernel/drivers/input/usb_hid/hid.h | 26 ++----------------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/add-ons/kernel/drivers/input/usb_hid/Jamfile b/src/add-ons/kernel/drivers/input/usb_hid/Jamfile index 619a361042..7c930b8d89 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/Jamfile +++ b/src/add-ons/kernel/drivers/input/usb_hid/Jamfile @@ -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 ] ; diff --git a/src/add-ons/kernel/drivers/input/usb_hid/hid.c b/src/add-ons/kernel/drivers/input/usb_hid/hid.c index 48770e229d..2dffdf227a 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/hid.c +++ b/src/add-ons/kernel/drivers/input/usb_hid/hid.c @@ -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: diff --git a/src/add-ons/kernel/drivers/input/usb_hid/hid.h b/src/add-ons/kernel/drivers/input/usb_hid/hid.h index 3a290b6edf..4752867516 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/hid.h +++ b/src/add-ons/kernel/drivers/input/usb_hid/hid.h @@ -13,6 +13,7 @@ #define _HID_H_ #include "hidparse.h" +#include "ring_buffer.h" #include #include @@ -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;