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_SERIAL 0x4 143#define OZ_APPID_MAX OZ_APPID_SERIAL 144#define OZ_NB_APPS (OZ_APPID_MAX+1) 145 146/* USB header common to all elements for the USB application. 147 * This header extends the oz_app_hdr and comes directly after 148 * the element header in a USB application. 149 */ 150struct oz_usb_hdr { 151 u8 app_id; 152 u8 elt_seq_num; 153 u8 type; 154} PACKED; 155 156 157 158/* USB requests element subtypes (type field of hs_usb_hdr). 159 */ 160#define OZ_GET_DESC_REQ 1 161#define OZ_GET_DESC_RSP 2 162#define OZ_SET_CONFIG_REQ 3 163#define OZ_SET_CONFIG_RSP 4 164#define OZ_SET_INTERFACE_REQ 5 165#define OZ_SET_INTERFACE_RSP 6 166#define OZ_VENDOR_CLASS_REQ 7 167#define OZ_VENDOR_CLASS_RSP 8 168#define OZ_GET_STATUS_REQ 9 169#define OZ_GET_STATUS_RSP 10 170#define OZ_CLEAR_FEATURE_REQ 11 171#define OZ_CLEAR_FEATURE_RSP 12 172#define OZ_SET_FEATURE_REQ 13 173#define OZ_SET_FEATURE_RSP 14 174#define OZ_GET_CONFIGURATION_REQ 15 175#define OZ_GET_CONFIGURATION_RSP 16 176#define OZ_GET_INTERFACE_REQ 17 177#define OZ_GET_INTERFACE_RSP 18 178#define OZ_SYNCH_FRAME_REQ 19 179#define OZ_SYNCH_FRAME_RSP 20 180#define OZ_USB_ENDPOINT_DATA 23 181 182#define OZ_REQD_D2H 0x80 183 184struct oz_get_desc_req { 185 u8 app_id; 186 u8 elt_seq_num; 187 u8 type; 188 u8 req_id; 189 u16 offset; 190 u16 size; 191 u8 req_type; 192 u8 desc_type; 193 __le16 w_index; 194 u8 index; 195} PACKED; 196 197/* Values for desc_type field. 198*/ 199#define OZ_DESC_DEVICE 0x01 200#define OZ_DESC_CONFIG 0x02 201#define OZ_DESC_STRING 0x03 202 203/* Values for req_type field. 204 */ 205#define OZ_RECP_MASK 0x1F 206#define OZ_RECP_DEVICE 0x00 207#define OZ_RECP_INTERFACE 0x01 208#define OZ_RECP_ENDPOINT 0x02 209 210#define OZ_REQT_MASK 0x60 211#define OZ_REQT_STD 0x00 212#define OZ_REQT_CLASS 0x20 213#define OZ_REQT_VENDOR 0x40 214 215struct oz_get_desc_rsp { 216 u8 app_id; 217 u8 elt_seq_num; 218 u8 type; 219 u8 req_id; 220 __le16 offset; 221 __le16 total_size; 222 u8 rcode; 223 u8 data[1]; 224} PACKED; 225 226struct oz_feature_req { 227 u8 app_id; 228 u8 elt_seq_num; 229 u8 type; 230 u8 req_id; 231 u8 recipient; 232 u8 index; 233 u16 feature; 234} PACKED; 235 236struct oz_feature_rsp { 237 u8 app_id; 238 u8 elt_seq_num; 239 u8 type; 240 u8 req_id; 241 u8 rcode; 242} PACKED; 243 244struct oz_set_config_req { 245 u8 app_id; 246 u8 elt_seq_num; 247 u8 type; 248 u8 req_id; 249 u8 index; 250} PACKED; 251 252struct oz_set_config_rsp { 253 u8 app_id; 254 u8 elt_seq_num; 255 u8 type; 256 u8 req_id; 257 u8 rcode; 258} PACKED; 259 260struct oz_set_interface_req { 261 u8 app_id; 262 u8 elt_seq_num; 263 u8 type; 264 u8 req_id; 265 u8 index; 266 u8 alternative; 267} PACKED; 268 269struct oz_set_interface_rsp { 270 u8 app_id; 271 u8 elt_seq_num; 272 u8 type; 273 u8 req_id; 274 u8 rcode; 275} PACKED; 276 277struct oz_get_interface_req { 278 u8 app_id; 279 u8 elt_seq_num; 280 u8 type; 281 u8 req_id; 282 u8 index; 283} PACKED; 284 285struct oz_get_interface_rsp { 286 u8 app_id; 287 u8 elt_seq_num; 288 u8 type; 289 u8 req_id; 290 u8 rcode; 291 u8 alternative; 292} PACKED; 293 294struct oz_vendor_class_req { 295 u8 app_id; 296 u8 elt_seq_num; 297 u8 type; 298 u8 req_id; 299 u8 req_type; 300 u8 request; 301 u16 value; 302 u16 index; 303 u8 data[1]; 304} PACKED; 305 306struct oz_vendor_class_rsp { 307 u8 app_id; 308 u8 elt_seq_num; 309 u8 type; 310 u8 req_id; 311 u8 rcode; 312 u8 data[1]; 313} PACKED; 314 315struct oz_data { 316 u8 app_id; 317 u8 elt_seq_num; 318 u8 type; 319 u8 endpoint; 320 u8 format; 321} PACKED; 322 323struct oz_isoc_fixed { 324 u8 app_id; 325 u8 elt_seq_num; 326 u8 type; 327 u8 endpoint; 328 u8 format; 329 u8 unit_size; 330 u8 frame_number; 331 u8 data[1]; 332} PACKED; 333 334struct oz_multiple_fixed { 335 u8 app_id; 336 u8 elt_seq_num; 337 u8 type; 338 u8 endpoint; 339 u8 format; 340 u8 unit_size; 341 u8 data[1]; 342} PACKED; 343 344struct oz_fragmented { 345 u8 app_id; 346 u8 elt_seq_num; 347 u8 type; 348 u8 endpoint; 349 u8 format; 350 u16 total_size; 351 u16 offset; 352 u8 data[1]; 353} PACKED; 354 355/* Note: the following does not get packaged in an element in the same way 356 * that other data formats are packaged. Instead the data is put in a frame 357 * directly after the oz_header and is the only permitted data in such a 358 * frame. The length of the data is directly determined from the frame size. 359 */ 360struct oz_isoc_large { 361 u8 endpoint; 362 u8 format; 363 u8 ms_data; 364 u8 frame_number; 365} PACKED; 366 367#define OZ_DATA_F_TYPE_MASK 0xF 368#define OZ_DATA_F_MULTIPLE_FIXED 0x1 369#define OZ_DATA_F_MULTIPLE_VAR 0x2 370#define OZ_DATA_F_ISOC_FIXED 0x3 371#define OZ_DATA_F_ISOC_VAR 0x4 372#define OZ_DATA_F_FRAGMENTED 0x5 373#define OZ_DATA_F_ISOC_LARGE 0x7 374 375#endif /* _OZPROTOCOL_H */ 376