257 lines
6.7 KiB
C
257 lines
6.7 KiB
C
/** @file
|
|
* @brief Bluetooth ISO handling
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2020 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_
|
|
#define ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_
|
|
|
|
/**
|
|
* @brief ISO
|
|
* @defgroup bt_iso ISO
|
|
* @ingroup bluetooth
|
|
* @{
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <sys/atomic.h>
|
|
#include <bluetooth/buf.h>
|
|
#include <bluetooth/conn.h>
|
|
#include <bluetooth/hci.h>
|
|
|
|
/** @def BT_ISO_CHAN_SEND_RESERVE
|
|
* @brief Headroom needed for outgoing buffers
|
|
*/
|
|
#define BT_ISO_CHAN_SEND_RESERVE (CONFIG_BT_HCI_RESERVE + \
|
|
BT_HCI_ISO_HDR_SIZE + \
|
|
BT_HCI_ISO_DATA_HDR_SIZE)
|
|
|
|
struct bt_iso_chan;
|
|
|
|
/** @brief Life-span states of ISO channel. Used only by internal APIs
|
|
* dealing with setting channel to proper state depending on operational
|
|
* context.
|
|
*/
|
|
enum {
|
|
/** Channel disconnected */
|
|
BT_ISO_DISCONNECTED,
|
|
/** Channel bound to a connection */
|
|
BT_ISO_BOUND,
|
|
/** Channel in connecting state */
|
|
BT_ISO_CONNECT,
|
|
/** Channel ready for upper layer traffic on it */
|
|
BT_ISO_CONNECTED,
|
|
/** Channel in disconnecting state */
|
|
BT_ISO_DISCONNECT,
|
|
};
|
|
|
|
/** @brief ISO Channel structure. */
|
|
struct bt_iso_chan {
|
|
/** Channel connection reference */
|
|
struct bt_conn *conn;
|
|
/** Channel operations reference */
|
|
struct bt_iso_chan_ops *ops;
|
|
/** Channel QoS reference */
|
|
struct bt_iso_chan_qos *qos;
|
|
/** Channel data path reference*/
|
|
struct bt_iso_chan_path *path;
|
|
sys_snode_t node;
|
|
uint8_t state;
|
|
bt_security_t required_sec_level;
|
|
};
|
|
|
|
/** @brief Audio QoS direction */
|
|
enum {
|
|
BT_ISO_CHAN_QOS_IN,
|
|
BT_ISO_CHAN_QOS_OUT,
|
|
BT_ISO_CHAN_QOS_INOUT
|
|
};
|
|
|
|
/** @brief ISO Channel QoS structure. */
|
|
struct bt_iso_chan_qos {
|
|
/** @brief Channel direction
|
|
*
|
|
* Possible values: BT_ISO_CHAN_QOS_IN, BT_ISO_CHAN_QOS_OUT or
|
|
* BT_ISO_CHAN_QOS_INOUT.
|
|
*/
|
|
uint8_t dir;
|
|
/** Channel interval */
|
|
uint32_t interval;
|
|
/** Channel SCA */
|
|
uint8_t sca;
|
|
/** Channel packing mode */
|
|
uint8_t packing;
|
|
/** Channel framing mode */
|
|
uint8_t framing;
|
|
/** Channel Latency */
|
|
uint16_t latency;
|
|
/** Channel SDU */
|
|
uint8_t sdu;
|
|
/** Channel PHY */
|
|
uint8_t phy;
|
|
/** Channel Retransmission Number */
|
|
uint8_t rtn;
|
|
};
|
|
|
|
/** @brief ISO Channel Data Path structure. */
|
|
struct bt_iso_chan_path {
|
|
/** Default path ID */
|
|
uint8_t pid;
|
|
/** Coding Format */
|
|
uint8_t format;
|
|
/** Company ID */
|
|
uint16_t cid;
|
|
/** Vendor-defined Codec ID */
|
|
uint16_t vid;
|
|
/** Controller Delay */
|
|
uint32_t delay;
|
|
/** Codec Configuration length*/
|
|
uint8_t cc_len;
|
|
/** Codec Configuration */
|
|
uint8_t cc[0];
|
|
};
|
|
|
|
/** @brief ISO Channel operations structure. */
|
|
struct bt_iso_chan_ops {
|
|
/** @brief Channel connected callback
|
|
*
|
|
* If this callback is provided it will be called whenever the
|
|
* connection completes.
|
|
*
|
|
* @param chan The channel that has been connected
|
|
*/
|
|
void (*connected)(struct bt_iso_chan *chan);
|
|
|
|
/** @brief Channel disconnected callback
|
|
*
|
|
* If this callback is provided it will be called whenever the
|
|
* channel is disconnected, including when a connection gets
|
|
* rejected.
|
|
*
|
|
* @param chan The channel that has been Disconnected
|
|
*/
|
|
void (*disconnected)(struct bt_iso_chan *chan);
|
|
|
|
/** @brief Channel alloc_buf callback
|
|
*
|
|
* If this callback is provided the channel will use it to allocate
|
|
* buffers to store incoming data.
|
|
*
|
|
* @param chan The channel requesting a buffer.
|
|
*
|
|
* @return Allocated buffer.
|
|
*/
|
|
struct net_buf *(*alloc_buf)(struct bt_iso_chan *chan);
|
|
|
|
/** @brief Channel recv callback
|
|
*
|
|
* @param chan The channel receiving data.
|
|
* @param buf Buffer containing incoming data.
|
|
*/
|
|
void (*recv)(struct bt_iso_chan *chan, struct net_buf *buf);
|
|
};
|
|
|
|
/** @brief ISO Server structure. */
|
|
struct bt_iso_server {
|
|
/** Required minimim security level */
|
|
bt_security_t sec_level;
|
|
|
|
/** @brief Server accept callback
|
|
*
|
|
* This callback is called whenever a new incoming connection requires
|
|
* authorization.
|
|
*
|
|
* @param conn The connection that is requesting authorization
|
|
* @param chan Pointer to receive the allocated channel
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
int (*accept)(struct bt_conn *conn, struct bt_iso_chan **chan);
|
|
};
|
|
|
|
/** @brief Register ISO server.
|
|
*
|
|
* Register ISO server, each new connection is authorized using the accept()
|
|
* callback which in case of success shall allocate the channel structure
|
|
* to be used by the new connection.
|
|
*
|
|
* @param server Server structure.
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
int bt_iso_server_register(struct bt_iso_server *server);
|
|
|
|
/** @brief Bind ISO channels
|
|
*
|
|
* Bind ISO channels with existing ACL connections, Channel objects passed
|
|
* (over an address of it) shouldn't be instantiated in application as
|
|
* standalone.
|
|
*
|
|
* @param conns Array of ACL connection objects
|
|
* @param num_conns Number of connection objects
|
|
* @param chans Array of ISO Channel objects to be created
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
int bt_iso_chan_bind(struct bt_conn **conns, uint8_t num_conns,
|
|
struct bt_iso_chan **chans);
|
|
|
|
/** @brief Connect ISO channels
|
|
*
|
|
* Connect ISO channels, once the connection is completed each channel
|
|
* connected() callback will be called. If the connection is rejected
|
|
* disconnected() callback is called instead.
|
|
* Channel object passed (over an address of it) as second parameter shouldn't
|
|
* be instantiated in application as standalone.
|
|
*
|
|
* @param chans Array of ISO channel objects
|
|
* @param num_chans Number of channel objects
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
int bt_iso_chan_connect(struct bt_iso_chan **chans, uint8_t num_chans);
|
|
|
|
/** @brief Disconnect ISO channel
|
|
*
|
|
* Disconnect ISO channel, if the connection is pending it will be
|
|
* canceled and as a result the channel disconnected() callback is called.
|
|
* Regarding to input parameter, to get details see reference description
|
|
* to bt_iso_chan_connect() API above.
|
|
*
|
|
* @param chan Channel object.
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
int bt_iso_chan_disconnect(struct bt_iso_chan *chan);
|
|
|
|
/** @brief Send data to ISO channel
|
|
*
|
|
* Send data from buffer to the channel. If credits are not available, buf will
|
|
* be queued and sent as and when credits are received from peer.
|
|
* Regarding to first input parameter, to get details see reference description
|
|
* to bt_iso_chan_connect() API above.
|
|
*
|
|
* @param chan Channel object.
|
|
* @param buf Buffer containing data to be sent.
|
|
*
|
|
* @return Bytes sent in case of success or negative value in case of error.
|
|
*/
|
|
int bt_iso_chan_send(struct bt_iso_chan *chan, struct net_buf *buf);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_ */
|