diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-03-06 09:48:41 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-03-06 13:07:16 +0100 |
commit | b93489856255848c02521f22f3b4271de2fc873f (patch) | |
tree | 988f7c70344049de4511459abf873f9c2d057c09 /bsps/arm | |
parent | bsp/atsam: Simplify SPI configuration (diff) | |
download | rtems-b93489856255848c02521f22f3b4271de2fc873f.tar.bz2 |
bsp/atsam: Make SPI CS delays configurable
Diffstat (limited to 'bsps/arm')
-rw-r--r-- | bsps/arm/atsam/include/bsp/atsam-spi.h | 6 | ||||
-rw-r--r-- | 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); |