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  *  This interface file contains the interface to the Audio Video Control
22  *  Transport Protocol (AVCTP).
23  *
24  ******************************************************************************/
25 #ifndef AVCT_API_H
26 #define AVCT_API_H
27 
28 #include "bt_target.h"
29 #include "bt_types.h"
30 
31 /*****************************************************************************
32  *  Constants
33  ****************************************************************************/
34 
35 /* API function return value result codes. */
36 #define AVCT_SUCCESS 0      /* Function successful */
37 #define AVCT_NO_RESOURCES 1 /* Not enough resources */
38 #define AVCT_BAD_HANDLE 2   /* Bad handle */
39 #define AVCT_PID_IN_USE 3   /* PID already in use */
40 #define AVCT_NOT_OPEN 4     /* Connection not open */
41 
42 /* PSM for AVCT. */
43 #define AVCT_PSM 0x0017
44 #define AVCT_BR_PSM 0x001B
45 
46 /* Protocol revision numbers */
47 #define AVCT_REV_1_0 0x0100
48 #define AVCT_REV_1_2 0x0102
49 #define AVCT_REV_1_3 0x0103
50 #define AVCT_REV_1_4 0x0104
51 
52 /* the layer_specific settings */
53 #define AVCT_DATA_CTRL 0x0001    /* for the control channel */
54 #define AVCT_DATA_BROWSE 0x0002  /* for the browsing channel */
55 #define AVCT_DATA_PARTIAL 0x0100 /* Only have room for a partial message */
56 
57 /* Per the AVRC spec, minimum MTU for the control channel */
58 #define AVCT_MIN_CONTROL_MTU 48
59 /* Per the AVRC spec, minimum MTU for the browsing channel */
60 #define AVCT_MIN_BROWSE_MTU 335
61 
62 /* Message offset.  The number of bytes needed by the protocol stack for the
63  * protocol headers of an AVCTP message packet.
64 */
65 #define AVCT_MSG_OFFSET 15
66 #define AVCT_BROWSE_OFFSET 17 /* the default offset for browsing channel */
67 
68 /* Connection role. */
69 #define AVCT_INT 0 /* Initiator connection */
70 #define AVCT_ACP 1 /* Acceptor connection */
71 
72 /* Control role. */
73 #define AVCT_TARGET 1  /* target  */
74 #define AVCT_CONTROL 2 /* controller  */
75 #define AVCT_PASSIVE 4 /* If conflict, allow the other side to succeed  */
76 
77 /* Command/Response indicator. */
78 #define AVCT_CMD 0 /* Command message */
79 #define AVCT_RSP 2 /* Response message */
80 #define AVCT_REJ 3 /* Message rejected */
81 
82 /* Control callback events. */
83 #define AVCT_CONNECT_CFM_EVT 0        /* Connection confirm */
84 #define AVCT_CONNECT_IND_EVT 1        /* Connection indication */
85 #define AVCT_DISCONNECT_CFM_EVT 2     /* Disconnect confirm */
86 #define AVCT_DISCONNECT_IND_EVT 3     /* Disconnect indication */
87 #define AVCT_CONG_IND_EVT 4           /* Congestion indication */
88 #define AVCT_UNCONG_IND_EVT 5         /* Uncongestion indication */
89 #define AVCT_BROWSE_CONN_CFM_EVT 6    /* Browse Connection confirm */
90 #define AVCT_BROWSE_CONN_IND_EVT 7    /* Browse Connection indication */
91 #define AVCT_BROWSE_DISCONN_CFM_EVT 8 /* Browse Disconnect confirm */
92 #define AVCT_BROWSE_DISCONN_IND_EVT 9 /* Browse Disconnect indication */
93 #define AVCT_BROWSE_CONG_IND_EVT 10   /* Congestion indication */
94 #define AVCT_BROWSE_UNCONG_IND_EVT 11 /* Uncongestion indication */
95 
96 /* General purpose failure result code for callback events. */
97 #define AVCT_RESULT_FAIL 5
98 
99 /*****************************************************************************
100  *  Type Definitions
101  ****************************************************************************/
102 
103 /* Control callback function. */
104 typedef void(tAVCT_CTRL_CBACK)(uint8_t handle, uint8_t event, uint16_t result,
105                                BD_ADDR peer_addr);
106 
107 /* Message callback function */
108 /* p_pkt->layer_specific is AVCT_DATA_CTRL or AVCT_DATA_BROWSE */
109 typedef void(tAVCT_MSG_CBACK)(uint8_t handle, uint8_t label, uint8_t cr,
110                               BT_HDR* p_pkt);
111 
112 /* Structure used by AVCT_CreateConn. */
113 typedef struct {
114   tAVCT_CTRL_CBACK* p_ctrl_cback; /* Control callback */
115   tAVCT_MSG_CBACK* p_msg_cback;   /* Message callback */
116   uint16_t pid;                   /* Profile ID */
117   uint8_t role;                   /* Initiator/acceptor role */
118   uint8_t control;                /* Control role (Control/Target) */
119 } tAVCT_CC;
120 
121 /*****************************************************************************
122  *  External Function Declarations
123  ****************************************************************************/
124 
125 /*******************************************************************************
126  *
127  * Function         AVCT_Register
128  *
129  * Description      This is the system level registration function for the
130  *                  AVCTP protocol.  This function initializes AVCTP and
131  *                  prepares the protocol stack for its use.  This function
132  *                  must be called once by the system or platform using AVCTP
133  *                  before the other functions of the API an be used.
134  *
135  *
136  * Returns          void
137  *
138  ******************************************************************************/
139 extern void AVCT_Register(uint16_t mtu, uint16_t mtu_br, uint8_t sec_mask);
140 
141 /*******************************************************************************
142  *
143  * Function         AVCT_Deregister
144  *
145  * Description      This function is called to deregister use AVCTP protocol.
146  *                  It is called when AVCTP is no longer being used by any
147  *                  application in the system.  Before this function can be
148  *                  called, all connections must be removed with
149  *                  AVCT_RemoveConn().
150  *
151  *
152  * Returns          void
153  *
154  ******************************************************************************/
155 extern void AVCT_Deregister(void);
156 
157 /*******************************************************************************
158  *
159  * Function         AVCT_CreateConn
160  *
161  * Description      Create an AVCTP connection.  There are two types of
162  *                  connections, initiator and acceptor, as determined by
163  *                  the p_cc->role parameter.  When this function is called to
164  *                  create an initiator connection, an AVCTP connection to
165  *                  the peer device is initiated if one does not already exist.
166  *                  If an acceptor connection is created, the connection waits
167  *                  passively for an incoming AVCTP connection from a peer
168  *                  device.
169  *
170  *
171  * Returns          AVCT_SUCCESS if successful, otherwise error.
172  *
173  ******************************************************************************/
174 extern uint16_t AVCT_CreateConn(uint8_t* p_handle, tAVCT_CC* p_cc,
175                                 BD_ADDR peer_addr);
176 
177 /*******************************************************************************
178  *
179  * Function         AVCT_RemoveConn
180  *
181  * Description      Remove an AVCTP connection.  This function is called when
182  *                  the application is no longer using a connection.  If this
183  *                  is the last connection to a peer the L2CAP channel for AVCTP
184  *                  will be closed.
185  *
186  *
187  * Returns          AVCT_SUCCESS if successful, otherwise error.
188  *
189  ******************************************************************************/
190 extern uint16_t AVCT_RemoveConn(uint8_t handle);
191 
192 /*******************************************************************************
193  *
194  * Function         AVCT_CreateBrowse
195  *
196  * Description      Create an AVCTP connection.  There are two types of
197  *                  connections, initiator and acceptor, as determined by
198  *                  the p_cc->role parameter.  When this function is called to
199  *                  create an initiator connection, an AVCTP connection to
200  *                  the peer device is initiated if one does not already exist.
201  *                  If an acceptor connection is created, the connection waits
202  *                  passively for an incoming AVCTP connection from a peer
203  *                  device.
204  *
205  *
206  * Returns          AVCT_SUCCESS if successful, otherwise error.
207  *
208  ******************************************************************************/
209 extern uint16_t AVCT_CreateBrowse(uint8_t handle, uint8_t role);
210 
211 /*******************************************************************************
212  *
213  * Function         AVCT_RemoveBrowse
214  *
215  * Description      Remove an AVCTP connection.  This function is called when
216  *                  the application is no longer using a connection.  If this
217  *                  is the last connection to a peer the L2CAP channel for AVCTP
218  *                  will be closed.
219  *
220  *
221  * Returns          AVCT_SUCCESS if successful, otherwise error.
222  *
223  ******************************************************************************/
224 extern uint16_t AVCT_RemoveBrowse(uint8_t handle);
225 
226 /*******************************************************************************
227  *
228  * Function         AVCT_GetBrowseMtu
229  *
230  * Description      Get the peer_mtu for the AVCTP Browse channel of the given
231  *                  connection.
232  *
233  * Returns          the peer browsing channel MTU.
234  *
235  ******************************************************************************/
236 extern uint16_t AVCT_GetBrowseMtu(uint8_t handle);
237 
238 /*******************************************************************************
239  *
240  * Function         AVCT_GetPeerMtu
241  *
242  * Description      Get the peer_mtu for the AVCTP channel of the given
243  *                  connection.
244  *
245  * Returns          the peer MTU size.
246  *
247  ******************************************************************************/
248 extern uint16_t AVCT_GetPeerMtu(uint8_t handle);
249 
250 /*******************************************************************************
251  *
252  * Function         AVCT_MsgReq
253  *
254  * Description      Send an AVCTP message to a peer device.  In calling
255  *                  AVCT_MsgReq(), the application should keep track of the
256  *                  congestion state of AVCTP as communicated with events
257  *                  AVCT_CONG_IND_EVT and AVCT_UNCONG_IND_EVT.   If the
258  *                  application calls AVCT_MsgReq() when AVCTP is congested
259  *                  the message may be discarded.  The application may make its
260  *                  first call to AVCT_MsgReq() after it receives an
261  *                  AVCT_CONNECT_CFM_EVT or AVCT_CONNECT_IND_EVT on control
262  *                  channel or
263  *                  AVCT_BROWSE_CONN_CFM_EVT or AVCT_BROWSE_CONN_IND_EVT on
264  *                  browsing channel.
265  *
266  *                  p_msg->layer_specific must be set to
267  *                  AVCT_DATA_CTRL for control channel traffic;
268  *                  AVCT_DATA_BROWSE for for browse channel traffic.
269  *
270  * Returns          AVCT_SUCCESS if successful, otherwise error.
271  *
272  ******************************************************************************/
273 extern uint16_t AVCT_MsgReq(uint8_t handle, uint8_t label, uint8_t cr,
274                             BT_HDR* p_msg);
275 
276 #endif /* AVCT_API_H */
277