61
61
static void mp_spiflash_acquire_bus (mp_spiflash_t * self ) {
62
62
const mp_spiflash_config_t * c = self -> config ;
63
63
if (c -> bus_kind == MP_SPIFLASH_BUS_QSPI ) {
64
- c -> bus .u_qspi .proto -> ioctl (c -> bus .u_qspi .data , MP_QSPI_IOCTL_BUS_ACQUIRE );
64
+ c -> bus .u_qspi .proto -> ioctl (c -> bus .u_qspi .data , MP_QSPI_IOCTL_BUS_ACQUIRE , 0 );
65
65
}
66
66
}
67
67
68
68
static void mp_spiflash_release_bus (mp_spiflash_t * self ) {
69
69
const mp_spiflash_config_t * c = self -> config ;
70
70
if (c -> bus_kind == MP_SPIFLASH_BUS_QSPI ) {
71
- c -> bus .u_qspi .proto -> ioctl (c -> bus .u_qspi .data , MP_QSPI_IOCTL_BUS_RELEASE );
71
+ c -> bus .u_qspi .proto -> ioctl (c -> bus .u_qspi .data , MP_QSPI_IOCTL_BUS_RELEASE , 0 );
72
+ }
73
+ }
74
+
75
+ static void mp_spiflash_notify_modified (mp_spiflash_t * self , uint32_t addr , uint32_t len ) {
76
+ const mp_spiflash_config_t * c = self -> config ;
77
+ if (c -> bus_kind == MP_SPIFLASH_BUS_QSPI ) {
78
+ uintptr_t arg [2 ] = { addr , len };
79
+ c -> bus .u_qspi .proto -> ioctl (c -> bus .u_qspi .data , MP_QSPI_IOCTL_MEMORY_MODIFIED , (uintptr_t )& arg [0 ]);
72
80
}
73
81
}
74
82
@@ -174,7 +182,7 @@ void mp_spiflash_init(mp_spiflash_t *self) {
174
182
mp_hal_pin_output (self -> config -> bus .u_spi .cs );
175
183
self -> config -> bus .u_spi .proto -> ioctl (self -> config -> bus .u_spi .data , MP_SPI_IOCTL_INIT );
176
184
} else {
177
- self -> config -> bus .u_qspi .proto -> ioctl (self -> config -> bus .u_qspi .data , MP_QSPI_IOCTL_INIT );
185
+ self -> config -> bus .u_qspi .proto -> ioctl (self -> config -> bus .u_qspi .data , MP_QSPI_IOCTL_INIT , 0 );
178
186
}
179
187
180
188
mp_spiflash_acquire_bus (self );
@@ -285,6 +293,7 @@ static int mp_spiflash_write_page(mp_spiflash_t *self, uint32_t addr, size_t len
285
293
int mp_spiflash_erase_block (mp_spiflash_t * self , uint32_t addr ) {
286
294
mp_spiflash_acquire_bus (self );
287
295
int ret = mp_spiflash_erase_block_internal (self , addr );
296
+ mp_spiflash_notify_modified (self , addr , SECTOR_SIZE );
288
297
mp_spiflash_release_bus (self );
289
298
return ret ;
290
299
}
@@ -300,6 +309,8 @@ int mp_spiflash_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *de
300
309
}
301
310
302
311
int mp_spiflash_write (mp_spiflash_t * self , uint32_t addr , size_t len , const uint8_t * src ) {
312
+ uint32_t orig_addr = addr ;
313
+ uint32_t orig_len = len ;
303
314
mp_spiflash_acquire_bus (self );
304
315
int ret = 0 ;
305
316
uint32_t offset = addr & (PAGE_SIZE - 1 );
@@ -317,12 +328,16 @@ int mp_spiflash_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint
317
328
src += rest ;
318
329
offset = 0 ;
319
330
}
331
+ mp_spiflash_notify_modified (self , orig_addr , orig_len );
320
332
mp_spiflash_release_bus (self );
321
333
return ret ;
322
334
}
323
335
324
336
/******************************************************************************/
325
337
// Interface functions that use the cache
338
+ //
339
+ // These functions do not call mp_spiflash_notify_modified(), so shouldn't be
340
+ // used for memory-mapped flash (for example).
326
341
327
342
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
328
343
0 commit comments