| /* |
| * Copyright (c) 2016-2018 Nordic Semiconductor ASA |
| * Copyright (c) 2016 Vinayak Kariappa Chettimada |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /***************************************************************************** |
| * Zephyr Kconfig defined |
| ****************************************************************************/ |
| #ifdef CONFIG_BT_MAX_CONN |
| #define RADIO_CONNECTION_CONTEXT_MAX CONFIG_BT_MAX_CONN |
| #else |
| #define RADIO_CONNECTION_CONTEXT_MAX 0 |
| #endif |
| |
| #ifdef CONFIG_BT_CTLR_RX_BUFFERS |
| #define RADIO_PACKET_COUNT_RX_MAX CONFIG_BT_CTLR_RX_BUFFERS |
| #endif |
| |
| #ifdef CONFIG_BT_CTLR_TX_BUFFERS |
| #define RADIO_PACKET_COUNT_TX_MAX CONFIG_BT_CTLR_TX_BUFFERS |
| #endif |
| |
| #ifdef CONFIG_BT_CTLR_TX_BUFFER_SIZE |
| #define RADIO_PACKET_TX_DATA_SIZE CONFIG_BT_CTLR_TX_BUFFER_SIZE |
| #endif |
| |
| /***************************************************************************** |
| * Timer Resources (Controller defined) |
| ****************************************************************************/ |
| #define RADIO_TICKER_ID_EVENT 0 |
| #define RADIO_TICKER_ID_MARKER_0 1 |
| #define RADIO_TICKER_ID_PRE_EMPT 2 |
| #define RADIO_TICKER_ID_ADV_STOP 3 |
| #define RADIO_TICKER_ID_SCAN_STOP 4 |
| #define RADIO_TICKER_ID_ADV 5 |
| #define RADIO_TICKER_ID_SCAN 6 |
| #define RADIO_TICKER_ID_FIRST_CONNECTION 7 |
| |
| #define RADIO_TICKER_INSTANCE_ID_RADIO 0 |
| #define RADIO_TICKER_INSTANCE_ID_APP 1 |
| |
| #define RADIO_TICKER_USERS 3 |
| |
| #define RADIO_TICKER_USER_ID_WORKER MAYFLY_CALL_ID_0 |
| #define RADIO_TICKER_USER_ID_JOB MAYFLY_CALL_ID_1 |
| #define RADIO_TICKER_USER_ID_APP MAYFLY_CALL_ID_PROGRAM |
| |
| #define RADIO_TICKER_USER_WORKER_OPS (7 + 1) |
| #define RADIO_TICKER_USER_JOB_OPS (2 + 1) |
| #define RADIO_TICKER_USER_APP_OPS (1 + 1) |
| #define RADIO_TICKER_USER_OPS (RADIO_TICKER_USER_WORKER_OPS + \ |
| RADIO_TICKER_USER_JOB_OPS + \ |
| RADIO_TICKER_USER_APP_OPS) |
| |
| #define RADIO_TICKER_NODES (RADIO_TICKER_ID_FIRST_CONNECTION + \ |
| RADIO_CONNECTION_CONTEXT_MAX) |
| |
| /***************************************************************************** |
| * Controller Interface Defines |
| ****************************************************************************/ |
| #if defined(CONFIG_BT_CTLR_WORKER_PRIO) |
| #define RADIO_TICKER_USER_ID_WORKER_PRIO CONFIG_BT_CTLR_WORKER_PRIO |
| #else |
| #define RADIO_TICKER_USER_ID_WORKER_PRIO 0 |
| #endif |
| |
| #if defined(CONFIG_BT_CTLR_JOB_PRIO) |
| #define RADIO_TICKER_USER_ID_JOB_PRIO CONFIG_BT_CTLR_JOB_PRIO |
| #else |
| #define RADIO_TICKER_USER_ID_JOB_PRIO 0 |
| #endif |
| |
| /***************************************************************************** |
| * Controller Reference Defines (compile time override-able) |
| ****************************************************************************/ |
| /* Implementation default L2CAP MTU */ |
| #ifndef RADIO_L2CAP_MTU_MAX |
| #define RADIO_L2CAP_MTU_MAX (LL_LENGTH_OCTETS_RX_MAX - 4) |
| #endif |
| |
| /* Maximise L2CAP MTU to LL data PDU size */ |
| #if (RADIO_L2CAP_MTU_MAX < (LL_LENGTH_OCTETS_RX_MAX - 4)) |
| #undef RADIO_L2CAP_MTU_MAX |
| #define RADIO_L2CAP_MTU_MAX (LL_LENGTH_OCTETS_RX_MAX - 4) |
| #endif |
| |
| /* Maximum LL PDU Receive pool size. */ |
| #ifndef RADIO_PACKET_COUNT_RX_MAX |
| #define RADIO_PACKET_COUNT_RX ((RADIO_L2CAP_MTU_MAX + \ |
| LL_LENGTH_OCTETS_RX_MAX + 3) / \ |
| LL_LENGTH_OCTETS_RX_MAX) |
| #define RADIO_PACKET_COUNT_RX_MAX (RADIO_PACKET_COUNT_RX + \ |
| ((RADIO_CONNECTION_CONTEXT_MAX - 1) * \ |
| (RADIO_PACKET_COUNT_RX - 1))) |
| #endif /* RADIO_PACKET_COUNT_RX_MAX */ |
| |
| /* Maximum LL PDU Transmit pool size and application tx count. */ |
| #ifndef RADIO_PACKET_COUNT_TX_MAX |
| #define RADIO_PACKET_COUNT_APP_TX_MAX RADIO_CONNECTION_CONTEXT_MAX |
| #define RADIO_PACKET_COUNT_TX_MAX (RADIO_PACKET_COUNT_RX_MAX + \ |
| RADIO_PACKET_COUNT_APP_TX_MAX) |
| #else |
| #define RADIO_PACKET_COUNT_APP_TX_MAX (RADIO_PACKET_COUNT_TX_MAX) |
| #endif |
| |
| /* Tx Data Size */ |
| #if !defined(RADIO_PACKET_TX_DATA_SIZE) || \ |
| (RADIO_PACKET_TX_DATA_SIZE < RADIO_LL_LENGTH_OCTETS_RX_MIN) |
| #define RADIO_PACKET_TX_DATA_SIZE RADIO_LL_LENGTH_OCTETS_RX_MIN |
| #endif |
| |
| /***************************************************************************** |
| * Controller Interface Structures |
| ****************************************************************************/ |
| struct radio_adv_data { |
| u8_t data[DOUBLE_BUFFER_SIZE][PDU_AC_SIZE_MAX]; |
| u8_t first; |
| u8_t last; |
| }; |
| |
| struct radio_pdu_node_tx { |
| void *next; |
| u8_t pdu_data[1]; |
| }; |
| |
| struct radio_le_conn_cmplt { |
| u8_t status; |
| u8_t role; |
| u8_t peer_addr_type; |
| u8_t peer_addr[BDADDR_SIZE]; |
| #if defined(CONFIG_BT_CTLR_PRIVACY) |
| u8_t peer_rpa[BDADDR_SIZE]; |
| u8_t own_addr_type; |
| u8_t own_addr[BDADDR_SIZE]; |
| #endif /* CONFIG_BT_CTLR_PRIVACY */ |
| u16_t interval; |
| u16_t latency; |
| u16_t timeout; |
| u8_t mca; |
| }; |
| |
| struct radio_le_conn_update_cmplt { |
| u8_t status; |
| u16_t interval; |
| u16_t latency; |
| u16_t timeout; |
| }; |
| |
| struct radio_le_chan_sel_algo { |
| u8_t chan_sel_algo; |
| }; |
| |
| struct radio_le_phy_upd_cmplt { |
| u8_t status; |
| u8_t tx; |
| u8_t rx; |
| }; |
| |
| struct radio_pdu_node_rx_hdr { |
| union { |
| sys_snode_t node; /* used by slist */ |
| void *next; /* used also by k_fifo once pulled */ |
| void *link; |
| u8_t packet_release_last; |
| }; |
| |
| enum node_rx_type type; |
| u16_t handle; |
| }; |
| |
| struct radio_pdu_node_rx { |
| struct radio_pdu_node_rx_hdr hdr; |
| u8_t pdu_data[1]; |
| }; |
| |
| /***************************************************************************** |
| * Controller Interface Functions |
| ****************************************************************************/ |
| /* Downstream */ |
| u32_t radio_init(void *hf_clock, u8_t sca, void *entropy, |
| u8_t connection_count_max, |
| u8_t rx_count_max, u8_t tx_count_max, |
| u16_t packet_data_octets_max, |
| u16_t packet_tx_data_size, u8_t *mem_radio, |
| u16_t mem_size); |
| struct device *radio_hf_clock_get(void); |
| void radio_ticks_active_to_start_set(u32_t ticks_active_to_start); |
| /* Downstream - Advertiser */ |
| struct radio_adv_data *radio_adv_data_get(void); |
| struct radio_adv_data *radio_scan_data_get(void); |
| |
| #if defined(CONFIG_BT_HCI_MESH_EXT) |
| #if defined(CONFIG_BT_CTLR_ADV_EXT) |
| u32_t radio_adv_enable(u8_t phy_p, u16_t interval, u8_t chan_map, |
| u8_t filter_policy, u8_t rl_idx, |
| #else /* !CONFIG_BT_CTLR_ADV_EXT */ |
| u32_t radio_adv_enable(u16_t interval, u8_t chan_map, u8_t filter_policy, |
| u8_t rl_idx, |
| #endif /* !CONFIG_BT_CTLR_ADV_EXT */ |
| u8_t at_anchor, u32_t ticks_anchor, u8_t retry, |
| u8_t scan_window, u8_t scan_delay); |
| #else /* !CONFIG_BT_HCI_MESH_EXT */ |
| #if defined(CONFIG_BT_CTLR_ADV_EXT) |
| u32_t radio_adv_enable(u8_t phy_p, u16_t interval, u8_t chan_map, |
| u8_t filter_policy, u8_t rl_idx); |
| #else /* !CONFIG_BT_CTLR_ADV_EXT */ |
| u32_t radio_adv_enable(u16_t interval, u8_t chan_map, u8_t filter_policy, |
| u8_t rl_idx); |
| #endif /* !CONFIG_BT_CTLR_ADV_EXT */ |
| #endif /* !CONFIG_BT_HCI_MESH_EXT */ |
| |
| u8_t radio_adv_disable(void); |
| u32_t ll_adv_is_enabled(u16_t handle); |
| u32_t radio_adv_filter_pol_get(void); |
| /* Downstream - Scanner */ |
| u32_t radio_scan_enable(u8_t type, u8_t init_addr_type, u8_t *init_addr, |
| u16_t interval, u16_t window, u8_t filter_policy, |
| u8_t rpa_gen, u8_t rl_idx); |
| u8_t radio_scan_disable(bool scanner); |
| u32_t ll_scan_is_enabled(u16_t handle); |
| u32_t radio_scan_filter_pol_get(void); |
| |
| u32_t radio_connect_enable(u8_t adv_addr_type, u8_t *adv_addr, |
| u16_t interval, u16_t latency, |
| u16_t timeout); |
| /* Upstream */ |
| u8_t radio_rx_fc_set(u16_t handle, u8_t fc); |
| u8_t radio_rx_fc_get(u16_t *handle); |
| |
| /* Callbacks */ |
| extern void radio_active_callback(u8_t active); |
| extern void radio_event_callback(void); |
| extern void ll_adv_scan_state_cb(u8_t bm); |