This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF51822 not resetting after DFU bootloader+softdevice

Hello,

This is related to a previous post, but now with new information and a more specific issue to resolve.

We have product in the field based on RF Digital's Simblee BLE module, which uses nRF51822 revision 3. All modules have Simblee's custom DFU bootloader, SoftDevice S110 v8.0.0 and our application flashed and working. Our application was developed using the Simblee library which hides much of the complexity of BLE, including legacy buttonless DFU.

We need to transition from the proprietary Simblee Library and bootloader to our own bootloader and an application developed with Nordic SDK 12.3, still using SoftDevice S110 v8.0.0. Our own bootloader is essentially the dual_bank_ble_s110 dfu bootloader example of SDK 10.0. Using an nRF51 dev kit, I can program our bootloader and S110, then I can DFU images of bootloader+S110 and our new application using nRF Connect (iOS). I use nrfutil v0.5.2 to generate the zip files for legacy DFU. All works well.

Ultimately we will be using DFU over BLE to update to our bootloader, S110 and our new application. I understand that this is done in two steps: 1) bootloader+S110, 2) application. If I program the DK with Simblee's proprietary bootloader and S110, when I then DFU an image that contains our bootloader+S110, following the transfer of the image, the DK does not reset. I have to manually reset the DK so that our bootloader runs and can then proceed with DFU of our application. This complicates the update process for our customers because they will be required to turn off and back on the device following transfer of the bootloader+S110 so that transfer of our application can proceed.

I'm noticing the same behaviour when using a Simblee module programmed via the nRF51 DK.

Any ideas why the module does not reset and run the bootloader following DFU of bootloader+S110? I've attached the custom Simblee bootloader (ota_bootloader_dual_bank.hex).

Many thanks,

Tim

ota_bootloader_dual_bank.hex

Parents
  • Hi,

    I find it difficult to make specific advice, as I do not know in what way the Simblee bootloader differs from the SDK bootloader. Do you have the source code of the bootloader?

    Based on what you write I understand the only thing that is missing is a reset, and that a manual reset causes the activation to complete. So it seems the only thing that is missing is the reset. Is there a problem with the DFU master not issuing the command to activate and reset? Do you have a log from the bootloader that shows more about what is (not) happening?

Reply
  • Hi,

    I find it difficult to make specific advice, as I do not know in what way the Simblee bootloader differs from the SDK bootloader. Do you have the source code of the bootloader?

    Based on what you write I understand the only thing that is missing is a reset, and that a manual reset causes the activation to complete. So it seems the only thing that is missing is the reset. Is there a problem with the DFU master not issuing the command to activate and reset? Do you have a log from the bootloader that shows more about what is (not) happening?

