Bluetooth: controller: Conditional compile BT_LL_SW variant

Refactor Kconfig and CMakelists.txt to be able to
conditionally compile in BT_LL_SW variant in the controller
subsystem. This is done to support future controller with
vendor specific variant implementations.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2018-01-09 15:17:15 +01:00 committed by Carles Cufí
commit 5b0cd2c69b
10 changed files with 153 additions and 80 deletions

View file

@ -4,32 +4,57 @@ zephyr_library_sources(
util/memq.c
util/mayfly.c
util/util.c
hal/nrf5/cntr.c
hal/nrf5/rand.c
hal/nrf5/ecb.c
hal/nrf5/radio/radio.c
ticker/ticker.c
ll_sw/ctrl.c
ll_sw/crypto.c
ll_sw/ll.c
ll_sw/ll_filter.c
ll_sw/ll_addr.c
ll_sw/ll_tx_pwr.c
crypto/crypto.c
hci/hci_driver.c
hci/hci.c
)
zephyr_library_sources_ifdef(CONFIG_BT_BROADCASTER ll_sw/ll_adv.c)
zephyr_library_sources_ifdef(CONFIG_BT_OBSERVER ll_sw/ll_scan.c)
zephyr_library_sources_ifdef(CONFIG_BT_CENTRAL ll_sw/ll_master.c)
zephyr_library_sources_ifdef(CONFIG_BT_CTLR_DTM ll_sw/ll_test.c)
if(CONFIG_BT_LL_SW)
zephyr_library_sources(
ll_sw/ctrl.c
ll_sw/ll.c
)
zephyr_library_sources_ifdef(
CONFIG_BT_BROADCASTER
ll_sw/ll_adv.c
)
zephyr_library_sources_ifdef(
CONFIG_BT_OBSERVER
ll_sw/ll_scan.c
)
zephyr_library_sources_ifdef(
CONFIG_BT_CENTRAL
ll_sw/ll_master.c
)
zephyr_library_sources_ifdef(
CONFIG_BT_CTLR_DTM
ll_sw/ll_test.c
)
endif()
zephyr_library_sources_ifdef(
CONFIG_BT_CTLR_FILTER
ll_sw/ll_filter.c
)
zephyr_library_sources_ifdef(
CONFIG_SOC_FAMILY_NRF5
hal/nrf5/cntr.c
hal/nrf5/rand.c
hal/nrf5/ecb.c
hal/nrf5/radio/radio.c
)
zephyr_library_include_directories(
.
util
hal
ticker
ll
include
)
)
zephyr_library_compile_options_ifdef(
CONFIG_BT_CTLR_FAST_ENC

View file

@ -22,7 +22,7 @@ choice
Select the Bluetooth Link Layer to compile.
config BT_LL_SW
bool "Use the software-based BLE Link Layer"
bool "Software-based BLE Link Layer"
help
Use Zephyr software BLE Link Layer implementation.
@ -30,6 +30,24 @@ endchoice
comment "BLE Controller configuration"
config BT_CTLR_RX_PRIO_STACK_SIZE
# Hidden option for Controller's Co-Operative high priority Rx thread
# stack size.
int
default 448
config BT_CTLR_RX_PRIO
# Hidden option for Controller's Co-Operative high priority Rx thread
# priority.
int
default 6
config BT_CTLR_FILTER
# Hidden option to enable controller whitelist feature
depends on BT_LL_SW
bool
default y
config BT_CTLR_HCI_VS_BUILD_INFO
string "Zephyr HCI VS Build Info string"
default ""
@ -41,6 +59,7 @@ config BT_CTLR_HCI_VS_BUILD_INFO
character is required at the beginning to separate it from the
already included information.
if BT_LL_SW
config BT_CTLR_DUP_FILTER_LEN
prompt "Number of addresses in the scan duplicate filter"
int
@ -102,16 +121,6 @@ config BT_CTLR_SUBVERSION_NUMBER
help
Set the Subversion Number that will be used in VERSION_IND PDU.
config BT_CTLR_RX_PRIO_STACK_SIZE
int
default 448
config BT_CTLR_RX_PRIO
# Hidden option for Controller's Co-Operative high priority Rx thread
# priority.
int
default 6
comment "BLE Controller features"
if BT_CONN
@ -462,6 +471,8 @@ config BT_CTLR_PA_LNA_GPIOTE_CHAN
help
Select the nRF5 GPIOTE channel to use for PA/LNA GPIO feature.
endif # BT_LL_SW
comment "BLE Controller debug configuration"
config BT_CTLR_ASSERT_HANDLER

View file

@ -385,7 +385,7 @@ static void read_tx_power_level(struct net_buf *buf, struct net_buf **evt)
rp = cmd_complete(evt, sizeof(*rp));
status = ll_tx_power_level_get(handle, type, &rp->tx_power_level);
status = ll_tx_pwr_lvl_get(handle, type, &rp->tx_power_level);
rp->status = (!status) ? 0x00 : BT_HCI_ERR_UNKNOWN_CONN_ID;
rp->handle = sys_cpu_to_le16(handle);
}
@ -703,6 +703,7 @@ static void le_set_random_address(struct net_buf *buf, struct net_buf **evt)
ccst->status = 0x00;
}
#if defined(CONFIG_BT_CTLR_FILTER)
static void le_read_wl_size(struct net_buf *buf, struct net_buf **evt)
{
struct bt_hci_rp_le_read_wl_size *rp;
@ -744,6 +745,7 @@ static void le_rem_dev_from_wl(struct net_buf *buf, struct net_buf **evt)
ccst = cmd_complete(evt, sizeof(*ccst));
ccst->status = status;
}
#endif /* CONFIG_BT_CTLR_FILTER */
static void le_encrypt(struct net_buf *buf, struct net_buf **evt)
{
@ -1369,7 +1371,7 @@ static void le_read_tx_power(struct net_buf *buf, struct net_buf **evt)
rp = cmd_complete(evt, sizeof(*rp));
rp->status = 0x00;
ll_tx_power_get(&rp->min_tx_power, &rp->max_tx_power);
ll_tx_pwr_get(&rp->min_tx_power, &rp->max_tx_power);
}
#if defined(CONFIG_BT_CTLR_DTM_HCI)
@ -1456,6 +1458,7 @@ static int controller_cmd_handle(u16_t ocf, struct net_buf *cmd,
le_set_random_address(cmd, evt);
break;
#if defined(CONFIG_BT_CTLR_FILTER)
case BT_OCF(BT_HCI_OP_LE_READ_WL_SIZE):
le_read_wl_size(cmd, evt);
break;
@ -1471,6 +1474,7 @@ static int controller_cmd_handle(u16_t ocf, struct net_buf *cmd,
case BT_OCF(BT_HCI_OP_LE_REM_DEV_FROM_WL):
le_rem_dev_from_wl(cmd, evt);
break;
#endif /* CONFIG_BT_CTLR_FILTER */
case BT_OCF(BT_HCI_OP_LE_ENCRYPT):
le_encrypt(cmd, evt);

View file

@ -139,7 +139,10 @@ static inline struct net_buf *encode_node(struct radio_pdu_node_rx *node_rx,
break;
}
#if defined(CONFIG_BT_LL_SW)
radio_rx_fc_set(node_rx->hdr.handle, 0);
#endif /* CONFIG_BT_LL_SW */
node_rx->hdr.onion.next = 0;
radio_rx_mem_release(&node_rx);

View file

@ -73,26 +73,20 @@ u32_t ll_version_ind_send(u16_t handle);
u32_t ll_terminate_ind_send(u16_t handle, u8_t reason);
void ll_timeslice_ticker_id_get(u8_t * const instance_index, u8_t * const user_id);
u32_t ll_rssi_get(u16_t handle, u8_t *rssi);
u32_t ll_tx_power_level_get(u16_t handle, u8_t type, s8_t *tx_power_level);
void ll_tx_power_get(s8_t *min, s8_t *max);
u32_t ll_tx_pwr_lvl_get(u16_t handle, u8_t type, s8_t *tx_pwr_lvl);
void ll_tx_pwr_get(s8_t *min, s8_t *max);
#if defined(CONFIG_BT_CTLR_LE_PING)
u32_t ll_apto_get(u16_t handle, u16_t *apto);
u32_t ll_apto_set(u16_t handle, u16_t apto);
#endif /* CONFIG_BT_CTLR_LE_PING */
#if defined(CONFIG_BT_CTLR_DATA_LENGTH)
u32_t ll_length_req_send(u16_t handle, u16_t tx_octets, u16_t tx_time);
void ll_length_default_get(u16_t *max_tx_octets, u16_t *max_tx_time);
u32_t ll_length_default_set(u16_t max_tx_octets, u16_t max_tx_time);
void ll_length_max_get(u16_t *max_tx_octets, u16_t *max_tx_time,
u16_t *max_rx_octets, u16_t *max_rx_time);
#endif /* CONFIG_BT_CTLR_DATA_LENGTH */
#if defined(CONFIG_BT_CTLR_PHY)
u32_t ll_phy_get(u16_t handle, u8_t *tx, u8_t *rx);
u32_t ll_phy_default_set(u8_t tx, u8_t rx);
u32_t ll_phy_req_send(u16_t handle, u8_t tx, u8_t flags, u8_t rx);
#endif /* CONFIG_BT_CTLR_PHY */
#endif /* _LL_H_ */

View file

@ -10661,7 +10661,7 @@ u32_t ll_terminate_ind_send(u16_t handle, u8_t reason)
return 0;
}
u32_t ll_tx_power_level_get(u16_t handle, u8_t type, s8_t *tx_power_level)
u32_t ll_tx_pwr_lvl_get(u16_t handle, u8_t type, s8_t *tx_pwr_lvl)
{
struct connection *conn;
@ -10672,19 +10672,12 @@ u32_t ll_tx_power_level_get(u16_t handle, u8_t type, s8_t *tx_power_level)
/*TODO: check type here for current or maximum */
/* We only support one TX Power Level: 0dBm */
*tx_power_level = 0;
/* TODO: Support TX Power Level other than 0dBm */
*tx_pwr_lvl = 0;
return 0;
}
void ll_tx_power_get(s8_t *min, s8_t *max)
{
/* We only support one TX Power Level: 0dBm */
*min = 0;
*max = 0;
}
#if defined(CONFIG_BT_CTLR_CONN_RSSI)
u32_t ll_rssi_get(u16_t handle, u8_t *rssi)
{

View file

@ -75,11 +75,6 @@ static u8_t MALIGN(4) _radio[LL_MEM_TOTAL];
static struct k_sem *sem_recv;
static struct {
u8_t pub_addr[BDADDR_SIZE];
u8_t rnd_addr[BDADDR_SIZE];
} _ll_context;
void mayfly_enable_cb(u8_t caller_id, u8_t callee_id, u8_t enable)
{
(void)caller_id;
@ -267,33 +262,3 @@ void ll_timeslice_ticker_id_get(u8_t * const instance_index, u8_t * const user_i
*user_id = (TICKER_NODES - FLASH_TICKER_NODES); /* The last index in the total tickers */
*instance_index = RADIO_TICKER_INSTANCE_ID_RADIO;
}
u8_t *ll_addr_get(u8_t addr_type, u8_t *bdaddr)
{
if (addr_type > 1) {
return NULL;
}
if (addr_type) {
if (bdaddr) {
memcpy(bdaddr, _ll_context.rnd_addr, BDADDR_SIZE);
}
return _ll_context.rnd_addr;
}
if (bdaddr) {
memcpy(bdaddr, _ll_context.pub_addr, BDADDR_SIZE);
}
return _ll_context.pub_addr;
}
void ll_addr_set(u8_t addr_type, u8_t const *const bdaddr)
{
if (addr_type) {
memcpy(_ll_context.rnd_addr, bdaddr, BDADDR_SIZE);
} else {
memcpy(_ll_context.pub_addr, bdaddr, BDADDR_SIZE);
}
}

View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2016-2018 Nordic Semiconductor ASA
* Copyright (c) 2016 Vinayak Kariappa Chettimada
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stddef.h>
#include <string.h>
#include <zephyr/types.h>
#include <toolchain.h>
#include "ll_sw/pdu.h"
static u8_t pub_addr[BDADDR_SIZE];
static u8_t rnd_addr[BDADDR_SIZE];
u8_t *ll_addr_get(u8_t addr_type, u8_t *bdaddr)
{
if (addr_type > 1) {
return NULL;
}
if (addr_type) {
if (bdaddr) {
memcpy(bdaddr, rnd_addr, BDADDR_SIZE);
}
return rnd_addr;
}
if (bdaddr) {
memcpy(bdaddr, pub_addr, BDADDR_SIZE);
}
return pub_addr;
}
void ll_addr_set(u8_t addr_type, u8_t const *const bdaddr)
{
if (addr_type) {
memcpy(rnd_addr, bdaddr, BDADDR_SIZE);
} else {
memcpy(pub_addr, bdaddr, BDADDR_SIZE);
}
}

View file

@ -0,0 +1,32 @@
/*
* Copyright (c) 2016-2017 Nordic Semiconductor ASA
* Copyright (c) 2016 Vinayak Kariappa Chettimada
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/types.h>
/* TODO: Remove weak attribute when refactored architecture replaces the old
* controller implementation. */
#include <toolchain.h>
u32_t __weak ll_tx_pwr_lvl_get(u16_t handle, u8_t type, s8_t *tx_pwr_lvl)
{
/* TODO: check for active connection */
/* TODO: check type here for current or maximum */
/* TODO: Support TX Power Level other than 0dBm */
*tx_pwr_lvl = 0;
return 0;
}
void ll_tx_pwr_get(s8_t *min, s8_t *max)
{
/* TODO: Support TX Power Level other than 0dBm */
*min = 0;
*max = 0;
}