Private
Public Access
2
0

spi: Add 16bit wide convenience functions for spi

Signed-off-by: Michael Ring <mail@michael-ring.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Michael Ring
2015-02-17 15:34:01 +00:00
committed by Brendan Le Foll
parent 3a5b992524
commit 55ac2e8996
3 changed files with 117 additions and 0 deletions

View File

@@ -256,6 +256,27 @@ mraa_spi_write(mraa_spi_context dev, uint8_t data)
return recv;
}
uint16_t
mraa_spi_write_word(mraa_spi_context dev, uint16_t data) {
struct spi_ioc_transfer msg;
memset(&msg, 0, sizeof(msg));
uint16_t length = 2;
uint16_t recv = 0;
msg.tx_buf = (unsigned long) &data;
msg.rx_buf = (unsigned long) &recv;
msg.speed_hz = dev->clock;
msg.bits_per_word = dev->bpw;
msg.delay_usecs = 0;
msg.len = length;
if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) {
syslog(LOG_ERR, "spi: Failed to perform dev transfer");
return -1;
}
return recv;
}
mraa_result_t
mraa_spi_transfer_buf(mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int length)
{
@@ -275,6 +296,24 @@ mraa_spi_transfer_buf(mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int l
return MRAA_SUCCESS;
}
mraa_result_t
mraa_spi_transfer_buf_word(mraa_spi_context dev, uint16_t *data, uint16_t *rxbuf, int length) {
struct spi_ioc_transfer msg;
memset(&msg, 0, sizeof(msg));
msg.tx_buf = (unsigned long) data;
msg.rx_buf = (unsigned long) rxbuf;
msg.speed_hz = dev->clock;
msg.bits_per_word = dev->bpw;
msg.delay_usecs = 0;
msg.len = length;
if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) {
syslog(LOG_ERR, "spi: Failed to perform dev transfer");
return MRAA_ERROR_INVALID_RESOURCE;
}
return MRAA_SUCCESS;
}
uint8_t*
mraa_spi_write_buf(mraa_spi_context dev, uint8_t* data, int length)
{
@@ -287,6 +326,19 @@ mraa_spi_write_buf(mraa_spi_context dev, uint8_t* data, int length)
return recv;
}
uint16_t *
mraa_spi_write_buf_word(mraa_spi_context dev, uint16_t *data, int length) {
uint16_t* recv = malloc(sizeof(uint16_t) * length);
if (mraa_spi_transfer_buf_word(dev, data, recv, length) != MRAA_SUCCESS) {
free(recv);
return NULL;
}
return recv;
}
mraa_result_t
mraa_spi_stop(mraa_spi_context dev)
{