diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-09-28 14:45:16 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-10-01 09:01:21 +0200 |
commit | fca9132aa5435a44a4a64adaa8438a177b33cab6 (patch) | |
tree | 27be6f8278a6e9c93f5b1e92b17a4275712f50a2 /bsps | |
parent | bsp/imx: Add imx_ccm_sdhci_hz() (diff) | |
download | rtems-fca9132aa5435a44a4a64adaa8438a177b33cab6.tar.bz2 |
bsp/atsam: Use binary semaphore for SPI
Update #3534.
Diffstat (limited to 'bsps')
-rw-r--r-- | bsps/arm/atsam/spi/atsam_spi_bus.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/bsps/arm/atsam/spi/atsam_spi_bus.c b/bsps/arm/atsam/spi/atsam_spi_bus.c index b40fa56f7a..36c6216146 100644 --- a/bsps/arm/atsam/spi/atsam_spi_bus.c +++ b/bsps/arm/atsam/spi/atsam_spi_bus.c @@ -32,6 +32,8 @@ #include <bsp/atsam-spi.h> #include <bsp/iocopy.h> +#include <rtems/thread.h> + #include <dev/spi/spi.h> #include <string.h> @@ -53,12 +55,12 @@ struct atsam_spi_xdma_buf { typedef struct { spi_bus base; + rtems_binary_semaphore sem; bool msg_cs_change; const spi_ioc_transfer *msg_current; const spi_ioc_transfer *msg_next; uint32_t msg_todo; int msg_error; - rtems_id msg_task; Spid spi; uint32_t dma_tx_channel; uint32_t dma_rx_channel; @@ -72,10 +74,7 @@ typedef struct { static void atsam_spi_wakeup_task(atsam_spi_bus *bus) { - rtems_status_code sc; - - sc = rtems_event_transient_send(bus->msg_task); - assert(sc == RTEMS_SUCCESSFUL); + rtems_binary_semaphore_post(&bus->sem); } static uint8_t atsam_calculate_dlybcs(uint16_t delay_in_us) @@ -269,7 +268,6 @@ static void atsam_spi_start_dma_transfer( ) { Xdmac *pXdmac = XDMAC; - size_t i; atsam_spi_check_alignment_and_set_up_dma_descriptors( bus, @@ -418,7 +416,6 @@ static int atsam_spi_transfer( uint32_t msg_count ) { - rtems_status_code sc; atsam_spi_bus *bus = (atsam_spi_bus *)base; bus->msg_cs_change = false; @@ -426,10 +423,8 @@ static int atsam_spi_transfer( bus->msg_current = NULL; bus->msg_todo = msg_count; bus->msg_error = 0; - bus->msg_task = rtems_task_self(); atsam_spi_setup_transfer(bus); - sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); - assert(sc == RTEMS_SUCCESSFUL); + rtems_binary_semaphore_wait(&bus->sem); return bus->msg_error; } @@ -464,6 +459,7 @@ static void atsam_spi_destroy(spi_bus *base) rtems_cache_coherent_free(bus->dma_bufs); spi_bus_destroy_and_free(&bus->base); + rtems_binary_semaphore_destroy(&bus->sem); } static int atsam_spi_setup(spi_bus *base) @@ -624,6 +620,7 @@ int spi_bus_register_atsam( bus->spi.pSpiHw = config->spi_regs; bus->chip_select_decode = config->chip_select_decode; + rtems_binary_semaphore_init(&bus->sem, "ATSAM SPI"); PIO_Configure(config->pins, config->pin_count); PMC_EnablePeripheral(config->spi_peripheral_id); atsam_configure_spi(bus); |