1/*
2 * Copyright 2008-2010, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Clemens Zeidler (haiku@Clemens-Zeidler.de)
7 */
8#ifndef PS2_SYNAPTICS_H
9#define PS2_SYNAPTICS_H
10
11
12#include <KernelExport.h>
13
14#include <touchpad_settings.h>
15
16#include "movement_maker.h"
17#include "packet_buffer.h"
18#include "ps2_service.h"
19
20
21#define SYN_TOUCHPAD			0x47
22// Synaptics modes
23#define SYN_ABSOLUTE_MODE		0x80
24// Absolute plus w mode
25#define SYN_ABSOLUTE_W_MODE		0x81
26#define SYN_FOUR_BYTE_CHILD		(1 << 1)
27// Low power sleep mode
28#define SYN_SLEEP_MODE			0x0C
29// Synaptics Passthrough port
30#define SYN_CHANGE_MODE			0x14
31#define SYN_PASSTHROUGH_CMD		0x28
32
33
34#define SYNAPTICS_HISTORY_SIZE	256
35
36// no touchpad / left / right button pressed
37#define IS_SYN_PT_PACKAGE(val) ((val[0] & 0xFC) == 0x84 \
38	&& (val[3] & 0xCC) == 0xc4)
39
40
41typedef struct {
42	uint8 majorVersion;
43	uint8 minorVersion;
44
45	bool capExtended;
46	bool capMiddleButton;
47	bool capSleep;
48	bool capFourButtons;
49	bool capMultiFinger;
50	bool capPalmDetection;
51	bool capPassThrough;
52} touchpad_info;
53
54
55typedef struct {
56	ps2_dev*			dev;
57
58	sem_id				synaptics_sem;
59struct packet_buffer*	synaptics_ring_buffer;
60	size_t				packet_index;
61	uint8				buffer[PS2_PACKET_SYNAPTICS];
62	uint8				mode;
63
64	TouchpadMovement	movementMaker;
65
66	touchpad_settings	settings;
67} synaptics_cookie;
68
69
70status_t synaptics_pass_through_set_packet_size(ps2_dev *dev, uint8 size);
71status_t passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out,
72	int out_count, uint8 *in, int in_count, bigtime_t timeout);
73status_t probe_synaptics(ps2_dev *dev);
74
75status_t synaptics_open(const char *name, uint32 flags, void **_cookie);
76status_t synaptics_close(void *_cookie);
77status_t synaptics_freecookie(void *_cookie);
78status_t synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length);
79
80int32 synaptics_handle_int(ps2_dev *dev);
81void synaptics_disconnect(ps2_dev *dev);
82
83extern device_hooks gSynapticsDeviceHooks;
84
85#endif	// PS2_SYNAPTICS_H
86