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

DFU fails intermittently with: Error 8: Operation not permitted

System Setup:

SDK 15.2.0,  SD 6.1.1, iOS 12.3.1, IOS-Pods-DFU-Library 4.4.1

Target device:  FanStel BC840M (nRF 52840)

Bootloader:  examples/dfu/secure_bootloader

We are using buttonless DFU. The application was based on ble_app_buttonless_dfu from SDK 15.2.0.  We create two ZIP packages that contain identical application image, then upgrade from one to the other and so on.  With iPhone 7 we see only one error in over 40 upgrades. With iPhone XR the first upgrade after power-up works but all subsequent upgrades fail until we power cycle the target device. The ZIP package contains the application only and is 44KB is size. The error usually happens near the start but sometimes happens after several packets are transferred. The DFU secure_bootloader comes from SDK 15.2 and we use SoftDevice 6.1.1. Target device is 52840. We do NOT use bonding. See the log output below. I plan to increase the log verbosity and do another capture soon. Any ideas how to debug this?

Here is the command to build the ZIP package:  nrfutil pkg generate --hw-version 52 --application-version 1 --sd-req 0xB6 --key-file private.key --application app.hex app.zip

2019-07-02 08:50:59.400 > DFU state: Connecting
2019-07-02 08:51:00.831 > DFU state: Starting
2019-07-02 08:51:01.012 > DFU:Buttonless DFU indications enabled
2019-07-02 08:51:01.012 > DFU:Application with buttonless update found
2019-07-02 08:51:01.013 > DFU state: Enabling DFU Mode
2019-07-02 08:51:01.072 > DFU:Response (Op Code = 2, Status = 1) received
2019-07-02 08:51:01.072 > DFU:Bootloader name changed successfully
2019-07-02 08:51:01.101 > DFU:Response (Op Code = 1, Status = 1) received
2019-07-02 08:51:04.943 > DFU state: Starting
2019-07-02 08:51:04.971 > DFU:Secure DFU Control Point notifications enabled
2019-07-02 08:51:05.002 > DFU:Command object info (Max size = 256, Offset = 0, CRC = 00000000) received
2019-07-02 08:51:05.064 > DFU:Packet Receipt Notif disabled (Op Code = 2, Value = 0)
2019-07-02 08:51:05.065 > DFU:Command object sent (CRC = 2AF5FA37)
2019-07-02 08:51:05.092 > DFU:Checksum (Offset = 141, CRC = 2AF5FA37) received
2019-07-02 08:51:05.137 > DFU:Command object executed
2019-07-02 08:51:05.166 > DFU:Packet Receipt Notif enabled (Op Code = 2, Value = 12)
2019-07-02 08:51:05.287 > DFU:Data object info (Max size = 4096, Offset = 0, CRC = 00000000) received
2019-07-02 08:51:05.287 > DFU state: Uploading
2019-07-02 08:51:05.317 > DFU:Uploading firmware...
2019-07-02 08:51:05.513 > DFU:Checksum (Offset = 3660, CRC = 91858F4F) received
2019-07-02 08:51:05.631 > DFU:Error 8: Operation not permitted
2019-07-02 08:51:05.632 > DFU:Data object executed
2019-07-02 08:51:05.663 > DFU:Uploading firmware...
2019-07-02 08:51:05.730 > DFU error: DFUError 7024 bytes were sent while 0 bytes were reported as received

  • Hi Michael, 

    Sorry for the late response, I was on vacation this week. 

    Good to know that you have a temporary workaround. 

    I will have a look at the traces. In the mean time, if possible could you capture the trace when the first update is success and the second update is failed ? (with packetReceiptNotifications = 12) 

  • Hi Michael, 

    Having a look at the traces from iPhone XR and iPhone 7, I can see that the iPhone XR can send the firmware data much faster compare to iPhone 7. If you count the time from:
    "DFU:Sending firmware to DFU Packet characteristic..."

    until the next log, on iPhone XR it takes ~150ms when on iPhone 7 it takes 283ms. 

    This may suggest that it was due to the XR sending data too fast that causing the bootloader couldn't handle it. We need to check the connection interval of the connections. 

    If you can capture some sniffer traces  to compare it would be great. 

    I would suggest to try increase the preferred connection interval to slow down the update speed from the iPhone XR. 

Related