Stream Flash¶
The Stream Flash module takes contiguous fragments of a stream of data (e.g. from radio packets), aggregates them into a user-provided buffer, then when the buffer fills (or stream ends) writes it to a raw flash partition. It supports providing the read-back buffer to the client to use in validating the persisted stream content.
One typical use of a stream write operation is when receiving a new firmware image to be used in a DFU operation.
There are several reasons why one might want to use buffered writes instead of writing the data directly as it is made available. Some devices have hardware limitations which does not allow flash writes to be performed in parallell with other operations, such as radio RX and TX. Also, fewer write operations result in faster response times seen from the application.
API Reference¶
-
group
stream_flash
Abstraction over stream writes to flash.
Typedefs
-
typedef int (*
stream_flash_callback_t
)(uint8_t *buf, size_t len, size_t offset)¶ Signature for callback invoked after flash write completes.
Functions of this type are invoked with a buffer containing data read back from the flash after a flash write has completed. This enables verifying that the data has been correctly stored (for instance by using a SHA function). The write buffer ‘buf’ provided in stream_flash_init is used as a read buffer for this purpose.
- Parameters
buf
: Pointer to the data read.len
: The length of the data read.offset
: The offset the data was read from.
Functions
-
int
stream_flash_init
(struct stream_flash_ctx *ctx, const struct device *fdev, uint8_t *buf, size_t buf_len, size_t offset, size_t size, stream_flash_callback_t cb)¶ Initialize context needed for stream writes to flash.
- Return
non-negative on success, negative errno code on fail
- Parameters
ctx
: context to be initializedfdev
: Flash device to operate onbuf
: Write bufferbuf_len
: Length of write buffer. Can not be larger than the page size. Must be multiple of the flash device write-block-size.offset
: Offset within flash device to start writing tosize
: Number of bytes available for performing buffered write. If this is ‘0’, the size will be set to the total size of the flash device minus the offset.cb
: Callback to be invoked on completed flash write operations.
-
size_t
stream_flash_bytes_written
(struct stream_flash_ctx *ctx)¶ Read number of bytes written to the flash.
- Note
api-tags: pre-kernel-ok isr-ok
- Return
Number of payload bytes written to flash.
- Parameters
ctx
: context
-
int
stream_flash_buffered_write
(struct stream_flash_ctx *ctx, const uint8_t *data, size_t len, bool flush)¶ Process input buffers to be written to flash device in single blocks. Will store remainder between calls.
A final call to this function with flush set to true will write out the remaining block buffer to flash.
- Return
non-negative on success, negative errno code on fail
- Parameters
ctx
: contextdata
: data to writelen
: Number of bytes to writeflush
: when true this forces any buffered data to be written to flash A flush write should be the last write operation in a sequence of write operations for given context (although this is not mandatory if the total data size is a multiple of the buffer size).
-
int
stream_flash_erase_page
(struct stream_flash_ctx *ctx, off_t off)¶ Erase the flash page to which a given offset belongs.
This function erases a flash page to which an offset belongs if this page is not the page previously erased by the provided ctx (ctx->last_erased_page_start_offset).
- Return
non-negative on success, negative errno code on fail
- Parameters
ctx
: contextoff
: offset from the base address of the flash device
-
struct
stream_flash_ctx
¶ - #include <stream_flash.h>
Structure for stream flash context.
Users should treat these structures as opaque values and only interact with them through the below API.
-
typedef int (*