Skip to content

Commit c61e859

Browse files
committed
drivers: Add MP_QSPI_IOCTL_MEMORY_MODIFIED to indicate flash changed.
Signed-off-by: Damien George <[email protected]>
1 parent 274c8c4 commit c61e859

File tree

6 files changed

+27
-7
lines changed

6 files changed

+27
-7
lines changed

drivers/bus/qspi.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ enum {
3737
MP_QSPI_IOCTL_DEINIT,
3838
MP_QSPI_IOCTL_BUS_ACQUIRE,
3939
MP_QSPI_IOCTL_BUS_RELEASE,
40+
MP_QSPI_IOCTL_MEMORY_MODIFIED,
4041
};
4142

4243
typedef struct _mp_qspi_proto_t {
43-
int (*ioctl)(void *self, uint32_t cmd);
44+
int (*ioctl)(void *self, uint32_t cmd, uintptr_t arg);
4445
int (*write_cmd_data)(void *self, uint8_t cmd, size_t len, uint32_t data);
4546
int (*write_cmd_addr_data)(void *self, uint8_t cmd, uint32_t addr, size_t len, const uint8_t *src);
4647
int (*read_cmd)(void *self, uint8_t cmd, size_t len, uint32_t *dest);

drivers/bus/softqspi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ static void nibble_write(mp_soft_qspi_obj_t *self, uint8_t v) {
5656
mp_hal_pin_write(self->io3, (v >> 3) & 1);
5757
}
5858

59-
static int mp_soft_qspi_ioctl(void *self_in, uint32_t cmd) {
59+
static int mp_soft_qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
6060
mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
61+
(void)arg;
6162

6263
switch (cmd) {
6364
case MP_QSPI_IOCTL_INIT:

drivers/memory/spiflash.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,22 @@
6161
static 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

6868
static 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
285293
int 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

302311
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;
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

drivers/memory/spiflash.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ int mp_spiflash_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint
8181

8282
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
8383
// These functions use the cache (which must already be configured)
84+
// Note: don't use these functions in combination with memory-mapped
85+
// flash, because MP_QSPI_IOCTL_MEMORY_MODIFIED is not called.
8486
int mp_spiflash_cache_flush(mp_spiflash_t *self);
8587
int mp_spiflash_cached_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *dest);
8688
int mp_spiflash_cached_write(mp_spiflash_t *self, uint32_t addr, size_t len, const uint8_t *src);

ports/stm32/octospi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ void octospi_init(void) {
105105
OCTOSPI1->CR |= OCTOSPI_CR_EN;
106106
}
107107

108-
static int octospi_ioctl(void *self_in, uint32_t cmd) {
108+
static int octospi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
109109
(void)self_in;
110+
(void)arg;
110111
switch (cmd) {
111112
case MP_QSPI_IOCTL_INIT:
112113
octospi_init();

ports/stm32/qspi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ void qspi_memory_map(void) {
170170
qspi_mpu_enable_mapped();
171171
}
172172

173-
static int qspi_ioctl(void *self_in, uint32_t cmd) {
173+
static int qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
174174
(void)self_in;
175175
switch (cmd) {
176176
case MP_QSPI_IOCTL_INIT:

0 commit comments

Comments
 (0)