6161static void mp_spiflash_acquire_bus (mp_spiflash_t * self ) {
6262 const mp_spiflash_config_t * c = self -> config ;
6363 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 );
6565 }
6666}
6767
6868static void mp_spiflash_release_bus (mp_spiflash_t * self ) {
6969 const mp_spiflash_config_t * c = self -> config ;
7070 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 ]);
7280 }
7381}
7482
@@ -174,7 +182,7 @@ void mp_spiflash_init(mp_spiflash_t *self) {
174182 mp_hal_pin_output (self -> config -> bus .u_spi .cs );
175183 self -> config -> bus .u_spi .proto -> ioctl (self -> config -> bus .u_spi .data , MP_SPI_IOCTL_INIT );
176184 } 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 );
178186 }
179187
180188 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
285293int mp_spiflash_erase_block (mp_spiflash_t * self , uint32_t addr ) {
286294 mp_spiflash_acquire_bus (self );
287295 int ret = mp_spiflash_erase_block_internal (self , addr );
296+ mp_spiflash_notify_modified (self , addr , SECTOR_SIZE );
288297 mp_spiflash_release_bus (self );
289298 return ret ;
290299}
@@ -300,6 +309,8 @@ int mp_spiflash_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *de
300309}
301310
302311int 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 ;
303314 mp_spiflash_acquire_bus (self );
304315 int ret = 0 ;
305316 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
317328 src += rest ;
318329 offset = 0 ;
319330 }
331+ mp_spiflash_notify_modified (self , orig_addr , orig_len );
320332 mp_spiflash_release_bus (self );
321333 return ret ;
322334}
323335
324336/******************************************************************************/
325337// 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).
326341
327342#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
328343
0 commit comments