119e95205Sopenharmony_ci/*
219e95205Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
419e95205Sopenharmony_ci * you may not use this file except in compliance with the License.
519e95205Sopenharmony_ci * You may obtain a copy of the License at
619e95205Sopenharmony_ci *
719e95205Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
819e95205Sopenharmony_ci *
919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and
1319e95205Sopenharmony_ci * limitations under the License.
1419e95205Sopenharmony_ci */
1519e95205Sopenharmony_ci/**
1619e95205Sopenharmony_ci * @addtogroup Bluetooth
1719e95205Sopenharmony_ci * @{
1819e95205Sopenharmony_ci *
1919e95205Sopenharmony_ci * @brief This file is a part of BTStack.
2019e95205Sopenharmony_ci * @since 6.0
2119e95205Sopenharmony_ci */
2219e95205Sopenharmony_ci
2319e95205Sopenharmony_ci/**
2419e95205Sopenharmony_ci * @file avctp.h
2519e95205Sopenharmony_ci *
2619e95205Sopenharmony_ci * @brief AVCT protocal Interface.
2719e95205Sopenharmony_ci *
2819e95205Sopenharmony_ci * @since 6.0
2919e95205Sopenharmony_ci */
3019e95205Sopenharmony_ci#ifndef AVCTP_H
3119e95205Sopenharmony_ci#define AVCTP_H
3219e95205Sopenharmony_ci
3319e95205Sopenharmony_ci#include <stdint.h>
3419e95205Sopenharmony_ci
3519e95205Sopenharmony_ci#include "btstack.h"
3619e95205Sopenharmony_ci#include "gap_if.h"
3719e95205Sopenharmony_ci#include "packet.h"
3819e95205Sopenharmony_ci
3919e95205Sopenharmony_ci#ifdef __cplusplus
4019e95205Sopenharmony_ciextern "C" {
4119e95205Sopenharmony_ci#endif
4219e95205Sopenharmony_ci
4319e95205Sopenharmony_ci/*****************************************************************************
4419e95205Sopenharmony_ci *  Constants
4519e95205Sopenharmony_ci ****************************************************************************/
4619e95205Sopenharmony_ci/** PSM for AVCT. */
4719e95205Sopenharmony_ci#define AVCT_PSM 0x0017
4819e95205Sopenharmony_ci#define AVCT_BR_PSM 0x001B
4919e95205Sopenharmony_ci
5019e95205Sopenharmony_ci/** Protocol Revision Numbers */
5119e95205Sopenharmony_ci#define AVCT_REV_1_4 0x0104
5219e95205Sopenharmony_ci
5319e95205Sopenharmony_ci/** The role to create the connection. */
5419e95205Sopenharmony_ci#define AVCT_INIT 0  // Initiator
5519e95205Sopenharmony_ci#define AVCT_ACPT 1  // Acceptor
5619e95205Sopenharmony_ci#define AVCT_CT 0    // Control Role
5719e95205Sopenharmony_ci#define AVCT_TG 1    // Target Role
5819e95205Sopenharmony_ci
5919e95205Sopenharmony_ci/** The Channel Type */
6019e95205Sopenharmony_ci#define AVCT_DATA_CTRL 0x01  // The control channel
6119e95205Sopenharmony_ci#define AVCT_DATA_BR 0x02    // The browse channel
6219e95205Sopenharmony_ci
6319e95205Sopenharmony_ci/** The C/R value. */
6419e95205Sopenharmony_ci#define AVCT_COMMAND 0   // command
6519e95205Sopenharmony_ci#define AVCT_RESPONSE 1  // response
6619e95205Sopenharmony_ci
6719e95205Sopenharmony_ci/** Control channel callback events. */
6819e95205Sopenharmony_citypedef enum {
6919e95205Sopenharmony_ci    AVCT_CONNECT_IND_EVT = 0,    // Connection indication
7019e95205Sopenharmony_ci    AVCT_CONNECT_CFM_EVT,        // Connection confirm
7119e95205Sopenharmony_ci    AVCT_DISCONNECT_IND_EVT,     // Disconnect indication
7219e95205Sopenharmony_ci    AVCT_DISCONNECT_CFM_EVT,     // Disconnect confirm
7319e95205Sopenharmony_ci    AVCT_CHANNEL_BUSY_EVT,       // Channel is busy on Enhance Mode
7419e95205Sopenharmony_ci    AVCT_CHANNEL_UNBUSY_EVT,     // Channel is unbusy on Enhance Mode
7519e95205Sopenharmony_ci    AVCT_BR_CONNECT_IND_EVT,     // Browse Connection indication, Browser auto connect in background,so it's unused.
7619e95205Sopenharmony_ci    AVCT_BR_CONNECT_CFM_EVT,     // Browse Connection confirm
7719e95205Sopenharmony_ci    AVCT_BR_DISCONNECT_IND_EVT,  // Browse Disconnect indication
7819e95205Sopenharmony_ci    AVCT_BR_DISCONNECT_CFM_EVT,  // Browse Disconnect confirm
7919e95205Sopenharmony_ci    AVCT_BR_CHANNEL_BUSY_EVT,    // Browse Channel is busy on Enhance Mode
8019e95205Sopenharmony_ci    AVCT_BR_CHANNEL_UNBUSY_EVT,  // Browse Channel is unbusy on Enhance Mode
8119e95205Sopenharmony_ci} AvctCallbackEvt;
8219e95205Sopenharmony_ci
8319e95205Sopenharmony_ci/** API function return value result codes. */
8419e95205Sopenharmony_citypedef enum {
8519e95205Sopenharmony_ci    AVCT_SUCCESS = 0,        // Function Success
8619e95205Sopenharmony_ci    AVCT_ERR_NO_RESOURCES,   // Not enough resources
8719e95205Sopenharmony_ci    AVCT_ERR_CONN_BAD,       // Bad channel can't be used
8819e95205Sopenharmony_ci    AVCT_ERR_CONN_NOT_OPEN,  // Connection not open
8919e95205Sopenharmony_ci    AVCT_ERR_PID_USED,       // PID already in used
9019e95205Sopenharmony_ci    AVCT_ERR_PARAM,          // Paramas error
9119e95205Sopenharmony_ci    AVCT_FAILED,             // Function Failed
9219e95205Sopenharmony_ci} AvctRet;
9319e95205Sopenharmony_ci/***********************************************************************************
9419e95205Sopenharmony_ci *  Type Definitions
9519e95205Sopenharmony_ci ***********************************************************************************/
9619e95205Sopenharmony_ci/** @brief      HCI Event callback function.
9719e95205Sopenharmony_ci * @details     The aim of this primitive is to request an application callback when the selected indication Event
9819e95205Sopenharmony_ci *              occurs. Each profile shall register for being called back separately.
9919e95205Sopenharmony_ci * @param[in]   connId    Connection channel Id
10019e95205Sopenharmony_ci * @param[in]   event     Control link callback events
10119e95205Sopenharmony_ci * @param[in]   result    Control link callback result
10219e95205Sopenharmony_ci * @param[in]   peerAddr  Peer device address
10319e95205Sopenharmony_ci * @reutrn      @c void
10419e95205Sopenharmony_ci */
10519e95205Sopenharmony_citypedef void (*AvctChannelEventCallback)(
10619e95205Sopenharmony_ci    uint8_t connId, uint8_t event, uint16_t result, const BtAddr *peerAddr, void *context);
10719e95205Sopenharmony_ci
10819e95205Sopenharmony_ci/** @brief      Protocal Message data callback function
10919e95205Sopenharmony_ci * @details     This is the callback function used by AVCTP to report received AV control messages.
11019e95205Sopenharmony_ci * @param[in]   connId    Connection channel Id
11119e95205Sopenharmony_ci * @param[in]   lable     Message lable from app
11219e95205Sopenharmony_ci * @param[in]   cr        Command/Response
11319e95205Sopenharmony_ci * @param[in]   ch_type   Message come from (AVCT_DATA_CTRL or AVCT_DATA_BROWSE)
11419e95205Sopenharmony_ci * @param[in]   pkt       The point of message data
11519e95205Sopenharmony_ci * @reutrn      @c void
11619e95205Sopenharmony_ci */
11719e95205Sopenharmony_citypedef void (*AvctMsgCallback)(uint8_t connId, uint8_t label, uint8_t cr, uint8_t ch_type, Packet *pkt, void *context);
11819e95205Sopenharmony_ci
11919e95205Sopenharmony_ci/**
12019e95205Sopenharmony_ci * @brief Connect parameter used by avct_connect_req.
12119e95205Sopenharmony_ci */
12219e95205Sopenharmony_citypedef struct {
12319e95205Sopenharmony_ci    AvctChannelEventCallback chEvtCallback;  // HCI Event callback
12419e95205Sopenharmony_ci    AvctMsgCallback msgCallback;             // Message Data callback
12519e95205Sopenharmony_ci    uint16_t pid;                            // Profile ID
12619e95205Sopenharmony_ci    uint8_t role;                            // Initiator/Acceptor
12719e95205Sopenharmony_ci    void *context;                           // context from  app
12819e95205Sopenharmony_ci} AvctConnectParam;
12919e95205Sopenharmony_ci
13019e95205Sopenharmony_ci/***********************************************************************************
13119e95205Sopenharmony_ci *  External Function Declarations
13219e95205Sopenharmony_ci ***********************************************************************************/
13319e95205Sopenharmony_ci
13419e95205Sopenharmony_ci/**
13519e95205Sopenharmony_ci * @brief       Function    AVCT_Register
13619e95205Sopenharmony_ci *
13719e95205Sopenharmony_ci * @details     This is the system level registration function for the AVCTP
13819e95205Sopenharmony_ci *              protocol. This function initializes AVCTP protocal and prepares
13919e95205Sopenharmony_ci *              the protocol stack for its use.  This function must be called
14019e95205Sopenharmony_ci *              once by the system before the other functions of the API can be
14119e95205Sopenharmony_ci *              used.
14219e95205Sopenharmony_ci *
14319e95205Sopenharmony_ci * @param[in]   mtu     Max transcation unit for control.
14419e95205Sopenharmony_ci * @param[in]   mtuBr   Max transcation unit for browser.
14519e95205Sopenharmony_ci *
14619e95205Sopenharmony_ci * @return      @c void
14719e95205Sopenharmony_ci *
14819e95205Sopenharmony_ci */
14919e95205Sopenharmony_ciBTSTACK_API void AVCT_Register(uint16_t mtu, uint16_t mtuBr, uint16_t role);
15019e95205Sopenharmony_ci
15119e95205Sopenharmony_ci/**
15219e95205Sopenharmony_ci *
15319e95205Sopenharmony_ci * @brief       Function    AVCT_Deregister
15419e95205Sopenharmony_ci *
15519e95205Sopenharmony_ci * @details     This function is called to deregister AVCTP protocol.
15619e95205Sopenharmony_ci *              It is called when AVCTP is no longer being used by any
15719e95205Sopenharmony_ci *              application in the system. All connections must be
15819e95205Sopenharmony_ci *              disconned in advance.
15919e95205Sopenharmony_ci *
16019e95205Sopenharmony_ci * @param[in]   void
16119e95205Sopenharmony_ci *
16219e95205Sopenharmony_ci * @return      @c void
16319e95205Sopenharmony_ci *
16419e95205Sopenharmony_ci */
16519e95205Sopenharmony_ciBTSTACK_API void AVCT_Deregister(void);
16619e95205Sopenharmony_ci
16719e95205Sopenharmony_ci/**
16819e95205Sopenharmony_ci *
16919e95205Sopenharmony_ci * @brief       Function    AVCT_ConnectReq
17019e95205Sopenharmony_ci *
17119e95205Sopenharmony_ci * @details     This function is called to create an avctp control connection
17219e95205Sopenharmony_ci *              session for peer device.
17319e95205Sopenharmony_ci *              AVCT.ICS #Table 2/11 3/11 Connect Request.
17419e95205Sopenharmony_ci *              AVCT.ICS #Table 3/9 Event register for connection request.
17519e95205Sopenharmony_ci *              AVCT Profile #11.2.1 #11.1.
17619e95205Sopenharmony_ci *
17719e95205Sopenharmony_ci * @param[in]   connParam   The point to the param of the connection request.
17819e95205Sopenharmony_ci *                          Such as the Role、Profile ID、Callback func point.
17919e95205Sopenharmony_ci * @param[in]   peerAddr    The peer address to be connected.
18019e95205Sopenharmony_ci * @param[out]  connId      The point of the connection session handle.
18119e95205Sopenharmony_ci *
18219e95205Sopenharmony_ci * @return      @c AVCT_SUCCESS Success @c otherwise Error
18319e95205Sopenharmony_ci *
18419e95205Sopenharmony_ci */
18519e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_ConnectReq(uint8_t *connId, const AvctConnectParam *connParam, const BtAddr *peerAddr);
18619e95205Sopenharmony_ci
18719e95205Sopenharmony_ci/**
18819e95205Sopenharmony_ci *
18919e95205Sopenharmony_ci * @brief       Function    AVCT_DisconnectReq
19019e95205Sopenharmony_ci *
19119e95205Sopenharmony_ci * @details     This function is called to disconnect the avctp control
19219e95205Sopenharmony_ci *              connection session. AVCT.ICS #Table 2/12 3/12 Disconnect Request. AVCT.ICS
19319e95205Sopenharmony_ci *              #Table 3/10 Event register for disconnection request. AVCT Profile #11.2.2
19419e95205Sopenharmony_ci *              #11.2.3 #11.1.
19519e95205Sopenharmony_ci *
19619e95205Sopenharmony_ci * @param[in]   connId   The id of the connection session to be disconnected.
19719e95205Sopenharmony_ci *
19819e95205Sopenharmony_ci * @return      @c AVCT_SUCCESS Success @c otherwise Error
19919e95205Sopenharmony_ci *
20019e95205Sopenharmony_ci */
20119e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_DisconnectReq(uint8_t connId);
20219e95205Sopenharmony_ci
20319e95205Sopenharmony_ci/**
20419e95205Sopenharmony_ci *
20519e95205Sopenharmony_ci * @brief       Function    AVCT_SendMsgReq
20619e95205Sopenharmony_ci *
20719e95205Sopenharmony_ci * @details     This function is called to send an message to the control
20819e95205Sopenharmony_ci *              connection session. AVCT.ICS #Table 2/13 3/13 Send Message AVCT.ICS #Table
20919e95205Sopenharmony_ci *              3/10 Event register for message  reception. AVCT Profile #11.2.3 #11.2.4
21019e95205Sopenharmony_ci *              #11.1
21119e95205Sopenharmony_ci *
21219e95205Sopenharmony_ci * @param[in]   connId  The id of the connection session which the message is send to.
21319e95205Sopenharmony_ci * @param[in]   label   Message label from application.
21419e95205Sopenharmony_ci * @param[in]   cr      Command/Tesponse
21519e95205Sopenharmony_ci * @param[in]   msg     The point of Message data.
21619e95205Sopenharmony_ci *
21719e95205Sopenharmony_ci * @return      @c AVCT_SUCCESS Success @c otherwise Error
21819e95205Sopenharmony_ci *
21919e95205Sopenharmony_ci */
22019e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_SendMsgReq(uint8_t connId, uint8_t label, uint8_t cr, const Packet *msg);
22119e95205Sopenharmony_ci
22219e95205Sopenharmony_ci/**
22319e95205Sopenharmony_ci *
22419e95205Sopenharmony_ci * @brief       Function    AVCT_GetMtu
22519e95205Sopenharmony_ci *
22619e95205Sopenharmony_ci * @details     This function is called to get the mtu of the control connection session.
22719e95205Sopenharmony_ci *
22819e95205Sopenharmony_ci * @param[in]   connId   The id of the connection session.
22919e95205Sopenharmony_ci *
23019e95205Sopenharmony_ci * @return      @c MTU
23119e95205Sopenharmony_ci *
23219e95205Sopenharmony_ci */
23319e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_GetPeerMtu(uint8_t connId);
23419e95205Sopenharmony_ci
23519e95205Sopenharmony_ci/**
23619e95205Sopenharmony_ci *
23719e95205Sopenharmony_ci * @brief       Function    AVCT_BrConnectReq
23819e95205Sopenharmony_ci *
23919e95205Sopenharmony_ci * @details     This function is called to create an avctp browse connection session if the peer device has.
24019e95205Sopenharmony_ci *
24119e95205Sopenharmony_ci * @param[in]   connId  The control connection session id.
24219e95205Sopenharmony_ci * @param[in]   role    The connection session role.
24319e95205Sopenharmony_ci *
24419e95205Sopenharmony_ci * @return      @c AVCT_SUCCESS Success @c otherwise Error
24519e95205Sopenharmony_ci *
24619e95205Sopenharmony_ci */
24719e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_BrConnectReq(uint8_t connId, uint8_t role);
24819e95205Sopenharmony_ci
24919e95205Sopenharmony_ci/**
25019e95205Sopenharmony_ci *
25119e95205Sopenharmony_ci * @brief       Function    AVCT_BrDisconnectReq
25219e95205Sopenharmony_ci *
25319e95205Sopenharmony_ci * @details     Remove an AVCTP browse connection session.
25419e95205Sopenharmony_ci *
25519e95205Sopenharmony_ci * @param[in]   connId      The connection session id.
25619e95205Sopenharmony_ci *
25719e95205Sopenharmony_ci * @return      @c AVCT_SUCCESS Success @c otherwise Error
25819e95205Sopenharmony_ci *
25919e95205Sopenharmony_ci */
26019e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_BrDisconnectReq(uint8_t connId);
26119e95205Sopenharmony_ci
26219e95205Sopenharmony_ci/**
26319e95205Sopenharmony_ci *
26419e95205Sopenharmony_ci * @brief       Function    AVCT_BrSendMsgReq
26519e95205Sopenharmony_ci *
26619e95205Sopenharmony_ci * @details     This function is called to send an  message to the browse session.
26719e95205Sopenharmony_ci *              AVCT.ICS #Table 2/13 3/13 Send Message.
26819e95205Sopenharmony_ci *              AVCT.ICS #Table 3/10 Event register for message reception.
26919e95205Sopenharmony_ci *              AVCT Profile #11.2.3 #11.2.4 #11.1.
27019e95205Sopenharmony_ci *
27119e95205Sopenharmony_ci * @param[in]   connId  The id of the connection session which the message is send to.
27219e95205Sopenharmony_ci * @param[in]   label   Message label from application.
27319e95205Sopenharmony_ci * @param[in]   cr      Command/Tesponse
27419e95205Sopenharmony_ci * @param[in]   msg     Message data point.
27519e95205Sopenharmony_ci *
27619e95205Sopenharmony_ci * @return      @c AVCT_SUCCESS Success @c otherwise Error
27719e95205Sopenharmony_ci *
27819e95205Sopenharmony_ci */
27919e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_BrSendMsgReq(uint8_t connId, uint8_t label, uint8_t cr, const Packet *msg);
28019e95205Sopenharmony_ci
28119e95205Sopenharmony_ci/**
28219e95205Sopenharmony_ci *
28319e95205Sopenharmony_ci * @brief       Function    AVCT_BrGetMtu
28419e95205Sopenharmony_ci *
28519e95205Sopenharmony_ci * @details     This function is called to get the mtu of the browse connection session.
28619e95205Sopenharmony_ci *
28719e95205Sopenharmony_ci * @param[in]   connId   The id of the connection session.
28819e95205Sopenharmony_ci *
28919e95205Sopenharmony_ci * @return      @c MTU
29019e95205Sopenharmony_ci *
29119e95205Sopenharmony_ci */
29219e95205Sopenharmony_ciBTSTACK_API uint16_t AVCT_BrGetPeerMtu(uint8_t connId);
29319e95205Sopenharmony_ci
29419e95205Sopenharmony_ci#ifdef __cplusplus
29519e95205Sopenharmony_ci}
29619e95205Sopenharmony_ci#endif
29719e95205Sopenharmony_ci
29819e95205Sopenharmony_ci#endif /* AVCTP_H */
299