* standart -> standard

* Hopefully fixed most of the coding style violations
* ps2_trackpoint.h had the wrong header guard


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28425 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2008-11-01 13:00:00 +00:00
parent 617fdc096a
commit 5bb8f08567
9 changed files with 353 additions and 332 deletions

View File

@ -9,7 +9,7 @@ KernelAddon ps2 :
ps2_dev.c
ps2_keyboard.c
ps2_module.c
ps2_standart_mouse.c
ps2_standard_mouse.c
ps2_synaptics.c
ps2_trackpoint.c
ps2_service.c

View File

@ -7,8 +7,7 @@
# define INFO(x...)
#endif
typedef union
{
typedef union {
float value;
/* FIXME: Assumes 32 bit int. */
unsigned int word;
@ -41,23 +40,23 @@ floorf(float x)
uint32 i;
GET_FLOAT_WORD(i0,x);
j0 = ((i0>>23)&0xff)-0x7f;
if(j0<23) {
if(j0<0) { /* raise inexact if x != 0 */
if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
if(i0>=0) {i0=0;}
else if((i0&0x7fffffff)!=0)
if (j0<23) {
if (j0<0) { /* raise inexact if x != 0 */
if (huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
if (i0>=0) {i0=0;}
else if ((i0&0x7fffffff)!=0)
{ i0=0xbf800000;}
}
} else {
i = (0x007fffff)>>j0;
if((i0&i)==0) return x; /* x is integral */
if(huge+x>(float)0.0) { /* raise inexact flag */
if(i0<0) i0 += (0x00800000)>>j0;
if ((i0&i)==0) return x; /* x is integral */
if (huge+x>(float)0.0) { /* raise inexact flag */
if (i0<0) i0 += (0x00800000)>>j0;
i0 &= (~i);
}
}
} else {
if(j0==0x80) return x+x; /* inf or NaN */
if (j0==0x80) return x+x; /* inf or NaN */
else return x; /* x is integral */
}
SET_FLOAT_WORD(x,i0);
@ -73,22 +72,22 @@ ceilf(float x)
GET_FLOAT_WORD(i0,x);
j0 = ((i0>>23)&0xff)-0x7f;
if(j0<23) {
if(j0<0) { /* raise inexact if x != 0 */
if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
if(i0<0) {i0=0x80000000;}
else if(i0!=0) { i0=0x3f800000;}
if (j0<23) {
if (j0<0) { /* raise inexact if x != 0 */
if (huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
if (i0<0) {i0=0x80000000;}
else if (i0!=0) { i0=0x3f800000;}
}
} else {
i = (0x007fffff)>>j0;
if((i0&i)==0) return x; /* x is integral */
if(huge+x>(float)0.0) { /* raise inexact flag */
if(i0>0) i0 += (0x00800000)>>j0;
if ((i0&i)==0) return x; /* x is integral */
if (huge+x>(float)0.0) { /* raise inexact flag */
if (i0>0) i0 += (0x00800000)>>j0;
i0 &= (~i);
}
}
} else {
if(j0==0x80) return x+x; /* inf or NaN */
if (j0==0x80) return x+x; /* inf or NaN */
else return x; /* x is integral */
}
SET_FLOAT_WORD(x,i0);
@ -108,25 +107,25 @@ sqrtf(float x)
GET_FLOAT_WORD(ix,x);
/* take care of Inf and NaN */
if((ix&0x7f800000)==0x7f800000) {
if ((ix&0x7f800000)==0x7f800000) {
return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
sqrt(-inf)=sNaN */
}
/* take care of zero */
if(ix<=0) {
if((ix&(~sign))==0) return x;/* sqrt(+-0) = +-0 */
else if(ix<0)
if (ix<=0) {
if ((ix&(~sign))==0) return x;/* sqrt(+-0) = +-0 */
else if (ix<0)
return (x-x)/(x-x); /* sqrt(-ve) = sNaN */
}
/* normalize x */
m = (ix>>23);
if(m==0) { /* subnormal x */
if (m==0) { /* subnormal x */
for(i=0;(ix&0x00800000)==0;i++) ix<<=1;
m -= i-1;
}
m -= 127; /* unbias exponent */
ix = (ix&0x007fffff)|0x00800000;
if(m&1) /* odd m, double x to make it even */
if (m&1) /* odd m, double x to make it even */
ix += ix;
m >>= 1; /* m = [m/2] */
@ -137,7 +136,7 @@ sqrtf(float x)
while(r!=0) {
t = s+r;
if(t<=ix) {
if (t<=ix) {
s = t+r;
ix -= t;
q += r;
@ -147,7 +146,7 @@ sqrtf(float x)
}
/* use floating add to find out rounding direction */
if(ix!=0) {
if (ix!=0) {
z = one-tiny; /* trigger inexact flag */
if (z>=one) {
z = one+tiny;
@ -165,8 +164,9 @@ sqrtf(float x)
int32
make_small(float value){
if(value > 0)
make_small(float value)
{
if (value > 0)
return floorf(value);
else
return ceilf(value);
@ -181,15 +181,14 @@ get_raw_movement(movement_maker *move, uint32 posX, uint32 posY)
float meanX = 0, meanY = 0;
// calculate mean
for(i = 0; i < move->n_points; i++){
for (i = 0; i < move->n_points; i++) {
meanXOld+= move->historyX[i];
meanYOld+= move->historyY[i];
}
if(move->n_points == 0){
if (move->n_points == 0) {
meanXOld = posX;
meanYOld = posY;
}
else{
} else {
meanXOld = meanXOld / move->n_points;
meanYOld = meanYOld / move->n_points;
}
@ -198,14 +197,14 @@ get_raw_movement(movement_maker *move, uint32 posX, uint32 posY)
meanY = (meanYOld + posY) / 2;
// fill history
for(i = 0; i < HISTORY_SIZE - 1; i++){
for (i = 0; i < HISTORY_SIZE - 1; i++) {
move->historyX[i] = move->historyX[i + 1];
move->historyY[i] = move->historyY[i + 1];
}
move->historyX[HISTORY_SIZE - 1] = meanX;
move->historyY[HISTORY_SIZE - 1] = meanY;
if(move->n_points < HISTORY_SIZE){
if (move->n_points < HISTORY_SIZE) {
move->n_points++;
move->xDelta = 0;
move->yDelta = 0;
@ -266,9 +265,9 @@ get_scrolling(movement_maker *move, uint32 posX, uint32 posY)
void
start_new_movment(movement_maker *move)
{
if(move->scrolling_xStep <= 0)
if (move->scrolling_xStep <= 0)
move->scrolling_xStep = 1;
if(move->scrolling_yStep <= 0)
if (move->scrolling_yStep <= 0)
move->scrolling_yStep = 1;
move->n_points = 0;

View File

@ -12,7 +12,7 @@
#include "ps2_dev.h"
#include "ps2_service.h"
#include "ps2_standart_mouse.h"
#include "ps2_standard_mouse.h"
#include "ps2_synaptics.h"
#include "ps2_trackpoint.h"
@ -22,12 +22,12 @@
ps2_dev ps2_device[PS2_DEVICE_COUNT] = {
{ .name = "input/mouse/ps2/0", .active = false, .idx = 0, .result_sem = -1, .command = standart_command_timeout },
{ .name = "input/mouse/ps2/1", .active = false, .idx = 1, .result_sem = -1, .command = standart_command_timeout },
{ .name = "input/mouse/ps2/2", .active = false, .idx = 2, .result_sem = -1, .command = standart_command_timeout },
{ .name = "input/mouse/ps2/3", .active = false, .idx = 3, .result_sem = -1, .command = standart_command_timeout },
{ .name = "input/mouse/ps2/0", .active = false, .idx = 0, .result_sem = -1, .command = standard_command_timeout },
{ .name = "input/mouse/ps2/1", .active = false, .idx = 1, .result_sem = -1, .command = standard_command_timeout },
{ .name = "input/mouse/ps2/2", .active = false, .idx = 2, .result_sem = -1, .command = standard_command_timeout },
{ .name = "input/mouse/ps2/3", .active = false, .idx = 3, .result_sem = -1, .command = standard_command_timeout },
{ .name = "input/mouse/ps2/synaptics_passthrough", .active = false, .result_sem = -1, .command = passthrough_command},
{ .name = "input/keyboard/at/0", .active = false, .result_sem = -1, .flags = PS2_FLAG_KEYB, .command = standart_command_timeout }
{ .name = "input/keyboard/at/0", .active = false, .result_sem = -1, .flags = PS2_FLAG_KEYB, .command = standard_command_timeout }
};
@ -67,29 +67,29 @@ ps2_dev_detect_pointing(ps2_dev *dev, device_hooks **hooks)
// the probe function has to set the dev name and the dev packet size
status = probe_trackpoint(dev);
if (status == B_OK){
*hooks = &gStandartMouseDeviceHooks;
if (status == B_OK) {
*hooks = &gStandardMouseDeviceHooks;
goto dev_found;
}
status = probe_synaptics(dev);
if (status == B_OK){
if (status == B_OK) {
*hooks = &gSynapticsDeviceHooks;
goto dev_found;
}
status = probe_standart_mouse(dev);
if (status == B_OK){
*hooks = &gStandartMouseDeviceHooks;
status = probe_standard_mouse(dev);
if (status == B_OK) {
*hooks = &gStandardMouseDeviceHooks;
goto dev_found;
}
return B_ERROR;
dev_found:
if(dev == &(ps2_device[PS2_DEVICE_SYN_PASSTHROUGH])){
if (dev == &(ps2_device[PS2_DEVICE_SYN_PASSTHROUGH]))
synaptics_pt_set_packagesize(dev, dev->packet_size);
}
return B_OK;
}
@ -134,13 +134,12 @@ ps2_dev_publish(ps2_dev *dev)
if (dev->active)
return;
if(atomic_get(&dev->flags) & PS2_FLAG_KEYB){
if (atomic_get(&dev->flags) & PS2_FLAG_KEYB) {
status = devfs_publish_device(dev->name, &gKeyboardDeviceHooks);
}
else{
} else {
device_hooks *hooks;
status = ps2_dev_detect_pointing(dev, &hooks);
if(status == B_OK){
if (status == B_OK) {
status = devfs_publish_device(dev->name, hooks);
}
@ -265,7 +264,7 @@ pass_to_handler:
status_t
standart_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout)
standard_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout)
{
status_t res;
bigtime_t start;

View File

@ -41,7 +41,8 @@ struct ps2_dev
// functions
void (*disconnect)(ps2_dev *);
int32 (*handle_int)(ps2_dev *);
status_t (*command)(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout);
status_t (*command)(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count, bigtime_t timeout);
};
#define PS2_DEVICE_COUNT 6
@ -52,13 +53,13 @@ extern ps2_dev ps2_device[PS2_DEVICE_COUNT];
#define PS2_DEVICE_SYN_PASSTHROUGH 4
#define PS2_DEVICE_KEYB 5
#define PS2_FLAG_KEYB (1<<0)
#define PS2_FLAG_OPEN (1<<1)
#define PS2_FLAG_ENABLED (1<<2)
#define PS2_FLAG_CMD (1<<3)
#define PS2_FLAG_ACK (1<<4)
#define PS2_FLAG_NACK (1<<5)
#define PS2_FLAG_GETID (1<<6)
#define PS2_FLAG_KEYB (1 << 0)
#define PS2_FLAG_OPEN (1 << 1)
#define PS2_FLAG_ENABLED (1 << 2)
#define PS2_FLAG_CMD (1 << 3)
#define PS2_FLAG_ACK (1 << 4)
#define PS2_FLAG_NACK (1 << 5)
#define PS2_FLAG_GETID (1 << 6)
void ps2_dev_send(ps2_dev *dev, uint8 data);
@ -67,10 +68,13 @@ status_t ps2_dev_detect_pointing(ps2_dev *dev, device_hooks **hooks);
status_t ps2_dev_init(void);
void ps2_dev_exit(void);
status_t standart_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout);
status_t standard_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count, bigtime_t timeout);
status_t ps2_dev_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count);
status_t ps2_dev_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout);
status_t ps2_dev_command(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count);
status_t ps2_dev_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count, bigtime_t timeout);
void ps2_dev_publish(ps2_dev *dev);
void ps2_dev_unpublish(ps2_dev *dev);

View File

@ -58,17 +58,22 @@
#include "kb_mouse_driver.h"
#include "ps2_service.h"
#include "ps2_standart_mouse.h"
#include "ps2_standard_mouse.h"
const char* kStandartMousePath[4] = {"input/mouse/ps2/standart_0",
"input/mouse/ps2/standart_1",
"input/mouse/ps2/standart_2",
"input/mouse/ps2/standart_3"};
const char* kIntelliMousePath[4] = {"input/mouse/ps2/intelli_0",
const char* kStandardMousePath[4] = {
"input/mouse/ps2/standard_0",
"input/mouse/ps2/standard_1",
"input/mouse/ps2/standard_2",
"input/mouse/ps2/standard_3"
};
const char* kIntelliMousePath[4] = {
"input/mouse/ps2/intelli_0",
"input/mouse/ps2/intelli_1",
"input/mouse/ps2/intelli_2",
"input/mouse/ps2/intelli_3"};
"input/mouse/ps2/intelli_3"
};
/** Set sampling rate of the ps2 port.
*/
static inline status_t
@ -81,7 +86,8 @@ ps2_set_sample_rate(ps2_dev *dev, uint8 rate)
/** Converts a packet received by the mouse to a "movement".
*/
static void
ps2_packet_to_movement(standart_mouse_cookie *cookie, uint8 packet[], mouse_movement *pos)
ps2_packet_to_movement(standard_mouse_cookie *cookie, uint8 packet[],
mouse_movement *pos)
{
int buttons = packet[0] & 7;
int xDelta = ((packet[0] & 0x10) ? ~0xff : 0) | packet[1];
@ -107,7 +113,7 @@ ps2_packet_to_movement(standart_mouse_cookie *cookie, uint8 packet[], mouse_move
yDeltaWheel |= ~0x07;
}
/*
if (cookie->flags & F_standart_mouse_TYPE_2WHEELS) {
if (cookie->flags & F_standard_mouse_TYPE_2WHEELS) {
switch (packet[3] & 0x0F) {
case 0x01: yDeltaWheel = +1; break; // wheel 1 down
case 0x0F: yDeltaWheel = -1; break; // wheel 1 up
@ -117,9 +123,10 @@ ps2_packet_to_movement(standart_mouse_cookie *cookie, uint8 packet[], mouse_move
}
*/
// TRACE("packet: %02x %02x %02x %02x: xd %d, yd %d, 0x%x (%d), w-xd %d, w-yd %d\n",
// packet[0], packet[1], packet[2], packet[3],
// xDelta, yDelta, buttons, cookie->click_count, xDeltaWheel, yDeltaWheel);
// TRACE("packet: %02x %02x %02x %02x: xd %d, yd %d, 0x%x (%d), w-xd %d, "
// "w-yd %d\n", packet[0], packet[1], packet[2], packet[3],
// xDelta, yDelta, buttons, cookie->click_count, xDeltaWheel,
// yDeltaWheel);
if (pos) {
pos->xdelta = xDelta;
@ -131,7 +138,8 @@ ps2_packet_to_movement(standart_mouse_cookie *cookie, uint8 packet[], mouse_move
pos->wheel_ydelta = yDeltaWheel;
pos->wheel_xdelta = xDeltaWheel;
TRACE("ps2: ps2_packet_to_movement xdelta: %d, ydelta: %d, buttons %x, clicks: %d, timestamp %Ld\n",
TRACE("ps2: ps2_packet_to_movement xdelta: %d, ydelta: %d, buttons %x, "
"clicks: %d, timestamp %Ld\n",
xDelta, yDelta, buttons, cookie->click_count, currentTime);
}
}
@ -140,24 +148,27 @@ ps2_packet_to_movement(standart_mouse_cookie *cookie, uint8 packet[], mouse_move
/** Read a mouse event from the mouse events chain buffer.
*/
static status_t
standart_mouse_read_event(standart_mouse_cookie *cookie, mouse_movement *movement)
standard_mouse_read_event(standard_mouse_cookie *cookie,
mouse_movement *movement)
{
uint8 packet[PS2_MAX_PACKET_SIZE];
status_t status;
TRACE("ps2: standart_mouse_read_event\n");
TRACE("ps2: standard_mouse_read_event\n");
status = acquire_sem_etc(cookie->standart_mouse_sem, 1, B_CAN_INTERRUPT, 0);
TRACE("ps2: standart_mouse_read_event acquired\n");
status = acquire_sem_etc(cookie->standard_mouse_sem, 1, B_CAN_INTERRUPT, 0);
TRACE("ps2: standard_mouse_read_event acquired\n");
if (status < B_OK)
return status;
if (!cookie->dev->active) {
TRACE("ps2: standart_mouse_read_event: Error device no longer active\n");
TRACE("ps2: standard_mouse_read_event: Error device no longer "
"active\n");
return B_ERROR;
}
if (packet_buffer_read(cookie->standart_mouse_buffer, packet, cookie->dev->packet_size) != cookie->dev->packet_size) {
if (packet_buffer_read(cookie->standard_mouse_buffer, packet,
cookie->dev->packet_size) != cookie->dev->packet_size) {
TRACE("ps2: error copying buffer\n");
return B_ERROR;
}
@ -171,12 +182,12 @@ standart_mouse_read_event(standart_mouse_cookie *cookie, mouse_movement *movemen
void
standart_mouse_disconnect(ps2_dev *dev)
standard_mouse_disconnect(ps2_dev *dev)
{
// the mouse device might not be opened at this point
INFO("ps2: ps2_standart_mouse_disconnect %s\n", dev->name);
INFO("ps2: ps2_standard_mouse_disconnect %s\n", dev->name);
if (dev->flags & PS2_FLAG_OPEN)
release_sem(((standart_mouse_cookie *)dev->cookie)->standart_mouse_sem);
release_sem(((standard_mouse_cookie *)dev->cookie)->standard_mouse_sem);
}
@ -187,12 +198,12 @@ standart_mouse_disconnect(ps2_dev *dev)
* calls to the handler, each holds a different byte on the data port.
*/
int32
standart_mouse_handle_int(ps2_dev *dev)
standard_mouse_handle_int(ps2_dev *dev)
{
standart_mouse_cookie *cookie = (standart_mouse_cookie*)dev->cookie;
standard_mouse_cookie *cookie = (standard_mouse_cookie*)dev->cookie;
const uint8 data = dev->history[0].data;
TRACE("ps2: standart mouse: %1x\t%1x\t%1x\t%1x\t%1x\t%1x\t%1x\t%1x\n",
TRACE("ps2: standard mouse: %1x\t%1x\t%1x\t%1x\t%1x\t%1x\t%1x\t%1x\n",
data >> 7 & 1, data >> 6 & 1, data >> 5 & 1,
data >> 4 & 1, data >> 3 & 1, data >> 2 & 1,
data >> 1 & 1, data >> 0 & 1);
@ -209,17 +220,21 @@ standart_mouse_handle_int(ps2_dev *dev)
return B_HANDLED_INTERRUPT;
}
if (cookie->packet_index == 1) {
int xDelta = ((cookie->packet_buffer[0] & 0x10) ? 0xFFFFFF00 : 0) | data;
int xDelta
= ((cookie->packet_buffer[0] & 0x10) ? 0xFFFFFF00 : 0) | data;
if (xDelta < -100 || xDelta > 100) {
INFO("ps2: strange mouse data, x-delta %d, trying resync\n", xDelta);
INFO("ps2: strange mouse data, x-delta %d, trying resync\n",
xDelta);
cookie->packet_index = 0;
return B_HANDLED_INTERRUPT;
}
}
if (cookie->packet_index == 2) {
int yDelta = ((cookie->packet_buffer[0] & 0x20) ? 0xFFFFFF00 : 0) | data;
int yDelta
= ((cookie->packet_buffer[0] & 0x20) ? 0xFFFFFF00 : 0) | data;
if (yDelta < -100 || yDelta > 100) {
INFO("ps2: strange mouse data, y-delta %d, trying resync\n", yDelta);
INFO("ps2: strange mouse data, y-delta %d, trying resync\n",
yDelta);
cookie->packet_index = 0;
return B_HANDLED_INTERRUPT;
}
@ -235,12 +250,13 @@ standart_mouse_handle_int(ps2_dev *dev)
// complete packet is assembled
cookie->packet_index = 0;
if (packet_buffer_write(cookie->standart_mouse_buffer, cookie->packet_buffer, dev->packet_size) != dev->packet_size) {
if (packet_buffer_write(cookie->standard_mouse_buffer,
cookie->packet_buffer, dev->packet_size) != dev->packet_size) {
// buffer is full, drop new data
return B_HANDLED_INTERRUPT;
}
release_sem_etc(cookie->standart_mouse_sem, 1, B_DO_NOT_RESCHEDULE);
release_sem_etc(cookie->standard_mouse_sem, 1, B_DO_NOT_RESCHEDULE);
return B_INVOKE_SCHEDULER;
}
@ -249,7 +265,7 @@ standart_mouse_handle_int(ps2_dev *dev)
status_t
probe_standart_mouse(ps2_dev * dev)
probe_standard_mouse(ps2_dev * dev)
{
status_t status;
uint8 deviceId = 0;
@ -269,16 +285,18 @@ probe_standart_mouse(ps2_dev * dev)
status = ps2_set_sample_rate(dev, 200);
status |= ps2_set_sample_rate(dev, 100);
status |= ps2_set_sample_rate(dev, 80);
status |= ps2_dev_command(dev, PS2_CMD_GET_DEVICE_ID, NULL, 0, &alternate_device_id, 1);
status |= ps2_dev_command(dev, PS2_CMD_GET_DEVICE_ID, NULL, 0,
&alternate_device_id, 1);
if (status == 0) {
TRACE("ps2: probe_mouse alternate device id: %2x\n", alternate_device_id);
TRACE("ps2: probe_mouse alternate device id: %2x\n",
alternate_device_id);
deviceId = alternate_device_id;
}
}
if (deviceId == PS2_DEV_ID_STANDARD) {
INFO("ps2: probe_mouse Standard PS/2 mouse found\n");
dev->name = kStandartMousePath[dev->idx];
dev->name = kStandardMousePath[dev->idx];
dev->packet_size = PS2_PACKET_STANDARD;
} else if (deviceId == PS2_DEV_ID_INTELLIMOUSE) {
dev->name = kIntelliMousePath[dev->idx];
@ -298,14 +316,14 @@ probe_standart_mouse(ps2_dev * dev)
status_t
standart_mouse_open(const char *name, uint32 flags, void **_cookie)
standard_mouse_open(const char *name, uint32 flags, void **_cookie)
{
standart_mouse_cookie *cookie;
standard_mouse_cookie *cookie;
status_t status;
ps2_dev *dev = NULL;
int i;
TRACE("ps2: standart_mouse_open %s\n", name);
TRACE("ps2: standard_mouse_open %s\n", name);
for (dev = NULL, i = 0; i < PS2_DEVICE_COUNT; i++) {
if (0 == strcmp(ps2_device[i].name, name)) {
@ -327,7 +345,7 @@ standart_mouse_open(const char *name, uint32 flags, void **_cookie)
if (atomic_or(&dev->flags, PS2_FLAG_OPEN) & PS2_FLAG_OPEN)
return B_BUSY;
cookie = malloc(sizeof(standart_mouse_cookie));
cookie = malloc(sizeof(standard_mouse_cookie));
if (cookie == NULL)
goto err1;
@ -336,26 +354,26 @@ standart_mouse_open(const char *name, uint32 flags, void **_cookie)
cookie->dev = dev;
dev->cookie = cookie;
dev->disconnect = &standart_mouse_disconnect;
dev->handle_int = &standart_mouse_handle_int;
dev->disconnect = &standard_mouse_disconnect;
dev->handle_int = &standard_mouse_handle_int;
if(strstr(dev->name, "standard_mouse") != NULL){
if (strstr(dev->name, "standard_mouse") != NULL)
cookie->flags = F_pointing_dev_TYPE_STANDARD;
}
if(strstr(dev->name, "intelli_mouse") != NULL){
cookie->flags = F_pointing_dev_TYPE_INTELLIMOUSE;
}
cookie->standart_mouse_buffer = create_packet_buffer(standart_mouse_HISTORY_SIZE * dev->packet_size);
if (cookie->standart_mouse_buffer == NULL) {
if (strstr(dev->name, "intelli_mouse") != NULL)
cookie->flags = F_pointing_dev_TYPE_INTELLIMOUSE;
cookie->standard_mouse_buffer
= create_packet_buffer(standard_mouse_HISTORY_SIZE * dev->packet_size);
if (cookie->standard_mouse_buffer == NULL) {
TRACE("ps2: can't allocate mouse actions buffer\n");
goto err2;
}
// create the mouse semaphore, used for synchronization between
// the interrupt handler and the read operation
cookie->standart_mouse_sem = create_sem(0, "ps2_standart_mouse_sem");
if (cookie->standart_mouse_sem < 0) {
cookie->standard_mouse_sem = create_sem(0, "ps2_standard_mouse_sem");
if (cookie->standard_mouse_sem < 0) {
TRACE("ps2: failed creating PS/2 mouse semaphore!\n");
goto err3;
}
@ -369,54 +387,55 @@ standart_mouse_open(const char *name, uint32 flags, void **_cookie)
atomic_or(&dev->flags, PS2_FLAG_ENABLED);
TRACE("ps2: standart_mouse_open %s success\n", name);
TRACE("ps2: standard_mouse_open %s success\n", name);
return B_OK;
err4:
delete_sem(cookie->standart_mouse_sem);
delete_sem(cookie->standard_mouse_sem);
err3:
delete_packet_buffer(cookie->standart_mouse_buffer);
delete_packet_buffer(cookie->standard_mouse_buffer);
err2:
free(cookie);
err1:
atomic_and(&dev->flags, ~PS2_FLAG_OPEN);
TRACE("ps2: standart_mouse_open %s failed\n", name);
TRACE("ps2: standard_mouse_open %s failed\n", name);
return B_ERROR;
}
status_t
standart_mouse_close(void *_cookie)
standard_mouse_close(void *_cookie)
{
standart_mouse_cookie *cookie = (standart_mouse_cookie*)_cookie;
standard_mouse_cookie *cookie = (standard_mouse_cookie*)_cookie;
TRACE("ps2: standart_mouse_close %s enter\n", cookie->dev->name);
TRACE("ps2: standard_mouse_close %s enter\n", cookie->dev->name);
ps2_dev_command_timeout(cookie->dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0, 150000);
ps2_dev_command_timeout(cookie->dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0,
150000);
delete_packet_buffer(cookie->standart_mouse_buffer);
delete_sem(cookie->standart_mouse_sem);
delete_packet_buffer(cookie->standard_mouse_buffer);
delete_sem(cookie->standard_mouse_sem);
atomic_and(&cookie->dev->flags, ~PS2_FLAG_OPEN);
atomic_and(&cookie->dev->flags, ~PS2_FLAG_ENABLED);
TRACE("ps2: standart_mouse_close %s done\n", cookie->dev->name);
TRACE("ps2: standard_mouse_close %s done\n", cookie->dev->name);
return B_OK;
}
status_t
standart_mouse_freecookie(void *_cookie)
standard_mouse_freecookie(void *_cookie)
{
standart_mouse_cookie *cookie = (standart_mouse_cookie*)_cookie;
standard_mouse_cookie *cookie = (standard_mouse_cookie*)_cookie;
free(cookie);
return B_OK;
}
static status_t
standart_mouse_read(void *cookie, off_t pos, void *buffer, size_t *_length)
standard_mouse_read(void *cookie, off_t pos, void *buffer, size_t *_length)
{
*_length = 0;
return B_NOT_ALLOWED;
@ -424,7 +443,8 @@ standart_mouse_read(void *cookie, off_t pos, void *buffer, size_t *_length)
static status_t
standart_mouse_write(void *cookie, off_t pos, const void *buffer, size_t *_length)
standard_mouse_write(void *cookie, off_t pos, const void *buffer,
size_t *_length)
{
*_length = 0;
return B_NOT_ALLOWED;
@ -432,16 +452,16 @@ standart_mouse_write(void *cookie, off_t pos, const void *buffer, size_t *_lengt
status_t
standart_mouse_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
standard_mouse_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
{
standart_mouse_cookie *cookie = (standart_mouse_cookie*)_cookie;
standard_mouse_cookie *cookie = (standard_mouse_cookie*)_cookie;
switch (op) {
case MS_NUM_EVENTS:
{
int32 count;
TRACE("ps2: ioctl MS_NUM_EVENTS\n");
get_sem_count(cookie->standart_mouse_sem, &count);
get_sem_count(cookie->standard_mouse_sem, &count);
return count;
}
@ -450,10 +470,11 @@ standart_mouse_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
mouse_movement movement;
status_t status;
TRACE("ps2: ioctl MS_READ\n");
if ((status = standart_mouse_read_event(cookie, &movement)) < B_OK)
if ((status = standard_mouse_read_event(cookie, &movement)) < B_OK)
return status;
// TRACE("%s %d %d %d %d\n", cookie->dev->name,
// movement.xdelta, movement.ydelta, movement.buttons, movement.clicks);
// movement.xdelta, movement.ydelta, movement.buttons,
// movement.clicks);
return user_memcpy(buffer, &movement, sizeof(movement));
}
@ -462,15 +483,18 @@ standart_mouse_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
return B_BAD_VALUE;
case MS_SET_MAP:
TRACE("ps2: ioctl MS_SET_MAP (set mouse mapping) not implemented\n");
TRACE("ps2: ioctl MS_SET_MAP (set mouse mapping) not "
"implemented\n");
return B_BAD_VALUE;
case MS_GET_ACCEL:
TRACE("ps2: ioctl MS_GET_ACCEL (get mouse acceleration) not implemented\n");
TRACE("ps2: ioctl MS_GET_ACCEL (get mouse acceleration) not "
"implemented\n");
return B_BAD_VALUE;
case MS_SET_ACCEL:
TRACE("ps2: ioctl MS_SET_ACCEL (set mouse acceleration) not implemented\n");
TRACE("ps2: ioctl MS_SET_ACCEL (set mouse acceleration) not "
"implemented\n");
return B_BAD_VALUE;
case MS_SET_CLICKSPEED:
@ -484,11 +508,11 @@ standart_mouse_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
}
device_hooks gStandartMouseDeviceHooks = {
standart_mouse_open,
standart_mouse_close,
standart_mouse_freecookie,
standart_mouse_ioctl,
standart_mouse_read,
standart_mouse_write,
device_hooks gStandardMouseDeviceHooks = {
standard_mouse_open,
standard_mouse_close,
standard_mouse_freecookie,
standard_mouse_ioctl,
standard_mouse_read,
standard_mouse_write,
};

View File

@ -12,14 +12,14 @@
* Clemens Zeidler <czeidler@gmx.de>
*/
#ifndef __PS2_STANDART_standart_mouse_H
#define __PS2_STANDART_standart_mouse_H
#ifndef __PS2_STANDARD_standard_mouse_H
#define __PS2_STANDARD_standard_mouse_H
#include <Drivers.h>
#include "packet_buffer.h"
#define standart_mouse_HISTORY_SIZE 256
#define standard_mouse_HISTORY_SIZE 256
// we record that many mouse packets before we start to drop them
#define F_pointing_dev_TYPE_STANDARD 0x1
@ -29,8 +29,8 @@ typedef struct
{
ps2_dev * dev;
sem_id standart_mouse_sem;
packet_buffer * standart_mouse_buffer;
sem_id standard_mouse_sem;
packet_buffer * standard_mouse_buffer;
bigtime_t click_last_time;
bigtime_t click_speed;
int click_count;
@ -39,21 +39,22 @@ typedef struct
size_t packet_index;
uint8 packet_buffer[PS2_MAX_PACKET_SIZE];
} standart_mouse_cookie;
} standard_mouse_cookie;
status_t probe_standart_mouse(ps2_dev *dev);
status_t probe_standard_mouse(ps2_dev *dev);
status_t standart_mouse_open(const char *name, uint32 flags, void **_cookie);
status_t standart_mouse_close(void *_cookie);
status_t standart_mouse_freecookie(void *_cookie);
status_t standart_mouse_ioctl(void *_cookie, uint32 op, void *buffer, size_t length);
status_t standard_mouse_open(const char *name, uint32 flags, void **_cookie);
status_t standard_mouse_close(void *_cookie);
status_t standard_mouse_freecookie(void *_cookie);
status_t standard_mouse_ioctl(void *_cookie, uint32 op, void *buffer,
size_t length);
int32 standart_mouse_handle_int(ps2_dev *dev);
void standart_mouse_disconnect(ps2_dev *dev);
int32 standard_mouse_handle_int(ps2_dev *dev);
void standard_mouse_disconnect(ps2_dev *dev);
device_hooks gStandartMouseDeviceHooks;
device_hooks gStandardMouseDeviceHooks;
#endif
#endif /* __PS2_STANDARD_standard_mouse_H */

View File

@ -16,13 +16,15 @@
#include "ps2_synaptics.h"
#include "kb_mouse_driver.h"
const char* kSynapticsPath[4] = {"input/touchpad/ps2/synaptics_0",
const char* kSynapticsPath[4] = {
"input/touchpad/ps2/synaptics_0",
"input/touchpad/ps2/synaptics_1",
"input/touchpad/ps2/synaptics_2",
"input/touchpad/ps2/synaptics_3"};
"input/touchpad/ps2/synaptics_3"
};
static touchpad_info g_touchpad_info;
ps2_dev *g_passthrough_dev = &ps2_device[PS2_DEVICE_SYN_PASSTHROUGH];
static touchpad_info gTouchpadInfo;
ps2_dev *gPassthroughDevice = &ps2_device[PS2_DEVICE_SYN_PASSTHROUGH];
void
@ -37,7 +39,8 @@ synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size)
{
synaptics_cookie* syn_cookie = dev->parent_dev->cookie;
status_t status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0);
status_t status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL,
0, NULL, 0);
if (status < B_OK) {
INFO("SYNAPTICS: cannot disable touchpad %s\n", dev->parent_dev->name);
return B_ERROR;
@ -45,12 +48,10 @@ synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size)
syn_cookie->packet_index = 0;
if(size == 4){
if (size == 4)
syn_cookie->mode|= SYN_FOUR_BYTE_CHILD;
}
else{
else
syn_cookie->mode&= ~SYN_FOUR_BYTE_CHILD;
}
set_touchpad_mode(dev->parent_dev, syn_cookie->mode);
status = ps2_dev_command(dev->parent_dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0);
@ -63,16 +64,18 @@ synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size)
status_t
send_touchpad_arg(ps2_dev *dev, uint8 arg){
send_touchpad_arg(ps2_dev *dev, uint8 arg)
{
return send_touchpad_arg_timeout(dev, arg, 4000000);
}
status_t
send_touchpad_arg_timeout(ps2_dev *dev, uint8 arg, bigtime_t timeout){
send_touchpad_arg_timeout(ps2_dev *dev, uint8 arg, bigtime_t timeout)
{
int8 i;
uint8 val[8];
for(i = 0; i < 4; i++){
for (i = 0; i < 4; i++) {
val[2*i] = (arg >> (6-2*i)) & 3;
val[2*i + 1] = 0xE8;
}
@ -85,12 +88,14 @@ set_touchpad_mode(ps2_dev *dev, uint8 mode)
{
uint8 sample_rate = SYN_CHANGE_MODE;
send_touchpad_arg(dev, mode);
return ps2_dev_command(dev, PS2_CMD_SET_SAMPLE_RATE, &sample_rate, 1, NULL, 0);
return ps2_dev_command(dev, PS2_CMD_SET_SAMPLE_RATE, &sample_rate, 1,
NULL, 0);
}
status_t
passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout)
passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count,
uint8 *in, int in_count, bigtime_t timeout)
{
status_t status;
uint8 pt_cmd = SYN_PASSTHROUGH_CMD;
@ -101,51 +106,45 @@ passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, ui
TRACE("SYNAPTICS: passthrough command 0x%x\n", cmd);
status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0);
if(status != B_OK){
status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL, 0,
NULL, 0);
if (status != B_OK)
return status;
}
for (i = -1; i < out_count; i++) {
if (i == -1) {
if (i == -1)
val = cmd;
} else {
else
val = out[i];
}
status = send_touchpad_arg_timeout(dev->parent_dev, val, timeout);
if(status != B_OK){
if (status != B_OK)
return status;
}
if(i != out_count -1){
status = ps2_dev_command_timeout(dev->parent_dev, PS2_CMD_SET_SAMPLE_RATE,
&pt_cmd, 1, NULL, 0, timeout);
if(status != B_OK){
if (i != out_count -1) {
status = ps2_dev_command_timeout(dev->parent_dev,
PS2_CMD_SET_SAMPLE_RATE, &pt_cmd, 1, NULL, 0, timeout);
if (status != B_OK)
return status;
}
}
}
status = ps2_dev_command_timeout(dev->parent_dev, PS2_CMD_SET_SAMPLE_RATE,
&pt_cmd, 1, pt_in, pt_in_count, timeout);
if(status != B_OK){
if (status != B_OK)
return status;
}
for(i = 0; i < in_count + 1; i++){
for (i = 0; i < in_count + 1; i++) {
uint8 *inPointer = &(pt_in[i * 6]);
if(!IS_SYN_PT_PACKAGE(inPointer)){
if (!IS_SYN_PT_PACKAGE(inPointer)) {
TRACE("SYNAPTICS: not a pass throught package\n");
return B_OK;
}
if(i == 0){
if (i == 0)
continue;
}
in[i - 1] = pt_in[i * 6 + 1];
}
status = ps2_dev_command(dev->parent_dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0);
if(status != B_OK){
if (status != B_OK)
return status;
}
return B_OK;
}
@ -157,36 +156,31 @@ edge_motion(mouse_movement *movement, touch_event *event, bool validStart)
int32 xdelta = 0;
int32 ydelta = 0;
if(event->xPosition < SYN_AREA_START_X + SYN_EDGE_MOTION_WIDTH){
if (event->xPosition < SYN_AREA_START_X + SYN_EDGE_MOTION_WIDTH)
xdelta = -SYN_EDGE_MOTION_SPEED;
}
else if(event->xPosition > SYN_AREA_END_X - SYN_EDGE_MOTION_WIDTH){
else if (event->xPosition > SYN_AREA_END_X - SYN_EDGE_MOTION_WIDTH)
xdelta = SYN_EDGE_MOTION_SPEED;
}
if(event->yPosition < SYN_AREA_START_Y + SYN_EDGE_MOTION_WIDTH){
if (event->yPosition < SYN_AREA_START_Y + SYN_EDGE_MOTION_WIDTH)
ydelta = -SYN_EDGE_MOTION_SPEED;
}
else if(event->yPosition > SYN_AREA_END_Y - SYN_EDGE_MOTION_WIDTH){
else if (event->yPosition > SYN_AREA_END_Y - SYN_EDGE_MOTION_WIDTH)
ydelta = SYN_EDGE_MOTION_SPEED;
}
if(xdelta && validStart){
if (xdelta && validStart)
movement->xdelta = xdelta;
}
if(ydelta && validStart){
if (ydelta && validStart)
movement->ydelta = ydelta;
}
if((xdelta || ydelta) && !validStart){
if ((xdelta || ydelta) && !validStart)
return false;
}
return true;
}
status_t
touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, mouse_movement *movement)
touchevent_to_movement(synaptics_cookie* cookie, touch_event *event,
mouse_movement *movement)
{
bool isSideScrollingV = false;
bool isSideScrollingH = false;
@ -196,9 +190,8 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, mouse_movem
bigtime_t currentTime = system_time();
touchpad_settings * settings = &(cookie->settings);
if(!movement){
if (!movement)
return B_ERROR;
}
movement->xdelta = 0;
movement->ydelta = 0;
@ -209,62 +202,57 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, mouse_movem
movement->clicks = 0;
movement->timestamp = currentTime;
if((currentTime - cookie->tap_time) > SYN_TAP_TIMEOUT){
if ((currentTime - cookie->tap_time) > SYN_TAP_TIMEOUT) {
TRACE("SYNAPTICS: tap gesture timed out\n");
cookie->tap_started = false;
if(!cookie->double_click || (currentTime - cookie->tap_time) > 2 * SYN_TAP_TIMEOUT)
if (!cookie->double_click
|| (currentTime - cookie->tap_time) > 2 * SYN_TAP_TIMEOUT) {
cookie->tap_clicks = 0;
}
}
if(event->buttons != 0){
if (event->buttons != 0) {
cookie->tap_clicks = 0;
cookie->tapdrag_started = false;
cookie->tap_started = false;
cookie->valid_edge_motion = false;
}
if(event->zPressure >= MIN_PRESSURE && event->zPressure < MAX_PRESSURE
if (event->zPressure >= MIN_PRESSURE && event->zPressure < MAX_PRESSURE
&& ((event->wValue >=4 && event->wValue <=7)
|| event->wValue == 0 || event->wValue == 1)
&& (event->xPosition != 0 || event->yPosition != 0))
{
&& (event->xPosition != 0 || event->yPosition != 0)) {
isInTouch = true;
}
if(isInTouch)
{
if((SYN_AREA_END_X - SYN_AREA_WIDTH_X * settings->scroll_rightrange
if (isInTouch) {
if ((SYN_AREA_END_X - SYN_AREA_WIDTH_X * settings->scroll_rightrange
< event->xPosition && !cookie->movement_started
&& settings->scroll_rightrange > 0.000001)
|| settings->scroll_rightrange > 0.999999)
{
|| settings->scroll_rightrange > 0.999999) {
isSideScrollingV = true;
}
if((SYN_AREA_START_Y + SYN_AREA_WIDTH_Y * settings->scroll_bottomrange
if ((SYN_AREA_START_Y + SYN_AREA_WIDTH_Y * settings->scroll_bottomrange
> event->yPosition && !cookie->movement_started
&& settings->scroll_bottomrange > 0.000001)
|| settings->scroll_bottomrange > 0.999999)
{
|| settings->scroll_bottomrange > 0.999999) {
isSideScrollingH = true;
}
if(isSideScrollingV || isSideScrollingH
if (isSideScrollingV || isSideScrollingH
||(event->wValue == 0 && settings->scroll_twofinger)
||(event->wValue == 1 && settings->scroll_multifinger))
{
goto scrooling;
}
else{
||(event->wValue == 1 && settings->scroll_multifinger)) {
goto scrolling;
} else {
cookie->scrolling_started = false;
}
goto movement;
}
else{
} else {
goto notouch;
}
movement:
TRACE("SYNAPTICS: movement event\n");
if(!cookie->movement_started){
if (!cookie->movement_started) {
isStartOfMovement = true;
cookie->movement_started = true;
start_new_movment(&(cookie->movement_maker));
@ -279,24 +267,25 @@ movement:
cookie->tap_delta_x+= cookie->movement_maker.xDelta;
cookie->tap_delta_y+= cookie->movement_maker.yDelta;
if(cookie->tapdrag_started){
if (cookie->tapdrag_started) {
movement->buttons = 0x01; // left button
movement->clicks = 0;
cookie->valid_edge_motion = edge_motion(movement, event, cookie->valid_edge_motion);
cookie->valid_edge_motion = edge_motion(movement, event,
cookie->valid_edge_motion);
TRACE("SYNAPTICS: tap drag\n");
}
else{
} else {
TRACE("SYNAPTICS: movement set buttons\n");
movement->buttons = event->buttons;
}
// use only a fraction of pressure range, the max pressure seems to be to high
sens = 20 * (event->zPressure - MIN_PRESSURE) / (MAX_PRESSURE - MIN_PRESSURE - 100);
if(!cookie->tap_started
// use only a fraction of pressure range, the max pressure seems to be
// to high
sens = 20 * (event->zPressure - MIN_PRESSURE)
/ (MAX_PRESSURE - MIN_PRESSURE - 100);
if (!cookie->tap_started
&& isStartOfMovement
&& settings->tapgesture_sensibility > (20 - sens))
{
&& settings->tapgesture_sensibility > (20 - sens)) {
TRACE("SYNAPTICS: tap started\n");
cookie->tap_started = true;
cookie->tap_time = system_time();
@ -306,26 +295,25 @@ movement:
return B_OK;
scrooling:
scrolling:
TRACE("SYNAPTICS: scroll event\n");
cookie->tap_started = false;
cookie->tap_clicks = 0;
cookie->tapdrag_started = false;
cookie->valid_edge_motion = false;
if(!cookie->scrolling_started){
if (!cookie->scrolling_started) {
cookie->scrolling_started = true;
start_new_movment(&(cookie->movement_maker));
}
get_scrolling(&(cookie->movement_maker), event->xPosition, event->yPosition);
get_scrolling(&(cookie->movement_maker), event->xPosition,
event->yPosition);
movement->wheel_ydelta = cookie->movement_maker.yDelta;
movement->wheel_xdelta = cookie->movement_maker.xDelta;
if(isSideScrollingV && !isSideScrollingH){
if (isSideScrollingV && !isSideScrollingH)
movement->wheel_xdelta = 0;
}
else if(isSideScrollingH && !isSideScrollingV){
else if (isSideScrollingH && !isSideScrollingV)
movement->wheel_ydelta = 0;
}
return B_OK;
notouch:
@ -333,41 +321,38 @@ notouch:
cookie->scrolling_started = false;
cookie->movement_started = false;
movement->buttons = event->buttons;
if(event->buttons)
if (event->buttons)
movement->clicks = 1;
if(cookie->tapdrag_started
&& (currentTime - cookie->tap_time) < SYN_TAP_TIMEOUT)
{
if (cookie->tapdrag_started
&& (currentTime - cookie->tap_time) < SYN_TAP_TIMEOUT) {
movement->buttons = 0x01;
movement->clicks = 0;
}
// if the movement stopped switch off the dap trag when timeout is expired
if((currentTime - cookie->tap_time) > SYN_TAP_TIMEOUT){
if ((currentTime - cookie->tap_time) > SYN_TAP_TIMEOUT) {
cookie->tapdrag_started = false;
cookie->valid_edge_motion = false;
TRACE("SYNAPTICS: tap drag gesture timed out\n");
}
if(abs(cookie->tap_delta_x) > 15 || abs(cookie->tap_delta_y) > 15){
if (abs(cookie->tap_delta_x) > 15 || abs(cookie->tap_delta_y) > 15) {
cookie->tap_started = false;
cookie->tap_clicks = 0;
}
if(cookie->tap_started || cookie->double_click)
{
if (cookie->tap_started || cookie->double_click) {
TRACE("SYNAPTICS: tap gesture\n");
cookie->tap_clicks++;
if(cookie->tap_clicks > 1){
if (cookie->tap_clicks > 1) {
TRACE("SYNAPTICS: empty click\n");
movement->buttons = 0x00;
movement->clicks = 0;
cookie->tap_clicks = 0;
cookie->double_click = true;
}
else{
} else {
movement->buttons = 0x01;
movement->clicks = 1;
cookie->tap_started = false;
@ -399,7 +384,8 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
return B_ERROR;
}
if (packet_buffer_read(cookie->synaptics_ring_buffer, event_buffer, cookie->dev->packet_size) != cookie->dev->packet_size) {
if (packet_buffer_read(cookie->synaptics_ring_buffer, event_buffer,
cookie->dev->packet_size) != cookie->dev->packet_size) {
TRACE("SYNAPTICS: error copying buffer\n");
return B_ERROR;
}
@ -407,7 +393,7 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
event.buttons = event_buffer[0] & 3;
event.zPressure = event_buffer[2];
if(g_touchpad_info.capExtended){
if (gTouchpadInfo.capExtended) {
wValue0 = event_buffer[3] >> 2 & 1;
wValue1 = event_buffer[0] >> 2 & 1;
wValue2 = event_buffer[0] >> 4 & 1;
@ -420,10 +406,9 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
event.wValue = wValue;
event.gesture = false;
}
else{
} else {
bool finger = event_buffer[0] >> 5 & 1;
if(finger){
if (finger) {
// finger with normal width
event.wValue = 4;
}
@ -456,18 +441,18 @@ query_capability(ps2_dev *dev)
send_touchpad_arg(dev, 0x02);
ps2_dev_command(dev, 0xE9, NULL, 0, val, 3);
g_touchpad_info.capExtended = val[0] >> 7 & 1;
gTouchpadInfo.capExtended = val[0] >> 7 & 1;
TRACE("SYNAPTICS: extended mode %2x\n", val[0] >> 7 & 1);
TRACE("SYNAPTICS: sleep mode %2x\n", val[2] >> 4 & 1);
g_touchpad_info.capSleep = val[2] >> 4 & 1;
gTouchpadInfo.capSleep = val[2] >> 4 & 1;
TRACE("SYNAPTICS: four buttons %2x\n", val[2] >> 3 & 1);
g_touchpad_info.capFourButtons = val[2] >> 3 & 1;
gTouchpadInfo.capFourButtons = val[2] >> 3 & 1;
TRACE("SYNAPTICS: multi finger %2x\n", val[2] >> 1 & 1);
g_touchpad_info.capMultiFinger = val[2] >> 1 & 1;
gTouchpadInfo.capMultiFinger = val[2] >> 1 & 1;
TRACE("SYNAPTICS: palm detection %2x\n", val[2] & 1);
g_touchpad_info.capPalmDetection = val[2] & 1;
gTouchpadInfo.capPalmDetection = val[2] & 1;
TRACE("SYNAPTICS: pass through %2x\n", val[2] >> 7 & 1);
g_touchpad_info.capPassThrough = val[2] >> 7 & 1;
gTouchpadInfo.capPassThrough = val[2] >> 7 & 1;
}
@ -481,18 +466,20 @@ probe_synaptics(ps2_dev *dev)
send_touchpad_arg(dev, 0x00);
ps2_dev_command(dev, 0xE9, NULL, 0, val, 3);
g_touchpad_info.minorVersion = val[0];
gTouchpadInfo.minorVersion = val[0];
deviceId = val[1];
if(deviceId != SYN_TOUCHPAD){
if (deviceId != SYN_TOUCHPAD) {
TRACE("SYNAPTICS: not found\n");
return B_ERROR;
}
TRACE("SYNAPTICS: Touchpad found id:l %2x\n", deviceId);
g_touchpad_info.majorVersion = val[2] & 0x0F;
TRACE("SYNAPTICS: version %d.%d\n", g_touchpad_info.majorVersion, g_touchpad_info.minorVersion);
gTouchpadInfo.majorVersion = val[2] & 0x0F;
TRACE("SYNAPTICS: version %d.%d\n", gTouchpadInfo.majorVersion,
gTouchpadInfo.minorVersion);
// version >= 4.0?
if(g_touchpad_info.minorVersion <= 2 && g_touchpad_info.majorVersion <= 3){
if (gTouchpadInfo.minorVersion <= 2
&& gTouchpadInfo.majorVersion <= 3) {
TRACE("SYNAPTICS: too old touchpad not supported\n");
return B_ERROR;
}
@ -541,7 +528,8 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
cookie->movement_maker.speed = 1;
cookie->movement_maker.scrolling_xStep = cookie->settings.scroll_xstepsize;
cookie->movement_maker.scrolling_yStep = cookie->settings.scroll_ystepsize;
cookie->movement_maker.scroll_acceleration = cookie->settings.scroll_acceleration;
cookie->movement_maker.scroll_acceleration
= cookie->settings.scroll_acceleration;
cookie->movement_started = false;
cookie->scrolling_started = false;
cookie->tap_started = false;
@ -550,7 +538,8 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
dev->packet_size = PS2_PACKET_SYNAPTICS;
cookie->synaptics_ring_buffer = create_packet_buffer(synaptics_HISTORY_SIZE * dev->packet_size);
cookie->synaptics_ring_buffer
= create_packet_buffer(synaptics_HISTORY_SIZE * dev->packet_size);
if (cookie->synaptics_ring_buffer == NULL) {
TRACE("ps2: can't allocate mouse actions buffer\n");
goto err2;
@ -566,20 +555,19 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
query_capability(dev);
// create pass through dev
if(g_touchpad_info.capPassThrough){
if (gTouchpadInfo.capPassThrough) {
TRACE("SYNAPTICS: pass through detected\n");
g_passthrough_dev->parent_dev = dev;
g_passthrough_dev->idx = dev->idx;
ps2_service_notify_device_added(g_passthrough_dev);
gPassthroughDevice->parent_dev = dev;
gPassthroughDevice->idx = dev->idx;
ps2_service_notify_device_added(gPassthroughDevice);
}
// Set Mode
if(g_touchpad_info.capExtended){
if (gTouchpadInfo.capExtended)
cookie->mode = SYN_ABSOLUTE_W_MODE;
}
else{
else
cookie->mode = SYN_ABSOLUTE_MODE;
}
status = set_touchpad_mode(dev, cookie->mode);
if (status < B_OK) {
INFO("SYNAPTICS: cannot set mode %s\n", name);
@ -606,7 +594,7 @@ err2:
err1:
atomic_and(&dev->flags, ~PS2_FLAG_OPEN);
TRACE("ps2: standart_mouse_open %s failed\n", name);
TRACE("SYNAPTICS: synaptics_open %s failed\n", name);
return B_ERROR;
}
@ -616,7 +604,8 @@ synaptics_close(void *_cookie)
{
synaptics_cookie *cookie = _cookie;
ps2_dev_command_timeout(cookie->dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0, 150000);
ps2_dev_command_timeout(cookie->dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0,
150000);
delete_packet_buffer(cookie->synaptics_ring_buffer);
delete_sem(cookie->synaptics_sem);
@ -624,9 +613,8 @@ synaptics_close(void *_cookie)
atomic_and(&cookie->dev->flags, ~PS2_FLAG_OPEN);
atomic_and(&cookie->dev->flags, ~PS2_FLAG_ENABLED);
if(g_touchpad_info.capPassThrough){
ps2_service_notify_device_removed(g_passthrough_dev);
}
if (gTouchpadInfo.capPassThrough)
ps2_service_notify_device_removed(gPassthroughDevice);
TRACE("SYNAPTICS: close %s done\n", cookie->dev->name);
return B_OK;
@ -667,7 +655,7 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
switch (op) {
case MS_READ:
TRACE("SYNAPTICS: MS_READ get event\n");
if((status = get_synaptics_movment(cookie, &movement)) != B_OK)
if ((status = get_synaptics_movment(cookie, &movement)) != B_OK)
return status;
return user_memcpy(buffer, &movement, sizeof(movement));
case MS_IS_TOUCHPAD:
@ -676,9 +664,12 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
case MS_SET_TOUCHPAD_SETTINGS:
TRACE("SYNAPTICS: MS_SET_TOUCHPAD_SETTINGS");
user_memcpy(&(cookie->settings), buffer, sizeof(touchpad_settings));
cookie->movement_maker.scrolling_xStep = cookie->settings.scroll_xstepsize;
cookie->movement_maker.scrolling_yStep = cookie->settings.scroll_ystepsize;
cookie->movement_maker.scroll_acceleration = cookie->settings.scroll_acceleration;
cookie->movement_maker.scrolling_xStep
= cookie->settings.scroll_xstepsize;
cookie->movement_maker.scrolling_yStep
= cookie->settings.scroll_ystepsize;
cookie->movement_maker.scroll_acceleration
= cookie->settings.scroll_acceleration;
return B_OK;
default:
TRACE("SYNAPTICS: unknown opcode: %ld\n", op);
@ -700,11 +691,11 @@ synaptics_handle_int(ps2_dev *dev)
cookie->packet_index = 0;
goto unhandled;
}
if(cookie->packet_index == 0 && val >> 6 != 0x02){
if (cookie->packet_index == 0 && val >> 6 != 0x02) {
TRACE("SYNAPTICS: first package begins not with bit 1, 0\n");
goto unhandled;
}
if(cookie->packet_index == 3 && val >> 6 != 0x03){
if (cookie->packet_index == 3 && val >> 6 != 0x03) {
TRACE("SYNAPTICS: third package begins not with bit 1, 1\n");
cookie->packet_index = 0;
goto unhandled;
@ -712,32 +703,33 @@ synaptics_handle_int(ps2_dev *dev)
cookie->packet_buffer[cookie->packet_index] = val;
cookie->packet_index++;
if(cookie->packet_index >= 6){
if (cookie->packet_index >= 6) {
cookie->packet_index = 0;
// check if package is a pass through package if true pass it
// too the pass through interrupt handle
if(g_passthrough_dev->active
&& g_passthrough_dev->handle_int != NULL
&& IS_SYN_PT_PACKAGE(cookie->packet_buffer))
{
if (gPassthroughDevice->active
&& gPassthroughDevice->handle_int != NULL
&& IS_SYN_PT_PACKAGE(cookie->packet_buffer)) {
status_t status;
g_passthrough_dev->history[0].data = cookie->packet_buffer[1];
g_passthrough_dev->handle_int(g_passthrough_dev);
g_passthrough_dev->history[0].data = cookie->packet_buffer[4];
g_passthrough_dev->handle_int(g_passthrough_dev);
g_passthrough_dev->history[0].data = cookie->packet_buffer[5];
status = g_passthrough_dev->handle_int(g_passthrough_dev);
gPassthroughDevice->history[0].data = cookie->packet_buffer[1];
gPassthroughDevice->handle_int(gPassthroughDevice);
gPassthroughDevice->history[0].data = cookie->packet_buffer[4];
gPassthroughDevice->handle_int(gPassthroughDevice);
gPassthroughDevice->history[0].data = cookie->packet_buffer[5];
status = gPassthroughDevice->handle_int(gPassthroughDevice);
if(cookie->dev->packet_size == 4){
g_passthrough_dev->history[0].data = cookie->packet_buffer[2];
status = g_passthrough_dev->handle_int(g_passthrough_dev);
if (cookie->dev->packet_size == 4) {
gPassthroughDevice->history[0].data = cookie->packet_buffer[2];
status = gPassthroughDevice->handle_int(gPassthroughDevice);
}
return status;
}
if (packet_buffer_write(cookie->synaptics_ring_buffer, cookie->packet_buffer, cookie->dev->packet_size) != cookie->dev->packet_size) {
if (packet_buffer_write(cookie->synaptics_ring_buffer,
cookie->packet_buffer, cookie->dev->packet_size)
!= cookie->dev->packet_size) {
// buffer is full, drop new data
return B_HANDLED_INTERRUPT;
}
@ -757,7 +749,7 @@ synaptics_disconnect(ps2_dev *dev)
{
synaptics_cookie *cookie = dev->cookie;
// the mouse device might not be opened at this point
INFO("ps2: ps2_standart_mouse_disconnect %s\n", dev->name);
INFO("SYNAPTICS: synaptics_disconnect %s\n", dev->name);
if (dev->flags & PS2_FLAG_OPEN)
release_sem(cookie->synaptics_sem);
}

View File

@ -4,21 +4,23 @@
#include "kb_mouse_driver.h"
#include "ps2_trackpoint.h"
const char* kTrackpointPath[4] = {"input/mouse/ps2/ibm_trackpoint_0",
const char* kTrackpointPath[4] = {
"input/mouse/ps2/ibm_trackpoint_0",
"input/mouse/ps2/ibm_trackpoint_1",
"input/mouse/ps2/ibm_trackpoint_2",
"input/mouse/ps2/ibm_trackpoint_3"};
"input/mouse/ps2/ibm_trackpoint_3"
};
status_t
probe_trackpoint(ps2_dev *dev)
probe_trackpoint(ps2_dev* dev)
{
uint8 val[2];
TRACE("TRACKPOINT: probe\n");
ps2_dev_command(dev, 0xE1, NULL, 0, val, 2);
if(val[0] != 0x01){
if (val[0] != 0x01) {
TRACE("TRACKPOINT: not found\n");
return B_ERROR;
}

View File

@ -1,5 +1,5 @@
#ifndef SYNAPTICS_H
#define SYNAPTICS_H
#ifndef TRACKPOINT_H
#define TRACKPOINT_H
#include <KernelExport.h>
@ -9,4 +9,4 @@
status_t probe_trackpoint(ps2_dev *dev);
#endif
#endif /* TRACKPOINT_H */