* Check the return codes returned by the command functions
in probe_synaptics(). * Automatic whitespace cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28442 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
* Authors (in chronological order):
|
* Authors (in chronological order):
|
||||||
* Clemens Zeidler ([email protected])
|
* Clemens Zeidler ([email protected])
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -27,7 +27,7 @@ static touchpad_info gTouchpadInfo;
|
|||||||
ps2_dev *gPassthroughDevice = &ps2_device[PS2_DEVICE_SYN_PASSTHROUGH];
|
ps2_dev *gPassthroughDevice = &ps2_device[PS2_DEVICE_SYN_PASSTHROUGH];
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
default_settings(touchpad_settings *set)
|
default_settings(touchpad_settings *set)
|
||||||
{
|
{
|
||||||
memcpy(set, &kDefaultTouchpadSettings, sizeof(touchpad_settings));
|
memcpy(set, &kDefaultTouchpadSettings, sizeof(touchpad_settings));
|
||||||
@@ -37,23 +37,23 @@ default_settings(touchpad_settings *set)
|
|||||||
status_t
|
status_t
|
||||||
synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size)
|
synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size)
|
||||||
{
|
{
|
||||||
synaptics_cookie* syn_cookie = dev->parent_dev->cookie;
|
synaptics_cookie* syn_cookie = dev->parent_dev->cookie;
|
||||||
|
|
||||||
status_t status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL,
|
status_t status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL,
|
||||||
0, NULL, 0);
|
0, NULL, 0);
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
INFO("SYNAPTICS: cannot disable touchpad %s\n", dev->parent_dev->name);
|
INFO("SYNAPTICS: cannot disable touchpad %s\n", dev->parent_dev->name);
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
syn_cookie->packet_index = 0;
|
syn_cookie->packet_index = 0;
|
||||||
|
|
||||||
if (size == 4)
|
if (size == 4)
|
||||||
syn_cookie->mode|= SYN_FOUR_BYTE_CHILD;
|
syn_cookie->mode|= SYN_FOUR_BYTE_CHILD;
|
||||||
else
|
else
|
||||||
syn_cookie->mode&= ~SYN_FOUR_BYTE_CHILD;
|
syn_cookie->mode&= ~SYN_FOUR_BYTE_CHILD;
|
||||||
set_touchpad_mode(dev->parent_dev, syn_cookie->mode);
|
set_touchpad_mode(dev->parent_dev, syn_cookie->mode);
|
||||||
|
|
||||||
status = ps2_dev_command(dev->parent_dev, PS2_CMD_ENABLE, NULL, 0, NULL,
|
status = ps2_dev_command(dev->parent_dev, PS2_CMD_ENABLE, NULL, 0, NULL,
|
||||||
0);
|
0);
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
@@ -64,14 +64,14 @@ synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
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);
|
return send_touchpad_arg_timeout(dev, arg, 4000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
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;
|
int8 i;
|
||||||
@@ -84,7 +84,7 @@ send_touchpad_arg_timeout(ps2_dev *dev, uint8 arg, bigtime_t timeout)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
set_touchpad_mode(ps2_dev *dev, uint8 mode)
|
set_touchpad_mode(ps2_dev *dev, uint8 mode)
|
||||||
{
|
{
|
||||||
uint8 sample_rate = SYN_CHANGE_MODE;
|
uint8 sample_rate = SYN_CHANGE_MODE;
|
||||||
@@ -104,14 +104,14 @@ passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count,
|
|||||||
uint32 pt_in_count = (in_count + 1) * 6;
|
uint32 pt_in_count = (in_count + 1) * 6;
|
||||||
uint8 pt_in[pt_in_count];
|
uint8 pt_in[pt_in_count];
|
||||||
int8 i;
|
int8 i;
|
||||||
|
|
||||||
TRACE("SYNAPTICS: passthrough command 0x%x\n", cmd);
|
TRACE("SYNAPTICS: passthrough command 0x%x\n", cmd);
|
||||||
|
|
||||||
status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL, 0,
|
status = ps2_dev_command(dev->parent_dev, PS2_CMD_DISABLE, NULL, 0,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
for (i = -1; i < out_count; i++) {
|
for (i = -1; i < out_count; i++) {
|
||||||
if (i == -1)
|
if (i == -1)
|
||||||
val = cmd;
|
val = cmd;
|
||||||
@@ -131,7 +131,7 @@ passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count,
|
|||||||
&pt_cmd, 1, pt_in, pt_in_count, timeout);
|
&pt_cmd, 1, pt_in, pt_in_count, timeout);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
for (i = 0; i < in_count + 1; i++) {
|
for (i = 0; i < in_count + 1; i++) {
|
||||||
uint8 *inPointer = &(pt_in[i * 6]);
|
uint8 *inPointer = &(pt_in[i * 6]);
|
||||||
if (!IS_SYN_PT_PACKAGE(inPointer)) {
|
if (!IS_SYN_PT_PACKAGE(inPointer)) {
|
||||||
@@ -142,12 +142,12 @@ passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count,
|
|||||||
continue;
|
continue;
|
||||||
in[i - 1] = pt_in[i * 6 + 1];
|
in[i - 1] = pt_in[i * 6 + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
status = ps2_dev_command(dev->parent_dev, PS2_CMD_ENABLE, NULL, 0, NULL,
|
status = ps2_dev_command(dev->parent_dev, PS2_CMD_ENABLE, NULL, 0, NULL,
|
||||||
0);
|
0);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,22 +157,22 @@ edge_motion(mouse_movement *movement, touch_event *event, bool validStart)
|
|||||||
{
|
{
|
||||||
int32 xdelta = 0;
|
int32 xdelta = 0;
|
||||||
int32 ydelta = 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;
|
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;
|
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;
|
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;
|
ydelta = SYN_EDGE_MOTION_SPEED;
|
||||||
|
|
||||||
if (xdelta && validStart)
|
if (xdelta && validStart)
|
||||||
movement->xdelta = xdelta;
|
movement->xdelta = xdelta;
|
||||||
if (ydelta && validStart)
|
if (ydelta && validStart)
|
||||||
movement->ydelta = ydelta;
|
movement->ydelta = ydelta;
|
||||||
|
|
||||||
if ((xdelta || ydelta) && !validStart)
|
if ((xdelta || ydelta) && !validStart)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -191,10 +191,10 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event,
|
|||||||
float sens = 0;
|
float sens = 0;
|
||||||
bigtime_t currentTime = system_time();
|
bigtime_t currentTime = system_time();
|
||||||
touchpad_settings * settings = &(cookie->settings);
|
touchpad_settings * settings = &(cookie->settings);
|
||||||
|
|
||||||
if (!movement)
|
if (!movement)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
movement->xdelta = 0;
|
movement->xdelta = 0;
|
||||||
movement->ydelta = 0;
|
movement->ydelta = 0;
|
||||||
movement->buttons = 0;
|
movement->buttons = 0;
|
||||||
@@ -203,7 +203,7 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event,
|
|||||||
movement->modifiers = 0;
|
movement->modifiers = 0;
|
||||||
movement->clicks = 0;
|
movement->clicks = 0;
|
||||||
movement->timestamp = currentTime;
|
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");
|
TRACE("SYNAPTICS: tap gesture timed out\n");
|
||||||
cookie->tap_started = false;
|
cookie->tap_started = false;
|
||||||
@@ -212,21 +212,21 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event,
|
|||||||
cookie->tap_clicks = 0;
|
cookie->tap_clicks = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->buttons != 0) {
|
if (event->buttons != 0) {
|
||||||
cookie->tap_clicks = 0;
|
cookie->tap_clicks = 0;
|
||||||
cookie->tapdrag_started = false;
|
cookie->tapdrag_started = false;
|
||||||
cookie->tap_started = false;
|
cookie->tap_started = false;
|
||||||
cookie->valid_edge_motion = 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 >=4 && event->wValue <=7)
|
||||||
|| event->wValue == 0 || event->wValue == 1)
|
|| event->wValue == 0 || event->wValue == 1)
|
||||||
&& (event->xPosition != 0 || event->yPosition != 0)) {
|
&& (event->xPosition != 0 || event->yPosition != 0)) {
|
||||||
isInTouch = true;
|
isInTouch = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isInTouch) {
|
if (isInTouch) {
|
||||||
if ((SYN_AREA_END_X - SYN_AREA_WIDTH_X * settings->scroll_rightrange
|
if ((SYN_AREA_END_X - SYN_AREA_WIDTH_X * settings->scroll_rightrange
|
||||||
< event->xPosition && !cookie->movement_started
|
< event->xPosition && !cookie->movement_started
|
||||||
@@ -259,20 +259,20 @@ movement:
|
|||||||
cookie->movement_started = true;
|
cookie->movement_started = true;
|
||||||
start_new_movment(&(cookie->movement_maker));
|
start_new_movment(&(cookie->movement_maker));
|
||||||
}
|
}
|
||||||
|
|
||||||
get_movement(&(cookie->movement_maker), event->xPosition, event->yPosition);
|
get_movement(&(cookie->movement_maker), event->xPosition, event->yPosition);
|
||||||
|
|
||||||
movement->xdelta = cookie->movement_maker.xDelta;
|
movement->xdelta = cookie->movement_maker.xDelta;
|
||||||
movement->ydelta = cookie->movement_maker.yDelta;
|
movement->ydelta = cookie->movement_maker.yDelta;
|
||||||
|
|
||||||
// tap gesture
|
// tap gesture
|
||||||
cookie->tap_delta_x+= cookie->movement_maker.xDelta;
|
cookie->tap_delta_x+= cookie->movement_maker.xDelta;
|
||||||
cookie->tap_delta_y+= cookie->movement_maker.yDelta;
|
cookie->tap_delta_y+= cookie->movement_maker.yDelta;
|
||||||
|
|
||||||
if (cookie->tapdrag_started) {
|
if (cookie->tapdrag_started) {
|
||||||
movement->buttons = 0x01; // left button
|
movement->buttons = 0x01; // left button
|
||||||
movement->clicks = 0;
|
movement->clicks = 0;
|
||||||
|
|
||||||
cookie->valid_edge_motion = edge_motion(movement, event,
|
cookie->valid_edge_motion = edge_motion(movement, event,
|
||||||
cookie->valid_edge_motion);
|
cookie->valid_edge_motion);
|
||||||
TRACE("SYNAPTICS: tap drag\n");
|
TRACE("SYNAPTICS: tap drag\n");
|
||||||
@@ -280,21 +280,21 @@ movement:
|
|||||||
TRACE("SYNAPTICS: movement set buttons\n");
|
TRACE("SYNAPTICS: movement set buttons\n");
|
||||||
movement->buttons = event->buttons;
|
movement->buttons = event->buttons;
|
||||||
}
|
}
|
||||||
|
|
||||||
// use only a fraction of pressure range, the max pressure seems to be
|
// use only a fraction of pressure range, the max pressure seems to be
|
||||||
// to high
|
// to high
|
||||||
sens = 20 * (event->zPressure - MIN_PRESSURE)
|
sens = 20 * (event->zPressure - MIN_PRESSURE)
|
||||||
/ (MAX_PRESSURE - MIN_PRESSURE - 100);
|
/ (MAX_PRESSURE - MIN_PRESSURE - 100);
|
||||||
if (!cookie->tap_started
|
if (!cookie->tap_started
|
||||||
&& isStartOfMovement
|
&& isStartOfMovement
|
||||||
&& settings->tapgesture_sensibility > (20 - sens)) {
|
&& settings->tapgesture_sensibility > (20 - sens)) {
|
||||||
TRACE("SYNAPTICS: tap started\n");
|
TRACE("SYNAPTICS: tap started\n");
|
||||||
cookie->tap_started = true;
|
cookie->tap_started = true;
|
||||||
cookie->tap_time = system_time();
|
cookie->tap_time = system_time();
|
||||||
cookie->tap_delta_x = 0;
|
cookie->tap_delta_x = 0;
|
||||||
cookie->tap_delta_y = 0;
|
cookie->tap_delta_y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
scrolling:
|
scrolling:
|
||||||
@@ -311,13 +311,13 @@ scrolling:
|
|||||||
event->yPosition);
|
event->yPosition);
|
||||||
movement->wheel_ydelta = cookie->movement_maker.yDelta;
|
movement->wheel_ydelta = cookie->movement_maker.yDelta;
|
||||||
movement->wheel_xdelta = cookie->movement_maker.xDelta;
|
movement->wheel_xdelta = cookie->movement_maker.xDelta;
|
||||||
|
|
||||||
if (isSideScrollingV && !isSideScrollingH)
|
if (isSideScrollingV && !isSideScrollingH)
|
||||||
movement->wheel_xdelta = 0;
|
movement->wheel_xdelta = 0;
|
||||||
else if (isSideScrollingH && !isSideScrollingV)
|
else if (isSideScrollingH && !isSideScrollingV)
|
||||||
movement->wheel_ydelta = 0;
|
movement->wheel_ydelta = 0;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
notouch:
|
notouch:
|
||||||
TRACE("SYNAPTICS: no touch event\n");
|
TRACE("SYNAPTICS: no touch event\n");
|
||||||
cookie->scrolling_started = false;
|
cookie->scrolling_started = false;
|
||||||
@@ -325,29 +325,29 @@ notouch:
|
|||||||
movement->buttons = event->buttons;
|
movement->buttons = event->buttons;
|
||||||
if (event->buttons)
|
if (event->buttons)
|
||||||
movement->clicks = 1;
|
movement->clicks = 1;
|
||||||
|
|
||||||
if (cookie->tapdrag_started
|
if (cookie->tapdrag_started
|
||||||
&& (currentTime - cookie->tap_time) < SYN_TAP_TIMEOUT) {
|
&& (currentTime - cookie->tap_time) < SYN_TAP_TIMEOUT) {
|
||||||
movement->buttons = 0x01;
|
movement->buttons = 0x01;
|
||||||
movement->clicks = 0;
|
movement->clicks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the movement stopped switch off the dap trag when timeout is expired
|
// 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->tapdrag_started = false;
|
||||||
cookie->valid_edge_motion = false;
|
cookie->valid_edge_motion = false;
|
||||||
TRACE("SYNAPTICS: tap drag gesture timed out\n");
|
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_started = false;
|
||||||
cookie->tap_clicks = 0;
|
cookie->tap_clicks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cookie->tap_started || cookie->double_click) {
|
if (cookie->tap_started || cookie->double_click) {
|
||||||
TRACE("SYNAPTICS: tap gesture\n");
|
TRACE("SYNAPTICS: tap gesture\n");
|
||||||
cookie->tap_clicks++;
|
cookie->tap_clicks++;
|
||||||
|
|
||||||
if (cookie->tap_clicks > 1) {
|
if (cookie->tap_clicks > 1) {
|
||||||
TRACE("SYNAPTICS: empty click\n");
|
TRACE("SYNAPTICS: empty click\n");
|
||||||
movement->buttons = 0x00;
|
movement->buttons = 0x00;
|
||||||
@@ -362,12 +362,12 @@ notouch:
|
|||||||
cookie->double_click = false;
|
cookie->double_click = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
|
get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
|
||||||
{
|
{
|
||||||
status_t status;
|
status_t status;
|
||||||
@@ -376,7 +376,7 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
|
|||||||
uint8 wValue0, wValue1, wValue2, wValue3, wValue;
|
uint8 wValue0, wValue1, wValue2, wValue3, wValue;
|
||||||
uint32 val32;
|
uint32 val32;
|
||||||
uint32 xTwelfBit, yTwelfBit;
|
uint32 xTwelfBit, yTwelfBit;
|
||||||
|
|
||||||
status = acquire_sem_etc(cookie->synaptics_sem, 1, B_CAN_INTERRUPT, 0);
|
status = acquire_sem_etc(cookie->synaptics_sem, 1, B_CAN_INTERRUPT, 0);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
@@ -385,27 +385,27 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
|
|||||||
TRACE("SYNAPTICS: read_event: Error device no longer active\n");
|
TRACE("SYNAPTICS: read_event: Error device no longer active\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet_buffer_read(cookie->synaptics_ring_buffer, event_buffer,
|
if (packet_buffer_read(cookie->synaptics_ring_buffer, event_buffer,
|
||||||
cookie->dev->packet_size) != cookie->dev->packet_size) {
|
cookie->dev->packet_size) != cookie->dev->packet_size) {
|
||||||
TRACE("SYNAPTICS: error copying buffer\n");
|
TRACE("SYNAPTICS: error copying buffer\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
event.buttons = event_buffer[0] & 3;
|
event.buttons = event_buffer[0] & 3;
|
||||||
event.zPressure = event_buffer[2];
|
event.zPressure = event_buffer[2];
|
||||||
|
|
||||||
if (gTouchpadInfo.capExtended) {
|
if (gTouchpadInfo.capExtended) {
|
||||||
wValue0 = event_buffer[3] >> 2 & 1;
|
wValue0 = event_buffer[3] >> 2 & 1;
|
||||||
wValue1 = event_buffer[0] >> 2 & 1;
|
wValue1 = event_buffer[0] >> 2 & 1;
|
||||||
wValue2 = event_buffer[0] >> 4 & 1;
|
wValue2 = event_buffer[0] >> 4 & 1;
|
||||||
wValue3 = event_buffer[0] >> 5 & 1;
|
wValue3 = event_buffer[0] >> 5 & 1;
|
||||||
|
|
||||||
wValue = wValue0;
|
wValue = wValue0;
|
||||||
wValue = wValue | (wValue1 << 1);
|
wValue = wValue | (wValue1 << 1);
|
||||||
wValue = wValue | (wValue2 << 2);
|
wValue = wValue | (wValue2 << 2);
|
||||||
wValue = wValue | (wValue3 << 3);
|
wValue = wValue | (wValue3 << 3);
|
||||||
|
|
||||||
event.wValue = wValue;
|
event.wValue = wValue;
|
||||||
event.gesture = false;
|
event.gesture = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -416,22 +416,22 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement)
|
|||||||
}
|
}
|
||||||
event.gesture = event_buffer[0] >> 2 & 1;
|
event.gesture = event_buffer[0] >> 2 & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
event.xPosition = event_buffer[4];
|
event.xPosition = event_buffer[4];
|
||||||
event.yPosition = event_buffer[5];
|
event.yPosition = event_buffer[5];
|
||||||
|
|
||||||
val32 = event_buffer[1] & 0x0F;
|
val32 = event_buffer[1] & 0x0F;
|
||||||
event.xPosition+= val32 << 8;
|
event.xPosition+= val32 << 8;
|
||||||
val32 = event_buffer[1] >> 4 & 0x0F;
|
val32 = event_buffer[1] >> 4 & 0x0F;
|
||||||
event.yPosition+= val32 << 8;
|
event.yPosition+= val32 << 8;
|
||||||
|
|
||||||
xTwelfBit = event_buffer[3] >> 4 & 1;
|
xTwelfBit = event_buffer[3] >> 4 & 1;
|
||||||
event.xPosition+= xTwelfBit << 12;
|
event.xPosition+= xTwelfBit << 12;
|
||||||
yTwelfBit = event_buffer[3] >> 5 & 1;
|
yTwelfBit = event_buffer[3] >> 5 & 1;
|
||||||
event.yPosition+= yTwelfBit << 12;
|
event.yPosition+= yTwelfBit << 12;
|
||||||
|
|
||||||
status = touchevent_to_movement(cookie, &event, movement);
|
status = touchevent_to_movement(cookie, &event, movement);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,7 +442,7 @@ query_capability(ps2_dev *dev)
|
|||||||
uint8 val[3];
|
uint8 val[3];
|
||||||
send_touchpad_arg(dev, 0x02);
|
send_touchpad_arg(dev, 0x02);
|
||||||
ps2_dev_command(dev, 0xE9, NULL, 0, val, 3);
|
ps2_dev_command(dev, 0xE9, NULL, 0, val, 3);
|
||||||
|
|
||||||
gTouchpadInfo.capExtended = val[0] >> 7 & 1;
|
gTouchpadInfo.capExtended = val[0] >> 7 & 1;
|
||||||
TRACE("SYNAPTICS: extended mode %2x\n", val[0] >> 7 & 1);
|
TRACE("SYNAPTICS: extended mode %2x\n", val[0] >> 7 & 1);
|
||||||
TRACE("SYNAPTICS: sleep mode %2x\n", val[2] >> 4 & 1);
|
TRACE("SYNAPTICS: sleep mode %2x\n", val[2] >> 4 & 1);
|
||||||
@@ -466,18 +466,23 @@ probe_synaptics(ps2_dev *dev)
|
|||||||
{
|
{
|
||||||
uint8 val[3];
|
uint8 val[3];
|
||||||
uint8 deviceId;
|
uint8 deviceId;
|
||||||
|
status_t status;
|
||||||
TRACE("SYNAPTICS: probe\n");
|
TRACE("SYNAPTICS: probe\n");
|
||||||
|
|
||||||
send_touchpad_arg(dev, 0x00);
|
status = send_touchpad_arg(dev, 0x00);
|
||||||
ps2_dev_command(dev, 0xE9, NULL, 0, val, 3);
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
status = ps2_dev_command(dev, 0xE9, NULL, 0, val, 3);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
gTouchpadInfo.minorVersion = val[0];
|
gTouchpadInfo.minorVersion = val[0];
|
||||||
deviceId = val[1];
|
deviceId = val[1];
|
||||||
if (deviceId != SYN_TOUCHPAD) {
|
if (deviceId != SYN_TOUCHPAD) {
|
||||||
TRACE("SYNAPTICS: not found\n");
|
TRACE("SYNAPTICS: not found\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("SYNAPTICS: Touchpad found id:l %2x\n", deviceId);
|
TRACE("SYNAPTICS: Touchpad found id:l %2x\n", deviceId);
|
||||||
gTouchpadInfo.majorVersion = val[2] & 0x0F;
|
gTouchpadInfo.majorVersion = val[2] & 0x0F;
|
||||||
TRACE("SYNAPTICS: version %d.%d\n", gTouchpadInfo.majorVersion,
|
TRACE("SYNAPTICS: version %d.%d\n", gTouchpadInfo.majorVersion,
|
||||||
@@ -496,43 +501,43 @@ probe_synaptics(ps2_dev *dev)
|
|||||||
// #pragma mark - Device functions
|
// #pragma mark - Device functions
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
synaptics_open(const char *name, uint32 flags, void **_cookie)
|
synaptics_open(const char *name, uint32 flags, void **_cookie)
|
||||||
{
|
{
|
||||||
status_t status;
|
status_t status;
|
||||||
synaptics_cookie* cookie;
|
synaptics_cookie* cookie;
|
||||||
ps2_dev *dev;
|
ps2_dev *dev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (dev = NULL, i = 0; i < PS2_DEVICE_COUNT; i++) {
|
for (dev = NULL, i = 0; i < PS2_DEVICE_COUNT; i++) {
|
||||||
if (0 == strcmp(ps2_device[i].name, name)) {
|
if (0 == strcmp(ps2_device[i].name, name)) {
|
||||||
dev = &ps2_device[i];
|
dev = &ps2_device[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev == NULL) {
|
if (dev == NULL) {
|
||||||
TRACE("ps2: dev = NULL\n");
|
TRACE("ps2: dev = NULL\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomic_or(&dev->flags, PS2_FLAG_OPEN) & PS2_FLAG_OPEN)
|
if (atomic_or(&dev->flags, PS2_FLAG_OPEN) & PS2_FLAG_OPEN)
|
||||||
return B_BUSY;
|
return B_BUSY;
|
||||||
|
|
||||||
cookie = (synaptics_cookie*)malloc(sizeof(synaptics_cookie));
|
cookie = (synaptics_cookie*)malloc(sizeof(synaptics_cookie));
|
||||||
if (cookie == NULL)
|
if (cookie == NULL)
|
||||||
goto err1;
|
goto err1;
|
||||||
|
|
||||||
*_cookie = cookie;
|
*_cookie = cookie;
|
||||||
memset(cookie, 0, sizeof(synaptics_cookie));
|
memset(cookie, 0, sizeof(synaptics_cookie));
|
||||||
|
|
||||||
cookie->dev = dev;
|
cookie->dev = dev;
|
||||||
dev->cookie = cookie;
|
dev->cookie = cookie;
|
||||||
dev->disconnect = &synaptics_disconnect;
|
dev->disconnect = &synaptics_disconnect;
|
||||||
dev->handle_int = &synaptics_handle_int;
|
dev->handle_int = &synaptics_handle_int;
|
||||||
|
|
||||||
default_settings(&(cookie->settings));
|
default_settings(&(cookie->settings));
|
||||||
|
|
||||||
cookie->movement_maker.speed = 1;
|
cookie->movement_maker.speed = 1;
|
||||||
cookie->movement_maker.scrolling_xStep = cookie->settings.scroll_xstepsize;
|
cookie->movement_maker.scrolling_xStep = cookie->settings.scroll_xstepsize;
|
||||||
cookie->movement_maker.scrolling_yStep = cookie->settings.scroll_ystepsize;
|
cookie->movement_maker.scrolling_yStep = cookie->settings.scroll_ystepsize;
|
||||||
@@ -543,16 +548,16 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
|
|||||||
cookie->tap_started = false;
|
cookie->tap_started = false;
|
||||||
cookie->double_click = false;
|
cookie->double_click = false;
|
||||||
cookie->valid_edge_motion = false;
|
cookie->valid_edge_motion = false;
|
||||||
|
|
||||||
dev->packet_size = PS2_PACKET_SYNAPTICS;
|
dev->packet_size = PS2_PACKET_SYNAPTICS;
|
||||||
|
|
||||||
cookie->synaptics_ring_buffer
|
cookie->synaptics_ring_buffer
|
||||||
= create_packet_buffer(SYNAPTICS_HISTORY_SIZE * dev->packet_size);
|
= create_packet_buffer(SYNAPTICS_HISTORY_SIZE * dev->packet_size);
|
||||||
if (cookie->synaptics_ring_buffer == NULL) {
|
if (cookie->synaptics_ring_buffer == NULL) {
|
||||||
TRACE("ps2: can't allocate mouse actions buffer\n");
|
TRACE("ps2: can't allocate mouse actions buffer\n");
|
||||||
goto err2;
|
goto err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the mouse semaphore, used for synchronization between
|
// create the mouse semaphore, used for synchronization between
|
||||||
// the interrupt handler and the read operation
|
// the interrupt handler and the read operation
|
||||||
cookie->synaptics_sem = create_sem(0, "ps2_synaptics_sem");
|
cookie->synaptics_sem = create_sem(0, "ps2_synaptics_sem");
|
||||||
@@ -561,7 +566,7 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
|
|||||||
goto err3;
|
goto err3;
|
||||||
}
|
}
|
||||||
query_capability(dev);
|
query_capability(dev);
|
||||||
|
|
||||||
// create pass through dev
|
// create pass through dev
|
||||||
if (gTouchpadInfo.capPassThrough) {
|
if (gTouchpadInfo.capPassThrough) {
|
||||||
TRACE("SYNAPTICS: pass through detected\n");
|
TRACE("SYNAPTICS: pass through detected\n");
|
||||||
@@ -569,7 +574,7 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
|
|||||||
gPassthroughDevice->idx = dev->idx;
|
gPassthroughDevice->idx = dev->idx;
|
||||||
ps2_service_notify_device_added(gPassthroughDevice);
|
ps2_service_notify_device_added(gPassthroughDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set Mode
|
// Set Mode
|
||||||
if (gTouchpadInfo.capExtended)
|
if (gTouchpadInfo.capExtended)
|
||||||
cookie->mode = SYN_ABSOLUTE_W_MODE;
|
cookie->mode = SYN_ABSOLUTE_W_MODE;
|
||||||
@@ -580,19 +585,19 @@ synaptics_open(const char *name, uint32 flags, void **_cookie)
|
|||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
INFO("SYNAPTICS: cannot set mode %s\n", name);
|
INFO("SYNAPTICS: cannot set mode %s\n", name);
|
||||||
goto err4;
|
goto err4;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = ps2_dev_command(dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0);
|
status = ps2_dev_command(dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0);
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
INFO("SYNAPTICS: cannot enable touchpad %s\n", name);
|
INFO("SYNAPTICS: cannot enable touchpad %s\n", name);
|
||||||
goto err4;
|
goto err4;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_or(&dev->flags, PS2_FLAG_ENABLED);
|
atomic_or(&dev->flags, PS2_FLAG_ENABLED);
|
||||||
|
|
||||||
TRACE("SYNAPTICS: open %s success\n", name);
|
TRACE("SYNAPTICS: open %s success\n", name);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
err4:
|
err4:
|
||||||
delete_sem(cookie->synaptics_sem);
|
delete_sem(cookie->synaptics_sem);
|
||||||
err3:
|
err3:
|
||||||
@@ -601,7 +606,7 @@ err2:
|
|||||||
free(cookie);
|
free(cookie);
|
||||||
err1:
|
err1:
|
||||||
atomic_and(&dev->flags, ~PS2_FLAG_OPEN);
|
atomic_and(&dev->flags, ~PS2_FLAG_OPEN);
|
||||||
|
|
||||||
TRACE("SYNAPTICS: synaptics_open %s failed\n", name);
|
TRACE("SYNAPTICS: synaptics_open %s failed\n", name);
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
@@ -620,10 +625,10 @@ synaptics_close(void *_cookie)
|
|||||||
|
|
||||||
atomic_and(&cookie->dev->flags, ~PS2_FLAG_OPEN);
|
atomic_and(&cookie->dev->flags, ~PS2_FLAG_OPEN);
|
||||||
atomic_and(&cookie->dev->flags, ~PS2_FLAG_ENABLED);
|
atomic_and(&cookie->dev->flags, ~PS2_FLAG_ENABLED);
|
||||||
|
|
||||||
if (gTouchpadInfo.capPassThrough)
|
if (gTouchpadInfo.capPassThrough)
|
||||||
ps2_service_notify_device_removed(gPassthroughDevice);
|
ps2_service_notify_device_removed(gPassthroughDevice);
|
||||||
|
|
||||||
TRACE("SYNAPTICS: close %s done\n", cookie->dev->name);
|
TRACE("SYNAPTICS: close %s done\n", cookie->dev->name);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -659,7 +664,7 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
|
|||||||
synaptics_cookie *cookie = _cookie;
|
synaptics_cookie *cookie = _cookie;
|
||||||
mouse_movement movement;
|
mouse_movement movement;
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case MS_READ:
|
case MS_READ:
|
||||||
TRACE("SYNAPTICS: MS_READ get event\n");
|
TRACE("SYNAPTICS: MS_READ get event\n");
|
||||||
@@ -667,7 +672,7 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
|
|||||||
return status;
|
return status;
|
||||||
return user_memcpy(buffer, &movement, sizeof(movement));
|
return user_memcpy(buffer, &movement, sizeof(movement));
|
||||||
case MS_IS_TOUCHPAD:
|
case MS_IS_TOUCHPAD:
|
||||||
TRACE("SYNAPTICS: MS_IS_TOUCHPAD\n");
|
TRACE("SYNAPTICS: MS_IS_TOUCHPAD\n");
|
||||||
return B_OK;
|
return B_OK;
|
||||||
case MS_SET_TOUCHPAD_SETTINGS:
|
case MS_SET_TOUCHPAD_SETTINGS:
|
||||||
TRACE("SYNAPTICS: MS_SET_TOUCHPAD_SETTINGS");
|
TRACE("SYNAPTICS: MS_SET_TOUCHPAD_SETTINGS");
|
||||||
@@ -686,14 +691,14 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32
|
int32
|
||||||
synaptics_handle_int(ps2_dev *dev)
|
synaptics_handle_int(ps2_dev *dev)
|
||||||
{
|
{
|
||||||
synaptics_cookie *cookie = dev->cookie;
|
synaptics_cookie *cookie = dev->cookie;
|
||||||
uint8 val;
|
uint8 val;
|
||||||
|
|
||||||
val = cookie->dev->history[0].data;
|
val = cookie->dev->history[0].data;
|
||||||
|
|
||||||
if ((cookie->packet_index == 0 || cookie->packet_index == 3) && val & 8) {
|
if ((cookie->packet_index == 0 || cookie->packet_index == 3) && val & 8) {
|
||||||
INFO("SYNAPTICS: bad mouse data, trying resync\n");
|
INFO("SYNAPTICS: bad mouse data, trying resync\n");
|
||||||
cookie->packet_index = 0;
|
cookie->packet_index = 0;
|
||||||
@@ -709,32 +714,32 @@ synaptics_handle_int(ps2_dev *dev)
|
|||||||
goto unhandled;
|
goto unhandled;
|
||||||
}
|
}
|
||||||
cookie->packet_buffer[cookie->packet_index] = val;
|
cookie->packet_buffer[cookie->packet_index] = val;
|
||||||
|
|
||||||
cookie->packet_index++;
|
cookie->packet_index++;
|
||||||
if (cookie->packet_index >= 6) {
|
if (cookie->packet_index >= 6) {
|
||||||
cookie->packet_index = 0;
|
cookie->packet_index = 0;
|
||||||
|
|
||||||
// check if package is a pass through package if true pass it
|
// check if package is a pass through package if true pass it
|
||||||
// too the pass through interrupt handle
|
// too the pass through interrupt handle
|
||||||
if (gPassthroughDevice->active
|
if (gPassthroughDevice->active
|
||||||
&& gPassthroughDevice->handle_int != NULL
|
&& gPassthroughDevice->handle_int != NULL
|
||||||
&& IS_SYN_PT_PACKAGE(cookie->packet_buffer)) {
|
&& IS_SYN_PT_PACKAGE(cookie->packet_buffer)) {
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
gPassthroughDevice->history[0].data = cookie->packet_buffer[1];
|
gPassthroughDevice->history[0].data = cookie->packet_buffer[1];
|
||||||
gPassthroughDevice->handle_int(gPassthroughDevice);
|
gPassthroughDevice->handle_int(gPassthroughDevice);
|
||||||
gPassthroughDevice->history[0].data = cookie->packet_buffer[4];
|
gPassthroughDevice->history[0].data = cookie->packet_buffer[4];
|
||||||
gPassthroughDevice->handle_int(gPassthroughDevice);
|
gPassthroughDevice->handle_int(gPassthroughDevice);
|
||||||
gPassthroughDevice->history[0].data = cookie->packet_buffer[5];
|
gPassthroughDevice->history[0].data = cookie->packet_buffer[5];
|
||||||
status = gPassthroughDevice->handle_int(gPassthroughDevice);
|
status = gPassthroughDevice->handle_int(gPassthroughDevice);
|
||||||
|
|
||||||
if (cookie->dev->packet_size == 4) {
|
if (cookie->dev->packet_size == 4) {
|
||||||
gPassthroughDevice->history[0].data = cookie->packet_buffer[2];
|
gPassthroughDevice->history[0].data = cookie->packet_buffer[2];
|
||||||
status = gPassthroughDevice->handle_int(gPassthroughDevice);
|
status = gPassthroughDevice->handle_int(gPassthroughDevice);
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet_buffer_write(cookie->synaptics_ring_buffer,
|
if (packet_buffer_write(cookie->synaptics_ring_buffer,
|
||||||
cookie->packet_buffer, cookie->dev->packet_size)
|
cookie->packet_buffer, cookie->dev->packet_size)
|
||||||
!= cookie->dev->packet_size) {
|
!= cookie->dev->packet_size) {
|
||||||
@@ -742,10 +747,10 @@ synaptics_handle_int(ps2_dev *dev)
|
|||||||
return B_HANDLED_INTERRUPT;
|
return B_HANDLED_INTERRUPT;
|
||||||
}
|
}
|
||||||
release_sem_etc(cookie->synaptics_sem, 1, B_DO_NOT_RESCHEDULE);
|
release_sem_etc(cookie->synaptics_sem, 1, B_DO_NOT_RESCHEDULE);
|
||||||
|
|
||||||
return B_INVOKE_SCHEDULER;
|
return B_INVOKE_SCHEDULER;
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_HANDLED_INTERRUPT;
|
return B_HANDLED_INTERRUPT;
|
||||||
unhandled:
|
unhandled:
|
||||||
return B_UNHANDLED_INTERRUPT;
|
return B_UNHANDLED_INTERRUPT;
|
||||||
|
|||||||
Reference in New Issue
Block a user