blob: cc0843fb7e39c9d2cb0291a7717e4b477456edc4 [file] [log] [blame]
/* hci.h - Bluetooth Host Control Interface definitions */
/*
* Copyright (c) 2015-2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_HCI_H_
#define ZEPHYR_INCLUDE_BLUETOOTH_HCI_H_
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/net_buf.h>
#include <zephyr/bluetooth/addr.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/hci_types.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Converts a HCI error to string.
*
* The error codes are described in the Bluetooth Core specification,
* Vol 1, Part F, Section 2.
*
* The HCI documentation found in Vol 4, Part E,
* describes when the different error codes are used.
*
* See also the defined BT_HCI_ERR_* macros.
*
* @return The string representation of the HCI error code.
* If @kconfig{CONFIG_BT_HCI_ERR_TO_STR} is not enabled,
* this just returns the empty string
*/
#if defined(CONFIG_BT_HCI_ERR_TO_STR)
const char *bt_hci_err_to_str(uint8_t hci_err);
#else
#include <zephyr/toolchain.h>
static inline const char *bt_hci_err_to_str(uint8_t hci_err)
{
ARG_UNUSED(hci_err);
return "";
}
#endif
/** Allocate a HCI command buffer.
*
* This function allocates a new buffer for a HCI command. It is given
* the OpCode (encoded e.g. using the BT_OP macro) and the total length
* of the parameters. Upon successful return the buffer is ready to have
* the parameters encoded into it.
*
* @deprecated Use bt_hci_cmd_alloc() instead.
*
* @param opcode Command OpCode.
* @param param_len Length of command parameters.
*
* @return Newly allocated buffer.
*/
__deprecated struct net_buf *bt_hci_cmd_create(uint16_t opcode, uint8_t param_len);
/** Allocate an HCI command buffer.
*
* This function allocates a new buffer for an HCI command. Upon successful
* return the buffer is ready to have the command parameters encoded into it.
* Sufficient headroom gets automatically reserved in the buffer, allowing
* the actual command and H:4 headers to be encoded later, as part of
* calling bt_hci_cmd_send() or bt_hci_cmd_send_sync().
*
* @param timeout Timeout for the allocation.
*
* @return Newly allocated buffer or NULL if allocation failed.
*/
struct net_buf *bt_hci_cmd_alloc(k_timeout_t timeout);
/** Send a HCI command asynchronously.
*
* This function is used for sending a HCI command asynchronously. It can
* either be called for a buffer created using bt_hci_cmd_alloc(), or
* if the command has no parameters a NULL can be passed instead. The
* sending of the command will happen asynchronously, i.e. upon successful
* return from this function the caller only knows that it was queued
* successfully.
*
* If synchronous behavior, and retrieval of the Command Complete parameters
* is desired, the bt_hci_cmd_send_sync() API should be used instead.
*
* @param opcode Command OpCode.
* @param buf Command buffer or NULL (if no parameters).
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_cmd_send(uint16_t opcode, struct net_buf *buf);
/** Send a HCI command synchronously.
*
* This function is used for sending a HCI command synchronously. It can
* either be called for a buffer created using bt_hci_cmd_alloc(), or
* if the command has no parameters a NULL can be passed instead.
*
* The function will block until a Command Status or a Command Complete
* event is returned. If either of these have a non-zero status the function
* will return a negative error code and the response reference will not
* be set. If the command completed successfully and a non-NULL rsp parameter
* was given, this parameter will be set to point to a buffer containing
* the response parameters.
*
* @param opcode Command OpCode.
* @param buf Command buffer or NULL (if no parameters).
* @param rsp Place to store a reference to the command response. May
* be NULL if the caller is not interested in the response
* parameters. If non-NULL is passed the caller is responsible
* for calling net_buf_unref() on the buffer when done parsing
* it.
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_cmd_send_sync(uint16_t opcode, struct net_buf *buf,
struct net_buf **rsp);
/** @brief Get connection handle for a connection.
*
* @param conn Connection object.
* @param conn_handle Place to store the Connection handle.
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_get_conn_handle(const struct bt_conn *conn, uint16_t *conn_handle);
/** @brief Get connection given a connection handle.
*
* The caller gets a new reference to the connection object which must be
* released with bt_conn_unref() once done using the object.
*
* @param handle The connection handle
*
* @returns The corresponding connection object on success.
* NULL if it does not exist.
*/
struct bt_conn *bt_hci_conn_lookup_handle(uint16_t handle);
/** @brief Get advertising handle for an advertising set.
*
* @param adv Advertising set.
* @param adv_handle Place to store the advertising handle.
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_get_adv_handle(const struct bt_le_ext_adv *adv, uint8_t *adv_handle);
/** @brief Get advertising set given an advertising handle
*
* @param handle The advertising handle
*
* @returns The corresponding advertising set on success,
* NULL if it does not exist.
*/
struct bt_le_ext_adv *bt_hci_adv_lookup_handle(uint8_t handle);
/** @brief Get periodic advertising sync handle.
*
* @param sync Periodic advertising sync set.
* @param sync_handle Place to store the periodic advertising sync handle.
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_get_adv_sync_handle(const struct bt_le_per_adv_sync *sync, uint16_t *sync_handle);
/** @brief Get periodic advertising sync given an periodic advertising sync handle.
*
* @param handle The periodic sync set handle
*
* @retval The corresponding periodic advertising sync set object on success,
* NULL if it does not exist.
*/
struct bt_le_per_adv_sync *bt_hci_per_adv_sync_lookup_handle(uint16_t handle);
/** @brief Obtain the version string given a core version number.
*
* The core version of a controller can be obtained by issuing
* the HCI Read Local Version Information command.
*
* See also the defines prefixed with BT_HCI_VERSION_.
*
* @param core_version The core version.
*
* @return Version string corresponding to the core version number.
*/
const char *bt_hci_get_ver_str(uint8_t core_version);
/** @typedef bt_hci_vnd_evt_cb_t
* @brief Callback type for vendor handling of HCI Vendor-Specific Events.
*
* A function of this type is registered with bt_hci_register_vnd_evt_cb()
* and will be called for any HCI Vendor-Specific Event.
*
* @param buf Buffer containing event parameters.
*
* @return true if the function handles the event or false to defer the
* handling of this event back to the stack.
*/
typedef bool bt_hci_vnd_evt_cb_t(struct net_buf_simple *buf);
/** Register user callback for HCI Vendor-Specific Events
*
* @param cb Callback to be called when the stack receives a
* HCI Vendor-Specific Event.
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_register_vnd_evt_cb(bt_hci_vnd_evt_cb_t cb);
/** @brief Get Random bytes from the LE Controller.
*
* Send the HCI_LE_Rand to the LE Controller as many times as required to
* fill the provided @p buffer.
*
* @note This function is provided as a helper to gather an arbitrary number of
* random bytes from an LE Controller using the HCI_LE_Rand command.
*
* @param buffer Buffer to fill with random bytes.
* @param len Length of the buffer in bytes.
*
* @return 0 on success or negative error value on failure.
*/
int bt_hci_le_rand(void *buffer, size_t len);
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_HCI_H_ */