diff --git a/subsys/bluetooth/controller/CMakeLists.txt b/subsys/bluetooth/controller/CMakeLists.txt index cea0da687f8..764ccadab66 100644 --- a/subsys/bluetooth/controller/CMakeLists.txt +++ b/subsys/bluetooth/controller/CMakeLists.txt @@ -140,6 +140,11 @@ if(CONFIG_BT_LL_SW_SPLIT) endif() endif() +zephyr_library_sources_ifdef( + CONFIG_BT_CTLR_SETTINGS + ll_sw/ll_settings.c +) + zephyr_library_sources_ifdef( CONFIG_SOC_COMPATIBLE_NRF ll_sw/nordic/hal/nrf5/cntr.c diff --git a/subsys/bluetooth/controller/Kconfig b/subsys/bluetooth/controller/Kconfig index 3df189734f5..f9618712e39 100644 --- a/subsys/bluetooth/controller/Kconfig +++ b/subsys/bluetooth/controller/Kconfig @@ -201,6 +201,19 @@ config BT_CTLR_TX_PWR_MINUS_40 endchoice +config BT_CTLR_SETTINGS + bool "Settings System" + depends on BT_SETTINGS + help + Enable use of settings system in controller. + +config BT_CTLR_VERSION_SETTINGS + bool "Version Settings" + depends on BT_CTLR_SETTINGS + help + Make Company Id and Subversion Number configurable through + settings system. + config BT_CTLR_COMPANY_ID hex "Company Id" default 0x05F1 diff --git a/subsys/bluetooth/controller/hci/hci.c b/subsys/bluetooth/controller/hci/hci.c index 656947b80c4..7fa75284aae 100644 --- a/subsys/bluetooth/controller/hci/hci.c +++ b/subsys/bluetooth/controller/hci/hci.c @@ -32,6 +32,7 @@ #include "ll_sw/ull_conn_types.h" #include "ll.h" #include "ll_feat.h" +#include "ll_settings.h" #include "hci_internal.h" #include "hci_vendor.h" @@ -518,8 +519,8 @@ static void read_local_version_info(struct net_buf *buf, struct net_buf **evt) rp->hci_version = LL_VERSION_NUMBER; rp->hci_revision = sys_cpu_to_le16(0); rp->lmp_version = LL_VERSION_NUMBER; - rp->manufacturer = sys_cpu_to_le16(CONFIG_BT_CTLR_COMPANY_ID); - rp->lmp_subversion = sys_cpu_to_le16(CONFIG_BT_CTLR_SUBVERSION_NUMBER); + rp->manufacturer = sys_cpu_to_le16(ll_settings_company_id()); + rp->lmp_subversion = sys_cpu_to_le16(ll_settings_subversion_number()); } static void read_supported_commands(struct net_buf *buf, struct net_buf **evt) diff --git a/subsys/bluetooth/controller/include/ll_settings.h b/subsys/bluetooth/controller/include/ll_settings.h new file mode 100644 index 00000000000..d1416033806 --- /dev/null +++ b/subsys/bluetooth/controller/include/ll_settings.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2019 Oticon A/S + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#if defined(CONFIG_BT_CTLR_VERSION_SETTINGS) + +u16_t ll_settings_company_id(void); +u16_t ll_settings_subversion_number(void); + +#else + +static inline u16_t ll_settings_company_id(void) +{ + return CONFIG_BT_CTLR_COMPANY_ID; +} +static inline u16_t ll_settings_subversion_number(void) +{ + return CONFIG_BT_CTLR_SUBVERSION_NUMBER; +} + +#endif /* CONFIG_BT_CTLR_VERSION_SETTINGS */ diff --git a/subsys/bluetooth/controller/ll_sw/ctrl.c b/subsys/bluetooth/controller/ll_sw/ctrl.c index ff710800f89..7a2ab24e12c 100644 --- a/subsys/bluetooth/controller/ll_sw/ctrl.c +++ b/subsys/bluetooth/controller/ll_sw/ctrl.c @@ -19,6 +19,7 @@ #include "ll.h" #include "ll_feat.h" +#include "ll_settings.h" #if defined(CONFIG_SOC_COMPATIBLE_NRF) #include @@ -7815,9 +7816,9 @@ static inline void event_vex_prep(struct connection *conn) pdu_ctrl_tx->llctrl.version_ind.version_number = LL_VERSION_NUMBER; pdu_ctrl_tx->llctrl.version_ind.company_id = - CONFIG_BT_CTLR_COMPANY_ID; + ll_settings_company_id(); pdu_ctrl_tx->llctrl.version_ind.sub_version_number = - CONFIG_BT_CTLR_SUBVERSION_NUMBER; + ll_settings_subversion_number(); ctrl_tx_enqueue(conn, node_tx); diff --git a/subsys/bluetooth/controller/ll_sw/ll_settings.c b/subsys/bluetooth/controller/ll_sw/ll_settings.c new file mode 100644 index 00000000000..99500bf5ea8 --- /dev/null +++ b/subsys/bluetooth/controller/ll_sw/ll_settings.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2019 Oticon A/S + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include + +#include +#include "ll_settings.h" + +#define LOG_MODULE_NAME bt_ctlr_ll_settings +#include "common/log.h" +#include "hal/debug.h" + +#if defined(CONFIG_BT_CTLR_VERSION_SETTINGS) + +static u16_t company_id = CONFIG_BT_CTLR_COMPANY_ID; +static u16_t subversion = CONFIG_BT_CTLR_SUBVERSION_NUMBER; + +u16_t ll_settings_company_id(void) +{ + return company_id; +} +u16_t ll_settings_subversion_number(void) +{ + return subversion; +} + +#endif /* CONFIG_BT_CTLR_VERSION_SETTINGS */ + +static int ctlr_set(const char *name, size_t len_rd, + settings_read_cb read_cb, void *store) +{ + int len, nlen; + const char *next; + + nlen = settings_name_next(name, &next); + +#if defined(CONFIG_BT_CTLR_VERSION_SETTINGS) + if (!strncmp(name, "company", nlen)) { + len = read_cb(store, &company_id, sizeof(company_id)); + if (len < 0) { + BT_ERR("Failed to read Company Id from storage" + " (err %d)", len); + } else { + BT_DBG("Company Id set to %04x", company_id); + } + return 0; + } + if (!strncmp(name, "subver", nlen)) { + len = read_cb(store, &subversion, sizeof(subversion)); + if (len < 0) { + BT_ERR("Failed to read Subversion from storage" + " (err %d)", len); + } else { + BT_DBG("Subversion set to %04x", subversion); + } + return 0; + } +#endif /* CONFIG_BT_CTLR_VERSION_SETTINGS */ + + return 0; +} + +SETTINGS_STATIC_HANDLER_DEFINE(bt_ctlr, "bt/ctlr", NULL, ctlr_set, NULL, NULL); diff --git a/subsys/bluetooth/controller/ll_sw/ull_conn.c b/subsys/bluetooth/controller/ll_sw/ull_conn.c index 0a6e5e647c5..3f0abf906e7 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn.c +++ b/subsys/bluetooth/controller/ll_sw/ull_conn.c @@ -36,6 +36,7 @@ #include "ll.h" #include "ll_feat.h" +#include "ll_settings.h" #define LOG_MODULE_NAME bt_ctlr_llsw_ull_conn #include "common/log.h" @@ -2377,8 +2378,8 @@ static inline void event_vex_prep(struct ll_conn *conn) PDU_DATA_LLCTRL_TYPE_VERSION_IND; pdu->llctrl.version_ind.version_number = LL_VERSION_NUMBER; - cid = sys_cpu_to_le16(CONFIG_BT_CTLR_COMPANY_ID); - svn = sys_cpu_to_le16(CONFIG_BT_CTLR_SUBVERSION_NUMBER); + cid = sys_cpu_to_le16(ll_settings_company_id()); + svn = sys_cpu_to_le16(ll_settings_subversion_number()); pdu->llctrl.version_ind.company_id = cid; pdu->llctrl.version_ind.sub_version_number = svn; @@ -3530,9 +3531,9 @@ static int version_ind_send(struct ll_conn *conn, struct node_rx_pdu *rx, pdu_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_VERSION_IND; v = &pdu_tx->llctrl.version_ind; v->version_number = LL_VERSION_NUMBER; - v->company_id = sys_cpu_to_le16(CONFIG_BT_CTLR_COMPANY_ID); + v->company_id = sys_cpu_to_le16(ll_settings_company_id()); v->sub_version_number = - sys_cpu_to_le16(CONFIG_BT_CTLR_SUBVERSION_NUMBER); + sys_cpu_to_le16(ll_settings_subversion_number()); ctrl_tx_sec_enqueue(conn, tx);