• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -----------------------------------------------------------------------------
2  * Copyright (c) 2011 Ozmo Inc
3  * Released under the GNU General Public License Version 2 (GPLv2).
4  * -----------------------------------------------------------------------------
5  */
6 #ifndef _OZPROTOCOL_H
7 #define _OZPROTOCOL_H
8 
9 #define PACKED __packed
10 
11 #define OZ_ETHERTYPE 0x892e
12 
13 /* Status codes
14  */
15 #define OZ_STATUS_SUCCESS		0
16 #define OZ_STATUS_INVALID_PARAM		1
17 #define OZ_STATUS_TOO_MANY_PDS		2
18 #define OZ_STATUS_NOT_ALLOWED		4
19 #define OZ_STATUS_SESSION_MISMATCH	5
20 #define OZ_STATUS_SESSION_TEARDOWN	6
21 
22 /* This is the generic element header.
23    Every element starts with this.
24  */
25 struct oz_elt {
26 	u8 type;
27 	u8 length;
28 } PACKED;
29 
30 #define oz_next_elt(__elt)	\
31 	(struct oz_elt *)((u8 *)((__elt) + 1) + (__elt)->length)
32 
33 /* Protocol element IDs.
34  */
35 #define OZ_ELT_CONNECT_REQ	0x06
36 #define OZ_ELT_CONNECT_RSP	0x07
37 #define OZ_ELT_DISCONNECT	0x08
38 #define OZ_ELT_UPDATE_PARAM_REQ	0x11
39 #define OZ_ELT_FAREWELL_REQ	0x12
40 #define OZ_ELT_APP_DATA		0x31
41 
42 /* This is the Ozmo header which is the first Ozmo specific part
43  * of a frame and comes after the MAC header.
44  */
45 struct oz_hdr {
46 	u8	control;
47 	u8	last_pkt_num;
48 	u32	pkt_num;
49 } PACKED;
50 
51 #define OZ_PROTOCOL_VERSION	0x1
52 /* Bits in the control field. */
53 #define OZ_VERSION_MASK		0xc
54 #define OZ_VERSION_SHIFT	2
55 #define OZ_F_ACK		0x10
56 #define OZ_F_ISOC		0x20
57 #define OZ_F_MORE_DATA		0x40
58 #define OZ_F_ACK_REQUESTED	0x80
59 
60 #define oz_get_prot_ver(__x)	(((__x) & OZ_VERSION_MASK) >> OZ_VERSION_SHIFT)
61 
62 /* Used to select the bits of packet number to put in the last_pkt_num.
63  */
64 #define OZ_LAST_PN_MASK		0x00ff
65 
66 #define OZ_LAST_PN_HALF_CYCLE	127
67 
68 #define OZ_LATENCY_MASK		0xc0
69 #define OZ_ONE_MS_LATENCY	0x40
70 #define OZ_TEN_MS_LATENCY	0x80
71 
72 /* Connect request data structure.
73  */
74 struct oz_elt_connect_req {
75 	u8	mode;
76 	u8	resv1[16];
77 	u8	pd_info;
78 	u8	session_id;
79 	u8	presleep;
80 	u8	ms_isoc_latency;
81 	u8	host_vendor;
82 	u8	keep_alive;
83 	u16	apps;
84 	u8	max_len_div16;
85 	u8	ms_per_isoc;
86 	u8	resv3[2];
87 } PACKED;
88 
89 /* mode field bits.
90  */
91 #define OZ_MODE_POLLED		0x0
92 #define OZ_MODE_TRIGGERED	0x1
93 #define OZ_MODE_MASK		0xf
94 #define OZ_F_ISOC_NO_ELTS	0x40
95 #define OZ_F_ISOC_ANYTIME	0x80
96 #define OZ_NO_ELTS_ANYTIME	0xc0
97 
98 /* Keep alive field.
99  */
100 #define OZ_KALIVE_TYPE_MASK	0xc0
101 #define OZ_KALIVE_VALUE_MASK	0x3f
102 #define OZ_KALIVE_SPECIAL	0x00
103 #define OZ_KALIVE_SECS		0x40
104 #define OZ_KALIVE_MINS		0x80
105 #define OZ_KALIVE_HOURS		0xc0
106 
107 /* Connect response data structure.
108  */
109 struct oz_elt_connect_rsp {
110 	u8	mode;
111 	u8	status;
112 	u8	resv1[3];
113 	u8	session_id;
114 	u16	apps;
115 	u32	resv2;
116 } PACKED;
117 
118 struct oz_elt_farewell {
119 	u8	ep_num;
120 	u8	index;
121 	u8	report[1];
122 } PACKED;
123 
124 struct oz_elt_update_param {
125 	u8	resv1[16];
126 	u8	presleep;
127 	u8	resv2;
128 	u8	host_vendor;
129 	u8	keepalive;
130 } PACKED;
131 
132 /* Header common to all application elements.
133  */
134 struct oz_app_hdr {
135 	u8	app_id;
136 	u8	elt_seq_num;
137 } PACKED;
138 
139 /* Values for app_id.
140  */
141 #define OZ_APPID_USB				0x1
142 #define OZ_APPID_UNUSED1			0x2
143 #define OZ_APPID_UNUSED2			0x3
144 #define OZ_APPID_SERIAL				0x4
145 #define OZ_APPID_MAX				OZ_APPID_SERIAL
146 #define OZ_NB_APPS				(OZ_APPID_MAX+1)
147 
148 /* USB header common to all elements for the  USB application.
149  * This header extends the oz_app_hdr and comes directly after
150  * the element header in a USB application.
151  */
152 struct oz_usb_hdr {
153 	u8	app_id;
154 	u8	elt_seq_num;
155 	u8	type;
156 } PACKED;
157 
158 
159 
160 /* USB requests element subtypes (type field of hs_usb_hdr).
161  */
162 #define OZ_GET_DESC_REQ			1
163 #define OZ_GET_DESC_RSP			2
164 #define OZ_SET_CONFIG_REQ		3
165 #define OZ_SET_CONFIG_RSP		4
166 #define OZ_SET_INTERFACE_REQ		5
167 #define OZ_SET_INTERFACE_RSP		6
168 #define OZ_VENDOR_CLASS_REQ		7
169 #define OZ_VENDOR_CLASS_RSP		8
170 #define OZ_GET_STATUS_REQ		9
171 #define OZ_GET_STATUS_RSP		10
172 #define OZ_CLEAR_FEATURE_REQ		11
173 #define OZ_CLEAR_FEATURE_RSP		12
174 #define OZ_SET_FEATURE_REQ		13
175 #define OZ_SET_FEATURE_RSP		14
176 #define OZ_GET_CONFIGURATION_REQ	15
177 #define OZ_GET_CONFIGURATION_RSP	16
178 #define OZ_GET_INTERFACE_REQ		17
179 #define OZ_GET_INTERFACE_RSP		18
180 #define OZ_SYNCH_FRAME_REQ		19
181 #define OZ_SYNCH_FRAME_RSP		20
182 #define OZ_USB_ENDPOINT_DATA		23
183 
184 #define OZ_REQD_D2H			0x80
185 
186 struct oz_get_desc_req {
187 	u8	app_id;
188 	u8	elt_seq_num;
189 	u8	type;
190 	u8	req_id;
191 	u16	offset;
192 	u16	size;
193 	u8	req_type;
194 	u8	desc_type;
195 	u16	w_index;
196 	u8	index;
197 } PACKED;
198 
199 /* Values for desc_type field.
200 */
201 #define OZ_DESC_DEVICE			0x01
202 #define OZ_DESC_CONFIG			0x02
203 #define OZ_DESC_STRING			0x03
204 
205 /* Values for req_type field.
206  */
207 #define OZ_RECP_MASK			0x1F
208 #define OZ_RECP_DEVICE			0x00
209 #define OZ_RECP_INTERFACE		0x01
210 #define OZ_RECP_ENDPOINT		0x02
211 
212 #define OZ_REQT_MASK			0x60
213 #define OZ_REQT_STD			0x00
214 #define OZ_REQT_CLASS			0x20
215 #define OZ_REQT_VENDOR			0x40
216 
217 struct oz_get_desc_rsp {
218 	u8	app_id;
219 	u8	elt_seq_num;
220 	u8	type;
221 	u8	req_id;
222 	u16	offset;
223 	u16	total_size;
224 	u8	rcode;
225 	u8	data[1];
226 } PACKED;
227 
228 struct oz_feature_req {
229 	u8	app_id;
230 	u8	elt_seq_num;
231 	u8	type;
232 	u8	req_id;
233 	u8	recipient;
234 	u8	index;
235 	u16	feature;
236 } PACKED;
237 
238 struct oz_feature_rsp {
239 	u8	app_id;
240 	u8	elt_seq_num;
241 	u8	type;
242 	u8	req_id;
243 	u8	rcode;
244 } PACKED;
245 
246 struct oz_set_config_req {
247 	u8	app_id;
248 	u8	elt_seq_num;
249 	u8	type;
250 	u8	req_id;
251 	u8	index;
252 } PACKED;
253 
254 struct oz_set_config_rsp {
255 	u8	app_id;
256 	u8	elt_seq_num;
257 	u8	type;
258 	u8	req_id;
259 	u8	rcode;
260 } PACKED;
261 
262 struct oz_set_interface_req {
263 	u8	app_id;
264 	u8	elt_seq_num;
265 	u8	type;
266 	u8	req_id;
267 	u8	index;
268 	u8	alternative;
269 } PACKED;
270 
271 struct oz_set_interface_rsp {
272 	u8	app_id;
273 	u8	elt_seq_num;
274 	u8	type;
275 	u8	req_id;
276 	u8	rcode;
277 } PACKED;
278 
279 struct oz_get_interface_req {
280 	u8	app_id;
281 	u8	elt_seq_num;
282 	u8	type;
283 	u8	req_id;
284 	u8	index;
285 } PACKED;
286 
287 struct oz_get_interface_rsp {
288 	u8	app_id;
289 	u8	elt_seq_num;
290 	u8	type;
291 	u8	req_id;
292 	u8	rcode;
293 	u8	alternative;
294 } PACKED;
295 
296 struct oz_vendor_class_req {
297 	u8	app_id;
298 	u8	elt_seq_num;
299 	u8	type;
300 	u8	req_id;
301 	u8	req_type;
302 	u8	request;
303 	u16	value;
304 	u16	index;
305 	u8	data[1];
306 } PACKED;
307 
308 struct oz_vendor_class_rsp {
309 	u8	app_id;
310 	u8	elt_seq_num;
311 	u8	type;
312 	u8	req_id;
313 	u8	rcode;
314 	u8	data[1];
315 } PACKED;
316 
317 struct oz_data {
318 	u8	app_id;
319 	u8	elt_seq_num;
320 	u8	type;
321 	u8	endpoint;
322 	u8	format;
323 } PACKED;
324 
325 struct oz_isoc_fixed {
326 	u8	app_id;
327 	u8	elt_seq_num;
328 	u8	type;
329 	u8	endpoint;
330 	u8	format;
331 	u8	unit_size;
332 	u8	frame_number;
333 	u8	data[1];
334 } PACKED;
335 
336 struct oz_multiple_fixed {
337 	u8	app_id;
338 	u8	elt_seq_num;
339 	u8	type;
340 	u8	endpoint;
341 	u8	format;
342 	u8	unit_size;
343 	u8	data[1];
344 } PACKED;
345 
346 struct oz_fragmented {
347 	u8	app_id;
348 	u8	elt_seq_num;
349 	u8	type;
350 	u8	endpoint;
351 	u8	format;
352 	u16	total_size;
353 	u16	offset;
354 	u8	data[1];
355 } PACKED;
356 
357 /* Note: the following does not get packaged in an element in the same way
358  * that other data formats are packaged. Instead the data is put in a frame
359  * directly after the oz_header and is the only permitted data in such a
360  * frame. The length of the data is directly determined from the frame size.
361  */
362 struct oz_isoc_large {
363 	u8	endpoint;
364 	u8	format;
365 	u8	ms_data;
366 	u8	frame_number;
367 } PACKED;
368 
369 #define OZ_DATA_F_TYPE_MASK		0xF
370 #define OZ_DATA_F_MULTIPLE_FIXED	0x1
371 #define OZ_DATA_F_MULTIPLE_VAR		0x2
372 #define OZ_DATA_F_ISOC_FIXED		0x3
373 #define OZ_DATA_F_ISOC_VAR		0x4
374 #define OZ_DATA_F_FRAGMENTED		0x5
375 #define OZ_DATA_F_ISOC_LARGE		0x7
376 
377 #endif /* _OZPROTOCOL_H */
378