Repository: incubator-mynewt-core Updated Branches: refs/heads/develop 832fa2d5f -> 95c7d3e5f
MYNEWT-707: Add API to retrieve public and random static address Please read the Jira ticket for more information on how to use these API. The controller now calls ble_hw_get_public_addr() and will use that address for its public address. The global device address has not been hidden yet since some apps rely on the ability to modify it. Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/95c7d3e5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/95c7d3e5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/95c7d3e5 Branch: refs/heads/develop Commit: 95c7d3e5f951e381bd8dbfc82335a3a3384d9f56 Parents: 832fa2d Author: William San Filippo <[email protected]> Authored: Tue Apr 4 14:00:11 2017 -0700 Committer: William San Filippo <[email protected]> Committed: Tue Apr 4 14:03:08 2017 -0700 ---------------------------------------------------------------------- apps/bleprph/src/main.c | 6 +-- hw/drivers/nimble/nrf51/src/ble_hw.c | 52 ++++++++++++++++++++ hw/drivers/nimble/nrf52/src/ble_hw.c | 52 ++++++++++++++++++++ .../controller/include/controller/ble_hw.h | 6 +++ net/nimble/controller/src/ble_ll.c | 13 +++++ net/nimble/controller/syscfg.yml | 9 ++++ 6 files changed, 135 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95c7d3e5/apps/bleprph/src/main.c ---------------------------------------------------------------------- diff --git a/apps/bleprph/src/main.c b/apps/bleprph/src/main.c index 3bdbbcd..1f45fa9 100755 --- a/apps/bleprph/src/main.c +++ b/apps/bleprph/src/main.c @@ -255,12 +255,12 @@ main(void) { int rc; - /* Initialize OS */ - sysinit(); - /* Set initial BLE device address. */ memcpy(g_dev_addr, (uint8_t[6]){0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a}, 6); + /* Initialize OS */ + sysinit(); + /* Initialize the bleprph log. */ log_register("bleprph", &bleprph_log, &log_console_handler, NULL, LOG_SYSLEVEL); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95c7d3e5/hw/drivers/nimble/nrf51/src/ble_hw.c ---------------------------------------------------------------------- diff --git a/hw/drivers/nimble/nrf51/src/ble_hw.c b/hw/drivers/nimble/nrf51/src/ble_hw.c index 9f268cc..c9e6989 100644 --- a/hw/drivers/nimble/nrf51/src/ble_hw.c +++ b/hw/drivers/nimble/nrf51/src/ble_hw.c @@ -56,6 +56,58 @@ uint8_t g_nrf_num_irks; #endif +/* Returns public device address or -1 if not present */ +int +ble_hw_get_public_addr(ble_addr_t *addr) +{ + int rc; + uint32_t addr_high; + uint32_t addr_low; + + /* Does FICR have a public address */ + rc = -1; + if ((NRF_FICR->DEVICEADDRTYPE & 1) == 0) { + addr_low = NRF_FICR->DEVICEADDR[0]; + addr_high = NRF_FICR->DEVICEADDR[1]; + rc = 0; + } else { + /* See if programmed in UICR. Upper 16 bits must all be zero */ + addr_high = NRF_UICR->CUSTOMER[1]; + if (addr_high < 65536) { + addr_low = NRF_UICR->CUSTOMER[0]; + rc = 0; + } + } + + if (!rc) { + /* Copy into device address. We can do this because we know platform */ + memcpy(addr->val, &addr_low, 4); + memcpy(&addr->val[4], &addr_high, 2); + addr->type = BLE_ADDR_PUBLIC; + } + + return rc; +} + +/* Returns random static address or -1 if not present */ +int +ble_hw_get_static_addr(ble_addr_t *addr) +{ + int rc; + + if ((NRF_FICR->DEVICEADDRTYPE & 1) == 1) { + memcpy(addr->val, (void *)&NRF_FICR->DEVICEADDR[0], 4); + memcpy(&addr->val[4], (void *)&NRF_FICR->DEVICEADDR[1], 2); + addr->val[5] |= 0xc0; + addr->type = BLE_ADDR_RANDOM; + rc = 0; + } else { + rc = -1; + } + + return rc; +} + /** * Clear the whitelist * http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95c7d3e5/hw/drivers/nimble/nrf52/src/ble_hw.c ---------------------------------------------------------------------- diff --git a/hw/drivers/nimble/nrf52/src/ble_hw.c b/hw/drivers/nimble/nrf52/src/ble_hw.c index ad5af49..dd1323a 100644 --- a/hw/drivers/nimble/nrf52/src/ble_hw.c +++ b/hw/drivers/nimble/nrf52/src/ble_hw.c @@ -58,6 +58,58 @@ uint8_t g_nrf_num_irks; #endif +/* Returns public device address or -1 if not present */ +int +ble_hw_get_public_addr(ble_addr_t *addr) +{ + int rc; + uint32_t addr_high; + uint32_t addr_low; + + /* Does FICR have a public address */ + rc = -1; + if ((NRF_FICR->DEVICEADDRTYPE & 1) == 0) { + addr_low = NRF_FICR->DEVICEADDR[0]; + addr_high = NRF_FICR->DEVICEADDR[1]; + rc = 0; + } else { + /* See if programmed in UICR. Upper 16 bits must all be zero */ + addr_high = NRF_UICR->CUSTOMER[1]; + if (addr_high < 65536) { + addr_low = NRF_UICR->CUSTOMER[0]; + rc = 0; + } + } + + if (!rc) { + /* Copy into device address. We can do this because we know platform */ + memcpy(addr->val, &addr_low, 4); + memcpy(&addr->val[4], &addr_high, 2); + addr->type = BLE_ADDR_PUBLIC; + } + + return rc; +} + +/* Returns random static address or -1 if not present */ +int +ble_hw_get_static_addr(ble_addr_t *addr) +{ + int rc; + + if ((NRF_FICR->DEVICEADDRTYPE & 1) == 1) { + memcpy(addr->val, (void *)&NRF_FICR->DEVICEADDR[0], 4); + memcpy(&addr->val[4], (void *)&NRF_FICR->DEVICEADDR[1], 2); + addr->val[5] |= 0xc0; + addr->type = BLE_ADDR_RANDOM; + rc = 0; + } else { + rc = -1; + } + + return rc; +} + /** * Clear the whitelist * http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95c7d3e5/net/nimble/controller/include/controller/ble_hw.h ---------------------------------------------------------------------- diff --git a/net/nimble/controller/include/controller/ble_hw.h b/net/nimble/controller/include/controller/ble_hw.h index 022e2cb..a1941ac 100644 --- a/net/nimble/controller/include/controller/ble_hw.h +++ b/net/nimble/controller/include/controller/ble_hw.h @@ -101,6 +101,12 @@ void ble_hw_resolv_list_disable(void); /* Returns index of resolved address; -1 if not resolved */ int ble_hw_resolv_list_match(void); +/* Returns public device address or -1 if not present */ +int ble_hw_get_public_addr(ble_addr_t *addr); + +/* Returns random static address or -1 if not present */ +int ble_hw_get_static_addr(ble_addr_t *addr); + #ifdef __cplusplus } #endif http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95c7d3e5/net/nimble/controller/src/ble_ll.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/src/ble_ll.c b/net/nimble/controller/src/ble_ll.c index 72ec9cd..360a203 100644 --- a/net/nimble/controller/src/ble_ll.c +++ b/net/nimble/controller/src/ble_ll.c @@ -1235,11 +1235,24 @@ ble_ll_init(void) #ifdef BLE_XCVR_RFCLK uint32_t xtal_ticks; #endif + ble_addr_t addr; struct ble_ll_obj *lldata; /* Ensure this function only gets called by sysinit. */ SYSINIT_ASSERT_ACTIVE(); + /* Retrieve the public device address if not set by syscfg */ + memcpy(&addr.val[0], MYNEWT_VAL_BLE_PUBLIC_DEV_ADDR, BLE_DEV_ADDR_LEN); + if (!memcmp(&addr.val[0], ((ble_addr_t *)BLE_ADDR_ANY)->val, + BLE_DEV_ADDR_LEN)) { + rc = ble_hw_get_public_addr(&addr); + if (!rc) { + memcpy(g_dev_addr, &addr.val[0], BLE_DEV_ADDR_LEN); + } + } else { + memcpy(g_dev_addr, &addr.val[0], BLE_DEV_ADDR_LEN); + } + #ifdef BLE_XCVR_RFCLK /* Settling time of crystal, in ticks */ xtal_ticks = MYNEWT_VAL(BLE_XTAL_SETTLE_TIME); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95c7d3e5/net/nimble/controller/syscfg.yml ---------------------------------------------------------------------- diff --git a/net/nimble/controller/syscfg.yml b/net/nimble/controller/syscfg.yml index 569010f..fd4f48a 100644 --- a/net/nimble/controller/syscfg.yml +++ b/net/nimble/controller/syscfg.yml @@ -203,3 +203,12 @@ syscfg.defs: policy feature. Currently, this feature is not supported by the nimble controller. value: '0' + + BLE_PUBLIC_DEV_ADDR: + description: > + Allows the target or app to override the public device address + used by the controller. If all zero, the controller will + attempt to retrieve the public device address from its + chip specific location. If non-zero, this address will + be used. + value: "(uint8_t[6]){0x00, 0x00, 0x00, 0x00, 0x00, 0x00}"
