1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef __HIDP_H
24#define __HIDP_H
25
26#include <linux/types.h>
27#include <linux/hid.h>
28#include <linux/kref.h>
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/l2cap.h>
31
32
33#define HIDP_HEADER_TRANS_MASK 0xf0
34#define HIDP_HEADER_PARAM_MASK 0x0f
35
36
37#define HIDP_TRANS_HANDSHAKE 0x00
38#define HIDP_TRANS_HID_CONTROL 0x10
39#define HIDP_TRANS_GET_REPORT 0x40
40#define HIDP_TRANS_SET_REPORT 0x50
41#define HIDP_TRANS_GET_PROTOCOL 0x60
42#define HIDP_TRANS_SET_PROTOCOL 0x70
43#define HIDP_TRANS_GET_IDLE 0x80
44#define HIDP_TRANS_SET_IDLE 0x90
45#define HIDP_TRANS_DATA 0xa0
46#define HIDP_TRANS_DATC 0xb0
47
48
49#define HIDP_HSHK_SUCCESSFUL 0x00
50#define HIDP_HSHK_NOT_READY 0x01
51#define HIDP_HSHK_ERR_INVALID_REPORT_ID 0x02
52#define HIDP_HSHK_ERR_UNSUPPORTED_REQUEST 0x03
53#define HIDP_HSHK_ERR_INVALID_PARAMETER 0x04
54#define HIDP_HSHK_ERR_UNKNOWN 0x0e
55#define HIDP_HSHK_ERR_FATAL 0x0f
56
57
58#define HIDP_CTRL_NOP 0x00
59#define HIDP_CTRL_HARD_RESET 0x01
60#define HIDP_CTRL_SOFT_RESET 0x02
61#define HIDP_CTRL_SUSPEND 0x03
62#define HIDP_CTRL_EXIT_SUSPEND 0x04
63#define HIDP_CTRL_VIRTUAL_CABLE_UNPLUG 0x05
64
65
66#define HIDP_DATA_RTYPE_MASK 0x03
67#define HIDP_DATA_RSRVD_MASK 0x0c
68#define HIDP_DATA_RTYPE_OTHER 0x00
69#define HIDP_DATA_RTYPE_INPUT 0x01
70#define HIDP_DATA_RTYPE_OUPUT 0x02
71#define HIDP_DATA_RTYPE_FEATURE 0x03
72
73
74#define HIDP_PROTO_BOOT 0x00
75#define HIDP_PROTO_REPORT 0x01
76
77
78#define HIDPCONNADD _IOW('H', 200, int)
79#define HIDPCONNDEL _IOW('H', 201, int)
80#define HIDPGETCONNLIST _IOR('H', 210, int)
81#define HIDPGETCONNINFO _IOR('H', 211, int)
82
83#define HIDP_VIRTUAL_CABLE_UNPLUG 0
84#define HIDP_BOOT_PROTOCOL_MODE 1
85#define HIDP_BLUETOOTH_VENDOR_ID 9
86#define HIDP_WAITING_FOR_RETURN 10
87#define HIDP_WAITING_FOR_SEND_ACK 11
88
89struct hidp_connadd_req {
90 int ctrl_sock;
91 int intr_sock;
92 __u16 parser;
93 __u16 rd_size;
94 __u8 __user *rd_data;
95 __u8 country;
96 __u8 subclass;
97 __u16 vendor;
98 __u16 product;
99 __u16 version;
100 __u32 flags;
101 __u32 idle_to;
102 char name[128];
103};
104
105struct hidp_conndel_req {
106 bdaddr_t bdaddr;
107 __u32 flags;
108};
109
110struct hidp_conninfo {
111 bdaddr_t bdaddr;
112 __u32 flags;
113 __u16 state;
114 __u16 vendor;
115 __u16 product;
116 __u16 version;
117 char name[128];
118};
119
120struct hidp_connlist_req {
121 __u32 cnum;
122 struct hidp_conninfo __user *ci;
123};
124
125int hidp_connection_add(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock);
126int hidp_connection_del(struct hidp_conndel_req *req);
127int hidp_get_connlist(struct hidp_connlist_req *req);
128int hidp_get_conninfo(struct hidp_conninfo *ci);
129
130enum hidp_session_state {
131 HIDP_SESSION_IDLING,
132 HIDP_SESSION_PREPARING,
133 HIDP_SESSION_RUNNING,
134};
135
136
137struct hidp_session {
138 struct list_head list;
139 struct kref ref;
140
141
142 atomic_t state;
143 wait_queue_head_t state_queue;
144 atomic_t terminate;
145 struct task_struct *task;
146 unsigned long flags;
147
148
149 bdaddr_t bdaddr;
150 struct l2cap_conn *conn;
151 struct l2cap_user user;
152 struct socket *ctrl_sock;
153 struct socket *intr_sock;
154 struct sk_buff_head ctrl_transmit;
155 struct sk_buff_head intr_transmit;
156 uint ctrl_mtu;
157 uint intr_mtu;
158 unsigned long idle_to;
159
160
161 struct work_struct dev_init;
162 struct input_dev *input;
163 struct hid_device *hid;
164 struct timer_list timer;
165
166
167 __u8 *rd_data;
168 uint rd_size;
169
170
171 unsigned char keys[8];
172 unsigned char leds;
173
174
175 int waiting_report_type;
176 int waiting_report_number;
177 struct mutex report_mutex;
178 struct sk_buff *report_return;
179 wait_queue_head_t report_queue;
180
181
182 int output_report_success;
183
184
185 u8 input_buf[HID_MAX_BUFFER_SIZE];
186};
187
188
189int __init hidp_init_sockets(void);
190void __exit hidp_cleanup_sockets(void);
191
192#endif
193