1/*
2 * Copyright 2005-2014 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors (in chronological order):
6 *		Marcus Overhagen (marcus@overhagen.de)
7 *		Clemens Zeidler (haiku@clemens-zeidler.de)
8 */
9#ifndef __PS2_DEV_H
10#define __PS2_DEV_H
11
12
13struct ps2_dev;
14typedef struct ps2_dev ps2_dev;
15
16#include "ps2_common.h"
17
18
19typedef struct {
20	bigtime_t		time;
21	uint8			data;
22	bool			error;
23} data_history;
24
25struct ps2_dev {
26	const char*		name;
27	bool			active;
28	uint8           idx;
29	sem_id			result_sem;
30	int32			flags;
31	uint8*			result_buf;
32	int				result_buf_idx;
33	int				result_buf_cnt;
34	void*			cookie;
35	data_history	history[2];
36	ps2_dev*		parent_dev;
37	size_t			packet_size;
38
39// functions
40	void			(*disconnect)(ps2_dev *);
41	int32			(*handle_int)(ps2_dev *);
42	status_t		(*command)(ps2_dev *dev, uint8 cmd, const uint8 *out,
43						int out_count, uint8 *in, int in_count, bigtime_t timeout);
44};
45
46#define PS2_DEVICE_COUNT 6
47
48extern ps2_dev ps2_device[PS2_DEVICE_COUNT];
49
50#define PS2_DEVICE_MOUSE 0
51#define PS2_DEVICE_SYN_PASSTHROUGH 4
52#define PS2_DEVICE_KEYB  5
53
54#define PS2_FLAG_KEYB		(1 << 0)
55#define PS2_FLAG_OPEN		(1 << 1)
56#define PS2_FLAG_ENABLED	(1 << 2)
57#define PS2_FLAG_CMD		(1 << 3)
58#define PS2_FLAG_ACK		(1 << 4)
59#define PS2_FLAG_NACK		(1 << 5)
60#define PS2_FLAG_GETID		(1 << 6)
61#define PS2_FLAG_RESEND		(1 << 7)
62
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
68void 		ps2_dev_send(ps2_dev *dev, uint8 data);
69
70status_t	ps2_dev_detect_pointing(ps2_dev *dev, device_hooks **hooks);
71
72status_t	ps2_dev_init(void);
73void		ps2_dev_exit(void);
74
75status_t	standard_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
76				int out_count, uint8 *in, int in_count, bigtime_t timeout);
77
78status_t	ps2_dev_command(ps2_dev *dev, uint8 cmd, const uint8 *out = NULL,
79				int out_count = 0, uint8 *in = NULL, int in_count = 0);
80status_t	ps2_dev_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
81				int out_count, uint8 *in, int in_count, bigtime_t timeout);
82status_t	ps2_dev_sliced_command(ps2_dev *dev, uint8 cmd);
83
84status_t	ps2_reset_mouse(ps2_dev *dev);
85
86void		ps2_dev_publish(ps2_dev *dev);
87void		ps2_dev_unpublish(ps2_dev *dev);
88
89int32		ps2_dev_handle_int(ps2_dev *dev);
90
91#ifdef __cplusplus
92}
93#endif
94
95
96#endif	/* __PS2_DEV_H */
97