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:
committed by
Brendan Le Foll
parent
3a638caf01
commit
9030ae2eeb
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user