uint32_t size;
/**
* Indication of erasure status: 0 = not erased, 1 = erased,
- * other = unknown. Set by @c flash_driver_s::erase_check.
+ * other = unknown. Set by @c flash_driver_s::erase_check only.
*
- * Flag is not used in protection block
+ * This information must be considered stale immediately.
+ * Don't set it in flash_driver_s::erase or a device mass_erase
+ * Don't clear it in flash_driver_s::write
+ * The flag is not used in a protection block
*/
int is_erased;
/**
int is_protected;
};
+/** Special value for write_start_alignment and write_end_alignment field */
+#define FLASH_WRITE_ALIGN_SECTOR UINT32_MAX
+
+/** Special values for minimal_write_gap field */
+#define FLASH_WRITE_CONTINUOUS 0
+#define FLASH_WRITE_GAP_SECTOR UINT32_MAX
+
/**
* Provides details of a flash bank, available either on-chip or through
* a major interface.
struct target *target; /**< Target to which this bank belongs. */
- struct flash_driver *driver; /**< Driver for this bank. */
+ const struct flash_driver *driver; /**< Driver for this bank. */
void *driver_priv; /**< Private driver storage pointer */
int bank_number; /**< The 'bank' (or chip number) of this instance. */
- uint32_t base; /**< The base address of this bank */
+ target_addr_t base; /**< The base address of this bank */
uint32_t size; /**< The size of this chip bank, in bytes */
int chip_width; /**< Width of the chip in bytes (1,2,4 bytes) */
* erased value. Defaults to 0xFF. */
uint8_t default_padded_value;
+ /** Required alignment of flash write start address.
+ * Default 0, no alignment. Can be any power of two or FLASH_WRITE_ALIGN_SECTOR */
+ uint32_t write_start_alignment;
+ /** Required alignment of flash write end address.
+ * Default 0, no alignment. Can be any power of two or FLASH_WRITE_ALIGN_SECTOR */
+ uint32_t write_end_alignment;
+ /** Minimal gap between sections to discontinue flash write
+ * Default FLASH_WRITE_GAP_SECTOR splits the write if one or more untouched
+ * sectors in between.
+ * Can be size in bytes or FLASH_WRITE_CONTINUOUS */
+ uint32_t minimal_write_gap;
+
/**
* The number of sectors on this chip. This value will
* be set intially to 0, and the flash driver must set this to
* @returns ERROR_OK if successful; otherwise, an error code.
*/
int flash_erase_address_range(struct target *target,
- bool pad, uint32_t addr, uint32_t length);
+ bool pad, target_addr_t addr, uint32_t length);
-int flash_unlock_address_range(struct target *target, uint32_t addr,
+int flash_unlock_address_range(struct target *target, target_addr_t addr,
uint32_t length);
+/**
+ * Align start address of a flash write region according to bank requirements.
+ * @param bank Pointer to bank descriptor structure
+ * @param addr Address to align
+ * @returns Aligned address
+*/
+target_addr_t flash_write_align_start(struct flash_bank *bank, target_addr_t addr);
+/**
+ * Align end address of a flash write region according to bank requirements.
+ * Note: Use address of the last byte to write, not the next after the region.
+ * @param bank Pointer to bank descriptor structure
+ * @param addr Address to align (address of the last byte to write)
+ * @returns Aligned address (address of the last byte of padded region)
+*/
+target_addr_t flash_write_align_end(struct flash_bank *bank, target_addr_t addr);
+
/**
* Writes @a image into the @a target flash. The @a written parameter
* will contain the
* @param check return ERROR_OK and result_bank NULL if the bank does not exist
* @returns The struct flash_bank located at @a addr, or NULL.
*/
-int get_flash_bank_by_addr(struct target *target, uint32_t addr, bool check,
+int get_flash_bank_by_addr(struct target *target, target_addr_t addr, bool check,
struct flash_bank **result_bank);
/**
* Allocate and fill an array of sectors or protection blocks.