linux/drivers/staging/ozwpan/ozprotocol.h
<<
>>
Prefs
   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