Coder Social home page Coder Social logo

nrf-dfu's Introduction

nrf-dfu-target

An implementation of the Nordic nRF DFU protocol in Rust that can be used in a no_std environment. It is based on the nRF SDK 17 DFU protocol, but is compatible with older versions as well.

The intention is that any transport (BLE, UART, USB) can use this crate for decoding the request, processing the request and encoding the response for the protocol.

You can use any flash device that implements the embedded-storage traits as the target.

It does not support updating more than one firmware type for each DfuTarget instance at the moment.

Example

For an example usage based on BLE, see the pinetime-embassy firmware which provides the GATT services and event dispatching.

nrf-dfu's People

Contributors

plaes avatar lulf avatar

Stargazers

 avatar Seyed Ali Mousavi Moallem avatar Xavier Groleau avatar

Watchers

 avatar

Forkers

alimoal plaes

nrf-dfu's Issues

DFU issues when Packet Receipt Notification (PRN) procedure is enabled

There seem to be some edge cases when handling DFU protocol, so let's write the things down:

Firstly, two sets of logs with "previous" code based on watchful where NrfDfuServiceEvent::PacketWrite is using packet_notify instead of notify_control.

  1. Working case (PRN disabled) and using packet_notify:
REQUEST Select { obj_type: Command }
RESPONSE DfuResponse { request: Select { obj_type: Command }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 512 }) }
REQUEST SetReceiptNotification { target: 0 }
RESPONSE DfuResponse { request: SetReceiptNotification { target: 0 }, result: Success, body: None }
REQUEST Create { obj_type: Command, obj_size: 79 }
RESPONSE DfuResponse { request: Create { obj_type: Command, obj_size: 79 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Crc
RESPONSE DfuResponse { request: Crc, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Execute
RESPONSE DfuResponse { request: Execute, result: Success, body: None }
REQUEST Select { obj_type: Data }
RESPONSE DfuResponse { request: Select { obj_type: Data }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 335872 }) }
REQUEST Create { obj_type: Data, obj_size: 61052 }
RESPONSE DfuResponse { request: Create { obj_type: Data, obj_size: 61052 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 120, crc: 1031809356 }) }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 240, crc: 4174146515 }) }
  1. Non-working case, where connection hangs after fifth packet (PRN is configured to 5 in NRF-Connect):
REQUEST Select { obj_type: Command }
RESPONSE DfuResponse { request: Select { obj_type: Command }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 512 }) }
REQUEST SetReceiptNotification { target: 0 }
RESPONSE DfuResponse { request: SetReceiptNotification { target: 0 }, result: Success, body: None }
REQUEST Create { obj_type: Command, obj_size: 79 }
RESPONSE DfuResponse { request: Create { obj_type: Command, obj_size: 79 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Crc
RESPONSE DfuResponse { request: Crc, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Execute
RESPONSE DfuResponse { request: Execute, result: Success, body: None }
REQUEST SetReceiptNotification { target: 5 }
RESPONSE DfuResponse { request: SetReceiptNotification { target: 5 }, result: Success, body: None }
REQUEST Select { obj_type: Data }
RESPONSE DfuResponse { request: Select { obj_type: Data }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 335872 }) }
REQUEST Create { obj_type: Data, obj_size: 61052 }
RESPONSE DfuResponse { request: Create { obj_type: Data, obj_size: 61052 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 600, crc: 2318566729 }) }
... hang ...

Where is the documentation?

Hi, Unfortunately DFU processing is somehow complicated and without documentation it's getting harder. I need firmware updates for my nrf52832 but it's lack of good example or documentation.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.