summaryrefslogtreecommitdiffstats
path: root/bsps/arm/atsam
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-03-06 09:48:41 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-03-06 13:07:16 +0100
commitb93489856255848c02521f22f3b4271de2fc873f (patch)
tree988f7c70344049de4511459abf873f9c2d057c09 /bsps/arm/atsam
parentbsp/atsam: Simplify SPI configuration (diff)
downloadrtems-b93489856255848c02521f22f3b4271de2fc873f.tar.bz2
bsp/atsam: Make SPI CS delays configurable
Diffstat (limited to 'bsps/arm/atsam')
-rw-r--r--bsps/arm/atsam/include/bsp/atsam-spi.h6
-rw-r--r--bsps/arm/atsam/spi/atsam_spi_bus.c19
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);