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