flash/nor/at91samd: Use 32-bit register writes for ST-Link compat
[fw/openocd] / src / flash / nor / core.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2005 by Dominic Rath <Dominic.Rath@gmx.de>              *
5  *   Copyright (C) 2007,2008 Ã˜yvind Harboe <oyvind.harboe@zylin.com>       *
6  *   Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk>           *
7  *   Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net>             *
8  *   Copyright (C) 2010 by Antonio Borneo <borneo.antonio@gmail.com>       *
9  ***************************************************************************/
10
11 #ifndef OPENOCD_FLASH_NOR_CORE_H
12 #define OPENOCD_FLASH_NOR_CORE_H
13
14 #include <flash/common.h>
15
16 /**
17  * @file
18  * Upper level NOR flash interfaces.
19  */
20
21 struct image;
22
23 /**
24  * Describes the geometry and status of a single flash sector
25  * within a flash bank.  A single bank typically consists of multiple
26  * sectors, each of which can be erased and protected independently.
27  */
28 struct flash_sector {
29         /** Bus offset from start of the flash chip (in bytes). */
30         uint32_t offset;
31         /** Number of bytes in this flash sector. */
32         uint32_t size;
33         /**
34          * Indication of erasure status: 0 = not erased, 1 = erased,
35          * other = unknown.  Set by @c flash_driver_s::erase_check only.
36          *
37          * This information must be considered stale immediately.
38          * Don't set it in flash_driver_s::erase or a device mass_erase
39          * Don't clear it in flash_driver_s::write
40          * The flag is not used in a protection block
41          */
42         int is_erased;
43         /**
44          * Indication of protection status: 0 = unprotected/unlocked,
45          * 1 = protected/locked, other = unknown.  Set by
46          * @c flash_driver_s::protect_check.
47          *
48          * This information must be considered stale immediately.
49          * A million things could make it stale: power cycle,
50          * reset of target, code running on target, etc.
51          *
52          * If a flash_bank uses an extra array of protection blocks,
53          * protection flag is not valid in sector array
54          */
55         int is_protected;
56 };
57
58 /** Special value for write_start_alignment and write_end_alignment field */
59 #define FLASH_WRITE_ALIGN_SECTOR        UINT32_MAX
60
61 /** Special values for minimal_write_gap field */
62 #define FLASH_WRITE_CONTINUOUS          0
63 #define FLASH_WRITE_GAP_SECTOR          UINT32_MAX
64
65 /**
66  * Provides details of a flash bank, available either on-chip or through
67  * a major interface.
68  *
69  * This structure will be passed as a parameter to the callbacks in the
70  * flash_driver_s structure, some of which may modify the contents of
71  * this structure of the area of flash that it defines.  Driver writers
72  * may use the @c driver_priv member to store additional data on a
73  * per-bank basis, if required.
74  */
75 struct flash_bank {
76         char *name;
77
78         struct target *target; /**< Target to which this bank belongs. */
79
80         const struct flash_driver *driver; /**< Driver for this bank. */
81         void *driver_priv; /**< Private driver storage pointer */
82
83         unsigned int bank_number; /**< The 'bank' (or chip number) of this instance. */
84         target_addr_t base; /**< The base address of this bank */
85         uint32_t size; /**< The size of this chip bank, in bytes */
86
87         unsigned int chip_width; /**< Width of the chip in bytes (1,2,4 bytes) */
88         unsigned int bus_width; /**< Maximum bus width, in bytes (1,2,4 bytes) */
89
90         /** Erased value. Defaults to 0xFF. */
91         uint8_t erased_value;
92
93         /** Default padded value used, normally this matches the  flash
94          * erased value. Defaults to 0xFF. */
95         uint8_t default_padded_value;
96
97         /** Required alignment of flash write start address.
98          * Default 0, no alignment. Can be any power of two or FLASH_WRITE_ALIGN_SECTOR */
99         uint32_t write_start_alignment;
100         /** Required alignment of flash write end address.
101          * Default 0, no alignment. Can be any power of two or FLASH_WRITE_ALIGN_SECTOR */
102         uint32_t write_end_alignment;
103         /** Minimal gap between sections to discontinue flash write
104          * Default FLASH_WRITE_GAP_SECTOR splits the write if one or more untouched
105          * sectors in between.
106      * Can be size in bytes or FLASH_WRITE_CONTINUOUS */
107         uint32_t minimal_write_gap;
108
109         /**
110          * The number of sectors on this chip.  This value will
111          * be set initially to 0, and the flash driver must set this to
112          * some non-zero value during "probe()" or "auto_probe()".
113          */
114         unsigned int num_sectors;
115         /** Array of sectors, allocated and initialized by the flash driver */
116         struct flash_sector *sectors;
117
118         /**
119          * The number of protection blocks in this bank. This value
120          * is set initially to 0 and sectors are used as protection blocks.
121          * Driver probe can set protection blocks array to work with
122          * protection granularity different than sector size.
123          */
124         unsigned int num_prot_blocks;
125         /** Array of protection blocks, allocated and initialized by the flash driver */
126         struct flash_sector *prot_blocks;
127
128         struct flash_bank *next; /**< The next flash bank on this chip */
129 };
130
131 /** Registers the 'flash' subsystem commands */
132 int flash_register_commands(struct command_context *cmd_ctx);
133
134 /**
135  * Erases @a length bytes in the @a target flash, starting at @a addr.
136  * The range @a addr to @a addr + @a length - 1 must be strictly
137  * sector aligned, unless @a pad is true.  Setting @a pad true extends
138  * the range, at beginning and/or end, if needed for sector alignment.
139  * @returns ERROR_OK if successful; otherwise, an error code.
140  */
141 int flash_erase_address_range(struct target *target,
142                 bool pad, target_addr_t addr, uint32_t length);
143
144 int flash_unlock_address_range(struct target *target, target_addr_t addr,
145                 uint32_t length);
146
147 /**
148  * Align start address of a flash write region according to bank requirements.
149  * @param bank Pointer to bank descriptor structure
150  * @param addr Address to align
151  * @returns Aligned address
152 */
153 target_addr_t flash_write_align_start(struct flash_bank *bank, target_addr_t addr);
154 /**
155  * Align end address of a flash write region according to bank requirements.
156  * Note: Use address of the last byte to write, not the next after the region.
157  * @param bank Pointer to bank descriptor structure
158  * @param addr Address to align (address of the last byte to write)
159  * @returns Aligned address (address of the last byte of padded region)
160 */
161 target_addr_t flash_write_align_end(struct flash_bank *bank, target_addr_t addr);
162
163 /**
164  * Writes @a image into the @a target flash.  The @a written parameter
165  * will contain the
166  * @param target The target with the flash to be programmed.
167  * @param image The image that will be programmed to flash.
168  * @param written On return, contains the number of bytes written.
169  * @param erase Indicates whether the flash driver should first
170  * erase the corresponding banks or sectors before programming.
171  * @returns ERROR_OK if successful; otherwise, an error code.
172  */
173 int flash_write(struct target *target,
174                 struct image *image, uint32_t *written, bool erase);
175
176 /**
177  * Forces targets to re-examine their erase/protection state.
178  * This routine must be called when the system may modify the status.
179  */
180 void flash_set_dirty(void);
181
182 /** @returns The number of flash banks currently defined. */
183 unsigned int flash_get_bank_count(void);
184
185 /** Deallocates bank->driver_priv */
186 void default_flash_free_driver_priv(struct flash_bank *bank);
187
188 /** Deallocates all flash banks */
189 void flash_free_all_banks(void);
190
191 /**
192  * Provides default read implementation for flash memory.
193  * @param bank The bank to read.
194  * @param buffer The data bytes read.
195  * @param offset The offset into the chip to read.
196  * @param count The number of bytes to read.
197  * @returns ERROR_OK if successful; otherwise, an error code.
198  */
199 int default_flash_read(struct flash_bank *bank,
200                 uint8_t *buffer, uint32_t offset, uint32_t count);
201
202 /**
203  * Provides default verify implementation for flash memory.
204  * @param bank The bank to verify.
205  * @param buffer The data bytes to verify.
206  * @param offset The offset into the chip to verify.
207  * @param count The number of bytes to verify.
208  * @returns ERROR_OK if successful; otherwise, an error code.
209  */
210 int default_flash_verify(struct flash_bank *bank,
211                 const uint8_t *buffer, uint32_t offset, uint32_t count);
212
213 /**
214  * Provides default erased-bank check handling. Checks to see if
215  * the flash driver knows they are erased; if things look uncertain,
216  * this routine will call default_flash_mem_blank_check() to confirm.
217  * @returns ERROR_OK if successful; otherwise, an error code.
218  */
219 int default_flash_blank_check(struct flash_bank *bank);
220 /**
221  * Returns the flash bank specified by @a name, which matches the
222  * driver name and a suffix (option) specify the driver-specific
223  * bank number. The suffix consists of the '.' and the driver-specific
224  * bank number: when two str9x banks are defined, then 'str9x.1' refers
225  * to the second.
226  */
227 int get_flash_bank_by_name(const char *name, struct flash_bank **bank_result);
228 /**
229  * Returns the flash bank specified by @a name, which matches the
230  * driver name and a suffix (option) specify the driver-specific
231  * bank number. The suffix consists of the '.' and the driver-specific
232  * bank number: when two str9x banks are defined, then 'str9x.1' refers
233  * to the second.
234  */
235 struct flash_bank *get_flash_bank_by_name_noprobe(const char *name);
236 /**
237  * Returns the flash bank like get_flash_bank_by_name(), without probing.
238  * @param num The flash bank number.
239  * @param bank returned bank if fn returns ERROR_OK
240  * @returns ERROR_OK if successful
241  */
242 int get_flash_bank_by_num(unsigned int num, struct flash_bank **bank);
243 /**
244  * Retrieves @a bank from a command argument, reporting errors parsing
245  * the bank identifier or retrieving the specified bank.  The bank
246  * may be identified by its bank number or by @c name.instance, where
247  * @a instance is driver-specific.
248  * @param name_index The index to the string in args containing the
249  * bank identifier.
250  * @param bank On output, contains a pointer to the bank or NULL.
251  * @returns ERROR_OK on success, or an error indicating the problem.
252  */
253 COMMAND_HELPER(flash_command_get_bank, unsigned name_index,
254                 struct flash_bank **bank);
255 /**
256  * Returns the flash bank like get_flash_bank_by_num(), without probing.
257  * @param num The flash bank number.
258  * @returns A struct flash_bank for flash bank @a num, or NULL.
259  */
260 struct flash_bank *get_flash_bank_by_num_noprobe(unsigned int num);
261 /**
262  * Returns the flash bank located at a specified address.
263  * @param target The target, presumed to contain one or more banks.
264  * @param addr An address that is within the range of the bank.
265  * @param check return ERROR_OK and result_bank NULL if the bank does not exist
266  * @param result_bank The struct flash_bank located at @a addr, or NULL.
267  * @returns ERROR_OK on success, or an error indicating the problem.
268  */
269 int get_flash_bank_by_addr(struct target *target, target_addr_t addr, bool check,
270                 struct flash_bank **result_bank);
271 /**
272  * Allocate and fill an array of sectors or protection blocks.
273  * @param offset Offset of first block.
274  * @param size Size of each block.
275  * @param num_blocks Number of blocks in array.
276  * @returns A struct flash_sector pointer or NULL when allocation failed.
277  */
278 struct flash_sector *alloc_block_array(uint32_t offset, uint32_t size,
279                 unsigned int num_blocks);
280
281 #endif /* OPENOCD_FLASH_NOR_CORE_H */