From d7baa54bd03f5d8fab99da467d953767650c542c Mon Sep 17 00:00:00 2001 From: "Xenofon (Fontas) Fafoutis" Date: Tue, 3 Apr 2018 12:58:47 +0100 Subject: [PATCH] SPI HAL API: lock()/open() and close()/unlock() merged --- arch/cpu/cc2538/dev/spi-arch.c | 40 ++++++++------------------- arch/cpu/cc26xx-cc13xx/dev/spi-arch.c | 40 ++++++++------------------- os/dev/spi.c | 24 +++------------- os/dev/spi.h | 29 ++++--------------- 4 files changed, 32 insertions(+), 101 deletions(-) diff --git a/arch/cpu/cc2538/dev/spi-arch.c b/arch/cpu/cc2538/dev/spi-arch.c index 5dc44524a..5c554e7e7 100644 --- a/arch/cpu/cc2538/dev/spi-arch.c +++ b/arch/cpu/cc2538/dev/spi-arch.c @@ -147,18 +147,6 @@ spix_wait_eorx(spi_device_t *dev) while(!(REG(spi_regs[dev->spi_controller].base + SSI_SR) & SSI_SR_RNE)); } /*---------------------------------------------------------------------------*/ -spi_status_t -spi_arch_lock(spi_device_t *dev) -{ - if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) { - return SPI_DEV_STATUS_BUS_LOCKED; - } - - board_spi_locks_spi[dev->spi_controller].owner = dev; - - return SPI_DEV_STATUS_OK; -} -/*---------------------------------------------------------------------------*/ bool spi_arch_has_lock(spi_device_t *dev) { @@ -180,20 +168,7 @@ spi_arch_is_bus_locked(spi_device_t *dev) } /*---------------------------------------------------------------------------*/ spi_status_t -spi_arch_unlock(spi_device_t *dev) -{ - if(!spi_arch_has_lock(dev)) { - return SPI_DEV_STATUS_BUS_NOT_OWNED; - } - - board_spi_locks_spi[dev->spi_controller].owner = NULL; - mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock); - - return SPI_DEV_STATUS_OK; -} -/*---------------------------------------------------------------------------*/ -spi_status_t -spi_arch_open(spi_device_t *dev) +spi_arch_lock_and_open(spi_device_t *dev) { const spi_regs_t *regs; uint32_t scr; @@ -213,10 +188,13 @@ spi_arch_open(spi_device_t *dev) uint32_t mode = 0; - if(!spi_arch_has_lock(dev)) { - return SPI_DEV_STATUS_BUS_NOT_OWNED; + /* lock the SPI bus */ + if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) { + return SPI_DEV_STATUS_BUS_LOCKED; } + board_spi_locks_spi[dev->spi_controller].owner = dev; + /* Set SPI phase */ if(dev->spi_pha != 0) { mode = mode | SSI_CR0_SPH; @@ -287,7 +265,7 @@ spi_arch_open(spi_device_t *dev) } /*---------------------------------------------------------------------------*/ spi_status_t -spi_arch_close(spi_device_t *dev) +spi_arch_close_and_unlock(spi_device_t *dev) { if(!spi_arch_has_lock(dev)) { return SPI_DEV_STATUS_BUS_NOT_OWNED; @@ -296,6 +274,10 @@ spi_arch_close(spi_device_t *dev) /* Disable SSI */ REG(SYS_CTRL_RCGCSSI) &= ~(1 << dev->spi_controller); + /* Unlock the SPI bus */ + board_spi_locks_spi[dev->spi_controller].owner = NULL; + mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock); + return SPI_DEV_STATUS_OK; } /*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c b/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c index bda3abbe2..d274a1d52 100644 --- a/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c +++ b/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c @@ -67,18 +67,6 @@ static const board_spi_controller_t spi_controller[SPI_CONTROLLER_COUNT] = { } }; /*---------------------------------------------------------------------------*/ -spi_status_t -spi_arch_lock(spi_device_t *dev) -{ - if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) { - return SPI_DEV_STATUS_BUS_LOCKED; - } - - board_spi_locks_spi[dev->spi_controller].owner = dev; - - return SPI_DEV_STATUS_OK; -} -/*---------------------------------------------------------------------------*/ bool spi_arch_has_lock(spi_device_t *dev) { @@ -99,19 +87,6 @@ spi_arch_is_bus_locked(spi_device_t *dev) return false; } /*---------------------------------------------------------------------------*/ -spi_status_t -spi_arch_unlock(spi_device_t *dev) -{ - if(!spi_arch_has_lock(dev)) { - return SPI_DEV_STATUS_BUS_NOT_OWNED; - } - - board_spi_locks_spi[dev->spi_controller].owner = NULL; - mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock); - - return SPI_DEV_STATUS_OK; -} -/*---------------------------------------------------------------------------*/ static uint32_t get_mode(spi_device_t *dev) { @@ -128,14 +103,17 @@ get_mode(spi_device_t *dev) } /*---------------------------------------------------------------------------*/ spi_status_t -spi_arch_open(spi_device_t *dev) +spi_arch_lock_and_open(spi_device_t *dev) { uint32_t c; - if(!spi_arch_has_lock(dev)) { - return SPI_DEV_STATUS_BUS_NOT_OWNED; + /* Lock the SPI bus */ + if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) { + return SPI_DEV_STATUS_BUS_LOCKED; } + board_spi_locks_spi[dev->spi_controller].owner = dev; + /* CS pin configuration */ ti_lib_ioc_pin_type_gpio_output(dev->pin_spi_cs); @@ -166,7 +144,7 @@ spi_arch_open(spi_device_t *dev) } /*---------------------------------------------------------------------------*/ spi_status_t -spi_arch_close(spi_device_t *dev) +spi_arch_close_and_unlock(spi_device_t *dev) { if(!spi_arch_has_lock(dev)) { return SPI_DEV_STATUS_BUS_NOT_OWNED; @@ -187,6 +165,10 @@ spi_arch_close(spi_device_t *dev) ti_lib_ioc_pin_type_gpio_input(dev->pin_spi_sck); ti_lib_ioc_io_port_pull_set(dev->pin_spi_sck, IOC_IOPULL_DOWN); + /* Unlock the SPI bus */ + board_spi_locks_spi[dev->spi_controller].owner = NULL; + mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock); + return SPI_DEV_STATUS_OK; } /*---------------------------------------------------------------------------*/ diff --git a/os/dev/spi.c b/os/dev/spi.c index d1d678a18..c41cf206f 100644 --- a/os/dev/spi.c +++ b/os/dev/spi.c @@ -45,39 +45,23 @@ spi_status_t spi_acquire(spi_device_t *dev) { - spi_status_t r; - if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { return SPI_DEV_STATUS_EINVAL; } - /* lock the bus */ - r = spi_arch_lock(dev); - if(r != SPI_DEV_STATUS_OK) { - return r; - } - - /* open the bus */ - return spi_arch_open(dev); + /* lock and open the bus */ + return spi_arch_lock_and_open(dev); } /*---------------------------------------------------------------------------*/ spi_status_t spi_release(spi_device_t *dev) { - spi_status_t r; - if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { return SPI_DEV_STATUS_EINVAL; } - /* unlock the bus */ - r = spi_arch_close(dev); - if(r != SPI_DEV_STATUS_OK) { - return r; - } - - /* unlock the bus */ - return spi_arch_unlock(dev); + /* close and unlock the bus */ + return spi_arch_close_and_unlock(dev); } /*---------------------------------------------------------------------------*/ spi_status_t diff --git a/os/dev/spi.h b/os/dev/spi.h index 95d079263..0c9aadc73 100644 --- a/os/dev/spi.h +++ b/os/dev/spi.h @@ -258,24 +258,6 @@ spi_status_t spi_read_register(spi_device_t *dev, uint8_t reg, /* These are architecture-specific functions to be implemented by each CPU. */ /*---------------------------------------------------------------------------*/ -/** - * \brief Locks an SPI controller to device dev. - * \param dev An SPI device configuration which defines the controller - * to be locked and the device that locks it. - * \return SPI return code - * - */ -spi_status_t spi_arch_lock(spi_device_t *dev); - -/** - * \brief Unlocks an SPI controller. - * \param dev An SPI device configuration which defines the controller - * to be unlocked and the device that unlocks it. - * \return SPI return code - * - */ -spi_status_t spi_arch_unlock(spi_device_t *dev); - /** * \brief Checks if a device has locked an SPI controller * \param dev An SPI device configuration which defines the controller @@ -295,7 +277,7 @@ bool spi_arch_has_lock(spi_device_t *dev); bool spi_arch_is_bus_locked(spi_device_t *dev); /** - * \brief Opens an SPI controller to the configuration specified. + * \brief Locks and opens an SPI controller to the configuration specified. * \param dev An SPI device configuration. * \return SPI return code * @@ -303,19 +285,20 @@ bool spi_arch_is_bus_locked(spi_device_t *dev); * controller. * */ -spi_status_t spi_arch_open(spi_device_t *dev); +spi_status_t spi_arch_lock_and_open(spi_device_t *dev); /** - * \brief Closes an SPI controller + * \brief Closes and unlocks an SPI controller * \param dev An SPI device configuration that specifies the controller. * \return SPI return code * - * This should turn off the SPI controller to put it in low power mode. + * This should turn off the SPI controller to put it in low power mode + * and unlock it. * It should work only if the device has already locked the SPI * controller. * */ -spi_status_t spi_arch_close(spi_device_t *dev); +spi_status_t spi_arch_close_and_unlock(spi_device_t *dev); /** * \brief Performs an SPI transfer