/* hci_core.h - Bluetooth HCI core access */ /* * Copyright (c) 2015-2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ /* LL connection parameters */ #define LE_CONN_LATENCY 0x0000 #define LE_CONN_TIMEOUT 0x002a #if defined(CONFIG_BT_BREDR) #define LMP_FEAT_PAGES_COUNT 3 #else #define LMP_FEAT_PAGES_COUNT 1 #endif /* SCO settings */ #define BT_VOICE_CVSD_16BIT 0x0060 /* k_poll event tags */ enum { BT_EVENT_CMD_TX, BT_EVENT_CONN_TX_NOTIFY, BT_EVENT_CONN_TX_QUEUE, }; /* bt_dev flags: the flags defined here represent BT controller state */ enum { BT_DEV_ENABLE, BT_DEV_READY, BT_DEV_ID_STATIC_RANDOM, BT_DEV_HAS_PUB_KEY, BT_DEV_PUB_KEY_BUSY, BT_DEV_ADVERTISING, BT_DEV_KEEP_ADVERTISING, BT_DEV_SCANNING, BT_DEV_EXPLICIT_SCAN, BT_DEV_ACTIVE_SCAN, BT_DEV_SCAN_FILTER_DUP, BT_DEV_RPA_VALID, BT_DEV_ID_PENDING, #if defined(CONFIG_BT_BREDR) BT_DEV_ISCAN, BT_DEV_PSCAN, BT_DEV_INQUIRY, #endif /* CONFIG_BT_BREDR */ /* Total number of flags - must be at the end of the enum */ BT_DEV_NUM_FLAGS, }; struct bt_dev_le { /* LE features */ u8_t features[8]; /* LE states */ u64_t states; #if defined(CONFIG_BT_CONN) /* Controller buffer information */ u16_t mtu; struct k_sem pkts; #endif /* CONFIG_BT_CONN */ #if defined(CONFIG_BT_SMP) /* Size of the the controller resolving list */ u8_t rl_size; /* Number of entries in the resolving list. rl_entries > rl_size * means that host-side resolving is used. */ u8_t rl_entries; #endif /* CONFIG_BT_SMP */ }; #if defined(CONFIG_BT_BREDR) struct bt_dev_br { /* Max controller's acceptable ACL packet length */ u16_t mtu; struct k_sem pkts; u16_t esco_pkt_type; }; #endif /* The theoretical max for these is 8 and 64, but there's no point * in allocating the full memory if we only support a small subset. * These values must be updated whenever the host implementation is * extended beyond the current values. */ #define BT_DEV_VS_FEAT_MAX 1 #define BT_DEV_VS_CMDS_MAX 2 /* State tracking for the local Bluetooth controller */ struct bt_dev { /* Local Identity Address */ bt_addr_le_t id_addr; /* Current local Random Address */ bt_addr_le_t random_addr; /* Controller version & manufacturer information */ u8_t hci_version; u8_t lmp_version; u16_t hci_revision; u16_t lmp_subversion; u16_t manufacturer; /* LMP features (pages 0, 1, 2) */ u8_t features[LMP_FEAT_PAGES_COUNT][8]; /* Supported commands */ u8_t supported_commands[64]; #if defined(CONFIG_BT_HCI_VS_EXT) /* Vendor HCI support */ u8_t vs_features[BT_DEV_VS_FEAT_MAX]; u8_t vs_commands[BT_DEV_VS_CMDS_MAX]; #endif struct k_work init; ATOMIC_DEFINE(flags, BT_DEV_NUM_FLAGS); /* LE controller specific features */ struct bt_dev_le le; #if defined(CONFIG_BT_BREDR) /* BR/EDR controller specific features */ struct bt_dev_br br; #endif /* Number of commands controller can accept */ struct k_sem ncmd_sem; /* Last sent HCI command */ struct net_buf *sent_cmd; #if !defined(CONFIG_BT_RECV_IS_RX_THREAD) /* Queue for incoming HCI events & ACL data */ struct k_fifo rx_queue; #endif /* Queue for high priority HCI events which may unlock waiters * in other threads. Such events include Number of Completed * Packets, as well as the Command Complete/Status events. */ struct k_fifo rx_prio_queue; /* Queue for outgoing HCI commands */ struct k_fifo cmd_tx_queue; /* Registered HCI driver */ const struct bt_hci_driver *drv; #if defined(CONFIG_BT_PRIVACY) /* Local Identity Resolving Key */ u8_t irk[16]; /* Work used for RPA rotation */ struct k_delayed_work rpa_update; #endif }; extern struct bt_dev bt_dev; extern const struct bt_storage *bt_storage; #if defined(CONFIG_BT_SMP) || defined(CONFIG_BT_BREDR) extern const struct bt_conn_auth_cb *bt_auth; #endif /* CONFIG_BT_SMP || CONFIG_BT_BREDR */ bool bt_le_conn_params_valid(const struct bt_le_conn_param *param); struct net_buf *bt_hci_cmd_create(u16_t opcode, u8_t param_len); int bt_hci_cmd_send(u16_t opcode, struct net_buf *buf); int bt_hci_cmd_send_sync(u16_t opcode, struct net_buf *buf, struct net_buf **rsp); int bt_le_scan_update(bool fast_scan); bool bt_addr_le_is_bonded(const bt_addr_le_t *addr); int bt_send(struct net_buf *buf); u16_t bt_hci_get_cmd_opcode(struct net_buf *buf); /* Don't require everyone to include keys.h */ struct bt_keys; int bt_id_add(struct bt_keys *keys); int bt_id_del(struct bt_keys *keys);