summaryrefslogtreecommitdiffstatshomepage
path: root/ports/stm32/spibdev.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-03-02 23:11:47 +1100
committerDamien George <damien.p.george@gmail.com>2018-03-02 23:55:40 +1100
commita0dfc386410b3a397e8643b269e352a8930b5f53 (patch)
tree116042333b1c60714bdf05559906cd2340ce628a /ports/stm32/spibdev.c
parent21d5527edf37ba550316ea0dbac87253c7791bd1 (diff)
downloadmicropython-a0dfc386410b3a397e8643b269e352a8930b5f53.tar.gz
micropython-a0dfc386410b3a397e8643b269e352a8930b5f53.zip
stm32/spibdev: Update to work with new spiflash driver.
Diffstat (limited to 'ports/stm32/spibdev.c')
-rw-r--r--ports/stm32/spibdev.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/ports/stm32/spibdev.c b/ports/stm32/spibdev.c
index 5e5123867d..e70507b7ba 100644
--- a/ports/stm32/spibdev.c
+++ b/ports/stm32/spibdev.c
@@ -25,6 +25,8 @@
*/
#include "py/obj.h"
+#include "systick.h"
+#include "led.h"
#include "storage.h"
#if defined(MICROPY_HW_SPIFLASH_SIZE_BITS)
@@ -32,6 +34,8 @@
#include "drivers/memory/spiflash.h"
#include "genhdr/pins.h"
+static uint32_t flash_tick_counter_last_write;
+
STATIC const mp_machine_soft_spi_obj_t spiflash_spi_bus = {
.base = {&mp_machine_soft_spi_type},
.delay_half = MICROPY_PY_MACHINE_SPI_MIN_DELAY,
@@ -42,22 +46,42 @@ STATIC const mp_machine_soft_spi_obj_t spiflash_spi_bus = {
.miso = &MICROPY_HW_SPIFLASH_MISO,
};
-STATIC const mp_spiflash_t spiflash = {
- .cs = &MICROPY_HW_SPIFLASH_CS,
- .spi = (mp_obj_base_t*)&spiflash_spi_bus.base,
+STATIC const mp_spiflash_config_t spiflash_config = {
+ .bus_kind = MP_SPIFLASH_BUS_SPI,
+ .bus.u_spi.cs = &MICROPY_HW_SPIFLASH_CS,
+ .bus.u_spi.data = (void*)&spiflash_spi_bus,
+ .bus.u_spi.proto = &mp_machine_soft_spi_p,
};
+STATIC mp_spiflash_t spiflash;
+
void spi_bdev_init(void) {
- mp_spiflash_init((mp_spiflash_t*)&spiflash);
+ spiflash.config = &spiflash_config;
+ mp_spiflash_init(&spiflash);
+ flash_tick_counter_last_write = 0;
+}
+
+void spi_bdev_irq_handler(void) {
+ if ((spiflash.flags & 1) && sys_tick_has_passed(flash_tick_counter_last_write, 1000)) {
+ mp_spiflash_flush(&spiflash);
+ led_state(PYB_LED_RED, 0); // indicate a clean cache with LED off
+ }
+}
+
+void spi_bdev_flush(void) {
+ if (spiflash.flags & 1) {
+ // we must disable USB irqs to prevent MSC contention with SPI flash
+ uint32_t basepri = raise_irq_pri(IRQ_PRI_OTG_FS);
+ mp_spiflash_flush(&spiflash);
+ led_state(PYB_LED_RED, 0); // indicate a clean cache with LED off
+ restore_irq_pri(basepri);
+ }
}
bool spi_bdev_readblock(uint8_t *dest, uint32_t block) {
// we must disable USB irqs to prevent MSC contention with SPI flash
uint32_t basepri = raise_irq_pri(IRQ_PRI_OTG_FS);
-
- mp_spiflash_read((mp_spiflash_t*)&spiflash,
- block * FLASH_BLOCK_SIZE, FLASH_BLOCK_SIZE, dest);
-
+ mp_spiflash_read(&spiflash, block * FLASH_BLOCK_SIZE, FLASH_BLOCK_SIZE, dest);
restore_irq_pri(basepri);
return true;
@@ -66,10 +90,11 @@ bool spi_bdev_readblock(uint8_t *dest, uint32_t block) {
bool spi_bdev_writeblock(const uint8_t *src, uint32_t block) {
// we must disable USB irqs to prevent MSC contention with SPI flash
uint32_t basepri = raise_irq_pri(IRQ_PRI_OTG_FS);
-
- int ret = mp_spiflash_write((mp_spiflash_t*)&spiflash,
- block * FLASH_BLOCK_SIZE, FLASH_BLOCK_SIZE, src);
-
+ int ret = mp_spiflash_write(&spiflash, block * FLASH_BLOCK_SIZE, FLASH_BLOCK_SIZE, src);
+ if (spiflash.flags & 1) {
+ led_state(PYB_LED_RED, 1); // indicate a dirty cache with LED on
+ flash_tick_counter_last_write = HAL_GetTick();
+ }
restore_irq_pri(basepri);
return ret == 0;