1
1
/*
2
- * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
2
+ * Copyright (c) 2021-2025 Espressif Systems (Shanghai) Co., Ltd.
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*/
@@ -39,6 +39,16 @@ struct flash_esp32_dev_config {
39
39
};
40
40
41
41
struct flash_esp32_dev_data {
42
+ #ifdef CONFIG_ESP_FLASH_ASYNC
43
+ struct k_work work ;
44
+ struct k_mutex lock ;
45
+ const struct device * dev ;
46
+ int type ;
47
+ off_t addr ;
48
+ size_t len ;
49
+ void * buf ;
50
+ int ret ;
51
+ #endif
42
52
#ifdef CONFIG_MULTITHREADING
43
53
struct k_sem sem ;
44
54
#endif
@@ -137,17 +147,20 @@ static int flash_esp32_read(const struct device *dev, off_t address, void *buffe
137
147
}
138
148
}
139
149
#else
140
- flash_esp32_sem_take (dev );
141
150
151
+ #if defined(CONFIG_MULTITHREADING ) && !defined(CONFIG_ESP_FLASH_ASYNC )
152
+ flash_esp32_sem_take (dev );
153
+ #endif
142
154
if (esp_flash_encryption_enabled ()) {
143
155
ret = esp_flash_read_encrypted (NULL , address , buffer , length );
144
156
} else {
145
157
ret = esp_flash_read (NULL , buffer , address , length );
146
158
}
147
159
160
+ #if defined(CONFIG_MULTITHREADING ) && !defined(CONFIG_ESP_FLASH_ASYNC )
148
161
flash_esp32_sem_give (dev );
149
162
#endif
150
-
163
+ #endif
151
164
if (ret != 0 ) {
152
165
LOG_ERR ("Flash read error: %d" , ret );
153
166
return - EIO ;
@@ -156,9 +169,7 @@ static int flash_esp32_read(const struct device *dev, off_t address, void *buffe
156
169
return 0 ;
157
170
}
158
171
159
- static int flash_esp32_write (const struct device * dev ,
160
- off_t address ,
161
- const void * buffer ,
172
+ static int flash_esp32_write (const struct device * dev , off_t address , const void * buffer ,
162
173
size_t length )
163
174
{
164
175
int ret = 0 ;
@@ -173,17 +184,19 @@ static int flash_esp32_write(const struct device *dev,
173
184
174
185
ret = esp_rom_flash_write (address , (void * )buffer , length , encrypt );
175
186
#else
187
+ #if defined(CONFIG_MULTITHREADING ) && !defined(CONFIG_ESP_FLASH_ASYNC )
176
188
flash_esp32_sem_take (dev );
177
-
189
+ #endif
178
190
if (esp_flash_encryption_enabled ()) {
179
191
ret = esp_flash_write_encrypted (NULL , address , buffer , length );
180
192
} else {
181
193
ret = esp_flash_write (NULL , buffer , address , length );
182
194
}
183
195
196
+ #if defined(CONFIG_MULTITHREADING ) && !defined(CONFIG_ESP_FLASH_ASYNC )
184
197
flash_esp32_sem_give (dev );
185
198
#endif
186
-
199
+ #endif
187
200
if (ret != 0 ) {
188
201
LOG_ERR ("Flash write error: %d" , ret );
189
202
return - EIO ;
@@ -199,9 +212,13 @@ static int flash_esp32_erase(const struct device *dev, off_t start, size_t len)
199
212
#ifdef CONFIG_MCUBOOT
200
213
ret = esp_rom_flash_erase_range (start , len );
201
214
#else
215
+ #if defined(CONFIG_MULTITHREADING ) && !defined(CONFIG_ESP_FLASH_ASYNC )
202
216
flash_esp32_sem_take (dev );
217
+ #endif
203
218
ret = esp_flash_erase_region (NULL , start , len );
219
+ #if defined(CONFIG_MULTITHREADING ) && !defined(CONFIG_ESP_FLASH_ASYNC )
204
220
flash_esp32_sem_give (dev );
221
+ #endif
205
222
#endif
206
223
if (ret != 0 ) {
207
224
LOG_ERR ("Flash erase error: %d" , ret );
@@ -210,6 +227,83 @@ static int flash_esp32_erase(const struct device *dev, off_t start, size_t len)
210
227
return 0 ;
211
228
}
212
229
230
+ #ifdef CONFIG_ESP_FLASH_ASYNC
231
+ static void flash_work_handler (struct k_work * work )
232
+ {
233
+ struct flash_esp32_dev_data * data = CONTAINER_OF (work , struct flash_esp32_dev_data , work );
234
+
235
+ if (data -> type == 0 ) {
236
+ data -> ret = flash_esp32_read (data -> dev , data -> addr , data -> buf , data -> len );
237
+ } else if (data -> type == 1 ) {
238
+ data -> ret = flash_esp32_write (data -> dev , data -> addr , data -> buf , data -> len );
239
+ } else if (data -> type == 2 ) {
240
+ data -> ret = flash_esp32_erase (data -> dev , data -> addr , data -> len );
241
+ } else {
242
+ data -> ret = -1 ;
243
+ }
244
+
245
+ k_sem_give (& data -> sem );
246
+ }
247
+
248
+ static int flash_esp32_read_async (const struct device * dev , off_t address ,
249
+ void * buffer , size_t length )
250
+ {
251
+ struct flash_esp32_dev_data * data = dev -> data ;
252
+
253
+ k_mutex_lock (& data -> lock , K_TIMEOUT_ABS_SEC (3 ));
254
+
255
+ data -> dev = dev ;
256
+ data -> addr = address ;
257
+ data -> buf = buffer ;
258
+ data -> len = length ;
259
+ data -> type = 0 ;
260
+
261
+ k_work_submit (& data -> work );
262
+ k_sem_take (& data -> sem , FLASH_SEM_TIMEOUT );
263
+ k_mutex_unlock (& data -> lock );
264
+
265
+ return data -> ret ;
266
+ }
267
+
268
+ static int flash_esp32_write_async (const struct device * dev , off_t address ,
269
+ const void * buffer , size_t length )
270
+ {
271
+ struct flash_esp32_dev_data * data = dev -> data ;
272
+
273
+ k_mutex_lock (& data -> lock , K_TIMEOUT_ABS_SEC (3 ));
274
+
275
+ data -> dev = dev ;
276
+ data -> addr = address ;
277
+ data -> buf = (void * ) buffer ;
278
+ data -> len = length ;
279
+ data -> type = 1 ;
280
+
281
+ k_work_submit (& data -> work );
282
+ k_sem_take (& data -> sem , FLASH_SEM_TIMEOUT );
283
+ k_mutex_unlock (& data -> lock );
284
+
285
+ return 0 ;
286
+ }
287
+ static int flash_esp32_erase_async (const struct device * dev , off_t start , size_t len )
288
+ {
289
+ struct flash_esp32_dev_data * data = dev -> data ;
290
+
291
+ k_mutex_lock (& data -> lock , K_TIMEOUT_ABS_SEC (3 ));
292
+
293
+ data -> addr = start ;
294
+ data -> len = len ;
295
+ data -> buf = NULL ;
296
+ data -> type = 2 ;
297
+
298
+ k_work_submit (& data -> work );
299
+ k_sem_take (& data -> sem , FLASH_SEM_TIMEOUT );
300
+ k_mutex_unlock (& data -> lock );
301
+
302
+ return 0 ;
303
+ }
304
+ #endif
305
+
306
+
213
307
#if CONFIG_FLASH_PAGE_LAYOUT
214
308
static const struct flash_pages_layout flash_esp32_pages_layout = {
215
309
.pages_count = DT_REG_SIZE (SOC_NV_FLASH_NODE ) / FLASH_ERASE_BLK_SZ ,
@@ -223,7 +317,7 @@ void flash_esp32_page_layout(const struct device *dev,
223
317
* layout = & flash_esp32_pages_layout ;
224
318
* layout_size = 1 ;
225
319
}
226
- #endif /* CONFIG_FLASH_PAGE_LAYOUT */
320
+ #endif
227
321
228
322
static const struct flash_parameters *
229
323
flash_esp32_get_parameters (const struct device * dev )
@@ -236,18 +330,32 @@ flash_esp32_get_parameters(const struct device *dev)
236
330
static int flash_esp32_init (const struct device * dev )
237
331
{
238
332
#ifdef CONFIG_MULTITHREADING
239
- struct flash_esp32_dev_data * const dev_data = dev -> data ;
333
+ struct flash_esp32_dev_data * const data = dev -> data ;
240
334
241
- k_sem_init (& dev_data -> sem , 1 , 1 );
242
- #endif /* CONFIG_MULTITHREADING */
335
+ #ifdef CONFIG_ESP_FLASH_ASYNC
336
+ k_sem_init (& data -> sem , 0 , 1 );
337
+ #else
338
+ k_sem_init (& data -> sem , 1 , 1 );
339
+ #endif
243
340
341
+ #ifdef CONFIG_ESP_FLASH_ASYNC
342
+ k_mutex_init (& data -> lock );
343
+ k_work_init (& data -> work , flash_work_handler );
344
+ #endif
345
+ #endif /* CONFIG_MULTITHREADING */
244
346
return 0 ;
245
347
}
246
348
247
349
static DEVICE_API (flash , flash_esp32_driver_api ) = {
350
+ #ifdef CONFIG_ESP_FLASH_ASYNC
351
+ .read = flash_esp32_read_async ,
352
+ .write = flash_esp32_write_async ,
353
+ .erase = flash_esp32_erase_async ,
354
+ #else
248
355
.read = flash_esp32_read ,
249
356
.write = flash_esp32_write ,
250
357
.erase = flash_esp32_erase ,
358
+ #endif
251
359
.get_parameters = flash_esp32_get_parameters ,
252
360
#ifdef CONFIG_FLASH_PAGE_LAYOUT
253
361
.page_layout = flash_esp32_page_layout ,
0 commit comments