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 */ 25struct 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 */ 45struct 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 */ 74struct 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 */ 109struct 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 118struct oz_elt_farewell { 119 u8 ep_num; 120 u8 index; 121 u8 report[1]; 122} PACKED; 123 124struct 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 */ 134struct 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 */ 152struct 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 186struct 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 217struct 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 228struct 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 238struct 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 246struct 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 254struct 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 262struct 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 271struct 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 279struct 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 287struct 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 296struct 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 308struct 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 317struct oz_data { 318 u8 app_id; 319 u8 elt_seq_num; 320 u8 type; 321 u8 endpoint; 322 u8 format; 323} PACKED; 324 325struct 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 336struct 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 346struct 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 */ 362struct 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