intel_minnow_max.c: Add support for spi
[contrib/mraa.git] / src / x86 / intel_minnow_max.c
index a6ca427..22324b2 100644 (file)
 
 #include <stdlib.h>
 #include <string.h>
+#include <sys/utsname.h>
+#include <ctype.h>
 
 #include "common.h"
-#include "intel_minnow_max.h"
+#include "x86/intel_minnow_max.h"
 
 #define PLATFORM_NAME "MinnowBoard MAX"
 #define I2C_BUS_COUNT 10
 #define I2C_BUS_DEFAULT 7
 
+int arch_nr_gpios_adjust = 0x100;
+
 mraa_result_t
 mraa_set_pininfo(mraa_board_t* board, int mraa_index, char *name, mraa_pincapabilities_t caps, int sysfs_pin)
 {
     if (mraa_index < board->phy_pin_count) {
+        // adjust mraa_index for ARCH_NR_GPIOS value
         mraa_pininfo_t* pin_info = &board->pins[mraa_index];
         strncpy(pin_info->name, name, 7);
         pin_info->capabilites = caps;
-        if (caps.gpio)
-            pin_info->gpio.pinmap = sysfs_pin;
+        if (caps.gpio) {
+            pin_info->gpio.pinmap = sysfs_pin | arch_nr_gpios_adjust;
+            pin_info->gpio.mux_total = 0;
+        }
         if (caps.i2c) {
             pin_info->i2c.pinmap = 1;
             pin_info->i2c.mux_total = 0;
@@ -53,6 +60,9 @@ mraa_set_pininfo(mraa_board_t* board, int mraa_index, char *name, mraa_pincapabi
             pin_info->pwm.pinmap = 0;
             pin_info->pwm.mux_total = 0;
         }
+        if (caps.spi) {
+            pin_info->spi.mux_total = 0;
+        }
         return MRAA_SUCCESS;
     }
     return MRAA_ERROR_INVALID_RESOURCE;
@@ -74,19 +84,17 @@ mraa_board_t*
 mraa_intel_minnow_max()
 {
     mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t));
+
+    struct utsname running_uname;
+    int uname_major, uname_minor, max_pins[27];
+
     if (b == NULL) {
         return NULL;
     }
 
-    b->platform_name_length = strlen(PLATFORM_NAME) + 1;
-    b->platform_name = (char*) malloc(sizeof(char) * b->platform_name_length);
-    if (b->platform_name == NULL) {
-        goto error;
-    }
-    strncpy(b->platform_name, PLATFORM_NAME, b->platform_name_length);
-
+    b->platform_name = PLATFORM_NAME;
     b->phy_pin_count = MRAA_INTEL_MINNOW_MAX_PINCOUNT;
-    //b->gpio_count = 14;
+    b->gpio_count = MRAA_INTEL_MINNOW_MAX_PINCOUNT;
     b->aio_count = 0;
     b->adc_raw = 0;
     b->adc_supported = 0;
@@ -95,19 +103,35 @@ mraa_intel_minnow_max()
     if (b->pins == NULL) {
         goto error;
     }
-    mraa_set_pininfo(b,  0, "INVALID",  (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1);
-    mraa_set_pininfo(b,  1, "GND",      (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1);
-    mraa_set_pininfo(b,  2, "GND",      (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1);
-    mraa_set_pininfo(b,  3, "5v",       (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1);
-    mraa_set_pininfo(b,  4, "3.3v",     (mraa_pincapabilities_t){1,0,0,0,0,0,0,0}, -1);
-    mraa_set_pininfo(b,  5, "SPI_CS",   (mraa_pincapabilities_t){1,0,0,0,1,0,0,0}, 220);
-    mraa_set_pininfo(b,  6, "UART1TX",  (mraa_pincapabilities_t){1,0,0,0,0,0,0,1}, 225);
-    mraa_set_pininfo(b,  7, "SPIMISO",  (mraa_pincapabilities_t){1,0,0,0,1,0,0,0}, 221);
-    mraa_set_pininfo(b,  8, "UART1RX",  (mraa_pincapabilities_t){1,0,0,0,0,0,0,1}, 224);
-    mraa_set_pininfo(b,  9, "SPIMOSI",  (mraa_pincapabilities_t){1,0,0,0,1,0,0,0}, 222);
+
+    if (uname(&running_uname) != 0) {
+        goto error;
+    }
+
+    sscanf(running_uname.release, "%d.%d", &uname_major, &uname_minor);
+
+    /* if we are on Linux 3.17 or lower they use a 256 max and number the GPIOs down
+     * if we are on 3.18 or higher (ea584595fc85e65796335033dfca25ed655cd0ed)  (for now)
+     * they start at 512 and number down, at some point this is going to change again when
+     * GPIO moves to a radix.
+     */
+    if (uname_major <= 3 && uname_minor <= 17 ) {
+        arch_nr_gpios_adjust = 0;
+    }
+
+    mraa_set_pininfo(b, 0, "INVALID",   (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1 );
+    mraa_set_pininfo(b, 1, "GND",       (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1 );
+    mraa_set_pininfo(b, 2, "GND",       (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1 );
+    mraa_set_pininfo(b, 3, "5v",        (mraa_pincapabilities_t){0,0,0,0,0,0,0,0}, -1 );
+    mraa_set_pininfo(b, 4, "3.3v",      (mraa_pincapabilities_t){1,0,0,0,0,0,0,0}, -1 );
+    mraa_set_pininfo(b, 5, "SPI_CS",    (mraa_pincapabilities_t){1,0,0,0,1,0,0,0}, 220);
+    mraa_set_pininfo(b, 6, "UART1TX",   (mraa_pincapabilities_t){1,0,0,0,0,0,0,1}, 225);
+    mraa_set_pininfo(b, 7, "SPIMISO",   (mraa_pincapabilities_t){1,0,0,0,1,0,0,0}, 221);
+    mraa_set_pininfo(b, 8, "UART1RX",   (mraa_pincapabilities_t){1,0,0,0,0,0,0,1}, 224);
+    mraa_set_pininfo(b, 9, "SPIMOSI",   (mraa_pincapabilities_t){1,0,0,0,1,0,0,0}, 222);
     mraa_set_pininfo(b, 10, "UART1CT",  (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 227);
     mraa_set_pininfo(b, 11, "SPI_CLK",  (mraa_pincapabilities_t){1,0,0,0,0,0,0,1}, 223);
-    mraa_set_pininfo(b, 12, "UART1RT", (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 226);
+    mraa_set_pininfo(b, 12, "UART1RT",  (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 226);
     mraa_set_pininfo(b, 13, "I2C_SCL",  (mraa_pincapabilities_t){1,0,0,0,0,1,0,0}, 243);
     mraa_set_pininfo(b, 14, "I2S_CLK",  (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 216);
     mraa_set_pininfo(b, 15, "I2C_SDA",  (mraa_pincapabilities_t){1,0,0,0,0,1,0,0}, 242);
@@ -116,11 +140,11 @@ mraa_intel_minnow_max()
     mraa_set_pininfo(b, 18, "I2S_DO",   (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 219);
     mraa_set_pininfo(b, 19, "UART2RX",  (mraa_pincapabilities_t){1,0,0,0,0,0,0,1}, 228);
     mraa_set_pininfo(b, 20, "I2S_DI",   (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 218);
-    mraa_set_pininfo(b, 21, "S5_0",     (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 82);
+    mraa_set_pininfo(b, 21, "S5_0",     (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 82 );
     mraa_set_pininfo(b, 22, "PWM0",     (mraa_pincapabilities_t){1,0,1,0,0,0,0,0}, 248); // Assume BIOS configured for PWM
-    mraa_set_pininfo(b, 23, "S5_1",     (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 83);
+    mraa_set_pininfo(b, 23, "S5_1",     (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 83 );
     mraa_set_pininfo(b, 24, "PWM1",     (mraa_pincapabilities_t){1,0,1,0,0,0,0,0}, 249); // Assume BIOS configured for PWM
-    mraa_set_pininfo(b, 25, "S5_4",     (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 84);
+    mraa_set_pininfo(b, 25, "S5_4",     (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 84 );
     mraa_set_pininfo(b, 26, "IBL8254",  (mraa_pincapabilities_t){1,1,0,0,0,0,0,0}, 208);
 
     // Set number of i2c adaptors
@@ -157,6 +181,8 @@ mraa_intel_minnow_max()
     b->spi_bus[0].miso = 7;
     b->spi_bus[0].sclk = 11;
 
+    b->uart_dev_count = 0;
+
     return b;
 error:
     syslog(LOG_CRIT, "minnowmax: Platform failed to initialise");