VSF Documented
flash_template.inc
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#if VSF_HAL_USE_FLASH == ENABLED
19
20/*============================ INCLUDES ======================================*/
21
22/*============================ MACROS ========================================*/
23
24#if defined(VSF_FLASH_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_FLASH_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
25# define vsf_real_flash_t VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _t)
26# define vsf_real_flash_capability VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _capability)
27# define vsf_real_flash_get_configuration VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _get_configuration)
28# define vsf_real_flash_erase_all VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _erase_all)
29# define vsf_real_flash_erase_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _erase_one_sector)
30# define vsf_real_flash_erase_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _erase_multi_sector)
31# define vsf_real_flash_write_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _write_one_sector)
32# define vsf_real_flash_write_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _write_multi_sector)
33# define vsf_real_flash_read_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _read_one_sector)
34# define vsf_real_flash_read_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _read_multi_sector)
35# define vsf_real_flash_ctrl VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _ctrl)
36# define vsf_real_flash_irq_clear VSF_MCONNECT(VSF_FLASH_CFG_IMP_DEVICE_PREFIX, _irq_clear)
37#else
38# define vsf_real_flash_t VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_t)
39# define vsf_real_flash_capability VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_capability)
40# define vsf_real_flash_get_configuration VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_get_configuration)
41# define vsf_real_flash_erase_all VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_all)
42# define vsf_real_flash_erase_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_one_sector)
43# define vsf_real_flash_erase_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_multi_sector)
44# define vsf_real_flash_write_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_write_one_sector)
45# define vsf_real_flash_write_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_write_multi_sector)
46# define vsf_real_flash_read_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_read_one_sector)
47# define vsf_real_flash_read_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_read_multi_sector)
48# define vsf_real_flash_ctrl VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_ctrl)
49# define vsf_real_flash_irq_clear VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_irq_clear)
50#endif
51
52#ifndef VSF_FLASH_CFG_REIMPLEMENT_API_GET_CONFIGURATION
53# define VSF_FLASH_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
54#endif
55
56#ifndef VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY
57# define VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
58#endif
59
60#ifndef VSF_FLASH_CFG_REIMPLEMENT_API_CTRL
61# define VSF_FLASH_CFG_REIMPLEMENT_API_CTRL DISABLED
62#endif
63
64#ifndef VSF_FLASH_CFG_REIMPLEMENT_API_IRQ_CLEAR
65# define VSF_FLASH_CFG_REIMPLEMENT_API_IRQ_CLEAR DISABLED
66#endif
67
68#ifdef VSF_FLASH_CFG_IMP_REMAP_PREFIX
69# undef VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY
70# define VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
71# undef VSF_FLASH_CFG_REIMPLEMENT_API_GET_CONFIGURATION
72# define VSF_FLASH_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
73# undef VSF_FLASH_CFG_REIMPLEMENT_API_CTRL
74# define VSF_FLASH_CFG_REIMPLEMENT_API_CTRL ENABLED
75# undef VSF_FLASH_CFG_REIMPLEMENT_API_IRQ_CLEAR
76# define VSF_FLASH_CFG_REIMPLEMENT_API_IRQ_CLEAR ENABLED
77#endif
78
79#if VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
80# ifndef VSF_FLASH_CFG_CAPABILITY_IRQ_MASK
81# define VSF_FLASH_CFG_CAPABILITY_IRQ_MASK VSF_FLASH_IRQ_ALL_BITS_MASK
82# endif
83# ifndef VSF_FLASH_CFG_CAPABILITY_BASE_ADDRESS
84# define VSF_FLASH_CFG_CAPABILITY_BASE_ADDRESS 0
85# endif
86# ifndef VSF_FLASH_CFG_CAPABILITY_MAX_SIZE
87# error "Please define flash size macro 'VSF_FLASH_CFG_CAPABILITY_MAX_SIZE' in source files"
88# endif
89# ifndef VSF_FLASH_CFG_CAPABILITY_ERASE_SECTORE_SIZE
90# define VSF_FLASH_CFG_CAPABILITY_ERASE_SECTORE_SIZE 4096
91# endif
92# ifndef VSF_FLASH_CFG_CAPABILITY_WRITE_SECTORE_SIZE
93# define VSF_FLASH_CFG_CAPABILITY_WRITE_SECTORE_SIZE 512
94# endif
95# ifndef VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_WRITE
96# define VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_WRITE 0
97# endif
98# ifndef VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_READ
99# define VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_READ 1
100# endif
101#endif
102
103/*============================ MACROFIED FUNCTIONS ===========================*/
104/*============================ TYPES =========================================*/
105/*============================ GLOBAL VARIABLES ==============================*/
106/*============================ LOCAL VARIABLES ===============================*/
107/*============================ PROTOTYPES ====================================*/
108/*============================ IMPLEMENTATION ================================*/
109
110#if VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
111vsf_flash_capability_t vsf_real_flash_capability(vsf_real_flash_t *flash_ptr)
112{
113 vsf_flash_capability_t flash_capability = {
114 .irq_mask = VSF_FLASH_CFG_CAPABILITY_IRQ_MASK,
115 .base_address = VSF_FLASH_CFG_CAPABILITY_BASE_ADDRESS,
116 .max_size = VSF_FLASH_CFG_CAPABILITY_MAX_SIZE,
117 .erase_sector_size = VSF_FLASH_CFG_CAPABILITY_ERASE_SECTORE_SIZE,
118 .write_sector_size = VSF_FLASH_CFG_CAPABILITY_WRITE_SECTORE_SIZE,
119 .none_sector_aligned_write = VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_WRITE,
120 .none_sector_aligned_read = VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_READ,
121 };
122
123 VSF_ASSERT(flash_capability.erase_sector_size >= flash_capability.write_sector_size);
124
125 return flash_capability;
126}
127#endif
128
129#if VSF_FLASH_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
130vsf_err_t vsf_real_flash_get_configuration(vsf_real_flash_t *flash_ptr, vsf_flash_cfg_t *cfg_ptr)
131{
132 VSF_HAL_ASSERT(NULL != flash_ptr);
133 VSF_HAL_ASSERT(NULL != cfg_ptr);
134
135 // Default implementation: not supported, trigger assertion
137
138 return VSF_ERR_NOT_SUPPORT;
139}
140#endif
141
142#if VSF_FLASH_CFG_REIMPLEMENT_API_CTRL == DISABLED
143vsf_err_t vsf_real_flash_ctrl(vsf_real_flash_t *flash_ptr, vsf_flash_ctrl_t ctrl, void *param)
144{
145 VSF_HAL_ASSERT(NULL != flash_ptr);
146
147 // Default implementation: not supported, trigger assertion
149
150 return VSF_ERR_NOT_SUPPORT;
151}
152#endif
153
154#if VSF_FLASH_CFG_REIMPLEMENT_API_IRQ_CLEAR == DISABLED
155vsf_flash_irq_mask_t vsf_real_flash_irq_clear(vsf_real_flash_t *flash_ptr, vsf_flash_irq_mask_t irq_mask)
156{
157 VSF_HAL_ASSERT(NULL != flash_ptr);
158
159 // Default implementation: not supported, trigger assertion
161
162 return 0;
163}
164#endif
165
166#if VSF_FLASH_CFG_ERASE_ONE_SECTOR_TEMPLATE == ENABLED
167vsf_err_t vsf_real_flash_erase_one_sector(vsf_real_flash_t *real_flash_ptr, vsf_flash_size_t offset)
168{
169 VSF_ASSERT(real_flash_ptr != 0);
170
171 vsf_flash_capability_t flash_capability = vsf_real_flash_capability(real_flash_ptr);
172
173 VSF_ASSERT((offset % flash_capability.erase_sector_size) == 0);
174 VSF_ASSERT(flash_capability.erase_sector_size != 0);
175
176 return vsf_real_flash_erase_multi_sector(real_flash_ptr, offset, flash_capability.erase_sector_size);
177}
178#endif
179
180#if VSF_FLASH_CFG_ERASE_MULTI_SECTOR_TEMPLATE == ENABLED
181# error not supported yet
182#endif
183
184#if VSF_FLASH_CFG_ERASE_ALL_TEMPLATE == ENABLED
185vsf_err_t vsf_real_flash_erase_all(vsf_real_flash_t *real_flash_ptr)
186{
187 VSF_ASSERT(real_flash_ptr != 0);
188
189 vsf_flash_capability_t flash_capability = vsf_real_flash_capability(real_flash_ptr);
190 VSF_ASSERT(flash_capability.erase_sector_size > 0);
191 VSF_ASSERT(flash_capability.erase_sector_size >= flash_capability.write_sector_size);
192 VSF_ASSERT(flash_capability.max_size >= flash_capability.erase_sector_size);
193
194 return vsf_real_flash_erase_multi_sector(real_flash_ptr, 0, flash_capability.max_size);
195}
196#endif
197
198#if VSF_FLASH_CFG_WRITE_ONE_SECTOR_TEMPLATE == ENABLED
199vsf_err_t vsf_real_flash_write_one_sector(vsf_real_flash_t *real_flash_ptr, vsf_flash_size_t offset, uint8_t* buffer, vsf_flash_size_t size)
200{
201 VSF_ASSERT(real_flash_ptr != 0);
202
203 vsf_flash_capability_t flash_capability = vsf_real_flash_capability(real_flash_ptr);
204 VSF_ASSERT(size <= flash_capability.write_sector_size);
205 VSF_ASSERT(flash_capability.none_sector_aligned_write || ((offset % flash_capability.write_sector_size) == 0));
206
207 return vsf_real_flash_write_multi_sector(real_flash_ptr, offset, buffer, size);
208}
209#endif
210
211#if VSF_FLASH_CFG_WRITE_MULTI_SECTOR_TEMPLATE == ENABLED
212# error not supported yet
213#endif
214
215#if VSF_FLASH_CFG_READ_ONE_SECTOR_TEMPLATE == ENABLED
216vsf_err_t vsf_real_flash_read_one_sector(vsf_real_flash_t *real_flash_ptr, vsf_flash_size_t offset, uint8_t* buffer, vsf_flash_size_t size)
217{
218 VSF_ASSERT(real_flash_ptr != 0);
219
220 vsf_flash_capability_t flash_capability = vsf_real_flash_capability(real_flash_ptr);
221 VSF_ASSERT(size <= flash_capability.write_sector_size);
222 VSF_ASSERT(flash_capability.none_sector_aligned_read || ((offset % flash_capability.write_sector_size) == 0));
223
224 return vsf_real_flash_read_multi_sector(real_flash_ptr, offset, buffer, size);
225}
226#endif
227
228#if VSF_FLASH_CFG_READ_MULTI_SECTOR_TEMPLATE == ENABLED
229# error not supported yet
230#endif
231
232/*============================ MACROS ========================================*/
233
234#undef VSF_FLASH_CFG_REIMPLEMENT_TYPE_CAPABILITY
235#undef VSF_FLASH_CFG_REIMPLEMENT_TYPE_CFG
236#undef VSF_FLASH_CFG_REIMPLEMENT_TYPE_CTRL
237#undef VSF_FLASH_CFG_REIMPLEMENT_TYPE_IRQ_MASK
238#undef VSF_FLASH_CFG_REIMPLEMENT_TYPE_STATUS
239#undef VSF_FLASH_CFG_REIMPLEMENT_API_CAPABILITY
240#undef VSF_FLASH_CFG_REIMPLEMENT_API_GET_CONFIGURATION
241#undef VSF_FLASH_CFG_REIMPLEMENT_API_CTRL
242#undef VSF_FLASH_CFG_REIMPLEMENT_API_IRQ_CLEAR
243#undef VSF_FLASH_CFG_CAPABILITY_IRQ_MASK
244#undef VSF_FLASH_CFG_CAPABILITY_BASE_ADDRESS
245#undef VSF_FLASH_CFG_CAPABILITY_MAX_SIZE
246#undef VSF_FLASH_CFG_CAPABILITY_ERASE_SECTORE_SIZE
247#undef VSF_FLASH_CFG_CAPABILITY_WRITE_SECTORE_SIZE
248#undef VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_WRITE
249#undef VSF_FLASH_CFG_CAPABILITY_NONE_SECTOR_ALIGNED_READ
250
251#undef vsf_real_flash_t
252#undef vsf_real_flash_erase_all
253#undef vsf_real_flash_erase_one_sector
254#undef vsf_real_flash_erase_multi_sector
255#undef vsf_real_flash_write_one_sector
256#undef vsf_real_flash_write_multi_sector
257#undef vsf_real_flash_read_one_sector
258#undef vsf_real_flash_read_multi_sector
259#undef vsf_real_flash_capability
260#undef vsf_real_flash_get_configuration
261#undef vsf_real_flash_ctrl
262#undef vsf_real_flash_irq_clear
263
264/*============================ MACROS ========================================*/
265
266#ifdef VSF_FLASH_CFG_IMP_REMAP_PREFIX
267# define vsf_imp_flash_t VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_t)
268# define vsf_imp_flash_init VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_init)
269# define vsf_imp_flash_fini VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_fini)
270# define vsf_imp_flash_enable VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_enable)
271# define vsf_imp_flash_disable VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_disable)
272# define vsf_imp_flash_capability VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_capability)
273# define vsf_imp_flash_status VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_status)
274# define vsf_imp_flash_irq_enable VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_irq_enable)
275# define vsf_imp_flash_irq_disable VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_irq_disable)
276# define vsf_imp_flash_irq_clear VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_irq_clear)
277# define vsf_imp_flash_erase_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_one_sector)
278# define vsf_imp_flash_erase_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_multi_sector)
279# define vsf_imp_flash_erase VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_multi_sector)
280# define vsf_imp_flash_erase_all VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_erase_all)
281# define vsf_imp_flash_write_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_write_one_sector)
282# define vsf_imp_flash_write_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_write_multi_sector)
283# define vsf_imp_flash_write VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_write_multi_sector)
284# define vsf_imp_flash_read_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_read_one_sector)
285# define vsf_imp_flash_read_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_read_multi_sector)
286# define vsf_imp_flash_read VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_read_multi_sector)
287# define vsf_imp_flash_get_configuration VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_get_configuration)
288# define vsf_imp_flash_ctrl VSF_MCONNECT(VSF_FLASH_CFG_IMP_PREFIX, _flash_ctrl)
289
290# define vsf_remap_flash_t VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_t)
291# define vsf_remap_flash_init VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_init)
292# define vsf_remap_flash_fini VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_fini)
293# define vsf_remap_flash_enable VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_enable)
294# define vsf_remap_flash_disable VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_disable)
295# define vsf_remap_flash_capability VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_capability)
296# define vsf_remap_flash_status VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_status)
297# define vsf_remap_flash_irq_enable VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_irq_enable)
298# define vsf_remap_flash_irq_disable VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_irq_disable)
299# define vsf_remap_flash_irq_clear VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_irq_clear)
300# define vsf_remap_flash_erase_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_erase_one_sector)
301# define vsf_remap_flash_erase_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_erase_multi_sector)
302# define vsf_remap_flash_erase VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_erase_multi_sector)
303# define vsf_remap_flash_erase_all VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_erase_all)
304# define vsf_remap_flash_write_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_write_one_sector)
305# define vsf_remap_flash_write_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_write_multi_sector)
306# define vsf_remap_flash_write VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_write_multi_sector)
307# define vsf_remap_flash_read_one_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_read_one_sector)
308# define vsf_remap_flash_read_multi_sector VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_read_multi_sector)
309# define vsf_remap_flash_read VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_read_multi_sector)
310# define vsf_remap_flash_get_configuration VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_get_configuration)
311# define vsf_remap_flash_ctrl VSF_MCONNECT(VSF_FLASH_CFG_IMP_REMAP_PREFIX, _flash_ctrl)
312
313# define VSF_FLASH_CFG_IMP_REMAP_FUNCTIONS \
314 vsf_err_t vsf_imp_flash_init(vsf_imp_flash_t *flash_ptr, vsf_flash_cfg_t *cfg_ptr) \
315 { \
316 VSF_HAL_ASSERT(flash_ptr != NULL); \
317 return vsf_remap_flash_init((vsf_remap_flash_t *)flash_ptr, cfg_ptr); \
318 } \
319 void vsf_imp_flash_fini(vsf_imp_flash_t *flash_ptr) \
320 { \
321 VSF_HAL_ASSERT(flash_ptr != NULL); \
322 vsf_remap_flash_fini((vsf_remap_flash_t *)flash_ptr); \
323 } \
324 fsm_rt_t vsf_imp_flash_enable(vsf_imp_flash_t *flash_ptr) \
325 { \
326 VSF_HAL_ASSERT(flash_ptr != NULL); \
327 return vsf_remap_flash_enable((vsf_remap_flash_t *)flash_ptr); \
328 } \
329 fsm_rt_t vsf_imp_flash_disable(vsf_imp_flash_t *flash_ptr) \
330 { \
331 VSF_HAL_ASSERT(flash_ptr != NULL); \
332 return vsf_remap_flash_disable((vsf_remap_flash_t *)flash_ptr); \
333 } \
334 void vsf_imp_flash_irq_enable(vsf_imp_flash_t *flash_ptr, vsf_flash_irq_mask_t irq_mask) \
335 { \
336 VSF_HAL_ASSERT(flash_ptr != NULL); \
337 vsf_remap_flash_irq_enable((vsf_remap_flash_t *)flash_ptr, irq_mask); \
338 } \
339 void vsf_imp_flash_irq_disable(vsf_imp_flash_t *flash_ptr, vsf_flash_irq_mask_t irq_mask) \
340 { \
341 VSF_HAL_ASSERT(flash_ptr != NULL); \
342 vsf_remap_flash_irq_disable((vsf_remap_flash_t *)flash_ptr, irq_mask); \
343 } \
344 vsf_flash_irq_mask_t vsf_imp_flash_irq_clear(vsf_imp_flash_t *flash_ptr, vsf_flash_irq_mask_t irq_mask) \
345 { \
346 VSF_HAL_ASSERT(flash_ptr != NULL); \
347 return vsf_remap_flash_irq_clear((vsf_remap_flash_t *)flash_ptr, irq_mask); \
348 } \
349 vsf_flash_status_t vsf_imp_flash_status(vsf_imp_flash_t *flash_ptr) \
350 { \
351 VSF_HAL_ASSERT(flash_ptr != NULL); \
352 return vsf_remap_flash_status((vsf_remap_flash_t *)flash_ptr); \
353 } \
354 vsf_flash_capability_t vsf_imp_flash_capability(vsf_imp_flash_t *flash_ptr) \
355 { \
356 VSF_HAL_ASSERT(flash_ptr != NULL); \
357 return vsf_remap_flash_capability((vsf_remap_flash_t *)flash_ptr); \
358 } \
359 vsf_err_t vsf_imp_flash_erase_one_sector(vsf_imp_flash_t *flash_ptr, uint_fast32_t offset) \
360 { \
361 VSF_HAL_ASSERT(flash_ptr != NULL); \
362 return vsf_remap_flash_erase_one_sector((vsf_remap_flash_t *)flash_ptr, offset); \
363 } \
364 vsf_err_t vsf_imp_flash_erase_multi_sector(vsf_imp_flash_t *flash_ptr, uint_fast32_t offset, uint_fast32_t size) \
365 { \
366 VSF_HAL_ASSERT(flash_ptr != NULL); \
367 return vsf_remap_flash_erase_multi_sector((vsf_remap_flash_t *)flash_ptr, offset, size); \
368 } \
369 vsf_err_t vsf_imp_flash_erase_all(vsf_imp_flash_t *flash_ptr) \
370 { \
371 VSF_HAL_ASSERT(flash_ptr != NULL); \
372 return vsf_remap_flash_erase_all((vsf_remap_flash_t *)flash_ptr); \
373 } \
374 vsf_err_t vsf_imp_flash_write_one_sector(vsf_imp_flash_t *flash_ptr, uint_fast32_t offset, uint8_t* buffer, uint_fast32_t size) \
375 { \
376 VSF_HAL_ASSERT(flash_ptr != NULL); \
377 return vsf_remap_flash_write_one_sector((vsf_remap_flash_t *)flash_ptr, offset, buffer, size); \
378 } \
379 vsf_err_t vsf_imp_flash_write_multi_sector(vsf_imp_flash_t *flash_ptr, uint_fast32_t offset, uint8_t* buffer, uint_fast32_t size) \
380 { \
381 VSF_HAL_ASSERT(flash_ptr != NULL); \
382 return vsf_remap_flash_write_multi_sector((vsf_remap_flash_t *)flash_ptr, offset, buffer, size); \
383 } \
384 vsf_err_t vsf_imp_flash_read_one_sector(vsf_imp_flash_t *flash_ptr, uint_fast32_t offset, uint8_t* buffer, uint_fast32_t size) \
385 { \
386 VSF_HAL_ASSERT(flash_ptr != NULL); \
387 return vsf_remap_flash_read_one_sector((vsf_remap_flash_t *)flash_ptr, offset, buffer, size); \
388 } \
389 vsf_err_t vsf_imp_flash_read_multi_sector(vsf_imp_flash_t *flash_ptr, uint_fast32_t offset, uint8_t* buffer, uint_fast32_t size) \
390 { \
391 VSF_HAL_ASSERT(flash_ptr != NULL); \
392 return vsf_remap_flash_read_multi_sector((vsf_remap_flash_t *)flash_ptr, offset, buffer, size); \
393 } \
394 \
395 vsf_err_t vsf_imp_flash_get_configuration(vsf_imp_flash_t *flash_ptr, vsf_flash_cfg_t *cfg_ptr) \
396 { \
397 VSF_HAL_ASSERT(flash_ptr != NULL); \
398 return vsf_remap_flash_get_configuration((vsf_remap_flash_t *)flash_ptr, cfg_ptr); \
399 } \
400 vsf_err_t vsf_imp_flash_ctrl(vsf_imp_flash_t *flash_ptr, vsf_flash_ctrl_t ctrl, void *param) \
401 { \
402 VSF_HAL_ASSERT(flash_ptr != NULL); \
403 return vsf_remap_flash_ctrl((vsf_remap_flash_t *)flash_ptr, ctrl, param); \
404 }
405#endif
406
407/*============================ GLOBAL VARIABLES ==============================*/
408
409#define VSF_HAL_TEMPLATE_IMP_NAME _flash
410#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _FLASH
411
412#if !defined(VSF_FLASH_CFG_IMP_PREFIX) && !defined(VSF_FLASH_CFG_IMP_DEVICE_PREFIX)
413# error "Please define VSF_FLASH_CFG_IMP_PREFIX in flash driver"
414#endif
415
416#if !defined(VSF_FLASH_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_FLASH_CFG_IMP_DEVICE_UPCASE_PREFIX)
417# error "Please define VSF_FLASH_CFG_IMP_UPCASE_PREFIX in flash driver"
418#endif
419
420#ifndef VSF_FLASH_CFG_IMP_COUNT_MASK_PREFIX
421# define VSF_FLASH_CFG_IMP_COUNT_MASK_PREFIX VSF_FLASH_CFG_IMP_UPCASE_PREFIX
422#endif
423
424#ifdef VSF_FLASH_CFG_IMP_REMAP_FUNCTIONS
425# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_FLASH_CFG_IMP_REMAP_FUNCTIONS
426#endif
427
429
430#undef VSF_FLASH_CFG_IMP_PREFIX
431#undef VSF_FLASH_CFG_IMP_COUNT_MASK_PREFIX
432#undef VSF_FLASH_CFG_IMP_UPCASE_PREFIX
433#undef VSF_FLASH_CFG_IMP_DEVICE_PREFIX
434#undef VSF_FLASH_CFG_IMP_DEVICE_UPCASE_PREFIX
435#undef VSF_FLASH_CFG_IMP_LV0
436#undef VSF_FLASH_CFG_IMP_REMAP_FUNCTIONS
437#undef VSF_FLASH_CFG_IMP_HAS_OP
438#undef VSF_FLASH_CFG_IMP_EXTERN_OP
439#undef VSF_FLASH_CFG_IMP_RENAME_DEVICE_PREFIX
440
441#undef vsf_imp_flash_t
442#undef vsf_imp_flash_init
443#undef vsf_imp_flash_fini
444#undef vsf_imp_flash_enable
445#undef vsf_imp_flash_disable
446#undef vsf_imp_flash_capability
447#undef vsf_imp_flash_status
448#undef vsf_imp_flash_irq_enable
449#undef vsf_imp_flash_irq_disable
450#undef vsf_imp_flash_irq_clear
451#undef vsf_imp_flash_erase_one_sector
452#undef vsf_imp_flash_erase_multi_sector
453#undef vsf_imp_flash_erase
454#undef vsf_imp_flash_erase_all
455#undef vsf_imp_flash_write_one_sector
456#undef vsf_imp_flash_write_multi_sector
457#undef vsf_imp_flash_write
458#undef vsf_imp_flash_read_one_sector
459#undef vsf_imp_flash_read_multi_sector
460#undef vsf_imp_flash_read
461#undef vsf_imp_flash_get_configuration
462#undef vsf_imp_flash_ctrl
463
464#undef vsf_remap_flash_t
465#undef vsf_remap_flash_init
466#undef vsf_remap_flash_fini
467#undef vsf_remap_flash_enable
468#undef vsf_remap_flash_disable
469#undef vsf_remap_flash_capability
470#undef vsf_remap_flash_status
471#undef vsf_remap_flash_irq_enable
472#undef vsf_remap_flash_irq_disable
473#undef vsf_remap_flash_irq_clear
474#undef vsf_remap_flash_erase_one_sector
475#undef vsf_remap_flash_erase_multi_sector
476#undef vsf_remap_flash_erase
477#undef vsf_remap_flash_erase_all
478#undef vsf_remap_flash_write_one_sector
479#undef vsf_remap_flash_write_multi_sector
480#undef vsf_remap_flash_write
481#undef vsf_remap_flash_read_one_sector
482#undef vsf_remap_flash_read_multi_sector
483#undef vsf_remap_flash_read
484#undef vsf_remap_flash_get_configuration
485#undef vsf_remap_flash_ctrl
486
487#undef VSF_HAL_TEMPLATE_IMP_NAME
488#undef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
489
490/*============================ STATIC ASSERTIONS ==============================*/
491
492/* User-extensible macros for custom mode and IRQ mask values
493 * Users can define these macros before including this template to append
494 * their custom enum values to the uniqueness checks.
495 *
496 * Check modes for custom values:
497 * VSF_FLASH_CFG_MODE_CHECK_UNIQUE - Check mode for custom mode values
498 * Default: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
499 * Can be set to: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
500 * VSF_FLASH_CFG_IRQ_MASK_CHECK_UNIQUE - Check mode for custom IRQ mask values
501 * Default: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
502 * Can be set to: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
503 *
504 * Example usage in vendor driver:
505 * #define VSF_FLASH_CUSTOM_MODE_VALUES MY_CUSTOM_MODE1, MY_CUSTOM_MODE2
506 * #define VSF_FLASH_CFG_MODE_CHECK_UNIQUE VSF_HAL_CHECK_MODE_LOOSE
507 * #define VSF_FLASH_CUSTOM_IRQ_MASK_VALUES MY_CUSTOM_IRQ1, MY_CUSTOM_IRQ2
508 * #define VSF_FLASH_CFG_IRQ_MASK_CHECK_UNIQUE VSF_HAL_CHECK_MODE_STRICT
509 * #include "hal/driver/common/flash/flash_template.inc"
510 */
511
512
513#ifdef VSF_FLASH_CFG_MODE_CHECK_UNIQUE
514/* Default mode lists - can be redefined by users before including this file */
515/* Note: Flash typically doesn't have mode enums, but custom modes can be added */
516
517#ifdef VSF_FLASH_CUSTOM_MODE_VALUES
518/* Check uniqueness among custom mode values using user-specified check mode */
520#endif
521#endif /* VSF_FLASH_CFG_MODE_CHECK_UNIQUE */
522
523/* ==================== IRQ MASK UNIQUENESS CHECKS ==================== */
524
525#ifdef VSF_FLASH_CFG_IRQ_MASK_CHECK_UNIQUE
526
527#ifdef VSF_FLASH_CUSTOM_IRQ_MASK_VALUES
528/* Check uniqueness among custom IRQ mask values using user-specified check mode */
530#endif
531
532/* Check uniqueness within vsf_flash_irq_mask_t enum */
533
534/* Check IRQ mask uniqueness - all IRQ mask bits should have different values
535 * Mandatory: VSF_FLASH_IRQ_ERASE_MASK, VSF_FLASH_IRQ_WRITE_MASK, VSF_FLASH_IRQ_READ_MASK,
536 * VSF_FLASH_IRQ_ERASE_ERROR_MASK, VSF_FLASH_IRQ_WRITE_ERROR_MASK, VSF_FLASH_IRQ_READ_ERROR_MASK
537 */
540 /* Mandatory IRQ masks - always included */
547 /* User-defined IRQ masks - appended by user configuration */
548#ifdef VSF_FLASH_CUSTOM_IRQ_MASK_VALUES
549 , VSF_FLASH_CUSTOM_IRQ_MASK_VALUES
550#endif
551);
552#endif /* VSF_FLASH_CFG_IRQ_MASK_CHECK_UNIQUE */
553
554#undef VSF_FLASH_CFG_MODE_CHECK_UNIQUE
555#undef VSF_FLASH_CFG_IRQ_MASK_CHECK_UNIQUE
556#undef VSF_FLASH_CUSTOM_MODE_VALUES
557#undef VSF_FLASH_CUSTOM_IRQ_MASK_VALUES
558
559#endif /* VSF_HAL_USE_FLASH */
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
vsf_flash_irq_mask_t
Definition flash.h:70
@ VSF_FLASH_IRQ_ERASE_MASK
Definition flash.h:72
@ VSF_FLASH_IRQ_READ_MASK
Definition flash.h:76
@ VSF_FLASH_IRQ_WRITE_ERROR_MASK
Definition flash.h:80
@ VSF_FLASH_IRQ_WRITE_MASK
Definition flash.h:74
@ VSF_FLASH_IRQ_ERASE_ERROR_MASK
Definition flash.h:78
@ VSF_FLASH_IRQ_READ_ERROR_MASK
Definition flash.h:82
#define NULL
Definition lvgl.h:26
const i_spi_t vsf_spi_irq_mask_t irq_mask
Definition spi_interface.h:38
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_template_flash.h:307
vsf_flash_size_t max_size
Definition vsf_template_flash.h:314
uint8_t none_sector_aligned_read
Definition vsf_template_flash.h:320
vsf_flash_size_t write_sector_size
Definition vsf_template_flash.h:316
vsf_flash_size_t base_address
Definition vsf_template_flash.h:313
vsf_flash_size_t erase_sector_size
Definition vsf_template_flash.h:315
uint8_t none_sector_aligned_write
Definition vsf_template_flash.h:319
Definition vsf_template_flash.h:283
#define VSF_FLASH_CFG_MODE_CHECK_UNIQUE
Definition flash.c:270
#define VSF_FLASH_CFG_IRQ_MASK_CHECK_UNIQUE
Definition flash.c:271
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
uint64_t offset
Definition vsf_memfs.h:49
uint32_t size
Definition vsf_memfs.h:50
vsf_flash_ctrl_t
Predefined VSF Flash control commands that can be reimplemented in specific HAL drivers.
Definition vsf_template_flash.h:358
uint_fast32_t vsf_flash_size_t
Definition vsf_template_flash.h:264
#define VSF_HAL_CHECK_UNIQUE_CUSTOM(__CHECK_FUNC,...)
Definition vsf_template_static_assert_unique.h:2426
#define VSF_ASSERT(...)
Definition vsf_usr_cfg.h:1
Generated from commit: vsfteam/vsf@b2e9e8a