From 3a5b99252419b5145c46811f15e807405cd0f62d Mon Sep 17 00:00:00 2001 From: Michael Ring Date: Sat, 14 Feb 2015 18:14:55 +0100 Subject: [PATCH] spi.c: Initialization of spi is necessary on Beaglebone Black Signed-off-by: Michael Ring Signed-off-by: Brendan Le Foll --- src/spi/spi.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/spi/spi.c b/src/spi/spi.c index e402143..c5d7997 100644 --- a/src/spi/spi.c +++ b/src/spi/spi.c @@ -56,7 +56,7 @@ mraa_spi_init(int bus) syslog(LOG_ERR, "spi: Platform Not Initialised"); return NULL; } - if (plat->spi_bus_count == 0) { + if (plat->spi_bus_count == 0) { syslog(LOG_ERR, "spi: no spi buses defined in platform"); return NULL; } @@ -135,10 +135,29 @@ mraa_spi_init_raw(unsigned int bus, unsigned int cs) free(dev); return NULL; } - dev->bpw = 8; - dev->clock = 4000000; - dev->lsb = 0; - dev->mode = 0; + + int speed = 0; + if ((ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) && (speed < 4000000)) { + dev->clock = speed; + } + else { + dev->clock = 4000000; + } + + if (mraa_spi_mode(dev, MRAA_SPI_MODE0) != MRAA_SUCCESS) { + free(dev); + return NULL; + }; + + if (mraa_spi_lsbmode(dev, 0) != MRAA_SUCCESS) { + free(dev); + return NULL; + }; + + if (mraa_spi_bit_per_word(dev, 8) != MRAA_SUCCESS) { + free(dev); + return NULL; + }; return dev; } @@ -177,7 +196,14 @@ mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode) mraa_result_t mraa_spi_frequency(mraa_spi_context dev, int hz) { + int speed = 0; dev->clock = hz; + if (ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) { + if (speed < hz) { + dev->clock = speed; + syslog(LOG_WARNING, "spi: Selected speed reduced to max allowed speed"); + } + } return MRAA_SUCCESS; }