summaryrefslogtreecommitdiff
path: root/stack/avrc/avrc_int.h
blob: d6c79c87b81946f84be26289a8e56f04bf0c4ff7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/******************************************************************************
 *
 *  Copyright (C) 2003-2016 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  VRCP internal header file.
 *
 ******************************************************************************/

#ifndef AVRC_INT_H
#define AVRC_INT_H

#include "avct_defs.h"
#include "avrc_api.h"
#include "osi/include/alarm.h"
#include "osi/include/fixed_queue.h"

/*      DEBUG FLAGS
 *
 * #define META_DEBUG_ENABLED
 */
/*****************************************************************************
 *  Constants
 ****************************************************************************/

/* Number of attributes in AVRC SDP record. */
#define AVRC_NUM_ATTR 6

/* Number of protocol elements in protocol element list. */
#define AVRC_NUM_PROTO_ELEMS 2

#ifndef AVRC_MIN_CMD_LEN
#define AVRC_MIN_CMD_LEN 20
#endif

#define AVRC_UNIT_OPRND_BYTES 5
#define AVRC_SUB_OPRND_BYTES 4
#define AVRC_SUBRSP_OPRND_BYTES 3
#define AVRC_SUB_PAGE_MASK 7
#define AVRC_SUB_PAGE_SHIFT 4
#define AVRC_SUB_EXT_CODE 7
#define AVRC_PASS_OP_ID_MASK 0x7F
#define AVRC_PASS_STATE_MASK 0x80
#define AVRC_CMD_OPRND_PAD 0xFF

#define AVRC_CTYPE_MASK 0x0F
#define AVRC_SUBTYPE_MASK 0xF8
#define AVRC_SUBTYPE_SHIFT 3
#define AVRC_SUBID_MASK 0x07
#define AVRC_SUBID_IGNORE 0x07

#define AVRC_SINGLE_PARAM_SIZE 1
#define AVRC_METADATA_PKT_TYPE_MASK 0x03
#define AVRC_PASS_THOUGH_MSG_MASK \
  0x80 /* MSB of msg_type indicates the PAS THROUGH msg */
#define AVRC_VENDOR_UNIQUE_MASK 0x70 /* vendor unique id */

/* Company ID is 24-bit integer We can not use the macros in bt_types.h */
#define AVRC_CO_ID_TO_BE_STREAM(p, u32) \
  {                                     \
    *(p)++ = (uint8_t)((u32) >> 16);    \
    *(p)++ = (uint8_t)((u32) >> 8);     \
    *(p)++ = (uint8_t)(u32);            \
  }
#define AVRC_BE_STREAM_TO_CO_ID(u32, p)                                   \
  {                                                                       \
    (u32) = (((uint32_t)(*((p) + 2))) + (((uint32_t)(*((p) + 1))) << 8) + \
             (((uint32_t)(*(p))) << 16));                                 \
    (p) += 3;                                                             \
  }

#define AVRC_AVC_HDR_SIZE 3 /* ctype, subunit*, opcode */

#define AVRC_MIN_META_HDR_SIZE 4   /* pdu id(1), packet type(1), param len(2) */
#define AVRC_MIN_BROWSE_HDR_SIZE 3 /* pdu id(1), param len(2) */

#define AVRC_VENDOR_HDR_SIZE 6 /* ctype, subunit*, opcode, CO_ID */
#define AVRC_MSG_VENDOR_OFFSET 23
#define AVRC_MIN_VENDOR_SIZE \
  (AVRC_MSG_VENDOR_OFFSET + BT_HDR_SIZE + AVRC_MIN_META_HDR_SIZE)

#define AVRC_PASS_THRU_SIZE 8
#define AVRC_MSG_PASS_THRU_OFFSET 25
#define AVRC_MIN_PASS_THRU_SIZE (AVRC_MSG_PASS_THRU_OFFSET + BT_HDR_SIZE + 4)

#define AVRC_MIN_BROWSE_SIZE \
  (AVCT_BROWSE_OFFSET + BT_HDR_SIZE + AVRC_MIN_BROWSE_HDR_SIZE)

#define AVRC_CTRL_PKT_LEN(pf, pk) \
  { (pf) = (uint8_t*)((pk) + 1) + (pk)->offset + 2; }

#define AVRC_MAX_CTRL_DATA_LEN (AVRC_PACKET_LEN)

/* Timeout for waiting for avrc command responses (in milliseconds) */
#ifndef AVRC_CMD_TOUT_MS
#define AVRC_CMD_TOUT_MS (2 * 1000)
#endif

/* Flags for avrc_cb.ccb_int[].flags */
#define AVRC_CB_FLAGS_RSP_PENDING 0x01 /* Waiting for AVRC response */

/*****************************************************************************
 *  Type definitions
 ****************************************************************************/

#if (AVRC_METADATA_INCLUDED == TRUE)
/* type for Metadata fragmentation control block */
typedef struct {
  BT_HDR* p_fmsg;    /* the fragmented message */
  uint8_t frag_pdu;  /* the PDU ID for fragmentation */
  bool frag_enabled; /* fragmentation flag */
} tAVRC_FRAG_CB;

/* type for Metadata re-assembly control block */
typedef struct {
  BT_HDR* p_rmsg;       /* the received message */
  uint16_t rasm_offset; /* re-assembly flag, the offset of the start fragment */
  uint8_t rasm_pdu;     /* the PDU ID for re-assembly */
} tAVRC_RASM_CB;
#endif

/* AVRC internal connection control block */
typedef struct {
  fixed_queue_t*
      cmd_q;     /* Command queue for serializing vendor specific commands */
  uint8_t flags; /* See AVRC_CB_FLAGS_* definitions */
  alarm_t* tle;  /* Command timeout timer */
} tAVRC_CONN_INT_CB;

typedef struct {
  tAVRC_CONN_CB
      ccb[AVCT_NUM_CONN]; /* Connection control block from AVRC_Open API */
  tAVRC_CONN_INT_CB
      ccb_int[AVCT_NUM_CONN]; /* Internal connection control block  */
#if (AVRC_METADATA_INCLUDED == TRUE)
  tAVRC_FRAG_CB fcb[AVCT_NUM_CONN];
  tAVRC_RASM_CB rcb[AVCT_NUM_CONN];
#endif
  tAVRC_FIND_CBACK* p_cback; /* pointer to application callback */
  tSDP_DISCOVERY_DB* p_db;   /* pointer to discovery database */
  uint16_t service_uuid;     /* service UUID to search */
  uint8_t trace_level;
} tAVRC_CB;

/******************************************************************************
 * Main Control Block
 ******************************************************************************/
extern tAVRC_CB avrc_cb;

extern bool avrc_is_valid_pdu_id(uint8_t pdu_id);
extern bool avrc_is_valid_player_attrib_value(uint8_t attrib, uint8_t value);
extern BT_HDR* avrc_alloc_ctrl_pkt(uint8_t pdu);
extern tAVRC_STS avrc_pars_pass_thru(tAVRC_MSG_PASS* p_msg,
                                     uint16_t* p_vendor_unique_id);
extern uint8_t avrc_opcode_from_pdu(uint8_t pdu);
extern bool avrc_is_valid_opcode(uint8_t opcode);
extern void avrc_flush_cmd_q(uint8_t handle);
void avrc_start_cmd_timer(uint8_t handle, uint8_t label, uint8_t msg_mask);
void avrc_send_next_vendor_cmd(uint8_t handle);

#endif /* AVRC_INT_H */