[rtems commit] bsp/atsam: Make SPI CS delays configurable

Sebastian Huber sebh at rtems.org
Wed Mar 6 12:07:32 UTC 2019


Module:    rtems
Branch:    master
Commit:    b93489856255848c02521f22f3b4271de2fc873f
Changeset: http://git.rtems.org/rtems/commit/?id=b93489856255848c02521f22f3b4271de2fc873f

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Mar  6 09:48:41 2019 +0100

bsp/atsam: Make SPI CS delays configurable

---

 bsps/arm/atsam/include/bsp/atsam-spi.h |  6 ++++++
 bsps/arm/atsam/spi/atsam_spi_bus.c     | 19 ++++++++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/bsps/arm/atsam/include/bsp/atsam-spi.h b/bsps/arm/atsam/include/bsp/atsam-spi.h
index 4bfa6c3..487795c 100644
--- a/bsps/arm/atsam/include/bsp/atsam-spi.h
+++ b/bsps/arm/atsam/include/bsp/atsam-spi.h
@@ -27,6 +27,12 @@ typedef struct {
   Spi        *spi_regs;
   size_t      pin_count;
   bool        chip_select_decode;
+
+  /* Delay before SCLK in ns */
+  uint32_t    dlybs_in_ns[4];
+
+  /* Delay before consecutive word transfers in ns */
+  uint32_t    dlybct_in_ns[4];
 } atsam_spi_config;
 
 int spi_bus_register_atsam(
diff --git a/bsps/arm/atsam/spi/atsam_spi_bus.c b/bsps/arm/atsam/spi/atsam_spi_bus.c
index 8062059..635bceb 100644
--- a/bsps/arm/atsam/spi/atsam_spi_bus.c
+++ b/bsps/arm/atsam/spi/atsam_spi_bus.c
@@ -148,11 +148,9 @@ static void atsam_configure_spi(atsam_spi_bus *bus)
 
   bus->spi_regs->SPI_MR = mode;
 
-  csr =
-    SPI_DLYBCT(1000, BOARD_MCK) |
-    SPI_DLYBS(1000, BOARD_MCK) |
-    SPI_CSR_SCBR(scbr) |
-    SPI_CSR_BITS(bus->base.bits_per_word - 8);
+  csr = bus->spi_csr[cs]
+    | SPI_CSR_SCBR(scbr)
+    | SPI_CSR_BITS(bus->base.bits_per_word - 8);
 
   atsam_set_phase_and_polarity(bus->base.mode, &csr);
 
@@ -606,6 +604,7 @@ int spi_bus_register_atsam(
 )
 {
   atsam_spi_bus *bus;
+  size_t i;
 
   bus = (atsam_spi_bus *) spi_bus_alloc_and_init(sizeof(*bus));
   if (bus == NULL) {
@@ -624,6 +623,16 @@ int spi_bus_register_atsam(
   bus->spi_regs = config->spi_regs;
   bus->chip_select_decode = config->chip_select_decode;
 
+  for (i = 0; i < RTEMS_ARRAY_SIZE(bus->spi_csr); ++i) {
+    if (config->dlybs_in_ns[i] != 0) {
+      bus->spi_csr[i] |= SPI_DLYBS(config->dlybs_in_ns[i], BOARD_MCK);
+    }
+
+    if (config->dlybct_in_ns[i] != 0) {
+      bus->spi_csr[i] |= SPI_DLYBCT(config->dlybct_in_ns[i], BOARD_MCK);
+    }
+  }
+
   rtems_binary_semaphore_init(&bus->sem, "ATSAM SPI");
   PIO_Configure(config->pins, config->pin_count);
   PMC_EnablePeripheral(config->spi_peripheral_id);



More information about the vc mailing list