From 998095d802f7ce86bb4221d38b395ae25d35211a Mon Sep 17 00:00:00 2001 From: Kiveisha Yevgeniy Date: Wed, 6 Aug 2014 11:40:51 +0000 Subject: [PATCH] spi: added spi mode to mraa Signed-off-by: Kiveisha Yevgeniy --- api/mraa/spi.h | 12 +++++++++++- api/mraa/spi.hpp | 2 +- src/spi/spi.c | 28 ++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/api/mraa/spi.h b/api/mraa/spi.h index 4a91e72..19fdbb0 100644 --- a/api/mraa/spi.h +++ b/api/mraa/spi.h @@ -44,6 +44,16 @@ extern "C" { #include "common.h" /** + * MRAA supported platform types + */ +typedef enum { + MODE0 = 0, /**< CPOL = 0, CPHA = 0, Clock idle low, data is clocked in on rising edge, output data (change) on falling edge */ + MODE1 = 1, /**< CPOL = 0, CPHA = 1, Clock idle low, data is clocked in on falling edge, output data (change) on rising edge */ + MODE2 = 2, /**< CPOL = 1, CPHA = 0, Clock idle low, data is clocked in on falling edge, output data (change) on rising edge */ + MODE3 = 3, /**< CPOL = 1, CPHA = 1, Clock idle low, data is clocked in on rising, edge output data (change) on falling edge */ +} mraa_spi_mode_t; + +/** * Opaque pointer definition to the internal struct _spi */ typedef struct _spi* mraa_spi_context; @@ -63,7 +73,7 @@ mraa_spi_context mraa_spi_init(int bus); * @param mode The SPI mode, See Linux spidev * @return Spi context or NULL */ -mraa_result_t mraa_spi_mode(mraa_spi_context dev,unsigned short mode); +mraa_result_t mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode); /** Set the SPI device operating clock frequency. * diff --git a/api/mraa/spi.hpp b/api/mraa/spi.hpp index 1cdbaff..263d7c0 100644 --- a/api/mraa/spi.hpp +++ b/api/mraa/spi.hpp @@ -57,7 +57,7 @@ class Spi { * @param mode the mode. See Linux spidev doc * @return Result of operation */ - mraa_result_t mode(unsigned short mode) { + mraa_result_t mode(mraa_spi_mode_t mode) { return mraa_spi_mode(m_spi, mode); } /** diff --git a/src/spi/spi.c b/src/spi/spi.c index e35df96..c411fd8 100644 --- a/src/spi/spi.c +++ b/src/spi/spi.c @@ -78,9 +78,33 @@ mraa_spi_init(int bus) } mraa_result_t -mraa_spi_mode(mraa_spi_context dev, unsigned short mode) +mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode) { - dev->mode = mode; + uint8_t spi_mode = 0; + switch (mode) { + case MODE0: + spi_mode = SPI_MODE_0; + break; + case MODE1: + spi_mode = SPI_MODE_1; + break; + case MODE2: + spi_mode = SPI_MODE_2; + break; + case MODE3: + spi_mode = SPI_MODE_3; + break; + default: + spi_mode = SPI_MODE_0; + break; + } + + if (ioctl (dev->devfd, SPI_IOC_WR_MODE, &spi_mode) < 0) { + fprintf(stderr, "Failed to set spi mode\n"); + return MRAA_ERROR_INVALID_RESOURCE; + } + + dev->mode = spi_mode; return MRAA_SUCCESS; } -- 2.7.4