+#include <flash/common.h>
+
+/**
+ * @file
+ * Upper level NOR flash interfaces.
+ */
+
+struct image;
+
+#define FLASH_MAX_ERROR_STR (128)
+
+/**
+ * Describes the geometry and status of a single flash sector
+ * within a flash bank. A single bank typically consists of multiple
+ * sectors, each of which can be erased and protected independently.
+ */
+struct flash_sector {
+ /** Bus offset from start of the flash chip (in bytes). */
+ uint32_t offset;
+ /** Number of bytes in this flash sector. */
+ uint32_t size;
+ /**
+ * Indication of erasure status: 0 = not erased, 1 = erased,
+ * other = unknown. Set by @c flash_driver_s::erase_check.
+ */
+ int is_erased;
+ /**
+ * Indication of protection status: 0 = unprotected/unlocked,
+ * 1 = protected/locked, other = unknown. Set by
+ * @c flash_driver_s::protect_check.
+ *
+ * This information must be considered stale immediately.
+ * A million things could make it stale: power cycle,
+ * reset of target, code running on target, etc.
+ */
+ int is_protected;
+};
+
+/**
+ * Provides details of a flash bank, available either on-chip or through
+ * a major interface.
+ *
+ * This structure will be passed as a parameter to the callbacks in the
+ * flash_driver_s structure, some of which may modify the contents of
+ * this structure of the area of flash that it defines. Driver writers
+ * may use the @c driver_priv member to store additional data on a
+ * per-bank basis, if required.
+ */
+struct flash_bank {
+ const char *name;
+
+ struct target *target; /**< Target to which this bank belongs. */
+
+ 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 */
+ uint32_t size; /**< The size of this chip bank, in bytes */
+
+ int chip_width; /**< Width of the chip in bytes (1,2,4 bytes) */
+ int bus_width; /**< Maximum bus width, in bytes (1,2,4 bytes) */
+
+ /** Default padded value used, normally this matches the flash
+ * erased value. Defaults to 0xFF. */
+ uint8_t default_padded_value;
+
+ /**
+ * The number of sectors on this chip. This value will
+ * be set intially to 0, and the flash driver must set this to
+ * some non-zero value during "probe()" or "auto_probe()".
+ */
+ int num_sectors;
+ /** Array of sectors, allocated and initilized by the flash driver */
+ struct flash_sector *sectors;
+
+ struct flash_bank *next; /**< The next flash bank on this chip */
+};
+
+/** Registers the 'flash' subsystem commands */
+int flash_register_commands(struct command_context *cmd_ctx);
+
+/**
+ * Erases @a length bytes in the @a target flash, starting at @a addr.
+ * The range @a addr to @a addr + @a length - 1 must be strictly
+ * sector aligned, unless @a pad is true. Setting @a pad true extends
+ * the range, at beginning and/or end, if needed for sector alignment.
+ * @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);
+
+int flash_unlock_address_range(struct target *target, uint32_t addr,
+ uint32_t length);
+
+/**
+ * Writes @a image into the @a target flash. The @a written parameter
+ * will contain the
+ * @param target The target with the flash to be programmed.
+ * @param image The image that will be programmed to flash.
+ * @param written On return, contains the number of bytes written.
+ * @param erase If non-zero, indicates the flash driver should first
+ * erase the corresponding banks or sectors before programming.
+ * @returns ERROR_OK if successful; otherwise, an error code.
+ */
+int flash_write(struct target *target,
+ struct image *image, uint32_t *written, int erase);
+
+/**
+ * Forces targets to re-examine their erase/protection state.
+ * This routine must be called when the system may modify the status.
+ */
+void flash_set_dirty(void);
+/** @returns The number of flash banks currently defined. */
+int flash_get_bank_count(void);
+/**
+ * Provides default read implementation for flash memory.
+ * @param bank The bank to read.
+ * @param buffer The data bytes read.
+ * @param offset The offset into the chip to read.
+ * @param count The number of bytes to read.
+ * @returns ERROR_OK if successful; otherwise, an error code.
+ */
+int default_flash_read(struct flash_bank *bank,
+ uint8_t *buffer, uint32_t offset, uint32_t count);
+/**
+ * Provides default erased-bank check handling. Checks to see if
+ * the flash driver knows they are erased; if things look uncertain,
+ * this routine will call default_flash_mem_blank_check() to confirm.
+ * @returns ERROR_OK if successful; otherwise, an error code.
+ */
+int default_flash_blank_check(struct flash_bank *bank);