haiku/headers/private/input/keyboard_mouse_driver.h
PulkoMandy 49efa33dd0 ps2 synaptics: implement 'extended W' mode.
"Newer" synaptics touchpad support a new mode where they can report more
information to the host. In this mode, there is a different packet
format for tracking extra data from the touchpad, including a wheel
encoder (mousewheel) if available, and multitouch finger tracking.

This mode is documented in the Synaptics touchpad interfacing guide
(Synaptics document 511-000275-01 Rev. B), but was not yet implemented
in our driver.

It should help with detecting multiple fingers, or finger position on
clickpads to determine right or left click.

This change implements the following items from the Synaptics
interfacing guide:

- Cleanup and clarify the code for features detection to properly report
  clickpads
- Enable "extended W" mode if supported
- Process extended W values 0 (mouse wheels, reported in the
  touchpad_event structure and could be used by input_server for
  scrolling), 1 (secondary finger), and 2 (finger count)
- Fix handling of wValue, which is not always a finger width
- Add handling of vValuen which indicates the finger width when wValue
  doesn't

Overall, this should provide the movement_maker with a better picture of
what's happening.

Also improve tracing to show received packets and the corresponding
WValue since that's an important value in identifying which type of
packet it is.

Unfortunately I currently don't have a laptop with synaptics touchpad to
test this with.

Change-Id: If334392f4eb2a146955f6c8c897f0ab64d79b8d9
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4425
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
Reviewed-by: nephele <nep@packageloss.eu>
2023-01-28 14:57:53 +00:00

176 lines
3.2 KiB
C

/*
* Copyright 2002-2010, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _KEYBOARD_MOUSE_DRIVER_H
#define _KEYBOARD_MOUSE_DRIVER_H
#include <SupportDefs.h>
#include <Drivers.h>
#define KEY_Scroll 0x0f
#define KEY_Pause 0x10
#define KEY_Num 0x22
#define KEY_CapsLock 0x3b
#define KEY_ShiftL 0x4b
#define KEY_ShiftR 0x56
#define KEY_ControlL 0x5c
#define KEY_CmdL 0x5d
#define KEY_AltL 0x5d
#define KEY_CmdR 0x5f
#define KEY_AltR 0x5f
#define KEY_ControlR 0x60
#define KEY_OptL 0x66
#define KEY_WinL 0x66
#define KEY_OptR 0x67
#define KEY_WinR 0x67
#define KEY_Menu 0x68
#define KEY_NumEqual 0x6a
#define KEY_Power 0x6b
#define KEY_SysRq 0x7e
#define KEY_Break 0x7f
#define KEY_Spacebar 0x5e
#define KB_DEFAULT_CONTROL_ALT_DEL_TIMEOUT 4000000
enum {
KB_READ = B_DEVICE_OP_CODES_END,
KB_GET_KEYBOARD_ID,
KB_SET_LEDS,
KB_SET_KEY_REPEATING,
KB_SET_KEY_NONREPEATING,
KB_SET_KEY_REPEAT_RATE,
KB_GET_KEY_REPEAT_RATE,
KB_SET_KEY_REPEAT_DELAY,
KB_GET_KEY_REPEAT_DELAY,
KB_SET_CONTROL_ALT_DEL_TIMEOUT,
KB_RESERVED_1,
KB_CANCEL_CONTROL_ALT_DEL,
KB_DELAY_CONTROL_ALT_DEL,
KB_SET_DEBUG_READER,
MS_READ = B_DEVICE_OP_CODES_END + 100,
MS_NUM_EVENTS,
MS_GET_ACCEL,
MS_SET_ACCEL,
MS_GET_TYPE,
MS_SET_TYPE,
MS_GET_MAP,
MS_SET_MAP,
MS_GET_CLICKSPEED,
MS_SET_CLICKSPEED,
MS_NUM_SERIAL_MICE,
MS_IS_TOUCHPAD,
MS_READ_TOUCHPAD,
IIC_WRITE = B_DEVICE_OP_CODES_END + 200,
RESTART_SYSTEM,
SHUTDOWN_SYSTEM
};
typedef struct {
bigtime_t timestamp;
uint32 keycode;
bool is_keydown;
} raw_key_info;
typedef struct {
bool num_lock;
bool caps_lock;
bool scroll_lock;
} led_info;
typedef struct {
int32 cookie;
uint32 buttons;
int32 xdelta;
int32 ydelta;
int32 clicks;
int32 modifiers;
bigtime_t timestamp;
int32 wheel_ydelta;
int32 wheel_xdelta;
} mouse_movement;
#define B_TIP_SWITCH 0x01
#define B_SECONDARY_TIP_SWITCH 0x02
#define B_BARREL_SWITCH 0x04
#define B_ERASER 0x08
#define B_TABLET_PICK 0x0F
typedef struct {
uint32 buttons;
uint32 switches;
float xpos;
float ypos;
bool has_contact;
float pressure;
int32 clicks;
bigtime_t timestamp;
int32 wheel_ydelta;
int32 wheel_xdelta;
float tilt_x;
float tilt_y;
} tablet_movement;
#define B_ONE_FINGER 0x01
#define B_TWO_FINGER 0x02
#define B_MULTI_FINGER 0x04
#define B_PEN 0x08
typedef struct {
uint16 edgeMotionWidth;
uint16 width;
uint16 areaStartX;
uint16 areaEndX;
uint16 areaStartY;
uint16 areaEndY;
uint16 minPressure;
// the value you reach when you hammer really hard on the touchpad
uint16 realMaxPressure;
uint16 maxPressure;
} touchpad_specs;
typedef struct {
uint8 buttons;
uint32 xPosition;
uint32 yPosition;
uint8 zPressure;
uint8 fingers;
bool gesture;
uint8 fingerWidth;
int32 wheel_ydelta;
int32 wheel_xdelta;
int32 wheel_zdelta;
int32 wheel_wdelta;
// 1 - 4 normal width
// 5 - 11 very wide finger or palm
// 12 maximum reportable width; extreme wide contact
} touchpad_movement;
typedef struct {
bigtime_t timeout;
int32 event;
union {
touchpad_movement touchpad;
mouse_movement mouse;
} u;
} touchpad_read;
#endif // _KB_MOUSE_DRIVER_H