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:
@@ -3,14 +3,22 @@ SubDir HAIKU_TOP src add-ons kernel drivers input usb_hid ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SubDirSysHdrs $(HAIKU_TOP) headers os drivers ;
|
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 :
|
KernelAddon usb_hid : kernel drivers bin :
|
||||||
hid.c
|
hid.c
|
||||||
hidparse.c
|
hidparse.c
|
||||||
devlist.c
|
devlist.c
|
||||||
|
$(buffer_impl)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
SEARCH on [ FGristFiles ring_buffer.cpp ] = [ FDirName $(HAIKU_TOP) src system kernel util ] ;
|
||||||
|
|
||||||
ObjectHdrs [ FGristFiles hid$(SUFOBJ) ]
|
ObjectHdrs [ FGristFiles hid$(SUFOBJ) ]
|
||||||
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR) preferences devices ] ;
|
: [ 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->insns = NULL;
|
||||||
device->num_insns = 0;
|
device->num_insns = 0;
|
||||||
device->flags = 0;
|
device->flags = 0;
|
||||||
device->cbuf = cbuf_init(384);
|
device->rbuf = create_ring_buffer(384);
|
||||||
device->is_keyboard = isKeyboard;
|
device->is_keyboard = isKeyboard;
|
||||||
|
|
||||||
// default values taken from the PS/2 driver
|
// default values taken from the PS/2 driver
|
||||||
@@ -360,9 +360,9 @@ remove_device(hid_device_info *device)
|
|||||||
assert(device != NULL);
|
assert(device != NULL);
|
||||||
cancel_timer(&device->repeat_timer.timer);
|
cancel_timer(&device->repeat_timer.timer);
|
||||||
|
|
||||||
if (device->cbuf != NULL) {
|
if (device->rbuf != NULL) {
|
||||||
cbuf_delete(device->cbuf);
|
delete_ring_buffer(device->rbuf);
|
||||||
device->cbuf = NULL;
|
device->rbuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_area(device->buffer_area);
|
delete_area(device->buffer_area);
|
||||||
@@ -380,7 +380,7 @@ write_key(hid_device_info *device, uint32 key, bool down)
|
|||||||
raw.is_keydown = down;
|
raw.is_keydown = down;
|
||||||
raw.timestamp = system_time();
|
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);
|
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.modifiers = 0;
|
||||||
info.timestamp = device->timestamp;
|
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);
|
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);
|
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
return err;
|
return err;
|
||||||
cbuf_getn(device->cbuf, arg, sizeof(raw_key_info));
|
ring_buffer_user_read(device->rbuf, arg, sizeof(raw_key_info));
|
||||||
return err;
|
return err;
|
||||||
break;
|
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);
|
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
return err;
|
return err;
|
||||||
cbuf_getn(device->cbuf, arg, sizeof(mouse_movement));
|
ring_buffer_user_read(device->rbuf, arg, sizeof(mouse_movement));
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
case MS_NUM_EVENTS:
|
case MS_NUM_EVENTS:
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#define _HID_H_
|
#define _HID_H_
|
||||||
|
|
||||||
#include "hidparse.h"
|
#include "hidparse.h"
|
||||||
|
#include "ring_buffer.h"
|
||||||
|
|
||||||
#include <Drivers.h>
|
#include <Drivers.h>
|
||||||
#include <USB.h>
|
#include <USB.h>
|
||||||
@@ -26,29 +27,6 @@
|
|||||||
#define DPRINTF_ERR(x) dprintf x
|
#define DPRINTF_ERR(x) dprintf x
|
||||||
#endif
|
#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 */
|
/* driver specific definitions */
|
||||||
|
|
||||||
#define DRIVER_NAME "usb_hid"
|
#define DRIVER_NAME "usb_hid"
|
||||||
@@ -87,7 +65,7 @@ typedef struct hid_device_info {
|
|||||||
uint16 ifno;
|
uint16 ifno;
|
||||||
char name[30];
|
char name[30];
|
||||||
|
|
||||||
cbuffer *cbuf;
|
struct ring_buffer *rbuf;
|
||||||
|
|
||||||
bool active;
|
bool active;
|
||||||
int open;
|
int open;
|
||||||
|
|||||||
Reference in New Issue
Block a user