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:
parent
ae9f5b38d0
commit
5b0cd2c69b
10 changed files with 153 additions and 80 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
46
subsys/bluetooth/controller/ll_sw/ll_addr.c
Normal file
46
subsys/bluetooth/controller/ll_sw/ll_addr.c
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
32
subsys/bluetooth/controller/ll_sw/ll_tx_pwr.c
Normal file
32
subsys/bluetooth/controller/ll_sw/ll_tx_pwr.c
Normal 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;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue