From b93489856255848c02521f22f3b4271de2fc873f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 6 Mar 2019 09:48:41 +0100 Subject: 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 4bfa6c3a1e..487795c0db 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 8062059007..635bcebc20 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); -- cgit v1.2.3