Children
  • Thank you Einar.

    Unfortunately I do not have source for the Simblee bootloader. I cannot say for sure, but I think it was developed with Nordic SDK 10.

    A couple things I've noticed that are different from the SDK 10 bootloader:

    1 - It advertises only for a short time, around 20 seconds

    2 - It assumes the application flash address is 0x1F000 rather than the standard location 0x18000.

    Yes, DFU of our new bootloader+S110 to a device containing the Simblee bootloader+S110 works, but the device does not reset when complete. Here's the log from nRF Connect (iOS) of the DFU process:

    File Name: bl2+sd.zip
    Parts: 1
    Size: Zero KB
    Soft Device Size: 88 KB
    Bootloader Size: 14 KB
    Connecting to DfuTarg...
    centralManager.connect(peripheral, options: nil)
    [Callback] Central Manager did connect peripheral
    Connected to DfuTarg
    Discovering services...
    peripheral.discoverServices(nil)
    Services discovered
    Starting Legacy DFU...
    Connected to DfuTarg
    Services discovered
    Legacy DFU Service found
    Discovering characteristics in DFU Service...
    peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    DFU characteristics discovered
    Reading DFU Version number...
    peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0600
    Version number read: 0.6
    Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    DFU Control Point notifications enabled
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0103, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Writing image sizes (88344b, 14352b, 0b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x185901001038000000000000, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Start DFU (Op Code = 1, Upload Mode = 3) request sent
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100101
    Response (Op Code = 1, Status = 1) received
    Writing Initialize DFU Parameters...
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0200, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Writing to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0xffffffffffff0000010064007dc7, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0201, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100201
    Response (Op Code = 2, Status = 1) received
    Initialize DFU Parameters completed
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x080c00, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Packet Receipt Notif Req (Op Code = 8, Value = 12) request sent
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x03, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Uploading firmware...
    Sending firmware to DFU Packet characteristic...
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100301
    Response (Op Code = 3, Status = 1) received
    Upload completed in 41.16 seconds
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x04, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Validate Firmware (Op Code = 4) request sent
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100401
    Response (Op Code = 4, Status = 1) received
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x05, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    [Callback] Central Manager did disconnect peripheral
    Disconnected by the remote device

    I am quite certain that our bootloader is not started following DFU because DfuTarg is not advertised. Also, I modified our bootloader to turn on all 4 LEDs of the nRF51 dev kit on startup and they do not light following DFU of bootloader+S110.

    Our iOS app will act as the DFU controller and uses Nordic's iOS-Pods-DFU-Library. Is there something that can be changed there that will force reset after successful DFU?

    Many thanks,

    Tim

  • Hi Tim,

    I see.

    Tim said:
    Our iOS app will act as the DFU controller and uses Nordic's iOS-Pods-DFU-Library. Is there something that can be changed there that will force reset after successful DFU?

    I don't think you can force it, but you could try to call activateAndReset() in the iPhone app using iOS-Pods-DFU-Library. That should be done already though, so I would not expect too much.

  • Thanks again Einar.

    Using iOS-Pods-DFU-Library logging, I found that when updating the bootloader and softdevice using the SDK 10 bootloader, following writing 0x05 (Response.activateAndReset) to characteristic 00001531-1212-EFDE-1523-785FEABCD123, peripheral.didWriteFor characteristic: is called, whereas when using the Simblee bootloader, it is not called. I suppose this is because the Simblee module resets before it's able to send the acknowledgement, and according to the source comments, this is okay. Still, though, a hard reset (power off/on or press reset button on the DK) is required for the module to start and run the new bootloader.

    Here's the log from iOS-Pods-DFU-Library for updating the bootloader, softdevice and application, which happens in two steps (bootloader+softdevice, then application). I've noted where manual reset is necessary for the application update to proceed.

    2020-09-01 23:17:27.137902-0600 myapp[1976:1843897] logging: [Callback] Central Manager did update state to: Powered ON
    2020-09-01 23:17:27.137939-0600 myapp[1976:1843897] logging: Connecting to mydevice...
    2020-09-01 23:17:27.137970-0600 myapp[1976:1843897] logging: centralManager.connect(peripheral, options: nil)
    2020-09-01 23:17:27.138206-0600 myapp[1976:1843897] logging: [Callback] Central Manager did connect peripheral
    2020-09-01 23:17:27.138218-0600 myapp[1976:1843897] logging: Connected to mydevice
    2020-09-01 23:17:27.138228-0600 myapp[1976:1843897] logging: Discovering services...
    2020-09-01 23:17:27.138236-0600 myapp[1976:1843897] logging: peripheral.discoverServices(nil)
    2020-09-01 23:17:27.139324-0600 myapp[1976:1843897] logging: Services discovered
    2020-09-01 23:17:27.139350-0600 myapp[1976:1843897] logging: Starting Legacy DFU...
    2020-09-01 23:17:27.139360-0600 myapp[1976:1843897] logging: Connected to mydevice
    2020-09-01 23:17:27.139369-0600 myapp[1976:1843897] logging: Services discovered
    2020-09-01 23:17:27.139377-0600 myapp[1976:1843897] logging: Legacy DFU Service found
    2020-09-01 23:17:27.139385-0600 myapp[1976:1843897] logging: Discovering characteristics in DFU Service...
    2020-09-01 23:17:27.139393-0600 myapp[1976:1843897] logging: peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:17:27.414661-0600 myapp[1976:1843897] logging: DFU characteristics discovered
    2020-09-01 23:17:27.414864-0600 myapp[1976:1843897] logging: Reading DFU Version number...
    2020-09-01 23:17:27.415173-0600 myapp[1976:1843897] logging: peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:17:27.465804-0600 myapp[1976:1843897] logging: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0100
    2020-09-01 23:17:27.465973-0600 myapp[1976:1843897] logging: Version number read: 0.1
    2020-09-01 23:17:27.466301-0600 myapp[1976:1843897] logging: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:27.466437-0600 myapp[1976:1843897] logging: peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:17:27.584907-0600 myapp[1976:1843897] logging: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:27.585265-0600 myapp[1976:1843897] logging: DFU Control Point notifications enabled
    2020-09-01 23:17:27.585446-0600 myapp[1976:1843897] logging: Application with buttonless update found
    2020-09-01 23:17:27.585587-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:27.585728-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:17:27.642666-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:27.642848-0600 myapp[1976:1843897] logging: Jump to bootloader (Op Code = 1, Upload Mode = 4) request sent
    2020-09-01 23:17:27.829784-0600 myapp[1976:1843897] logging: [Callback] Central Manager did disconnect peripheral
    2020-09-01 23:17:27.829927-0600 myapp[1976:1843897] logging: Disconnected by the remote device
    2020-09-01 23:17:27.830052-0600 myapp[1976:1843897] logging: Connecting to mydevice...
    2020-09-01 23:17:27.830176-0600 myapp[1976:1843897] logging: centralManager.connect(peripheral, options: nil)
    2020-09-01 23:17:28.271927-0600 myapp[1976:1843897] logging: [Callback] Central Manager did connect peripheral
    2020-09-01 23:17:28.272119-0600 myapp[1976:1843897] logging: Connected to mydevice
    2020-09-01 23:17:28.272251-0600 myapp[1976:1843897] logging: Discovering services...
    2020-09-01 23:17:28.272372-0600 myapp[1976:1843897] logging: peripheral.discoverServices([00001530-1212-EFDE-1523-785FEABCD123])
    2020-09-01 23:17:28.629846-0600 myapp[1976:1843897] logging: Services discovered
    2020-09-01 23:17:28.629964-0600 myapp[1976:1843897] logging: Legacy DFU Service found
    2020-09-01 23:17:28.630111-0600 myapp[1976:1843897] logging: Discovering characteristics in DFU Service...
    2020-09-01 23:17:28.630202-0600 myapp[1976:1843897] logging: peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:17:28.903771-0600 myapp[1976:1843897] logging: DFU characteristics discovered
    2020-09-01 23:17:28.903973-0600 myapp[1976:1843897] logging: Reading DFU Version number...
    2020-09-01 23:17:28.904390-0600 myapp[1976:1843897] logging: peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:17:28.960086-0600 myapp[1976:1843897] logging: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0600
    2020-09-01 23:17:28.960308-0600 myapp[1976:1843897] logging: Version number read: 0.6
    2020-09-01 23:17:28.960452-0600 myapp[1976:1843897] logging: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:28.960579-0600 myapp[1976:1843897] logging: peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:17:29.082525-0600 myapp[1976:1843897] logging: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:29.082775-0600 myapp[1976:1843897] logging: DFU Control Point notifications enabled
    2020-09-01 23:17:29.082908-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:29.083046-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0103, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:17:29.083170-0600 myapp[1976:1843897] logging: Writing image sizes (88344b, 14324b, 0b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:29.083295-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x18590100f437000000000000, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    2020-09-01 23:17:29.139042-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:29.139221-0600 myapp[1976:1843897] logging: Start DFU (Op Code = 1, Upload Mode = 3) request sent
    2020-09-01 23:17:32.233505-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100101
    2020-09-01 23:17:32.233748-0600 myapp[1976:1843897] logging: Response (Op Code = 1, Status = 1) received
    2020-09-01 23:17:32.233896-0600 myapp[1976:1843897] logging: Writing Initialize DFU Parameters...
    2020-09-01 23:17:32.234023-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:32.234166-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0200, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:17:32.234350-0600 myapp[1976:1843897] logging: Writing to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:32.234477-0600 myapp[1976:1843897] logging: peripheral.writeValue(0xffffffffffff0000010064009c78, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    2020-09-01 23:17:32.234601-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:32.234727-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0201, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:17:32.289118-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:32.349009-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:32.351180-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100201
    2020-09-01 23:17:32.351345-0600 myapp[1976:1843897] logging: Response (Op Code = 2, Status = 1) received
    2020-09-01 23:17:32.351544-0600 myapp[1976:1843897] logging: Initialize DFU Parameters completed
    2020-09-01 23:17:32.352644-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:32.352814-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x080200, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:17:32.410273-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:32.410485-0600 myapp[1976:1843897] logging: Packet Receipt Notif Req (Op Code = 8, Value = 2) request sent
    2020-09-01 23:17:32.410624-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:17:32.410770-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x03, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:17:32.470953-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:17:32.471134-0600 myapp[1976:1843897] logging: Uploading firmware...
    2020-09-01 23:17:32.471266-0600 myapp[1976:1843897] logging: Sending firmware to DFU Packet characteristic...
    2020-09-01 23:20:13.896620-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100301
    2020-09-01 23:20:13.896857-0600 myapp[1976:1843897] logging: Response (Op Code = 3, Status = 1) received
    2020-09-01 23:20:13.896998-0600 myapp[1976:1843897] logging: Upload completed in 161.43 seconds
    2020-09-01 23:20:13.897229-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:13.897446-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x04, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:13.954772-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:13.954944-0600 myapp[1976:1843897] logging: Validate Firmware (Op Code = 4) request sent
    2020-09-01 23:20:14.106887-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100401
    2020-09-01 23:20:14.107117-0600 myapp[1976:1843897] logging: Response (Op Code = 4, Status = 1) received
    2020-09-01 23:20:14.107299-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:14.107445-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x05, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:14.860410-0600 myapp[1976:1843897] logging: [Callback] Central Manager did disconnect peripheral
    2020-09-01 23:20:14.860514-0600 myapp[1976:1843897] logging: Disconnected by the remote device
    2020-09-01 23:20:14.860587-0600 myapp[1976:1843897] logging: Scanning for the DFU Bootloader...
    
    *** need to manually reset device at this point ***
    
    2020-09-01 23:20:33.995711-0600 myapp[1976:1843897] logging: DFU Bootloader found with name DfuTarg
    2020-09-01 23:20:33.995931-0600 myapp[1976:1843897] logging: Connecting to DfuTarg...
    2020-09-01 23:20:33.996074-0600 myapp[1976:1843897] logging: centralManager.connect(peripheral, options: nil)
    2020-09-01 23:20:34.258682-0600 myapp[1976:1843897] logging: [Callback] Central Manager did connect peripheral
    2020-09-01 23:20:34.258870-0600 myapp[1976:1843897] logging: Connected to DfuTarg
    2020-09-01 23:20:34.259003-0600 myapp[1976:1843897] logging: Discovering services...
    2020-09-01 23:20:34.259124-0600 myapp[1976:1843897] logging: peripheral.discoverServices([00001530-1212-EFDE-1523-785FEABCD123])
    2020-09-01 23:20:34.648986-0600 myapp[1976:1843897] logging: Services discovered
    2020-09-01 23:20:34.649168-0600 myapp[1976:1843897] logging: Legacy DFU Service found
    2020-09-01 23:20:34.649507-0600 myapp[1976:1843897] logging: Discovering characteristics in DFU Service...
    2020-09-01 23:20:34.649660-0600 myapp[1976:1843897] logging: peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:20:34.890468-0600 myapp[1976:1843897] logging: DFU characteristics discovered
    2020-09-01 23:20:34.890633-0600 myapp[1976:1843897] logging: Reading DFU Version number...
    2020-09-01 23:20:34.890972-0600 myapp[1976:1843897] logging: peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:20:34.948009-0600 myapp[1976:1843897] logging: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0800
    2020-09-01 23:20:34.948184-0600 myapp[1976:1843897] logging: Version number read: 0.8
    2020-09-01 23:20:34.948329-0600 myapp[1976:1843897] logging: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:34.948541-0600 myapp[1976:1843897] logging: peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    2020-09-01 23:20:35.070214-0600 myapp[1976:1843897] logging: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:35.070452-0600 myapp[1976:1843897] logging: DFU Control Point notifications enabled
    2020-09-01 23:20:35.070601-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:35.070728-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:35.070852-0600 myapp[1976:1843897] logging: Writing image sizes (0b, 0b, 34832b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:35.070979-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x000000000000000010880000, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    2020-09-01 23:20:35.127029-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:35.127206-0600 myapp[1976:1843897] logging: Start DFU (Op Code = 1, Upload Mode = 4) request sent
    2020-09-01 23:20:37.321846-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100101
    2020-09-01 23:20:37.322083-0600 myapp[1976:1843897] logging: Response (Op Code = 1, Status = 1) received
    2020-09-01 23:20:37.322218-0600 myapp[1976:1843897] logging: Writing Initialize DFU Parameters...
    2020-09-01 23:20:37.322353-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:37.322478-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0200, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:37.322639-0600 myapp[1976:1843897] logging: Writing to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:37.322777-0600 myapp[1976:1843897] logging: peripheral.writeValue(0xffffffffffff0000010064004f76, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    2020-09-01 23:20:37.322925-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:37.323047-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x0201, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:37.376927-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:37.466841-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:37.469107-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100201
    2020-09-01 23:20:37.469279-0600 myapp[1976:1843897] logging: Response (Op Code = 2, Status = 1) received
    2020-09-01 23:20:37.469422-0600 myapp[1976:1843897] logging: Initialize DFU Parameters completed
    2020-09-01 23:20:37.469904-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:37.470071-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x080200, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:37.528298-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:37.528498-0600 myapp[1976:1843897] logging: Packet Receipt Notif Req (Op Code = 8, Value = 2) request sent
    2020-09-01 23:20:37.528633-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:20:37.529014-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x03, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:20:37.588529-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:20:37.588706-0600 myapp[1976:1843897] logging: Uploading firmware...
    2020-09-01 23:20:37.588837-0600 myapp[1976:1843897] logging: Sending firmware to DFU Packet characteristic...
    2020-09-01 23:21:32.005590-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100301
    2020-09-01 23:21:32.005704-0600 myapp[1976:1843897] logging: Response (Op Code = 3, Status = 1) received
    2020-09-01 23:21:32.005773-0600 myapp[1976:1843897] logging: Upload completed in 54.42 seconds
    2020-09-01 23:21:32.005945-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:21:32.006019-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x04, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:21:32.065398-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:21:32.065572-0600 myapp[1976:1843897] logging: Validate Firmware (Op Code = 4) request sent
    2020-09-01 23:21:32.096702-0600 myapp[1976:1843897] logging: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100401
    2020-09-01 23:21:32.096877-0600 myapp[1976:1843897] logging: Response (Op Code = 4, Status = 1) received
    2020-09-01 23:21:32.097027-0600 myapp[1976:1843897] logging: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    2020-09-01 23:21:32.097172-0600 myapp[1976:1843897] logging: peripheral.writeValue(0x05, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    2020-09-01 23:21:32.155312-0600 myapp[1976:1843897] logging: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    2020-09-01 23:21:32.155508-0600 myapp[1976:1843897] logging: Activate and Reset (Op Code = 5) request sent
    2020-09-01 23:21:32.341104-0600 myapp[1976:1843897] logging: [Callback] Central Manager did disconnect peripheral
    2020-09-01 23:21:32.341279-0600 myapp[1976:1843897] logging: Disconnected by the remote device
    2020-09-01 23:21:32.341538-0600 myapp[1976:1845196] [CoreBluetooth] XPC connection invalid

    Can we be certain that the issue lies in the Simblee bootloader not properly reseting following activation of the newly written image? Is it possible that the issue is with the SDK 10 bootloader not starting for some reason?

    If this cannot be solved, we'll accept that the update process to flash our SDK 10-based bootloader, along with softdevice 110 and a compatible application will require the user to turn the device off and on at the appropriate point in the process. We'll be sure our iOS app's UI instructs the user accordingly.

    Thanks for any thoughts, Einar.

    Tim

  • Hi Tim,

    I cannot say that it is impossible to solve this, but without having the exact bootloader code it is difficult to make more precise suggestions. Your workaround by making the user reset the device seems sensibel, though I understand it is not the first choice.

    Einar

  • Hi Einar,

    Thank you for your understandable response.

    I've now discovered that even the proposed solution where the user is required to turn the device off and on does not work. So far, I've been using a Simblee module programmed via a nRF51 dev kit. In order to do this I had to erase the chip (nrfjprog --recover) because it's read protected. Using the Programmer of nRF Connect on Mac, I was able to write the Simblee bootloader, soft device 110, then DFU my bootloader (based on SDK 10 bootloader) plus softdevice 110, then, after manually resetting the dev kit, a new application. Then I could DFU a new version of the application.

    I then tried this using a Simblee that had our current application flashed to it using the Simblee loader and the Arduino IDE used for Simblee development and following DFU of our bootloader and softdevice 110, a manual reset would not cause the device to boot into DFU mode. The device was essentially bricked. There's something proprietary that is loaded when programmed with the Arduino IDE and Simblee's loader.

    Now I'm exploring the possibility of leaving Simblee's bootloader on the devices in the field and simply DFU a new application. To test, I built the s110_with_dfu version of the heart rate service example (ble_app_hrs) of SDK 10. (I built using armgcc.) If I change the FLASH ORIGIN in the linker file (ble_app_hrs_gcc_nrf51.ld) from 0x18000 to 0x1F000, I can DFU the application to a device with Simblee's bootloader. All works. Here's the DFU log from nRF Connect (iOS).

    File Name: hrm.zip
    Parts: 1
    Size: 31 KB
    Soft Device Size: Zero KB
    Bootloader Size: Zero KB
    [Callback] Central Manager did update state to: Powered ON
    Connecting to beam...
    centralManager.connect(peripheral, options: nil)
    [Callback] Central Manager did connect peripheral
    Connected to beam
    Discovering services...
    peripheral.discoverServices(nil)
    Services discovered
    Starting Legacy DFU...
    Connected to beam
    Services discovered
    Legacy DFU Service found
    Discovering characteristics in DFU Service...
    peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    DFU characteristics discovered
    Reading DFU Version number...
    peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0100
    Version number read: 0.1
    Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    DFU Control Point notifications enabled
    Application with buttonless update found
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Jump to bootloader (Op Code = 1, Upload Mode = 4) request sent
    [Callback] Central Manager did disconnect peripheral
    Disconnected by the remote device
    Connecting to beam...
    centralManager.connect(peripheral, options: nil)
    [Callback] Central Manager did connect peripheral
    Connected to beam
    Discovering services...
    peripheral.discoverServices([00001530-1212-EFDE-1523-785FEABCD123])
    Services discovered
    Legacy DFU Service found
    Discovering characteristics in DFU Service...
    peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    DFU characteristics discovered
    Reading DFU Version number...
    peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0600
    Version number read: 0.6
    Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    DFU Control Point notifications enabled
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Writing image sizes (0b, 0b, 30832b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x000000000000000070780000, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Start DFU (Op Code = 1, Upload Mode = 4) request sent
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100101
    Response (Op Code = 1, Status = 1) received
    Writing Initialize DFU Parameters...
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0200, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Writing to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0xffffffffffff0000010064002f50, for: 00001532-1212-EFDE-1523-785FEABCD123, type: .withoutResponse)
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0201, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100201
    Response (Op Code = 2, Status = 1) received
    Initialize DFU Parameters completed
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x080c00, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Packet Receipt Notif Req (Op Code = 8, Value = 12) request sent
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x03, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Uploading firmware...
    Sending firmware to DFU Packet characteristic...
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100301
    Response (Op Code = 3, Status = 1) received
    Upload completed in 13.11 seconds
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x04, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Validate Firmware (Op Code = 4) request sent
    Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100401
    Response (Op Code = 4, Status = 1) received
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x05, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Activate and Reset (Op Code = 5) request sent
    [Callback] Central Manager did disconnect peripheral
    Disconnected by the remote device

    When I connect to the application (advertises as "Nordic_HRM") and attempt to DFU the same application again, it fails. When it attempts to jump to the bootloader, I think it fails because when the DFU version number is read, it's 0.1 and not 0.6 as expected (see line 50 below). It just continues trying to jump to the bootloader and fails until I manually cancel.

    File Name: hrm.zip
    Parts: 1
    Size: 31 KB
    Soft Device Size: Zero KB
    Bootloader Size: Zero KB
    [Callback] Central Manager did update state to: Powered ON
    Connecting to Nordic_HRM...
    centralManager.connect(peripheral, options: nil)
    [Callback] Central Manager did connect peripheral
    Connected to Nordic_HRM
    Discovering services...
    peripheral.discoverServices(nil)
    Services discovered
    Starting Legacy DFU...
    Connected to Nordic_HRM
    Services discovered
    Legacy DFU Service found
    Discovering characteristics in DFU Service...
    peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    DFU characteristics discovered
    Reading DFU Version number...
    peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0100
    Version number read: 0.1
    Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    DFU Control Point notifications enabled
    Application with buttonless update found
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Jump to bootloader (Op Code = 1, Upload Mode = 4) request sent
    [Callback] Central Manager did disconnect peripheral
    Disconnected by the remote device
    Connecting to Nordic_HRM...
    centralManager.connect(peripheral, options: nil)
    [Callback] Central Manager did connect peripheral
    Connected to Nordic_HRM
    Discovering services...
    peripheral.discoverServices([00001530-1212-EFDE-1523-785FEABCD123])
    Services discovered
    Legacy DFU Service found
    Discovering characteristics in DFU Service...
    peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    DFU characteristics discovered
    Reading DFU Version number...
    peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0100
    Version number read: 0.1
    Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    DFU Control Point notifications enabled
    Application with buttonless update found
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Jump to bootloader (Op Code = 1, Upload Mode = 4) request sent
    [Callback] Central Manager did disconnect peripheral
    Disconnected by the remote device
    Connecting to Nordic_HRM...
    centralManager.connect(peripheral, options: nil)
    [Callback] Central Manager did connect peripheral
    Connected to Nordic_HRM
    Discovering services...
    peripheral.discoverServices([00001530-1212-EFDE-1523-785FEABCD123])
    Services discovered
    Legacy DFU Service found
    Discovering characteristics in DFU Service...
    peripheral.discoverCharacteristics(nil, for: 00001530-1212-EFDE-1523-785FEABCD123)
    DFU characteristics discovered
    Reading DFU Version number...
    peripheral.readValue(00001534-1212-EFDE-1523-785FEABCD123)
    Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0100
    Version number read: 0.1
    Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.setNotifyValue(true, for: 00001531-1212-EFDE-1523-785FEABCD123)
    Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    DFU Control Point notifications enabled
    Application with buttonless update found
    Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    peripheral.writeValue(0x0104, for: 00001531-1212-EFDE-1523-785FEABCD123, type: .withResponse)
    Data written to 00001531-1212-EFDE-1523-785FEABCD123
    Jump to bootloader (Op Code = 1, Upload Mode = 4) request sent
    
    .
    .
    .

    I presume there's something different in how a Simblee application with buttonless DFU jumps to the Simblee bootloader compared to how a standard SDK 10 application with buttonless DFU jumps to a standard Nordic SDK 10 bootloader.

    If I can't figure this out, it means we will be able to update our 700 Simblee devices in the field once and only once.

    Is it possible to write an application that reads any location in flash? Could I write an application that reads the MBR, bootloader settings, etc. in hopes of finding the difference(s) so I can account for them in the buttonless DFU support of our application?

    I've contacted the company (AMS) that acquired and discontinued Simblee to see if I could, under non-disclosure, gain access to Simblee proprietary information to solve this. I speculate this will not be possible.

    I realize this is a hard situation. I understand that Simblee was developed with support for Nordic, so I wonder if some helpful information might reside within Nordic. I would be happy to sign a non-disclosure/confidentiality agreement in order to access information to solve my issue.

    Many thanks, Einar, for your help.

    Tim

Related