diff options
| author | Damien George <damien@micropython.org> | 2025-05-01 01:19:52 +1000 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2025-07-08 16:24:27 +1000 |
| commit | 62a674c9c40b52903d7da4fda5331b0f8653d966 (patch) | |
| tree | cc493900549f998671d96c9fc45d87a9296c4bba /drivers | |
| parent | eaffbacb10783c769dc46a61b9eea65fcb7413fe (diff) | |
drivers: Support special QSPI direct-read protocol.
This is useful for interfaces that stay in memory-mapped mode by default.
They can implement this method with a simple `memcpy()`.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/bus/qspi.h | 1 | ||||
| -rw-r--r-- | drivers/memory/spiflash.c | 8 |
2 files changed, 9 insertions, 0 deletions
diff --git a/drivers/bus/qspi.h b/drivers/bus/qspi.h index 32b2890e3..05d9dd473 100644 --- a/drivers/bus/qspi.h +++ b/drivers/bus/qspi.h @@ -46,6 +46,7 @@ typedef struct _mp_qspi_proto_t { int (*write_cmd_addr_data)(void *self, uint8_t cmd, uint32_t addr, size_t len, const uint8_t *src); int (*read_cmd)(void *self, uint8_t cmd, size_t len, uint32_t *dest); int (*read_cmd_qaddr_qdata)(void *self, uint8_t cmd, uint32_t addr, uint8_t num_dummy, size_t len, uint8_t *dest); + int (*direct_read)(void *self, uint32_t addr, size_t len, uint8_t *dest); // can be NULL if direct read not supported } mp_qspi_proto_t; typedef struct _mp_soft_qspi_obj_t { diff --git a/drivers/memory/spiflash.c b/drivers/memory/spiflash.c index 1ae0bbbc6..7cd1d18a3 100644 --- a/drivers/memory/spiflash.c +++ b/drivers/memory/spiflash.c @@ -197,6 +197,10 @@ void mp_spiflash_init(mp_spiflash_t *self) { } else { uint8_t num_dummy = MICROPY_HW_SPIFLASH_QREAD_NUM_DUMMY(self); self->config->bus.u_qspi.proto->ioctl(self->config->bus.u_qspi.data, MP_QSPI_IOCTL_INIT, num_dummy); + if (self->config->bus.u_qspi.proto->direct_read != NULL) { + // A bus with a custom read function should not have any further initialisation done. + return; + } } mp_spiflash_acquire_bus(self); @@ -318,6 +322,10 @@ int mp_spiflash_read(mp_spiflash_t *self, uint32_t addr, size_t len, uint8_t *de if (len == 0) { return 0; } + const mp_spiflash_config_t *c = self->config; + if (c->bus_kind == MP_SPIFLASH_BUS_QSPI && c->bus.u_qspi.proto->direct_read != NULL) { + return c->bus.u_qspi.proto->direct_read(c->bus.u_qspi.data, addr, len, dest); + } mp_spiflash_acquire_bus(self); int ret = mp_spiflash_read_data(self, addr, len, dest); mp_spiflash_release_bus(self); |
