Chris Kelly | 1619cb6 | 2012-02-20 21:11:28 +0000 | [diff] [blame] | 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 | |
Rupesh Gujare | 86d03a0 | 2012-07-23 18:49:46 +0100 | [diff] [blame] | 68 | #define OZ_LATENCY_MASK 0xc0 |
| 69 | #define OZ_ONE_MS_LATENCY 0x40 |
| 70 | #define OZ_TEN_MS_LATENCY 0x80 |
| 71 | |
Chris Kelly | 1619cb6 | 2012-02-20 21:11:28 +0000 | [diff] [blame] | 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; |
Rupesh Gujare | 86d03a0 | 2012-07-23 18:49:46 +0100 | [diff] [blame] | 80 | u8 ms_isoc_latency; |
Chris Kelly | 1619cb6 | 2012-02-20 21:11:28 +0000 | [diff] [blame] | 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 |
Rupesh Gujare | 33e6ada | 2012-06-20 13:36:06 +0100 | [diff] [blame] | 96 | #define OZ_NO_ELTS_ANYTIME 0xc0 |
Chris Kelly | 1619cb6 | 2012-02-20 21:11:28 +0000 | [diff] [blame] | 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; |
Himangi Saraogi | 45b1fe5 | 2014-03-12 22:20:32 +0530 | [diff] [blame] | 195 | __le16 w_index; |
Chris Kelly | 1619cb6 | 2012-02-20 21:11:28 +0000 | [diff] [blame] | 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; |
Himangi Saraogi | accd4d7 | 2014-03-12 22:21:13 +0530 | [diff] [blame] | 222 | __le16 offset; |
| 223 | __le16 total_size; |
Chris Kelly | 1619cb6 | 2012-02-20 21:11:28 +0000 | [diff] [blame] | 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 */ |