1 /******************************************************************************
2  *
3  *  Copyright (C) 2003-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  VRCP internal header file.
22  *
23  ******************************************************************************/
24 
25 
26 #ifndef AVRC_INT_H
27 #define AVRC_INT_H
28 
29 #include "avct_defs.h"
30 #include "stack/avrc_api.h"
31 
32 #if (AVRC_INCLUDED == TRUE)
33 /*      DEBUG FLAGS
34  *
35  * #define META_DEBUG_ENABLED
36  */
37 /*****************************************************************************
38 **  Constants
39 *****************************************************************************/
40 
41 /* Number of attributes in AVRC SDP record. */
42 #define AVRC_NUM_ATTR            6
43 
44 /* Number of protocol elements in protocol element list. */
45 #define AVRC_NUM_PROTO_ELEMS     2
46 
47 #ifndef AVRC_MIN_CMD_LEN
48 #define AVRC_MIN_CMD_LEN    20
49 #endif
50 
51 #define AVRC_UNIT_OPRND_BYTES   5
52 #define AVRC_SUB_OPRND_BYTES    4
53 #define AVRC_SUBRSP_OPRND_BYTES 3
54 #define AVRC_SUB_PAGE_MASK      7
55 #define AVRC_SUB_PAGE_SHIFT     4
56 #define AVRC_SUB_EXT_CODE       7
57 #define AVRC_PASS_OP_ID_MASK    0x7F
58 #define AVRC_PASS_STATE_MASK    0x80
59 #define AVRC_CMD_OPRND_PAD      0xFF
60 
61 #define AVRC_CTYPE_MASK         0x0F
62 #define AVRC_SUBTYPE_MASK       0xF8
63 #define AVRC_SUBTYPE_SHIFT      3
64 #define AVRC_SUBID_MASK         0x07
65 #define AVRC_SUBID_IGNORE       0x07
66 
67 #define AVRC_SINGLE_PARAM_SIZE      1
68 #define AVRC_METADATA_PKT_TYPE_MASK 0x03
69 #define AVRC_PASS_THOUGH_MSG_MASK   0x80           /* MSB of msg_type indicates the PAS THROUGH msg */
70 #define AVRC_VENDOR_UNIQUE_MASK     0x70           /* vendor unique id */
71 
72 
73 /* Company ID is 24-bit integer We can not use the macros in stack/bt_types.h */
74 #define AVRC_CO_ID_TO_BE_STREAM(p, u32) {*(p)++ = (UINT8)((u32) >> 16); *(p)++ = (UINT8)((u32) >> 8); *(p)++ = (UINT8)(u32); }
75 #define AVRC_BE_STREAM_TO_CO_ID(u32, p) {u32 = (((UINT32)(*((p) + 2))) + (((UINT32)(*((p) + 1))) << 8) + (((UINT32)(*(p))) << 16)); (p) += 3;}
76 
77 #define AVRC_AVC_HDR_SIZE           3   /* ctype, subunit*, opcode */
78 
79 #define AVRC_MIN_META_HDR_SIZE      4   /* pdu id(1), packet type(1), param len(2) */
80 #define AVRC_MIN_BROWSE_HDR_SIZE    3   /* pdu id(1), param len(2) */
81 
82 #define AVRC_VENDOR_HDR_SIZE        6   /* ctype, subunit*, opcode, CO_ID */
83 #define AVRC_MSG_VENDOR_OFFSET      23
84 #define AVRC_MIN_VENDOR_SIZE        (AVRC_MSG_VENDOR_OFFSET + BT_HDR_SIZE + AVRC_MIN_META_HDR_SIZE)
85 
86 #define AVRC_PASS_THRU_SIZE         8
87 #define AVRC_MSG_PASS_THRU_OFFSET   25
88 #define AVRC_MIN_PASS_THRU_SIZE     (AVRC_MSG_PASS_THRU_OFFSET + BT_HDR_SIZE + 4)
89 
90 #define AVRC_MIN_BROWSE_SIZE        (AVCT_BROWSE_OFFSET + BT_HDR_SIZE + AVRC_MIN_BROWSE_HDR_SIZE)
91 
92 #define AVRC_CTRL_PKT_LEN(pf, pk)   {pf = (UINT8 *)((pk) + 1) + (pk)->offset + 2;}
93 
94 #define AVRC_MAX_CTRL_DATA_LEN      (AVRC_PACKET_LEN)
95 
96 /*****************************************************************************
97 **  Type definitions
98 *****************************************************************************/
99 
100 #if (AVRC_METADATA_INCLUDED == TRUE)
101 /* type for Metadata fragmentation control block */
102 typedef struct {
103     BT_HDR              *p_fmsg;        /* the fragmented message */
104     UINT8               frag_pdu;       /* the PDU ID for fragmentation */
105     BOOLEAN             frag_enabled;   /* fragmentation flag */
106 } tAVRC_FRAG_CB;
107 
108 /* type for Metadata re-assembly control block */
109 typedef struct {
110     BT_HDR              *p_rmsg;        /* the received message */
111     UINT16              rasm_offset;    /* re-assembly flag, the offset of the start fragment */
112     UINT8               rasm_pdu;       /* the PDU ID for re-assembly */
113 } tAVRC_RASM_CB;
114 #endif
115 
116 typedef struct {
117     tAVRC_CONN_CB       ccb[AVCT_NUM_CONN];
118 #if (AVRC_METADATA_INCLUDED == TRUE)
119     tAVRC_FRAG_CB       fcb[AVCT_NUM_CONN];
120     tAVRC_RASM_CB       rcb[AVCT_NUM_CONN];
121 #endif
122     tAVRC_FIND_CBACK    *p_cback;       /* pointer to application callback */
123     tSDP_DISCOVERY_DB   *p_db;          /* pointer to discovery database */
124     UINT16              service_uuid;   /* service UUID to search */
125     UINT8               trace_level;
126 } tAVRC_CB;
127 
128 
129 
130 #ifdef __cplusplus
131 extern "C"
132 {
133 #endif
134 
135 /******************************************************************************
136 ** Main Control Block
137 *******************************************************************************/
138 #if AVRC_DYNAMIC_MEMORY == FALSE
139 extern tAVRC_CB  avrc_cb;
140 #else
141 extern tAVRC_CB *avrc_cb_ptr;
142 #define avrc_cb (*avrc_cb_ptr)
143 #endif
144 
145 extern BOOLEAN avrc_is_valid_pdu_id(UINT8 pdu_id);
146 extern BOOLEAN avrc_is_valid_player_attrib_value(UINT8 attrib, UINT8 value);
147 extern BT_HDR *avrc_alloc_ctrl_pkt (UINT8 pdu);
148 extern tAVRC_STS avrc_pars_pass_thru(tAVRC_MSG_PASS *p_msg, UINT16 *p_vendor_unique_id);
149 extern UINT8 avrc_opcode_from_pdu(UINT8 pdu);
150 extern BOOLEAN avrc_is_valid_opcode(UINT8 opcode);
151 
152 #ifdef __cplusplus
153 }
154 #endif
155 
156 #endif  ///AVRC_INCLUDED == TRUE
157 
158 #endif /* AVRC_INT_H */
159