summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/memory/spiflash.c17
-rw-r--r--drivers/memory/spiflash.h1
2 files changed, 18 insertions, 0 deletions
diff --git a/drivers/memory/spiflash.c b/drivers/memory/spiflash.c
index 22775d541..0eacc710e 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 a5b8a1dca..96dfdeeab 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);