Private
Public Access
2
0

spi.c: added replace functions for all basic actions

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Alex Tereschenko
2016-08-18 16:27:35 +02:00
committed by Brendan Le Foll
parent 3a638caf01
commit 9030ae2eeb
2 changed files with 72 additions and 11 deletions

View File

@@ -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;