aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor/core.h
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2016-07-14 20:33:27 +0200
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2016-08-14 09:16:54 +0100
commit77a1c01ccbb1150ffe749a7373cf6c4dc15ecad0 (patch)
treeefaa9e59e4323beef204a8d7b2f0f1f64964c05d /src/flash/nor/core.h
parent77478eb0f5175ff0518fd7c7fa322beed3b858a8 (diff)
flash/nor: implement protection blocks of different size than erase sector
Originally flash/nor infrastructure assumed protection blocks identical to erase sectors. This assumption is not valid for many flash types. Driver code fixed the problem either by increasing sector size to size of protection block or by defining more protection block than really existed in device. Both cases had drawbacks. The change retains compatibility with the old driver. Updated driver can set protection blocks table independent of sector table. Change-Id: I27f6d267528ad9ed9fe0a85f05436a8ec17603a4 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/3545 Tested-by: jenkins Reviewed-by: Steven Stallion <stallion@squareup.com> Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Diffstat (limited to 'src/flash/nor/core.h')
-rw-r--r--src/flash/nor/core.h25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/flash/nor/core.h b/src/flash/nor/core.h
index 929ebdbe..60d4483a 100644
--- a/src/flash/nor/core.h
+++ b/src/flash/nor/core.h
@@ -46,6 +46,8 @@ struct flash_sector {
/**
* Indication of erasure status: 0 = not erased, 1 = erased,
* other = unknown. Set by @c flash_driver_s::erase_check.
+ *
+ * Flag is not used in protection block
*/
int is_erased;
/**
@@ -56,6 +58,9 @@ struct flash_sector {
* This information must be considered stale immediately.
* A million things could make it stale: power cycle,
* reset of target, code running on target, etc.
+ *
+ * If a flash_bank uses an extra array of protection blocks,
+ * protection flag is not valid in sector array
*/
int is_protected;
};
@@ -95,9 +100,19 @@ struct flash_bank {
* some non-zero value during "probe()" or "auto_probe()".
*/
int num_sectors;
- /** Array of sectors, allocated and initilized by the flash driver */
+ /** Array of sectors, allocated and initialized by the flash driver */
struct flash_sector *sectors;
+ /**
+ * The number of protection blocks in this bank. This value
+ * is set intially to 0 and sectors are used as protection blocks.
+ * Driver probe can set protection blocks array to work with
+ * protection granularity different than sector size.
+ */
+ int num_prot_blocks;
+ /** Array of protection blocks, allocated and initilized by the flash driver */
+ struct flash_sector *prot_blocks;
+
struct flash_bank *next; /**< The next flash bank on this chip */
};
@@ -205,5 +220,13 @@ struct flash_bank *get_flash_bank_by_num_noprobe(int num);
*/
int get_flash_bank_by_addr(struct target *target, uint32_t addr, bool check,
struct flash_bank **result_bank);
+/**
+ * Allocate and fill an array of sectors or protection blocks.
+ * @param offset Offset of first block.
+ * @param size Size of each block.
+ * @param num_blocks Number of blocks in array.
+ * @returns A struct flash_sector pointer or NULL when allocation failed.
+ */
+struct flash_sector *alloc_block_array(uint32_t offset, uint32_t size, int num_blocks);
#endif /* OPENOCD_FLASH_NOR_CORE_H */