summaryrefslogtreecommitdiff
path: root/peripheral/libmraa/src/spi/spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libmraa/src/spi/spi.c')
-rw-r--r--peripheral/libmraa/src/spi/spi.c358
1 files changed, 0 insertions, 358 deletions
diff --git a/peripheral/libmraa/src/spi/spi.c b/peripheral/libmraa/src/spi/spi.c
deleted file mode 100644
index 384cc20..0000000
--- a/peripheral/libmraa/src/spi/spi.c
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
- * Author: Brendan Le Foll <brendan.le.foll@intel.com>
- * Copyright (c) 2014, 2015 Intel Corporation.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <linux/spi/spidev.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include "spi.h"
-#include "mraa_internal.h"
-
-#define MAX_SIZE 64
-#define SPI_MAX_LENGTH 4096
-
-static mraa_spi_context
-mraa_spi_init_internal(mraa_adv_func_t* func_table)
-{
- mraa_spi_context dev = (mraa_spi_context) calloc(1, sizeof(struct _spi));
- if (dev == NULL) {
- return NULL;
- }
- dev->advance_func = func_table;
-
- return dev;
-}
-
-mraa_spi_context
-mraa_spi_init(int bus)
-{
- if (plat == NULL) {
- syslog(LOG_ERR, "spi: Platform Not Initialised");
- return NULL;
- }
- if (mraa_is_sub_platform_id(bus)) {
- syslog(LOG_ERR, "spi: Spi module doesn't support subplatforms");
- return NULL;
- }
- if (plat->spi_bus_count == 0) {
- syslog(LOG_ERR, "spi: no spi buses defined in platform");
- return NULL;
- }
- if (plat->spi_bus_count == 1) {
- bus = plat->def_spi_bus;
- }
- if (bus >= plat->spi_bus_count) {
- syslog(LOG_ERR, "spi: requested bus above spi bus count");
- return NULL;
- }
- if (plat->adv_func->spi_init_pre != NULL) {
- if (plat->adv_func->spi_init_pre(bus) != MRAA_SUCCESS) {
- return NULL;
- }
- }
-
- if (!plat->no_bus_mux) {
- int pos = plat->spi_bus[bus].sclk;
- if (plat->pins[pos].spi.mux_total > 0) {
- if (mraa_setup_mux_mapped(plat->pins[pos].spi) != MRAA_SUCCESS) {
- syslog(LOG_ERR, "spi: failed to set-up spi sclk multiplexer");
- return NULL;
- }
- }
-
- pos = plat->spi_bus[bus].mosi;
- if (plat->pins[pos].spi.mux_total > 0) {
- if (mraa_setup_mux_mapped(plat->pins[pos].spi) != MRAA_SUCCESS) {
- syslog(LOG_ERR, "spi: failed to set-up spi mosi multiplexer");
- return NULL;
- }
- }
-
- pos = plat->spi_bus[bus].miso;
- if (plat->pins[pos].spi.mux_total > 0) {
- if (mraa_setup_mux_mapped(plat->pins[pos].spi) != MRAA_SUCCESS) {
- syslog(LOG_ERR, "spi: failed to set-up spi miso multiplexer");
- return NULL;
- }
- }
-
- pos = plat->spi_bus[bus].cs;
- if (plat->pins[pos].spi.mux_total > 0) {
- if (mraa_setup_mux_mapped(plat->pins[pos].spi) != MRAA_SUCCESS) {
- syslog(LOG_ERR, "spi: failed to set-up spi cs multiplexer");
- return NULL;
- }
- }
- }
- mraa_spi_context dev = mraa_spi_init_raw(plat->spi_bus[bus].bus_id, plat->spi_bus[bus].slave_s);
-
- if (plat->adv_func->spi_init_post != NULL) {
- mraa_result_t ret = plat->adv_func->spi_init_post(dev);
- if (ret != MRAA_SUCCESS) {
- free(dev);
- return NULL;
- }
- }
-
- return dev;
-}
-
-mraa_spi_context
-mraa_spi_init_raw(unsigned int bus, unsigned int cs)
-{
- 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;
- }
-
- char path[MAX_SIZE];
- sprintf(path, "/dev/spidev%u.%u", bus, 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;
- }
-
- 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;
-}
-
-mraa_result_t
-mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode)
-{
- uint8_t spi_mode = 0;
- switch (mode) {
- case MRAA_SPI_MODE0:
- spi_mode = SPI_MODE_0;
- break;
- case MRAA_SPI_MODE1:
- spi_mode = SPI_MODE_1;
- break;
- case MRAA_SPI_MODE2:
- spi_mode = SPI_MODE_2;
- break;
- case MRAA_SPI_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) {
- syslog(LOG_ERR, "spi: Failed to set spi mode");
- return MRAA_ERROR_INVALID_RESOURCE;
- }
-
- dev->mode = spi_mode;
- return MRAA_SUCCESS;
-}
-
-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;
-}
-
-mraa_result_t
-mraa_spi_lsbmode(mraa_spi_context dev, mraa_boolean_t lsb)
-{
- if (IS_FUNC_DEFINED(dev, spi_lsbmode_replace)) {
- return dev->advance_func->spi_lsbmode_replace(dev, lsb);
- }
-
- uint8_t lsb_mode = (uint8_t) lsb;
- if (ioctl(dev->devfd, SPI_IOC_WR_LSB_FIRST, &lsb_mode) < 0) {
- syslog(LOG_ERR, "spi: Failed to set bit order");
- return MRAA_ERROR_INVALID_RESOURCE;
- }
- if (ioctl(dev->devfd, SPI_IOC_RD_LSB_FIRST, &lsb_mode) < 0) {
- syslog(LOG_ERR, "spi: Failed to set bit order");
- return MRAA_ERROR_INVALID_RESOURCE;
- }
- dev->lsb = lsb;
- return MRAA_SUCCESS;
-}
-
-mraa_result_t
-mraa_spi_bit_per_word(mraa_spi_context dev, unsigned int 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;
- }
- dev->bpw = bits;
- return MRAA_SUCCESS;
-}
-
-int
-mraa_spi_write(mraa_spi_context dev, uint8_t data)
-{
- struct spi_ioc_transfer msg;
- memset(&msg, 0, sizeof(msg));
-
- uint16_t length = 1;
-
- unsigned long 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 (int) 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)
-{
- 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;
-}
-
-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)
-{
- uint8_t* recv = malloc(sizeof(uint8_t) * length);
-
- if (mraa_spi_transfer_buf(dev, data, recv, length) != MRAA_SUCCESS) {
- free(recv);
- return NULL;
- }
- 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)
-{
- close(dev->devfd);
- free(dev);
- return MRAA_SUCCESS;
-}