summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott.shawcroft@gmail.com>2017-05-03 10:50:29 -0700
committerScott Shawcroft <scott.shawcroft@gmail.com>2017-05-03 10:50:29 -0700
commit6512ccf32ec962c094117f9d8ec712f8c209e655 (patch)
tree1467367b23a355412ee48d9f95d95b472be201a3
parent24a5752f942e3afcb5549c3622f321637375c995 (diff)
atmel-samd: Use DMA for user SPI.
Also replace use of PINMUX_DEFAULT with PINMUX_UNUSED to prevent any accidental pin changes. This caused user SPI to break internal SPI flash on the Feather M0 Express. Fixes #100
-rw-r--r--atmel-samd/boards/circuitplayground_express/mpconfigboard.h4
-rw-r--r--atmel-samd/boards/feather_m0_express/mpconfigboard.h2
-rw-r--r--atmel-samd/boards/metro_m0_express/mpconfigboard.h2
-rw-r--r--atmel-samd/common-hal/busio/SPI.c27
4 files changed, 22 insertions, 13 deletions
diff --git a/atmel-samd/boards/circuitplayground_express/mpconfigboard.h b/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
index 5eee39574..243e50358 100644
--- a/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
+++ b/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
@@ -12,13 +12,13 @@
// Rev B:
// #define SPI_FLASH_PAD0_PINMUX PINMUX_PA12D_SERCOM4_PAD0 // MISO
-// #define SPI_FLASH_PAD1_PINMUX PINMUX_DEFAULT // CS
+// #define SPI_FLASH_PAD1_PINMUX PINMUX_UNUSED // CS
// #define SPI_FLASH_PAD2_PINMUX PINMUX_PB10D_SERCOM4_PAD2 // MOSI
// #define SPI_FLASH_PAD3_PINMUX PINMUX_PB11D_SERCOM4_PAD3 // SCK
// Rev C:
#define SPI_FLASH_PAD0_PINMUX PINMUX_PA16D_SERCOM3_PAD0 // MISO
-#define SPI_FLASH_PAD1_PINMUX PINMUX_DEFAULT // CS
+#define SPI_FLASH_PAD1_PINMUX PINMUX_UNUSED // CS
#define SPI_FLASH_PAD2_PINMUX PINMUX_PA20D_SERCOM3_PAD2 // MOSI
#define SPI_FLASH_PAD3_PINMUX PINMUX_PA21D_SERCOM3_PAD3 // SCK
diff --git a/atmel-samd/boards/feather_m0_express/mpconfigboard.h b/atmel-samd/boards/feather_m0_express/mpconfigboard.h
index b18de9544..93ec565bd 100644
--- a/atmel-samd/boards/feather_m0_express/mpconfigboard.h
+++ b/atmel-samd/boards/feather_m0_express/mpconfigboard.h
@@ -13,7 +13,7 @@
// Use default pinmux for the chip select since we manage it ourselves.
#define SPI_FLASH_PAD1_PINMUX PINMUX_PA09D_SERCOM2_PAD1 // SCK
#define SPI_FLASH_PAD2_PINMUX PINMUX_PA14C_SERCOM2_PAD2 // MISO
-#define SPI_FLASH_PAD3_PINMUX PINMUX_DEFAULT // SCK
+#define SPI_FLASH_PAD3_PINMUX PINMUX_UNUSED // SCK
#define SPI_FLASH_SERCOM SERCOM2
#define SPI_FLASH_CS PIN_PA13
diff --git a/atmel-samd/boards/metro_m0_express/mpconfigboard.h b/atmel-samd/boards/metro_m0_express/mpconfigboard.h
index ddee4ff70..728169957 100644
--- a/atmel-samd/boards/metro_m0_express/mpconfigboard.h
+++ b/atmel-samd/boards/metro_m0_express/mpconfigboard.h
@@ -12,7 +12,7 @@
#define SPI_FLASH_BAUDRATE (8000000)
#define SPI_FLASH_MUX_SETTING SPI_SIGNAL_MUX_SETTING_F
-#define SPI_FLASH_PAD0_PINMUX PINMUX_DEFAULT // CS
+#define SPI_FLASH_PAD0_PINMUX PINMUX_UNUSED // CS
// Use default pinmux for the chip select since we manage it ourselves.
#define SPI_FLASH_PAD1_PINMUX PINMUX_PB03D_SERCOM5_PAD1 // MISO
#define SPI_FLASH_PAD2_PINMUX PINMUX_PB22D_SERCOM5_PAD2 // MOSI
diff --git a/atmel-samd/common-hal/busio/SPI.c b/atmel-samd/common-hal/busio/SPI.c
index 75891c6df..f3f289f37 100644
--- a/atmel-samd/common-hal/busio/SPI.c
+++ b/atmel-samd/common-hal/busio/SPI.c
@@ -29,6 +29,7 @@
#include "py/runtime.h"
#include "rgb_led_status.h"
#include "samd21_pins.h"
+#include "shared_dma.h"
// We use ENABLE registers below we don't want to treat as a macro.
#undef ENABLE
@@ -127,6 +128,11 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
&config_spi_master.pinmux_pad1,
&config_spi_master.pinmux_pad2,
&config_spi_master.pinmux_pad3};
+ // Set other pinmuxes to unused so we don't accidentally change other pin
+ // state.
+ for (uint8_t i = 0; i < 4; i++) {
+ *pinmuxes[i] = PINMUX_UNUSED;
+ }
*pinmuxes[clock_pad] = clock_pinmux;
self->clock_pin = clock->pin;
claim_pin(clock);
@@ -220,10 +226,12 @@ bool common_hal_busio_spi_write(busio_spi_obj_t *self,
if (len == 0) {
return true;
}
- enum status_code status = spi_write_buffer_wait(
- &self->spi_master_instance,
- data,
- len);
+ enum status_code status;
+ if (len >= 16) {
+ status = shared_dma_write(self->spi_master_instance.hw, data, len);
+ } else {
+ status = spi_write_buffer_wait(&self->spi_master_instance, data, len);
+ }
return status == STATUS_OK;
}
@@ -232,10 +240,11 @@ bool common_hal_busio_spi_read(busio_spi_obj_t *self,
if (len == 0) {
return true;
}
- enum status_code status = spi_read_buffer_wait(
- &self->spi_master_instance,
- data,
- len,
- write_value);
+ enum status_code status;
+ if (len >= 16) {
+ status = shared_dma_read(self->spi_master_instance.hw, data, len, write_value);
+ } else {
+ status = spi_read_buffer_wait(&self->spi_master_instance, data, len, write_value);
+ }
return status == STATUS_OK;
}