From 9030ae2eeb46d02ebee142e7323b151470b0a9d4 Mon Sep 17 00:00:00 2001 From: Alex Tereschenko Date: Thu, 18 Aug 2016 16:27:35 +0200 Subject: [PATCH] spi.c: added replace functions for all basic actions Signed-off-by: Alex Tereschenko Signed-off-by: Brendan Le Foll --- include/mraa_adv_func.h | 9 +++++ src/spi/spi.c | 74 +++++++++++++++++++++++++++++++++++------ 2 files changed, 72 insertions(+), 11 deletions(-) diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index 9c017a5..aa0cfb0 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -97,7 +97,16 @@ typedef struct { mraa_result_t (*spi_init_pre) (int bus); mraa_result_t (*spi_init_post) (mraa_spi_context spi); + mraa_result_t (*spi_init_raw_replace) (mraa_spi_context spi, unsigned int bus, unsigned int cs); mraa_result_t (*spi_lsbmode_replace) (mraa_spi_context dev, mraa_boolean_t lsb); + mraa_result_t (*spi_mode_replace) (mraa_spi_context dev, mraa_spi_mode_t mode); + mraa_result_t (*spi_bit_per_word_replace) (mraa_spi_context dev, unsigned int bits); + mraa_result_t (*spi_frequency_replace) (mraa_spi_context dev, int hz); + mraa_result_t (*spi_transfer_buf_replace) (mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int length); + mraa_result_t (*spi_transfer_buf_word_replace) (mraa_spi_context dev, uint16_t* data, uint16_t* rxbuf, int length); + int (*spi_write_replace) (mraa_spi_context dev, uint8_t data); + int (*spi_write_word_replace) (mraa_spi_context dev, uint16_t data); + mraa_result_t (*spi_stop_replace) (mraa_spi_context dev); mraa_result_t (*uart_init_pre) (int index); mraa_result_t (*uart_init_post) (mraa_uart_context uart); diff --git a/src/spi/spi.c b/src/spi/spi.c index 88cab1b..e91dbf2 100644 --- a/src/spi/spi.c +++ b/src/spi/spi.c @@ -135,10 +135,22 @@ mraa_spi_init(int bus) mraa_spi_context mraa_spi_init_raw(unsigned int bus, unsigned int cs) { + mraa_result_t status = MRAA_SUCCESS; + mraa_spi_context dev = mraa_spi_init_internal(plat == NULL ? NULL : plat->adv_func); if (dev == NULL) { syslog(LOG_CRIT, "spi: Failed to allocate memory for context"); - return NULL; + status = MRAA_ERROR_NO_RESOURCES; + goto init_raw_cleanup; + } + + if (IS_FUNC_DEFINED(dev, spi_init_raw_replace)) { + status = dev->advance_func->spi_init_raw_replace(dev, bus, cs); + if (status == MRAA_SUCCESS) { + return dev; + } else { + goto init_raw_cleanup; + } } char path[MAX_SIZE]; @@ -147,8 +159,8 @@ mraa_spi_init_raw(unsigned int bus, unsigned int cs) dev->devfd = open(path, O_RDWR); if (dev->devfd < 0) { syslog(LOG_ERR, "spi: Failed opening SPI Device. bus:%s", path); - free(dev); - return NULL; + status = MRAA_ERROR_INVALID_RESOURCE; + goto init_raw_cleanup; } int speed = 0; @@ -160,18 +172,26 @@ mraa_spi_init_raw(unsigned int bus, unsigned int cs) syslog(LOG_WARNING, "spi: Max speed query failed, setting %d", dev->clock); } - if (mraa_spi_mode(dev, MRAA_SPI_MODE0) != MRAA_SUCCESS) { - free(dev); - return NULL; + status = mraa_spi_mode(dev, MRAA_SPI_MODE0); + if (status != MRAA_SUCCESS) { + goto init_raw_cleanup; } - if (mraa_spi_lsbmode(dev, 0) != MRAA_SUCCESS) { - free(dev); - return NULL; + status = mraa_spi_lsbmode(dev, 0); + if (status != MRAA_SUCCESS) { + goto init_raw_cleanup; } - if (mraa_spi_bit_per_word(dev, 8) != MRAA_SUCCESS) { - free(dev); + status = mraa_spi_bit_per_word(dev, 8); + if (status != MRAA_SUCCESS) { + goto init_raw_cleanup; + } + +init_raw_cleanup: + if (status != MRAA_SUCCESS) { + if (dev != NULL) { + free(dev); + } return NULL; } @@ -186,6 +206,10 @@ mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, spi_mode_replace)) { + return dev->advance_func->spi_mode_replace(dev, mode); + } + uint8_t spi_mode = 0; switch (mode) { case MRAA_SPI_MODE0: @@ -222,6 +246,10 @@ mraa_spi_frequency(mraa_spi_context dev, int hz) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, spi_frequency_replace)) { + return dev->advance_func->spi_frequency_replace(dev, hz); + } + int speed = 0; dev->clock = hz; if (ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) { @@ -266,6 +294,10 @@ mraa_spi_bit_per_word(mraa_spi_context dev, unsigned int bits) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, spi_bit_per_word_replace)) { + return dev->advance_func->spi_bit_per_word_replace(dev, bits); + } + if (ioctl(dev->devfd, SPI_IOC_WR_BITS_PER_WORD, &bits) < 0) { syslog(LOG_ERR, "spi: Failed to set bit per word"); return MRAA_ERROR_INVALID_RESOURCE; @@ -282,6 +314,10 @@ mraa_spi_write(mraa_spi_context dev, uint8_t data) return -1; } + if (IS_FUNC_DEFINED(dev, spi_write_replace)) { + return dev->advance_func->spi_write_replace(dev, data); + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -309,6 +345,10 @@ mraa_spi_write_word(mraa_spi_context dev, uint16_t data) return -1; } + if (IS_FUNC_DEFINED(dev, spi_write_word_replace)) { + return dev->advance_func->spi_write_word_replace(dev, data); + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -336,6 +376,10 @@ mraa_spi_transfer_buf(mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int l return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, spi_transfer_buf_replace)) { + return dev->advance_func->spi_transfer_buf_replace(dev, data, rxbuf, length); + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -360,6 +404,10 @@ mraa_spi_transfer_buf_word(mraa_spi_context dev, uint16_t* data, uint16_t* rxbuf return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, spi_transfer_buf_word_replace)) { + return dev->advance_func->spi_transfer_buf_word_replace(dev, data, rxbuf, length); + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -418,6 +466,10 @@ mraa_spi_stop(mraa_spi_context dev) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, spi_stop_replace)) { + return dev->advance_func->spi_stop_replace(dev); + } + close(dev->devfd); free(dev); return MRAA_SUCCESS;