16849a228SStephan Aßmus #ifndef SYNAPTICS_H 26849a228SStephan Aßmus #define SYNAPTICS_H 36849a228SStephan Aßmus 46849a228SStephan Aßmus #include <KernelExport.h> 56849a228SStephan Aßmus 66849a228SStephan Aßmus #include "kb_mouse_driver.h" 76849a228SStephan Aßmus #include "movement_maker.h" 86849a228SStephan Aßmus #include "packet_buffer.h" 96849a228SStephan Aßmus #include "touchpad_settings.h" 106849a228SStephan Aßmus 116849a228SStephan Aßmus 126849a228SStephan Aßmus #define SYN_TOUCHPAD 0x47 136849a228SStephan Aßmus // Synaptics modes 146849a228SStephan Aßmus #define SYN_ABSOLUTE_MODE 0x80 156849a228SStephan Aßmus // Absolute plus w mode 166849a228SStephan Aßmus #define SYN_ABSOLUTE_W_MODE 0x81 176849a228SStephan Aßmus #define SYN_FOUR_BYTE_CHILD (1 << 1) 186849a228SStephan Aßmus // Low power sleep mode 196849a228SStephan Aßmus #define SYN_SLEEP_MODE 0x0C 206849a228SStephan Aßmus // Synaptics Passthrough port 216849a228SStephan Aßmus #define SYN_CHANGE_MODE 0x14 226849a228SStephan Aßmus #define SYN_PASSTHROUGH_CMD 0x28 236849a228SStephan Aßmus 246849a228SStephan Aßmus 256849a228SStephan Aßmus // synaptics touchpad proportions 266849a228SStephan Aßmus #define SYN_EDGE_MOTION_WIDTH 50 276849a228SStephan Aßmus #define SYN_EDGE_MOTION_SPEED 5 286849a228SStephan Aßmus #define SYN_AREA_OFFSET 40 // increase the touchpad size a little bit 296849a228SStephan Aßmus #define SYN_AREA_START_X (1472 - SYN_AREA_OFFSET) 306849a228SStephan Aßmus #define SYN_AREA_END_X (5472 + SYN_AREA_OFFSET) 316849a228SStephan Aßmus #define SYN_AREA_WIDTH_X (SYN_AREA_END_X - SYN_AREA_START_X) 326849a228SStephan Aßmus #define SYN_AREA_START_Y (1408 - SYN_AREA_OFFSET) 336849a228SStephan Aßmus #define SYN_AREA_END_Y (4448 + SYN_AREA_OFFSET) 346849a228SStephan Aßmus #define SYN_AREA_WIDTH_Y (SYN_AREA_END_Y - SYN_AREA_START_Y) 356849a228SStephan Aßmus 366849a228SStephan Aßmus #define SYN_TAP_TIMEOUT 200000 376849a228SStephan Aßmus 386849a228SStephan Aßmus #define MIN_PRESSURE 30 396849a228SStephan Aßmus #define MAX_PRESSURE 200 406849a228SStephan Aßmus 41*802b6330SStephan Aßmus #define SYNAPTICS_HISTORY_SIZE 256 426849a228SStephan Aßmus 436849a228SStephan Aßmus // no touchpad / left / right button pressed 44*802b6330SStephan Aßmus #define IS_SYN_PT_PACKAGE(val) ((val[0] & 0xFC) == 0x84 \ 45*802b6330SStephan Aßmus && (val[3] & 0xCC) == 0xc4) 466849a228SStephan Aßmus 476849a228SStephan Aßmus 48*802b6330SStephan Aßmus typedef struct { 496849a228SStephan Aßmus uint8 majorVersion; 506849a228SStephan Aßmus uint8 minorVersion; 516849a228SStephan Aßmus 526849a228SStephan Aßmus bool capExtended; 536849a228SStephan Aßmus bool capSleep; 546849a228SStephan Aßmus bool capFourButtons; 556849a228SStephan Aßmus bool capMultiFinger; 566849a228SStephan Aßmus bool capPalmDetection; 576849a228SStephan Aßmus bool capPassThrough; 586849a228SStephan Aßmus 596849a228SStephan Aßmus } touchpad_info; 606849a228SStephan Aßmus 616849a228SStephan Aßmus 62*802b6330SStephan Aßmus typedef struct { 636849a228SStephan Aßmus uint8 buttons; 646849a228SStephan Aßmus uint32 xPosition; 656849a228SStephan Aßmus uint32 yPosition; 666849a228SStephan Aßmus uint8 zPressure; 676849a228SStephan Aßmus // absolut mode 686849a228SStephan Aßmus bool finger; 696849a228SStephan Aßmus bool gesture; 706849a228SStephan Aßmus // absolut w mode 716849a228SStephan Aßmus uint8 wValue; 726849a228SStephan Aßmus } touch_event; 736849a228SStephan Aßmus 746849a228SStephan Aßmus 756849a228SStephan Aßmus typedef struct 766849a228SStephan Aßmus { 776849a228SStephan Aßmus ps2_dev * dev; 786849a228SStephan Aßmus 796849a228SStephan Aßmus sem_id synaptics_sem; 806849a228SStephan Aßmus packet_buffer * synaptics_ring_buffer; 816849a228SStephan Aßmus size_t packet_index; 826849a228SStephan Aßmus uint8 packet_buffer[PS2_PACKET_SYNAPTICS]; 836849a228SStephan Aßmus uint8 mode; 846849a228SStephan Aßmus 856849a228SStephan Aßmus movement_maker movement_maker; 866849a228SStephan Aßmus bool movement_started; 876849a228SStephan Aßmus bool scrolling_started; 886849a228SStephan Aßmus bool tap_started; 896849a228SStephan Aßmus bigtime_t tap_time; 906849a228SStephan Aßmus int32 tap_delta_x; 916849a228SStephan Aßmus int32 tap_delta_y; 926849a228SStephan Aßmus int32 tap_clicks; 936849a228SStephan Aßmus bool tapdrag_started; 946849a228SStephan Aßmus bool valid_edge_motion; 956849a228SStephan Aßmus bool double_click; 966849a228SStephan Aßmus 976849a228SStephan Aßmus touchpad_settings settings; 986849a228SStephan Aßmus } synaptics_cookie; 996849a228SStephan Aßmus 1006849a228SStephan Aßmus 1016849a228SStephan Aßmus void default_settings(touchpad_settings *settings); 1026849a228SStephan Aßmus 1036849a228SStephan Aßmus status_t synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size); 1046849a228SStephan Aßmus status_t send_touchpad_arg(ps2_dev *dev, uint8 arg); 1056849a228SStephan Aßmus status_t send_touchpad_arg_timeout(ps2_dev *dev, uint8 arg, bigtime_t timeout); 1066849a228SStephan Aßmus status_t set_touchpad_mode(ps2_dev *dev, uint8 mode); 107*802b6330SStephan Aßmus status_t passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, 108*802b6330SStephan Aßmus int out_count, uint8 *in, int in_count, bigtime_t timeout); 1096849a228SStephan Aßmus 1106849a228SStephan Aßmus bool edge_motion(mouse_movement *movement, touch_event *event, bool validStart); 111*802b6330SStephan Aßmus status_t touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, 112*802b6330SStephan Aßmus mouse_movement *movement); 113*802b6330SStephan Aßmus status_t get_synaptics_movment(synaptics_cookie* cookie, 114*802b6330SStephan Aßmus mouse_movement *movement); 1156849a228SStephan Aßmus void query_capability(ps2_dev *dev); 1166849a228SStephan Aßmus status_t probe_synaptics(ps2_dev *dev); 1176849a228SStephan Aßmus 1186849a228SStephan Aßmus status_t synaptics_open(const char *name, uint32 flags, void **_cookie); 1196849a228SStephan Aßmus status_t synaptics_close(void *_cookie); 1206849a228SStephan Aßmus status_t synaptics_freecookie(void *_cookie); 1216849a228SStephan Aßmus status_t synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length); 1226849a228SStephan Aßmus 1236849a228SStephan Aßmus int32 synaptics_handle_int(ps2_dev *dev); 1246849a228SStephan Aßmus void synaptics_disconnect(ps2_dev *dev); 1256849a228SStephan Aßmus 1266849a228SStephan Aßmus device_hooks gSynapticsDeviceHooks; 1276849a228SStephan Aßmus 1286849a228SStephan Aßmus #endif 129