From 8cde5faedd63ea1b21b7adef87e50e6a036c7e5a Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 3 Jul 2019 01:03:25 +1000 Subject: [PATCH] drivers/memory/spiflash: Add support to put SPI flash in sleep mode. --- drivers/memory/spiflash.c | 17 +++++++++++++++++ drivers/memory/spiflash.h | 1 + 2 files changed, 18 insertions(+) diff --git a/drivers/memory/spiflash.c b/drivers/memory/spiflash.c index 22775d5416..0eacc710e3 100644 --- a/drivers/memory/spiflash.c +++ b/drivers/memory/spiflash.c @@ -146,6 +146,10 @@ STATIC int mp_spiflash_wait_wip0(mp_spiflash_t *self) { return mp_spiflash_wait_sr(self, 1, 0, WAIT_SR_TIMEOUT); } +static inline void mp_spiflash_deepsleep_internal(mp_spiflash_t *self, int value) { + mp_spiflash_write_cmd(self, value ? 0xb9 : 0xab); // sleep/wake +} + void mp_spiflash_init(mp_spiflash_t *self) { self->flags = 0; @@ -159,6 +163,9 @@ void mp_spiflash_init(mp_spiflash_t *self) { mp_spiflash_acquire_bus(self); + // Ensure SPI flash is out of sleep mode + mp_spiflash_deepsleep_internal(self, 0); + #if defined(CHECK_DEVID) // Validate device id uint32_t devid = mp_spiflash_read_cmd(self, CMD_RD_DEVID, 3); @@ -182,6 +189,16 @@ void mp_spiflash_init(mp_spiflash_t *self) { mp_spiflash_release_bus(self); } +void mp_spiflash_deepsleep(mp_spiflash_t *self, int value) { + if (value) { + mp_spiflash_acquire_bus(self); + } + mp_spiflash_deepsleep_internal(self, value); + if (!value) { + mp_spiflash_release_bus(self); + } +} + STATIC int mp_spiflash_erase_block_internal(mp_spiflash_t *self, uint32_t addr) { // enable writes mp_spiflash_write_cmd(self, CMD_WREN); diff --git a/drivers/memory/spiflash.h b/drivers/memory/spiflash.h index a5b8a1dcae..96dfdeeab6 100644 --- a/drivers/memory/spiflash.h +++ b/drivers/memory/spiflash.h @@ -68,6 +68,7 @@ typedef struct _mp_spiflash_t { } mp_spiflash_t; void mp_spiflash_init(mp_spiflash_t *self); +void mp_spiflash_deepsleep(mp_spiflash_t *self, int value); // These functions go direct to the SPI flash device int mp_spiflash_erase_block(mp_spiflash_t *self, uint32_t addr);