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
89 struct 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
105 struct hidp_conndel_req {
106 bdaddr_t bdaddr;
107 __u32 flags;
108 };
109
110 struct 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
120 struct hidp_connlist_req {
121 __u32 cnum;
122 struct hidp_conninfo __user *ci;
123 };
124
125 int hidp_connection_add(const struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock);
126 int hidp_connection_del(struct hidp_conndel_req *req);
127 int hidp_get_connlist(struct hidp_connlist_req *req);
128 int hidp_get_conninfo(struct hidp_conninfo *ci);
129
130 enum hidp_session_state {
131 HIDP_SESSION_IDLING,
132 HIDP_SESSION_PREPARING,
133 HIDP_SESSION_RUNNING,
134 };
135
136
137 struct 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
189 int __init hidp_init_sockets(void);
190 void __exit hidp_cleanup_sockets(void);
191
192 #endif