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