1*6849a228SStephan Aßmus #ifndef SYNAPTICS_H 2*6849a228SStephan Aßmus #define SYNAPTICS_H 3*6849a228SStephan Aßmus 4*6849a228SStephan Aßmus #include <KernelExport.h> 5*6849a228SStephan Aßmus 6*6849a228SStephan Aßmus #include "kb_mouse_driver.h" 7*6849a228SStephan Aßmus #include "movement_maker.h" 8*6849a228SStephan Aßmus #include "packet_buffer.h" 9*6849a228SStephan Aßmus #include "touchpad_settings.h" 10*6849a228SStephan Aßmus 11*6849a228SStephan Aßmus 12*6849a228SStephan Aßmus #define SYN_TOUCHPAD 0x47 13*6849a228SStephan Aßmus // Synaptics modes 14*6849a228SStephan Aßmus #define SYN_ABSOLUTE_MODE 0x80 15*6849a228SStephan Aßmus // Absolute plus w mode 16*6849a228SStephan Aßmus #define SYN_ABSOLUTE_W_MODE 0x81 17*6849a228SStephan Aßmus #define SYN_FOUR_BYTE_CHILD (1 << 1) 18*6849a228SStephan Aßmus // Low power sleep mode 19*6849a228SStephan Aßmus #define SYN_SLEEP_MODE 0x0C 20*6849a228SStephan Aßmus // Synaptics Passthrough port 21*6849a228SStephan Aßmus #define SYN_CHANGE_MODE 0x14 22*6849a228SStephan Aßmus #define SYN_PASSTHROUGH_CMD 0x28 23*6849a228SStephan Aßmus 24*6849a228SStephan Aßmus 25*6849a228SStephan Aßmus // synaptics touchpad proportions 26*6849a228SStephan Aßmus #define SYN_EDGE_MOTION_WIDTH 50 27*6849a228SStephan Aßmus #define SYN_EDGE_MOTION_SPEED 5 28*6849a228SStephan Aßmus #define SYN_AREA_OFFSET 40 // increase the touchpad size a little bit 29*6849a228SStephan Aßmus #define SYN_AREA_START_X (1472 - SYN_AREA_OFFSET) 30*6849a228SStephan Aßmus #define SYN_AREA_END_X (5472 + SYN_AREA_OFFSET) 31*6849a228SStephan Aßmus #define SYN_AREA_WIDTH_X (SYN_AREA_END_X - SYN_AREA_START_X) 32*6849a228SStephan Aßmus #define SYN_AREA_START_Y (1408 - SYN_AREA_OFFSET) 33*6849a228SStephan Aßmus #define SYN_AREA_END_Y (4448 + SYN_AREA_OFFSET) 34*6849a228SStephan Aßmus #define SYN_AREA_WIDTH_Y (SYN_AREA_END_Y - SYN_AREA_START_Y) 35*6849a228SStephan Aßmus 36*6849a228SStephan Aßmus #define SYN_TAP_TIMEOUT 200000 37*6849a228SStephan Aßmus 38*6849a228SStephan Aßmus #define MIN_PRESSURE 30 39*6849a228SStephan Aßmus #define MAX_PRESSURE 200 40*6849a228SStephan Aßmus 41*6849a228SStephan Aßmus #define synaptics_HISTORY_SIZE 256 42*6849a228SStephan Aßmus 43*6849a228SStephan Aßmus // no touchpad / left / right button pressed 44*6849a228SStephan Aßmus #define IS_SYN_PT_PACKAGE(val) ((val[0] & 0xFC) == 0x84 && (val[3] & 0xCC) == 0xc4) 45*6849a228SStephan Aßmus 46*6849a228SStephan Aßmus 47*6849a228SStephan Aßmus typedef struct 48*6849a228SStephan Aßmus { 49*6849a228SStephan Aßmus uint8 majorVersion; 50*6849a228SStephan Aßmus uint8 minorVersion; 51*6849a228SStephan Aßmus 52*6849a228SStephan Aßmus bool capExtended; 53*6849a228SStephan Aßmus bool capSleep; 54*6849a228SStephan Aßmus bool capFourButtons; 55*6849a228SStephan Aßmus bool capMultiFinger; 56*6849a228SStephan Aßmus bool capPalmDetection; 57*6849a228SStephan Aßmus bool capPassThrough; 58*6849a228SStephan Aßmus 59*6849a228SStephan Aßmus } touchpad_info; 60*6849a228SStephan Aßmus 61*6849a228SStephan Aßmus 62*6849a228SStephan Aßmus typedef struct 63*6849a228SStephan Aßmus { 64*6849a228SStephan Aßmus uint8 buttons; 65*6849a228SStephan Aßmus uint32 xPosition; 66*6849a228SStephan Aßmus uint32 yPosition; 67*6849a228SStephan Aßmus uint8 zPressure; 68*6849a228SStephan Aßmus // absolut mode 69*6849a228SStephan Aßmus bool finger; 70*6849a228SStephan Aßmus bool gesture; 71*6849a228SStephan Aßmus // absolut w mode 72*6849a228SStephan Aßmus uint8 wValue; 73*6849a228SStephan Aßmus } touch_event; 74*6849a228SStephan Aßmus 75*6849a228SStephan Aßmus 76*6849a228SStephan Aßmus typedef struct 77*6849a228SStephan Aßmus { 78*6849a228SStephan Aßmus ps2_dev * dev; 79*6849a228SStephan Aßmus 80*6849a228SStephan Aßmus sem_id synaptics_sem; 81*6849a228SStephan Aßmus packet_buffer * synaptics_ring_buffer; 82*6849a228SStephan Aßmus size_t packet_index; 83*6849a228SStephan Aßmus uint8 packet_buffer[PS2_PACKET_SYNAPTICS]; 84*6849a228SStephan Aßmus uint8 mode; 85*6849a228SStephan Aßmus 86*6849a228SStephan Aßmus movement_maker movement_maker; 87*6849a228SStephan Aßmus bool movement_started; 88*6849a228SStephan Aßmus bool scrolling_started; 89*6849a228SStephan Aßmus bool tap_started; 90*6849a228SStephan Aßmus bigtime_t tap_time; 91*6849a228SStephan Aßmus int32 tap_delta_x; 92*6849a228SStephan Aßmus int32 tap_delta_y; 93*6849a228SStephan Aßmus int32 tap_clicks; 94*6849a228SStephan Aßmus bool tapdrag_started; 95*6849a228SStephan Aßmus bool valid_edge_motion; 96*6849a228SStephan Aßmus bool double_click; 97*6849a228SStephan Aßmus 98*6849a228SStephan Aßmus touchpad_settings settings; 99*6849a228SStephan Aßmus } synaptics_cookie; 100*6849a228SStephan Aßmus 101*6849a228SStephan Aßmus 102*6849a228SStephan Aßmus void default_settings(touchpad_settings *settings); 103*6849a228SStephan Aßmus 104*6849a228SStephan Aßmus status_t synaptics_pt_set_packagesize(ps2_dev *dev, uint8 size); 105*6849a228SStephan Aßmus status_t send_touchpad_arg(ps2_dev *dev, uint8 arg); 106*6849a228SStephan Aßmus status_t send_touchpad_arg_timeout(ps2_dev *dev, uint8 arg, bigtime_t timeout); 107*6849a228SStephan Aßmus status_t set_touchpad_mode(ps2_dev *dev, uint8 mode); 108*6849a228SStephan Aßmus status_t passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout); 109*6849a228SStephan Aßmus 110*6849a228SStephan Aßmus bool edge_motion(mouse_movement *movement, touch_event *event, bool validStart); 111*6849a228SStephan Aßmus status_t touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, mouse_movement *movement); 112*6849a228SStephan Aßmus status_t get_synaptics_movment(synaptics_cookie* cookie, mouse_movement *movement); 113*6849a228SStephan Aßmus void query_capability(ps2_dev *dev); 114*6849a228SStephan Aßmus status_t probe_synaptics(ps2_dev *dev); 115*6849a228SStephan Aßmus 116*6849a228SStephan Aßmus status_t synaptics_open(const char *name, uint32 flags, void **_cookie); 117*6849a228SStephan Aßmus status_t synaptics_close(void *_cookie); 118*6849a228SStephan Aßmus status_t synaptics_freecookie(void *_cookie); 119*6849a228SStephan Aßmus status_t synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length); 120*6849a228SStephan Aßmus 121*6849a228SStephan Aßmus int32 synaptics_handle_int(ps2_dev *dev); 122*6849a228SStephan Aßmus void synaptics_disconnect(ps2_dev *dev); 123*6849a228SStephan Aßmus 124*6849a228SStephan Aßmus device_hooks gSynapticsDeviceHooks; 125*6849a228SStephan Aßmus 126*6849a228SStephan Aßmus #endif 127