From dd85ce0d07fffbefdebe9992c750d7e29f0cbc12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 1 Nov 2008 20:29:50 +0000 Subject: [PATCH] * 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 --- .../kernel/bus_managers/ps2/ps2_synaptics.c | 199 +++++++++--------- 1 file changed, 102 insertions(+), 97 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c index 081311c319..7fed15e50c 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c @@ -7,7 +7,7 @@ * Authors (in chronological order): * Clemens Zeidler (haiku@Clemens-Zeidler.de) */ - + #include #include #include @@ -27,7 +27,7 @@ static touchpad_info gTouchpadInfo; ps2_dev *gPassthroughDevice = &ps2_device[PS2_DEVICE_SYN_PASSTHROUGH]; -void +void default_settings(touchpad_settings *set) { memcpy(set, &kDefaultTouchpadSettings, sizeof(touchpad_settings)); @@ -37,23 +37,23 @@ default_settings(touchpad_settings *set) status_t 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, 0, NULL, 0); if (status < B_OK) { INFO("SYNAPTICS: cannot disable touchpad %s\n", dev->parent_dev->name); return B_ERROR; } - + syn_cookie->packet_index = 0; - + if (size == 4) syn_cookie->mode|= SYN_FOUR_BYTE_CHILD; 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); 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) { return send_touchpad_arg_timeout(dev, arg, 4000000); } -status_t +status_t send_touchpad_arg_timeout(ps2_dev *dev, uint8 arg, bigtime_t timeout) { 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) { 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; uint8 pt_in[pt_in_count]; int8 i; - + 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) return status; - + for (i = -1; i < out_count; i++) { if (i == -1) 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); if (status != B_OK) return status; - + for (i = 0; i < in_count + 1; i++) { uint8 *inPointer = &(pt_in[i * 6]); if (!IS_SYN_PT_PACKAGE(inPointer)) { @@ -142,12 +142,12 @@ passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, 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) return status; - + return B_OK; } @@ -157,22 +157,22 @@ 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) xdelta = -SYN_EDGE_MOTION_SPEED; 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) ydelta = -SYN_EDGE_MOTION_SPEED; else if (event->yPosition > SYN_AREA_END_Y - SYN_EDGE_MOTION_WIDTH) ydelta = SYN_EDGE_MOTION_SPEED; - + if (xdelta && validStart) movement->xdelta = xdelta; if (ydelta && validStart) movement->ydelta = ydelta; - + if ((xdelta || ydelta) && !validStart) return false; @@ -191,10 +191,10 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, float sens = 0; bigtime_t currentTime = system_time(); touchpad_settings * settings = &(cookie->settings); - + if (!movement) return B_ERROR; - + movement->xdelta = 0; movement->ydelta = 0; movement->buttons = 0; @@ -203,7 +203,7 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, movement->modifiers = 0; movement->clicks = 0; movement->timestamp = currentTime; - + if ((currentTime - cookie->tap_time) > SYN_TAP_TIMEOUT) { TRACE("SYNAPTICS: tap gesture timed out\n"); cookie->tap_started = false; @@ -212,21 +212,21 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, cookie->tap_clicks = 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 && ((event->wValue >=4 && event->wValue <=7) || event->wValue == 0 || event->wValue == 1) && (event->xPosition != 0 || event->yPosition != 0)) { isInTouch = true; } - + if (isInTouch) { if ((SYN_AREA_END_X - SYN_AREA_WIDTH_X * settings->scroll_rightrange < event->xPosition && !cookie->movement_started @@ -259,20 +259,20 @@ movement: cookie->movement_started = true; start_new_movment(&(cookie->movement_maker)); } - + get_movement(&(cookie->movement_maker), event->xPosition, event->yPosition); - + movement->xdelta = cookie->movement_maker.xDelta; movement->ydelta = cookie->movement_maker.yDelta; - + // tap gesture cookie->tap_delta_x+= cookie->movement_maker.xDelta; cookie->tap_delta_y+= cookie->movement_maker.yDelta; - + if (cookie->tapdrag_started) { movement->buttons = 0x01; // left button movement->clicks = 0; - + cookie->valid_edge_motion = edge_motion(movement, event, cookie->valid_edge_motion); TRACE("SYNAPTICS: tap drag\n"); @@ -280,21 +280,21 @@ movement: 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 - && isStartOfMovement - && settings->tapgesture_sensibility > (20 - sens)) { + && isStartOfMovement + && settings->tapgesture_sensibility > (20 - sens)) { TRACE("SYNAPTICS: tap started\n"); cookie->tap_started = true; cookie->tap_time = system_time(); cookie->tap_delta_x = 0; cookie->tap_delta_y = 0; } - + return B_OK; scrolling: @@ -311,13 +311,13 @@ scrolling: event->yPosition); movement->wheel_ydelta = cookie->movement_maker.yDelta; movement->wheel_xdelta = cookie->movement_maker.xDelta; - + if (isSideScrollingV && !isSideScrollingH) movement->wheel_xdelta = 0; else if (isSideScrollingH && !isSideScrollingV) movement->wheel_ydelta = 0; return B_OK; - + notouch: TRACE("SYNAPTICS: no touch event\n"); cookie->scrolling_started = false; @@ -325,29 +325,29 @@ notouch: movement->buttons = event->buttons; if (event->buttons) movement->clicks = 1; - + 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) { 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) { cookie->tap_started = false; cookie->tap_clicks = 0; } - + if (cookie->tap_started || cookie->double_click) { TRACE("SYNAPTICS: tap gesture\n"); cookie->tap_clicks++; - + if (cookie->tap_clicks > 1) { TRACE("SYNAPTICS: empty click\n"); movement->buttons = 0x00; @@ -362,12 +362,12 @@ notouch: cookie->double_click = false; } } - + return B_OK; } -status_t +status_t get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement) { status_t status; @@ -376,7 +376,7 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement) uint8 wValue0, wValue1, wValue2, wValue3, wValue; uint32 val32; uint32 xTwelfBit, yTwelfBit; - + status = acquire_sem_etc(cookie->synaptics_sem, 1, B_CAN_INTERRUPT, 0); if (status < B_OK) 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"); return B_ERROR; } - + 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; } - + event.buttons = event_buffer[0] & 3; event.zPressure = event_buffer[2]; - + if (gTouchpadInfo.capExtended) { wValue0 = event_buffer[3] >> 2 & 1; wValue1 = event_buffer[0] >> 2 & 1; wValue2 = event_buffer[0] >> 4 & 1; wValue3 = event_buffer[0] >> 5 & 1; - + wValue = wValue0; wValue = wValue | (wValue1 << 1); wValue = wValue | (wValue2 << 2); wValue = wValue | (wValue3 << 3); - + event.wValue = wValue; event.gesture = false; } else { @@ -416,22 +416,22 @@ get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement) } event.gesture = event_buffer[0] >> 2 & 1; } - + event.xPosition = event_buffer[4]; event.yPosition = event_buffer[5]; - + val32 = event_buffer[1] & 0x0F; event.xPosition+= val32 << 8; val32 = event_buffer[1] >> 4 & 0x0F; event.yPosition+= val32 << 8; - + xTwelfBit = event_buffer[3] >> 4 & 1; event.xPosition+= xTwelfBit << 12; yTwelfBit = event_buffer[3] >> 5 & 1; event.yPosition+= yTwelfBit << 12; - + status = touchevent_to_movement(cookie, &event, movement); - + return B_OK; } @@ -442,7 +442,7 @@ query_capability(ps2_dev *dev) uint8 val[3]; send_touchpad_arg(dev, 0x02); ps2_dev_command(dev, 0xE9, NULL, 0, val, 3); - + 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); @@ -466,18 +466,23 @@ probe_synaptics(ps2_dev *dev) { uint8 val[3]; uint8 deviceId; + status_t status; TRACE("SYNAPTICS: probe\n"); - send_touchpad_arg(dev, 0x00); - ps2_dev_command(dev, 0xE9, NULL, 0, val, 3); - + status = send_touchpad_arg(dev, 0x00); + 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]; deviceId = val[1]; if (deviceId != SYN_TOUCHPAD) { TRACE("SYNAPTICS: not found\n"); return B_ERROR; } - + TRACE("SYNAPTICS: Touchpad found id:l %2x\n", deviceId); gTouchpadInfo.majorVersion = val[2] & 0x0F; TRACE("SYNAPTICS: version %d.%d\n", gTouchpadInfo.majorVersion, @@ -496,43 +501,43 @@ probe_synaptics(ps2_dev *dev) // #pragma mark - Device functions -status_t +status_t synaptics_open(const char *name, uint32 flags, void **_cookie) { status_t status; synaptics_cookie* cookie; ps2_dev *dev; int i; - + for (dev = NULL, i = 0; i < PS2_DEVICE_COUNT; i++) { if (0 == strcmp(ps2_device[i].name, name)) { dev = &ps2_device[i]; break; } } - + if (dev == NULL) { TRACE("ps2: dev = NULL\n"); return B_ERROR; } - + if (atomic_or(&dev->flags, PS2_FLAG_OPEN) & PS2_FLAG_OPEN) return B_BUSY; - - cookie = (synaptics_cookie*)malloc(sizeof(synaptics_cookie)); + + cookie = (synaptics_cookie*)malloc(sizeof(synaptics_cookie)); if (cookie == NULL) goto err1; - + *_cookie = cookie; memset(cookie, 0, sizeof(synaptics_cookie)); - + cookie->dev = dev; dev->cookie = cookie; dev->disconnect = &synaptics_disconnect; dev->handle_int = &synaptics_handle_int; - + default_settings(&(cookie->settings)); - + cookie->movement_maker.speed = 1; cookie->movement_maker.scrolling_xStep = cookie->settings.scroll_xstepsize; 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->double_click = false; cookie->valid_edge_motion = false; - + dev->packet_size = PS2_PACKET_SYNAPTICS; - + 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; } - + // create the mouse semaphore, used for synchronization between // the interrupt handler and the read operation cookie->synaptics_sem = create_sem(0, "ps2_synaptics_sem"); @@ -561,7 +566,7 @@ synaptics_open(const char *name, uint32 flags, void **_cookie) goto err3; } query_capability(dev); - + // create pass through dev if (gTouchpadInfo.capPassThrough) { TRACE("SYNAPTICS: pass through detected\n"); @@ -569,7 +574,7 @@ synaptics_open(const char *name, uint32 flags, void **_cookie) gPassthroughDevice->idx = dev->idx; ps2_service_notify_device_added(gPassthroughDevice); } - + // Set Mode if (gTouchpadInfo.capExtended) cookie->mode = SYN_ABSOLUTE_W_MODE; @@ -580,19 +585,19 @@ synaptics_open(const char *name, uint32 flags, void **_cookie) if (status < B_OK) { INFO("SYNAPTICS: cannot set mode %s\n", name); goto err4; - } - + } + status = ps2_dev_command(dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0); if (status < B_OK) { INFO("SYNAPTICS: cannot enable touchpad %s\n", name); goto err4; } - + atomic_or(&dev->flags, PS2_FLAG_ENABLED); - + TRACE("SYNAPTICS: open %s success\n", name); return B_OK; - + err4: delete_sem(cookie->synaptics_sem); err3: @@ -601,7 +606,7 @@ err2: free(cookie); err1: atomic_and(&dev->flags, ~PS2_FLAG_OPEN); - + TRACE("SYNAPTICS: synaptics_open %s failed\n", name); 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_ENABLED); - + if (gTouchpadInfo.capPassThrough) ps2_service_notify_device_removed(gPassthroughDevice); - + TRACE("SYNAPTICS: close %s done\n", cookie->dev->name); return B_OK; } @@ -659,7 +664,7 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length) synaptics_cookie *cookie = _cookie; mouse_movement movement; status_t status; - + switch (op) { case MS_READ: 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 user_memcpy(buffer, &movement, sizeof(movement)); case MS_IS_TOUCHPAD: - TRACE("SYNAPTICS: MS_IS_TOUCHPAD\n"); + TRACE("SYNAPTICS: MS_IS_TOUCHPAD\n"); return B_OK; case 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_cookie *cookie = dev->cookie; uint8 val; - + val = cookie->dev->history[0].data; - + if ((cookie->packet_index == 0 || cookie->packet_index == 3) && val & 8) { INFO("SYNAPTICS: bad mouse data, trying resync\n"); cookie->packet_index = 0; @@ -709,32 +714,32 @@ synaptics_handle_int(ps2_dev *dev) goto unhandled; } cookie->packet_buffer[cookie->packet_index] = val; - + cookie->packet_index++; 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 (gPassthroughDevice->active + if (gPassthroughDevice->active && gPassthroughDevice->handle_int != NULL && IS_SYN_PT_PACKAGE(cookie->packet_buffer)) { status_t status; - + 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) { gPassthroughDevice->history[0].data = cookie->packet_buffer[2]; status = gPassthroughDevice->handle_int(gPassthroughDevice); } - return status; + return status; } - + if (packet_buffer_write(cookie->synaptics_ring_buffer, cookie->packet_buffer, cookie->dev->packet_size) != cookie->dev->packet_size) { @@ -742,10 +747,10 @@ synaptics_handle_int(ps2_dev *dev) return B_HANDLED_INTERRUPT; } release_sem_etc(cookie->synaptics_sem, 1, B_DO_NOT_RESCHEDULE); - + return B_INVOKE_SCHEDULER; } - + return B_HANDLED_INTERRUPT; unhandled: return B_UNHANDLED_INTERRUPT;