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/memq.c
util/mayfly.c util/mayfly.c
util/util.c util/util.c
hal/nrf5/cntr.c
hal/nrf5/rand.c
hal/nrf5/ecb.c
hal/nrf5/radio/radio.c
ticker/ticker.c ticker/ticker.c
ll_sw/ctrl.c ll_sw/ll_addr.c
ll_sw/crypto.c ll_sw/ll_tx_pwr.c
ll_sw/ll.c crypto/crypto.c
ll_sw/ll_filter.c
hci/hci_driver.c hci/hci_driver.c
hci/hci.c hci/hci.c
) )
zephyr_library_sources_ifdef(CONFIG_BT_BROADCASTER ll_sw/ll_adv.c) if(CONFIG_BT_LL_SW)
zephyr_library_sources_ifdef(CONFIG_BT_OBSERVER ll_sw/ll_scan.c) zephyr_library_sources(
zephyr_library_sources_ifdef(CONFIG_BT_CENTRAL ll_sw/ll_master.c) ll_sw/ctrl.c
zephyr_library_sources_ifdef(CONFIG_BT_CTLR_DTM ll_sw/ll_test.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( zephyr_library_include_directories(
. .
util util
hal hal
ticker ticker
ll
include include
) )
zephyr_library_compile_options_ifdef( zephyr_library_compile_options_ifdef(
CONFIG_BT_CTLR_FAST_ENC CONFIG_BT_CTLR_FAST_ENC

View file

@ -22,7 +22,7 @@ choice
Select the Bluetooth Link Layer to compile. Select the Bluetooth Link Layer to compile.
config BT_LL_SW config BT_LL_SW
bool "Use the software-based BLE Link Layer" bool "Software-based BLE Link Layer"
help help
Use Zephyr software BLE Link Layer implementation. Use Zephyr software BLE Link Layer implementation.
@ -30,6 +30,24 @@ endchoice
comment "BLE Controller configuration" 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 config BT_CTLR_HCI_VS_BUILD_INFO
string "Zephyr HCI VS Build Info string" string "Zephyr HCI VS Build Info string"
default "" default ""
@ -41,6 +59,7 @@ config BT_CTLR_HCI_VS_BUILD_INFO
character is required at the beginning to separate it from the character is required at the beginning to separate it from the
already included information. already included information.
if BT_LL_SW
config BT_CTLR_DUP_FILTER_LEN config BT_CTLR_DUP_FILTER_LEN
prompt "Number of addresses in the scan duplicate filter" prompt "Number of addresses in the scan duplicate filter"
int int
@ -102,16 +121,6 @@ config BT_CTLR_SUBVERSION_NUMBER
help help
Set the Subversion Number that will be used in VERSION_IND PDU. 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" comment "BLE Controller features"
if BT_CONN if BT_CONN
@ -462,6 +471,8 @@ config BT_CTLR_PA_LNA_GPIOTE_CHAN
help help
Select the nRF5 GPIOTE channel to use for PA/LNA GPIO feature. Select the nRF5 GPIOTE channel to use for PA/LNA GPIO feature.
endif # BT_LL_SW
comment "BLE Controller debug configuration" comment "BLE Controller debug configuration"
config BT_CTLR_ASSERT_HANDLER 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)); 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->status = (!status) ? 0x00 : BT_HCI_ERR_UNKNOWN_CONN_ID;
rp->handle = sys_cpu_to_le16(handle); 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; ccst->status = 0x00;
} }
#if defined(CONFIG_BT_CTLR_FILTER)
static void le_read_wl_size(struct net_buf *buf, struct net_buf **evt) static void le_read_wl_size(struct net_buf *buf, struct net_buf **evt)
{ {
struct bt_hci_rp_le_read_wl_size *rp; 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 = cmd_complete(evt, sizeof(*ccst));
ccst->status = status; ccst->status = status;
} }
#endif /* CONFIG_BT_CTLR_FILTER */
static void le_encrypt(struct net_buf *buf, struct net_buf **evt) 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 = cmd_complete(evt, sizeof(*rp));
rp->status = 0x00; 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) #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); le_set_random_address(cmd, evt);
break; break;
#if defined(CONFIG_BT_CTLR_FILTER)
case BT_OCF(BT_HCI_OP_LE_READ_WL_SIZE): case BT_OCF(BT_HCI_OP_LE_READ_WL_SIZE):
le_read_wl_size(cmd, evt); le_read_wl_size(cmd, evt);
break; 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): case BT_OCF(BT_HCI_OP_LE_REM_DEV_FROM_WL):
le_rem_dev_from_wl(cmd, evt); le_rem_dev_from_wl(cmd, evt);
break; break;
#endif /* CONFIG_BT_CTLR_FILTER */
case BT_OCF(BT_HCI_OP_LE_ENCRYPT): case BT_OCF(BT_HCI_OP_LE_ENCRYPT):
le_encrypt(cmd, evt); 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; break;
} }
#if defined(CONFIG_BT_LL_SW)
radio_rx_fc_set(node_rx->hdr.handle, 0); radio_rx_fc_set(node_rx->hdr.handle, 0);
#endif /* CONFIG_BT_LL_SW */
node_rx->hdr.onion.next = 0; node_rx->hdr.onion.next = 0;
radio_rx_mem_release(&node_rx); 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); 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); 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_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); u32_t ll_tx_pwr_lvl_get(u16_t handle, u8_t type, s8_t *tx_pwr_lvl);
void ll_tx_power_get(s8_t *min, s8_t *max); 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_get(u16_t handle, u16_t *apto);
u32_t ll_apto_set(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); 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); 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); 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, 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); 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_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_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); 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_ */ #endif /* _LL_H_ */

View file

@ -10661,7 +10661,7 @@ u32_t ll_terminate_ind_send(u16_t handle, u8_t reason)
return 0; 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; 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 */ /*TODO: check type here for current or maximum */
/* We only support one TX Power Level: 0dBm */ /* TODO: Support TX Power Level other than 0dBm */
*tx_power_level = 0; *tx_pwr_lvl = 0;
return 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) #if defined(CONFIG_BT_CTLR_CONN_RSSI)
u32_t ll_rssi_get(u16_t handle, u8_t *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 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 mayfly_enable_cb(u8_t caller_id, u8_t callee_id, u8_t enable)
{ {
(void)caller_id; (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 */ *user_id = (TICKER_NODES - FLASH_TICKER_NODES); /* The last index in the total tickers */
*instance_index = RADIO_TICKER_INSTANCE_ID_RADIO; *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;
}