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