summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Krutwig <alexander.krutwig@embedded-brains.de>2016-10-17 14:36:49 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-10-17 14:48:43 +0200
commit24fe2130d7699cf4eb123354363fd6f80fc6afbe (patch)
tree738c9095b1dfbc6c7cd691ca78a8a1b189346a79
parentlibchip/network/if_fxp.c: do not use rtems_interrupt_disable. (diff)
downloadrtems-24fe2130d7699cf4eb123354363fd6f80fc6afbe.tar.bz2
atsam: multiple messages on one cs low level
-rw-r--r--c/src/lib/libbsp/arm/atsam/include/atsam-spi.h1
-rw-r--r--c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c21
2 files changed, 14 insertions, 8 deletions
diff --git a/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h b/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h
index a7cf5834d4..c742e83337 100644
--- a/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h
+++ b/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h
@@ -44,6 +44,7 @@ typedef struct {
uint32_t dma_rx_channel;
bool rx_transfer_done;
bool tx_transfer_done;
+ bool spi_switched_on;
} atsam_spi_bus;
int spi_bus_register_atsam(
diff --git a/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c b/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c
index 3f44a4e1f1..86950aecab 100644
--- a/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c
+++ b/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c
@@ -97,7 +97,6 @@ static void atsam_interrupt_handler(void *arg)
} else {
/* Block end interrupt for LLI dma mode */
if (XDMAC_GetChannelIsr(xdmac, channel) & XDMAC_CIS_BIS) {
- atsam_finish_command(spid);
}
}
@@ -110,7 +109,6 @@ static void atsam_interrupt_handler(void *arg)
}
if (bus->rx_transfer_done && bus->tx_transfer_done) {
- atsam_finish_command(spid);
sc = rtems_event_transient_send(bus->task_id);
assert(sc == RTEMS_SUCCESSFUL);
}
@@ -149,6 +147,7 @@ static void atsam_set_phase_and_polarity(uint32_t mode, uint32_t *csr)
*csr |= SPI_CSR_CPOL;
break;
}
+ *csr |= SPI_CSR_CSAAT;
}
static void atsam_configure_spi(atsam_spi_bus *bus)
@@ -370,14 +369,18 @@ static uint32_t atsam_send_command(
return SPID_ERROR_LOCK;
}
- /* Enable the SPI Peripheral */
- PMC_EnablePeripheral(spid->spiId);
+ if(!bus->spi_switched_on){
+ /* Enable the SPI Peripheral */
+ PMC_EnablePeripheral(spid->spiId);
- /* SPI chip select */
- SPI_ChipSelect(pSpiHw, 1 << msg->cs);
+ /* SPI chip select */
+ SPI_ChipSelect(pSpiHw, 1 << msg->cs);
- /* Enables the SPI to transfer and receive data. */
- SPI_Enable (pSpiHw);
+ /* Enables the SPI to transfer and receive data. */
+ SPI_Enable (pSpiHw);
+ }
+
+ bus->spi_switched_on = true;
/* Start DMA 0(RX) && 1(TX) */
if (XDMAD_StartTransfer(spid->pXdmad, bus->dma_rx_channel)) {
@@ -453,6 +456,8 @@ static int atsam_spi_setup_transfer(atsam_spi_bus *bus)
bus->tx_transfer_done = false;
if (msgs[i].cs_change > 0) {
SPI_ReleaseCS(bus->SpiDma.pSpiHw);
+ atsam_finish_command(&bus->SpiDma);
+ bus->spi_switched_on = false;
}
}
return rv;