xref: /haiku/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.h (revision 6849a22864a9edc90482d16a5fd35f64f671b3b9)
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