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	bool capClickPad;
53
54	uint8 nExtendedButtons;
55	uint8 firstExtendedButton;
56	uint8 extendedButtonsState;
57} touchpad_info;
58
59
60typedef struct {
61	ps2_dev*			dev;
62
63	sem_id				synaptics_sem;
64struct packet_buffer*	synaptics_ring_buffer;
65	size_t				packet_index;
66	uint8				buffer[PS2_PACKET_SYNAPTICS];
67	uint8				mode;
68
69	TouchpadMovement	movementMaker;
70
71	touchpad_settings	settings;
72} synaptics_cookie;
73
74
75status_t synaptics_pass_through_set_packet_size(ps2_dev *dev, uint8 size);
76status_t passthrough_command(ps2_dev *dev, uint8 cmd, const uint8 *out,
77	int out_count, uint8 *in, int in_count, bigtime_t timeout);
78status_t probe_synaptics(ps2_dev *dev);
79
80status_t synaptics_open(const char *name, uint32 flags, void **_cookie);
81status_t synaptics_close(void *_cookie);
82status_t synaptics_freecookie(void *_cookie);
83status_t synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length);
84
85int32 synaptics_handle_int(ps2_dev *dev);
86void synaptics_disconnect(ps2_dev *dev);
87
88extern device_hooks gSynapticsDeviceHooks;
89
90#endif	// PS2_SYNAPTICS_H
91