From 759d387c5a8be8534b83d2ec875f66400d642871 Mon Sep 17 00:00:00 2001 From: Mihai Serban Date: Mon, 16 Nov 2015 19:10:12 +0200 Subject: [PATCH] edison: fix SPI IO pointers usage Check if SPI IO pointers are holding valid data before using them. Signed-off-by: Jianxun Zhang Signed-off-by: Bruce Beare Signed-off-by: Mihai Serban Signed-off-by: Brendan Le Foll --- api/mraa/common.h | 7 +++++ src/x86/intel_edison_fab_c.c | 64 ++++++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/api/mraa/common.h b/api/mraa/common.h index 58afb82..ef67c49 100644 --- a/api/mraa/common.h +++ b/api/mraa/common.h @@ -36,6 +36,13 @@ #define MRAA_MAIN_PLATFORM_OFFSET 0 #define MRAA_SUB_PLATFORM_OFFSET 1 +/** Executes function func and returns its result in case of error + */ +#define MRAA_RETURN_FOR_ERROR(func) do { \ + mraa_result_t res; \ + res = func; \ + if (res != MRAA_SUCCESS) \ + return res;} while(0) /** @file * diff --git a/src/x86/intel_edison_fab_c.c b/src/x86/intel_edison_fab_c.c index 944ab93..3083a95 100644 --- a/src/x86/intel_edison_fab_c.c +++ b/src/x86/intel_edison_fab_c.c @@ -250,39 +250,39 @@ mraa_intel_edison_i2c_init_pre(unsigned int bus) static mraa_result_t mraa_intel_edison_misc_spi() { - mraa_gpio_write(tristate, 0); + // These arrays must have same length + static const int gpio_pin_list[] = {263, 240, 262, 241, 242, 243}; + static int pin_num = sizeof(gpio_pin_list) / sizeof(int); + static const int gpio_val_list[] = {1, 0, 1, 0, 0, 0}; + static const int gpio_dir_list[] = {MRAA_GPIO_OUT, MRAA_GPIO_OUT, + MRAA_GPIO_OUT, MRAA_GPIO_OUT, + MRAA_GPIO_OUT, MRAA_GPIO_OUT}; + int i; + mraa_result_t ret; + + MRAA_RETURN_FOR_ERROR(mraa_gpio_write(tristate, 0)); + + for (i = 0; i < pin_num; i++) { + mraa_gpio_context io = mraa_gpio_init_raw(gpio_pin_list[i]); + if (io != NULL) { + ret = mraa_gpio_dir(io, gpio_dir_list[i]); + if (ret == MRAA_SUCCESS) { + ret = mraa_gpio_write(io, gpio_val_list[i]); + } + + //Don't care return value of close() + mraa_gpio_close(io); + MRAA_RETURN_FOR_ERROR(ret); + } else { + syslog(LOG_ERR, "edison: Failed to init raw gpio %d!",gpio_pin_list[i]); + return MRAA_ERROR_NO_RESOURCES; + } + } - mraa_gpio_context io10_p1 = mraa_gpio_init_raw(263); - mraa_gpio_context io10_p2 = mraa_gpio_init_raw(240); - mraa_gpio_context io11_p1 = mraa_gpio_init_raw(262); - mraa_gpio_context io11_p2 = mraa_gpio_init_raw(241); - mraa_gpio_context io12_p1 = mraa_gpio_init_raw(242); - mraa_gpio_context io13_p1 = mraa_gpio_init_raw(243); - mraa_gpio_dir(io10_p1, MRAA_GPIO_OUT); - mraa_gpio_dir(io10_p2, MRAA_GPIO_OUT); - mraa_gpio_dir(io11_p1, MRAA_GPIO_OUT); - mraa_gpio_dir(io11_p2, MRAA_GPIO_OUT); - mraa_gpio_dir(io12_p1, MRAA_GPIO_OUT); - mraa_gpio_dir(io13_p1, MRAA_GPIO_OUT); - - mraa_gpio_write(io10_p1, 1); - mraa_gpio_write(io10_p2, 0); - mraa_gpio_write(io11_p1, 1); - mraa_gpio_write(io11_p2, 0); - mraa_gpio_write(io12_p1, 0); - mraa_gpio_write(io13_p1, 0); - - mraa_gpio_close(io10_p1); - mraa_gpio_close(io10_p2); - mraa_gpio_close(io11_p1); - mraa_gpio_close(io11_p2); - mraa_gpio_close(io12_p1); - mraa_gpio_close(io13_p1); - - mraa_intel_edison_pinmode_change(115, 1); - mraa_intel_edison_pinmode_change(114, 1); - mraa_intel_edison_pinmode_change(109, 1); - mraa_gpio_write(tristate, 1); + MRAA_RETURN_FOR_ERROR(mraa_intel_edison_pinmode_change(115, 1)); + MRAA_RETURN_FOR_ERROR(mraa_intel_edison_pinmode_change(114, 1)); + MRAA_RETURN_FOR_ERROR(mraa_intel_edison_pinmode_change(109, 1)); + MRAA_RETURN_FOR_ERROR(mraa_gpio_write(tristate, 1)); return MRAA_SUCCESS; } -- 2.7.4