Commit | Line | Data |
---|---|---|
1619cb6f CK |
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 | ||
86d03a0f RG |
68 | #define OZ_LATENCY_MASK 0xc0 |
69 | #define OZ_ONE_MS_LATENCY 0x40 | |
70 | #define OZ_TEN_MS_LATENCY 0x80 | |
71 | ||
1619cb6f CK |
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; | |
86d03a0f | 80 | u8 ms_isoc_latency; |
1619cb6f CK |
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 | |
33e6ada1 | 96 | #define OZ_NO_ELTS_ANYTIME 0xc0 |
1619cb6f CK |
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 */ |