[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