xref: /nrf52832-nimble/packages/NimBLE-latest/docs/ble_setup/ble_addr.rst (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZeroConfigure device address
2*042d53a7SEvalZero------------------------
3*042d53a7SEvalZero
4*042d53a7SEvalZeroA BLE device needs an address to do just about anything. For information
5*042d53a7SEvalZeroon the various types of Bluetooth addresses, see the `NimBLE Host
6*042d53a7SEvalZeroIdentity Reference :doc:`<../ble_hs/ble_hs_id/ble_hs_id>`.
7*042d53a7SEvalZero
8*042d53a7SEvalZeroThere are several methods for assigning an address to a NimBLE device.
9*042d53a7SEvalZeroThe available options are documented below:
10*042d53a7SEvalZero
11*042d53a7SEvalZeroMethod 1: Configure nRF hardware with a public address
12*042d53a7SEvalZero~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13*042d53a7SEvalZero
14*042d53a7SEvalZeroWhen Mynewt is running on a Nordic nRF platform, the NimBLE controller
15*042d53a7SEvalZerowill attempt to read a public address out of the board's FICR or UICR
16*042d53a7SEvalZeroregisters. The controller uses the following logic while trying to read
17*042d53a7SEvalZeroan address from hardware:
18*042d53a7SEvalZero
19*042d53a7SEvalZero1. If the *DEVICEADDRTYPE* FICR register is written, read the address
20*042d53a7SEvalZero   programmed in the *DEVICEADDR[0]* and *DEVICEADDR[1]* FICR registers.
21*042d53a7SEvalZero2. Else if the upper 16 bits of the *CUSTOMER[1]* UICR register are 0,
22*042d53a7SEvalZero   read the address programmed in the *CUSTOMER[0]* and *CUSTOMER[1]*
23*042d53a7SEvalZero   UCI registers.
24*042d53a7SEvalZero3. Else, no address available.
25*042d53a7SEvalZero
26*042d53a7SEvalZeroMethod 2: Hardcode a public address in the Mynewt target
27*042d53a7SEvalZero~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
28*042d53a7SEvalZero
29*042d53a7SEvalZeroThe NimBLE controller package exports a
30*042d53a7SEvalZero:doc:`syscfg <../../../os/modules/sysinitconfig/sysinitconfig>` setting
31*042d53a7SEvalZerocalled ``BLE_PUBLIC_DEV_ADDR``. This setting can be overridden at the
32*042d53a7SEvalZeroapplication or target level to configure a public Bluetooth address. For
33*042d53a7SEvalZeroexample, a target can assign the public address *11:22:33:44:55:66* as
34*042d53a7SEvalZerofollows:
35*042d53a7SEvalZero
36*042d53a7SEvalZero::
37*042d53a7SEvalZero
38*042d53a7SEvalZero    syscfg.vals:
39*042d53a7SEvalZero        BLE_PUBLIC_DEV_ADDR: '(uint8_t[6]){0x66, 0x55, 0x44, 0x33, 0x22, 0x11}'
40*042d53a7SEvalZero
41*042d53a7SEvalZeroThis setting takes the form of a C expression. Specifically, the value
42*042d53a7SEvalZerois a designated initializer expressing a six-byte array. Also note that
43*042d53a7SEvalZerothe bytes are reversed, as an array is inherently little-endian, while
44*042d53a7SEvalZeroaddresses are generally expressed in big-endian.
45*042d53a7SEvalZero
46*042d53a7SEvalZeroNote: this method takes precedence over method 1. Whatever is written to
47*042d53a7SEvalZerothe ``BLE_PUBLIC_DEV_ADDR`` setting is the address that gets used.
48*042d53a7SEvalZero
49*042d53a7SEvalZeroMethod 3: Configure a random address at runtime
50*042d53a7SEvalZero~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
51*042d53a7SEvalZero
52*042d53a7SEvalZeroRandom addresses get configured through the NimBLE host. The following
53*042d53a7SEvalZerotwo functions are used in random address configuration:
54*042d53a7SEvalZero
55*042d53a7SEvalZero-  :doc:`ble_hs_id_gen_rnd <../ble_hs/ble_hs_id/functions/ble_hs_id_gen_rnd>`:
56*042d53a7SEvalZero   Generates a new random address.
57*042d53a7SEvalZero-  :doc:`ble_hs_id_set_rnd <../ble_hs/ble_hs_id/functions/ble_hs_id_set_rnd>`:
58*042d53a7SEvalZero   Sets the device's random address.
59*042d53a7SEvalZero
60*042d53a7SEvalZeroFor an example of how this is done, see the :doc:`<../../../os/tutorials/ibeacon>`.
61*042d53a7SEvalZero
62*042d53a7SEvalZero*Note:* A NimBLE device can be configured with multiple addresses; at
63*042d53a7SEvalZeromost one of each address type.
64