nRF51 SDK v6.0.0 bug report and temporary workarounds

I created this blog post to document the bugs reported on nRF51 SDK v6.0.0

The workaround for each bug would also be provided here as a temporary solution before the bug is fixed in the future release of the SDK.

Issues List

  1. [DeviceManager] Unable to re-connect to the second bonded central (Fixed in SDK v6.1)

  2. [DeviceManager] Unable to re-connect to a bonded central that uses Resolvable Private Address (e.g iOS device) if the application doesn't do whitelist advertising. (Fixed in SDK v6.1)

  3. [S310][BootLoader] S310 BLE bootloader doesn't work with Android and iOS but works with MCP on PC. Same bug applied for SDK v5.x (Bootloader for S310 is removed from SDKv6.1 please use the one in earlier version)

  4. [AppButton] app_button_is_pushed() uses wrong index with pin_no (Fixed in SDK v6.1)

  5. [BLEAddress] Windows 8.1 is unable to reconnect. The workaround for the BLE address' known bug on S110 v7.0 has not been applied in all the SDK's BLE examples. (Not fixed in SDK v6.1)

  6. [S120][DeviceManagerCentral] S120 application example would not be able to re-bond to a peripheral with Resolvable Random Address, i.e an iOS device. (Not fixed in SDK v6.1)


Explanations and Workarounds

1 . [DeviceManager] Unable to re-connect to the second bonded central

This issue was reported here.

Incorrect index variable was used for copying data of a bonded device and this would result in unexpected book keeping. Workaround for #1 and #2 is provided in this updated file: device_manager_peripheral.c

2 . [DeviceManager] Unable to re-connect to a bonded central that uses Resolvable Private Address (e.g iOS device) if the application doesn't do whitelist advertising.

Device manager relied solely on IRK whitelist resolution and address match to identify a bonded device. However, if the application does not use a whitelist, IRK resolution is not done by SoftDevice and address certainly does not match for a resolvable device. Diversifier information provided in BLE_GAP_EVT_SEC_INFO_REQUEST can be used to identify the bonded device.

Workaround for #1 and #2 is provided in this updated file: device_manager_peripheral.c

3 . [S310][BootLoader] S310 BLE bootloader doesn't work with Android and iOS but works with MCP on PC. Same bug applied for SDK v5.x The internal RX buffer was configured wrongly and did not allow more than 2 RX packet per connection interval. It was because we used the incorrect hci_mem_pool_internal.h.

The dfu_dual_bank_ble -> Target Option -> C/C++ -> Include Path was referred to the ..\include\hci_transport. This is wrong, it should refer to ..\include\ble_transport instead. Fixing that the compiler will point to the correct hci_mem_pool_internal.h file.

4 . [AppButton] app_button_is_pushed() uses wrong index with pin_no.

This issue was reported here.

It's a mistake on the way we used pin_no in app_button_is_pushed(). Instead of accessing the mp_buttons[] entries with ordinal index, we accessed the array with the pin number index which is wrong. Workaround is either have a loop to look for the correct index of the pin number, or define macros to match the ordinal position of a button and its pin number, and use that marco instead of pin_no.

5 . **[BLEAddress] Windows 8.1 is unable to reconnect. The workaround for the BLE address' known bug on S110 v7.0 has not been applied in all the SDK's BLE examples. **

There is a issue with the S110 v7.0 that described in the release note in Known Issues section: "The Identity Address Information sent to the peer during a pairing procedure needs to be initialized manually by the application(DRGN-4521)." However, not all the BLE examples in the SDK were implemented the workaround for this issue, except the ble_app_hids_keyboard and ble_app_hids_mouse.

The issue will result with the symptoms that Windows 8.1 will disconnect and never connect back.

The workaround for this issue is to set the address manually in the application as implemented in advertising_init() function in ble_app_hids_keyboard:

{

ble_gap_addr_t m_ble_addr;

uint32_t err_code;

err_code = sd_ble_gap_address_get(&m_ble_addr);

APP_ERROR_CHECK(err_code);

err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &m_ble_addr);

APP_ERROR_CHECK(err_code);

}

This patch should be applied each time the softdevice is initialized.

6 . [S120][DeviceManagerCentral] S120 application example would not be able to re-bond to a peripheral with Resolvable Random Address, i.e iOS device. Resolving IRK is implemented from S120 v1.0 production but not from S120 v1.0.0-1 alpha. Our device manager central library hasn't updated for this feature.

The result is that when the S120 device connected and bonded with an iOS device, the next time they connect, they would need to bond again.

Workaround is provided in this example, modification added in both main.c and device_manager_central_mod.c: ble_app_hrs_c - FixedDeviceManager_IRK.zip


Note: To report a bug for the SDK, please create a new post on devzone or on the support portal. After we have confirmed the issue and found a workaround, it will be updated here. If it's not updated, please leave a comment here and point to the post