MXC-A36_2024.04.18/fr3092_mcu/components/btdm/include/avctp_api.h

644 lines
21 KiB
C
Raw Normal View History

2024-04-17 19:45:26 +08:00
#ifndef __AVCTP_API_H_
#define __AVCTP_API_H_
#include "btconfig.h"
#include "bt_types.h"
#include "me_api.h"
/*---------------------------------------------------------------------------
* AVCTP API layer
*
* The Audio/Video Remote Control Transport Protocol (AVCTP) defines
* procedures for exchanging 1394 Trade Association AV/C commands between
* Bluetooth enabled Audio/Video devices.
*
* This API is designed to support AV remote control applications using
* the iAnywhere Blue SDK core protocol stack. It provides an API
* for connection management and message handling.
*/
/****************************************************************************
*
* Types
*
****************************************************************************/
/*---------------------------------------------------------------------------
* AvctpEvent type
*
*/
typedef uint8_t AvctpEvent;
/** The transport layer is connected and commands/responses can now
* be exchanged.
*
* During this callback, the 'p.remDev' parameter is valid.
*/
#define AVCTP_EVENT_CONNECT 1
/** A remote device is attempting to connect the transport layer.
* Only the acceptor of the connection is notified. The acceptor must
* call AVCTP_ConnectRsp() to either accept or reject the connection.
*
* During this callback, the 'p.remDev' parameter is valid.
*/
#define AVCTP_EVENT_CONNECT_IND 2
/** The transport layer been disconnected.
*
* During this callback, the 'p.remDev' parameter is valid.
*/
#define AVCTP_EVENT_DISCONNECT 3
/** A command was received from the remote AVCTP device (controller).
*
* During this callback, the 'p.cmdFrame' parameter is valid. It contains the
* the AVCTP command header information, including operands. If the "more"
* value is TRUE then this event only signals the first part of the operands.
* Subsequent AVCTP_EVENT_OPERANDS events will follow this event with
* additional operand data.
*/
#define AVCTP_EVENT_COMMAND 4
/** A response was received from the remote AVCTP device (target).
*
* During this callback, the 'p.rspFrame' parameter is valid. It contains the
* the AVCTP response header information, including operands. If the "more"
* value is TRUE then this event only signals the first part of the operands.
* Subsequent AVCTP_EVENT_OPERANDS events will follow this event with
* additional operand data.
*/
#define AVCTP_EVENT_RESPONSE 5
/** The remote device (target) rejected the AVCTP command.
*
* During this callback, the 'p.rspFrame' parameter is valid. It contains the
* the AVCTP reject header information, including operands. If the "more"
* value is TRUE then this event only signals the first part of the operands.
* Subsequent AVCTP_EVENT_OPERANDS events will follow this event with
* additional operand data.
*/
#define AVCTP_EVENT_REJECT 6
/** A command (see AVCTP_SendCommand) or response (see AVCTP_SendResponse)
* has been sent. Memory allocated for the operation can be freed or reused
* after receiving this event.
*
* During this callback, the 'p.cmdFrame' or 'p.rspFrame' parameter associated
* with the sent command or response is valid. In addition, "status" will be
* set to indicate "BT_STATUS_SUCCESS" or "BT_STATUS_FAILED" to indicate
* whether the event was properly delivered.
*/
#define AVCTP_EVENT_TX_DONE 8
/** Additional operand data has been received for the previous
* AVCTP_EVENT_COMMAND or AVCTP_EVENT_RESPONSE.
*
* During this callback, the 'p.cmdFrame' or 'p.rspFrame' parameter associated
* with the received command or response is valid. The "operands" and
* "operandLen" fields indicate the chunk of operands being received for
* the command or response. If the "more" field is set to TRUE, the full
* operand buffer will be received in multiple _OPERANDS events and the
* last operand buffer indicated with the "more" field set to FALSE.
*/
#define AVCTP_EVENT_OPERANDS 9
/* End of AvctpEvent */
#define AVCTP_EVENT_LAST 9
/*---------------------------------------------------------------------------
* AvctpCtype type
*
* This type defines the AV/C ctype (command type) codes.
*/
typedef uint8_t AvctpCtype;
#define AVCTP_CTYPE_CONTROL 0x00
#define AVCTP_CTYPE_STATUS 0x01
#define AVCTP_CTYPE_SPECIFIC_INQUIRY 0x02
#define AVCTP_CTYPE_NOTIFY 0x03
#define AVCTP_CTYPE_GENERAL_INQUIRY 0x04
#define AVCTP_CTYPE_BROWSING 0x80
/* End of AvctpCtype */
/*---------------------------------------------------------------------------
* AvctpResponse type
*
* This type defines the AV/C response codes.
*/
typedef uint8_t AvctpResponse;
#define AVCTP_RESPONSE_NOT_IMPLEMENTED 0x08
#define AVCTP_RESPONSE_ACCEPTED 0x09
#define AVCTP_RESPONSE_REJECTED 0x0A
#define AVCTP_RESPONSE_IN_TRANSITION 0x0B
#define AVCTP_RESPONSE_IMPLEMENTED_STABLE 0x0C
#define AVCTP_RESPONSE_CHANGED 0x0D
#define AVCTP_RESPONSE_INTERIM 0x0F
#define AVCTP_RESPONSE_BROWSING 0x40
/* End of AvctpResponse */
/*---------------------------------------------------------------------------
* AvctpOpcode type
*
* This type defines the AV/C Opcodes.
*/
typedef uint8_t AvctpOpcode;
#define AVCTP_OPCODE_VENDOR_DEPENDENT 0x00
#define AVCTP_OPCODE_UNIT_INFO 0x30
#define AVCTP_OPCODE_SUBUNIT_INFO 0x31
#define AVCTP_OPCODE_PASS_THROUGH 0x7C
/* End of AvctpOpcode */
/* Forward references */
typedef struct _AvctpCallbackParms AvctpCallbackParms;
typedef struct _AvctpChannel AvctpChannel;
typedef struct _AvctpCmdFrame AvctpCmdFrame;
typedef struct _AvctpRspFrame AvctpRspFrame;
/*---------------------------------------------------------------------------
* AvctpCallback type
*
* A function of this type is called to indicate events to the application.
*/
typedef void (*AvctpCallback)(AvctpChannel *chnl, AvctpCallbackParms *Parms);
/* End of AvctpCallback */
/* Forward references */
typedef struct _AvctpConnCallbackParms AvctpConnCallbackParms;
typedef struct _AvctpConn AvctpConn;
/* Conn callback function */
typedef void (*AvctpConnCallback)(AvctpConn *Conn, const AvctpConnCallbackParms *Parms);
/* Conn calback parameters */
struct _AvctpConnCallbackParms {
uint8_t event;
uint16_t dataLen;
BtStatus status;
union {
BtRemoteDevice *remDev;
uint8_t *data;
} ptrs;
};
/* Connection State */
struct _AvctpConn {
uint16_t l2ChannelId;
uint16_t psm;
uint8_t state;
AvctpConnCallback callback;
BtRemoteDevice *remDev;
};
typedef struct _AvtpChannel AvtpChannel;
typedef struct _AvtpCallbackParms AvtpCallbackParms;
/* Channel Manager Callback */
typedef void (*AvtpCallback)(AvtpChannel *chnl, AvtpCallbackParms *Parms);
/* Channel Packet */
typedef struct _AvtpPacket {
ListEntry node;
uint8_t transId;
uint8_t msgType;
uint8_t msgHdrLen;
uint8_t msgHdr[10];
uint8_t txIdSize;
uint16_t txId;
uint16_t txDataLen;
uint8_t *txData;
uint32_t context;
} AvtpPacket;
/* Channel */
struct _AvtpChannel {
uint32_t context;
/* Identifier */
uint16_t rxId;
/* Transmit Packet */
ListEntry avPacketList;
AvtpPacket *curAvPacket;
/* Transmit State */
uint8_t txState;
uint16_t offset;
uint16_t packetSize;
uint8_t txPacketsLeft;
/* Channel Receive State */
uint8_t rxState;
uint8_t rxPacketsLeft;
/* Channel Resources */
BtPacket packet;
uint16_t l2ChannelId;
/* Command Timeout */
uint32_t txTimeout;
EvmTimer txTimer;
/* Channel Callback */
AvtpCallback callback;
};
/* Channel Callback Parameters */
struct _AvtpCallbackParms {
uint8_t event; /* Callback event type */
BtStatus status; /* Transport status */
uint8_t transId; /* Transaction ID */
uint8_t msgType; /* Message type */
uint8_t pktType; /* Packet type */
uint16_t rxId; /* RX ID */
uint8_t packetsLeft; /* Number of packet still to receive */
uint16_t len; /* Length of the current data */
AvtpPacket *packet; /* Pointer to the transmitted packet */
uint8_t *data; /* Pointer to the received data */
};
/****************************************************************************
*
* Data Structures
*
****************************************************************************/
/*---------------------------------------------------------------------------
* AvctpCmdFrame structure
*
* Defines the parameters required for an AVCTP command.
*/
struct _AvctpCmdFrame {
ListEntry node; /* Used internally by AVCTP. */
uint8_t transId; /* Transaction ID */
AvctpCtype ctype; /* 4 bits */
uint8_t subunitType; /* 5 bits */
uint8_t subunitId; /* 3 bits */
AvctpOpcode opcode; /* 8 bits */
uint8_t headerLen; /* Header length */
uint8_t header[6]; /* Header information */
uint16_t operandLen; /* Length of buffer in "operands" */
uint8_t *operands; /* Buffer containing the command data */
int more; /* Indicates whether to expect additional
* frames containing more operand data. */
AvtpPacket avtpPacket; /* For sending over AVTP */
EvmTimer timer; /* Timer for the command */
};
/*---------------------------------------------------------------------------
* AvctpRspFrame structure
*
* Defines the parameters required for an AVCTP response.
*/
struct _AvctpRspFrame {
ListEntry node; /* Used internally by AVCTP. */
uint8_t transId; /* Transaction ID */
AvctpResponse response; /* 4 bits */
uint8_t subunitType; /* 5 bits */
uint8_t subunitId; /* 3 bits */
AvctpOpcode opcode; /* 8 bits */
uint8_t headerLen; /* Header length */
uint8_t header[6]; /* Header information */
uint16_t operandLen; /* Length of buffer in "operands" */
uint8_t *operands; /* Buffer containing the response data */
int more; /* Indicates whether to expect additional
* frames containing more operand data. */
AvtpPacket avtpPacket; /* For sending over AVTP */
EvmTimer padding; /* Timer for the command */
};
/*---------------------------------------------------------------------------
* AvctpChannel structure
*
* Defines the AVCTP channel.
*/
struct _AvctpChannel {
/* === Internal use only === */
ListEntry node;
/* Transmit queue */
ListEntry txQueue;
/* Connection Handle */
AvctpConn conn;
/* Channel Handle */
AvtpChannel avtpChnl;
/* Current Transmitting Command */
void *curCmd;
/* Current Waiting Command ID */
uint8_t curId;
/* Current Transmitting Response */
void *curRsp;
/* Rx Frame */
union {
AvctpCmdFrame cmdFrame;
AvctpRspFrame rspFrame;
} rx;
/* System response packet */
AvtpPacket rspPacket;
/* Transaction ID */
uint8_t txTransId;
/* Receive State */
uint8_t rxState;
/* Transmit State */
uint8_t txState;
/* Application callback function */
AvctpCallback callback;
};
/*---------------------------------------------------------------------------
* AvctpCallbackParms structure
*
* Contains information for the application callback event.
*
*/
struct _AvctpCallbackParms {
/* AVCTP event */
AvctpEvent event;
/* AVCTP channel associated with the event */
AvctpChannel *channel;
/* Status of event (valid only for certain events) */
BtStatus status;
/* Callback parameter object, depending on "event" */
union {
/* Remote device associated with the event */
BtRemoteDevice *remDev;
/* Command frame associated with the event */
AvctpCmdFrame *cmdFrame;
/* Response frame associated with the event */
AvctpRspFrame *rspFrame;
} p;
};
/****************************************************************************
*
* Function Reference
*
****************************************************************************/
#if 0
/*---------------------------------------------------------------------------
* AVCTP_Register()
*
* Registers an application callback to receive AVCTP events. This
* function must be called before any other AVCTP functions.
*
* Parameters:
*
* chnl - Channel structure that receives or initiates connections.
*
* psm - The type of PSM to register (BT_PSM_AVCTP)
*
* callback - Identifies the application function that will be called
* with AVCTP events.
*
* Returns:
* BT_STATUS_SUCCESS - The AVCTP application callback Function was
* successfully registered.
*
* BT_STATUS_IN_USE - The specified channel is already in use.
*
* BT_STATUS_INVALID_PARM - The chnl or Callback parameter does not
* contain a valid pointer (XA_ERROR_CHECK only), or psm is not a
* valid PSM value.
*/
BtStatus AVCTP_Register(AvctpChannel *chnl,
L2capPsmValue psm,
AvctpCallback callback);
/*---------------------------------------------------------------------------
* AVCTP_Deregister()
*
* De-registers the AVCTP callback. After making this call
* successfully, the callback specified in AVCTP_Register will
* receive no further events.
*
* Parameters:
*
* chnl - Channel structure that receives or initiates connections.
*
* Returns:
* BT_STATUS_SUCCESS - The AVCTP callback was successfully deregistered.
*
* BT_STATUS_IN_USE - The specified channel is still in use.
*
* BT_STATUS_NOT_FOUND - An AVCTP callback was not previously registered.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*/
BtStatus AVCTP_Deregister(AvctpChannel *chnl);
/*---------------------------------------------------------------------------
* AVCTP_Connect()
*
* Initiates a signal channel connection to a remote AVCTP device. This
* function is used to establish the lower layer connection (L2CAP), which
* allows sending signal messages. Only one connection can exist between
* two devices.
*
* If the connection attempt is successful, the AVCTP_EVENT_CONNECT event
* will be received. If the connection attempt is unsuccessful, the
* AVCTP_EVENT_DISCONNECT event will be received.
*
* Parameters:
*
* chnl - Channel structure that receives or initiates connections.
*
* remDev - A connected remote device.
*
* Returns:
*
* BT_STATUS_PENDING - The connection process has been successfully
* started. When the connection process is complete, the
* application callback will receive either the AVCTP_EVENT_CONNECT or
* AVCTP_EVENT_DISCONNECT event.
*
* BT_STATUS_IN_USE - The connection already exists.
*
* BT_STATUS_RESTRICTED - A connection of this type already exists with the
* remote device.
*
* BT_STATUS_NOT_FOUND - An AVCTP channel was not previously registered.
*
* BT_STATUS_INVALID_PARM - The chnl or addr parameter does not contain a
* valid pointer (XA_ERROR_CHECK only).
*
* Other - It is possible to receive other error codes, depending on the
* lower layer service in use (L2CAP or Management Entity).
*/
BtStatus AVCTP_Connect(AvctpChannel *chnl, BtRemoteDevice *RemDev);
/*---------------------------------------------------------------------------
* AVCTP_ConnectRsp()
*
* Responds to a connection request from the remote AVCTP device. This
* function is used to establish the lower layer connection (L2CAP),
* which allows sending signaling messages, such as discover,
* configuration, and stream management.
*
* Parameters:
*
* Chnl - A registered and open AVCTP channel.
*
* Accept - TRUE accepts the connect or FALSE rejects the connection.
*
* Returns:
*
* BT_STATUS_PENDING - The connection responses has been successfully
* sent. When the connection process is complete, the application
* callback will receive the AVCTP_EVENT_CONNECT event.
*
* BT_STATUS_BUSY - The connection is already connected.
*
* BT_STATUS_INVALID_PARM - The Chnl parameter does not contain a
* valid pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NOT_FOUND - The specified device was not found in the device
* selector database. The device must be discovered, paired, or added
* manually using DS_AddDevice().
*
* Other - It is possible to receive other error codes, depending on the
* lower layer service in use (L2CAP or Management Entity).
*/
BtStatus AVCTP_ConnectRsp(AvctpChannel *Chnl, int Accept);
/*---------------------------------------------------------------------------
* AVCTP_Disconnect()
*
* Terminates a connection with a remote AVCTP device. The lower layer
* connection (L2CAP) is disconnected.
*
* Parameters:
*
* chnl - A registered and open AVCTP channel.
*
* Returns:
*
* BT_STATUS_PENDING - The disconnect process has been successfully
* started. When the disconnect process is complete, the
* application callback will receive the AVCTP_EVENT_DISCONNECT event.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NO_CONNECTION - No connection exists on the specified
* channel.
*
* BT_STATUS_NOT_FOUND - The specified device was not found in the device
* selector database. The device must be discovered, paired, or added
* manually using DS_AddDevice().
*
* It is possible to receive other error codes, depending on the lower
* layer service in use (L2CAP or Management Entity).
*/
BtStatus AVCTP_Disconnect(AvctpChannel *chnl);
/*---------------------------------------------------------------------------
* AVCTP_SendCommand()
*
* Sends an AVCTP command on the specified channel. The channel must be
* connected and in the open state. The "cmdFrame" parameter must be
* set with valid AVCTP command parameters.
*
* Parameters:
*
* chnl - A registered and open AVCTP channel.
*
* cmdFrame - An AvctpCmdFrame structure initialized with valid
* AVCTP command parameters.
*
* Returns:
*
* BT_STATUS_PENDING - The send command operation has been started
* successfully. When the associated packet has been sent,
* the application callback will receive the AVCTP_EVENT_TX_DONE
* event.
*
* BT_STATUS_IN_USE - The command frame is alread in use on this channel.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NOT_FOUND - The specified channel is not registered.
*/
BtStatus AVCTP_SendCommand(AvctpChannel *chnl, AvctpCmdFrame *cmdFrame);
/*---------------------------------------------------------------------------
* AVCTP_SendResponse()
*
* Sends an AVCTP response on the specified channel. The channel must be
* connected and in the open state. The "rspFrame" parameter must be
* set with valid AVCTP response parameters.
*
* Parameters:
*
* chnl - A registered and open AVCTP channel.
*
* rspFrame - An AvctpRspFrame structure initialized with valid
* AVCTP response parameters.
*
* Returns:
*
* BT_STATUS_PENDING - The send response operation has been started
* successfully. When the associated packet has been sent,
* the application callback will receive the AVCTP_EVENT_TX_DONE
* event.
*
* BT_STATUS_IN_USE - The response frame is alread in use on this channel.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NOT_FOUND - The specified channel is not registered.
*/
BtStatus AVCTP_SendResponse(AvctpChannel *chnl, AvctpRspFrame *rspFrame);
/*---------------------------------------------------------------------------
* AVCTP_GetRemoteDevice()
*
* Returns a pointer to the current remote device.
*
* Parameters:
*
* chnl - An AVCTP channel.
*
* Returns:
*
* A pointer to a remote device.
*/
BtRemoteDevice * AVCTP_RemoteDevice(AvctpChannel *chnl);
#endif
#endif /* __AVCTP_H_ */