intel_edison_fab_c.c: Remove dependency on debugfs
[contrib/mraa.git] / src / x86 / intel_edison_fab_c.c
index f8e54ac..decf624 100644 (file)
 #include <string.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <linux/spi/spidev.h>
 
 #include "common.h"
 #include "x86/intel_edison_fab_c.h"
 
 #define PLATFORM_NAME "Intel Edison"
 #define SYSFS_CLASS_GPIO "/sys/class/gpio"
-#define SYSFS_PINMODE_PATH "/sys/kernel/debug/gpio_debug/gpio"
+#define DEBUGFS_PINMODE_PATH "/sys/kernel/debug/gpio_debug/gpio"
 #define MAX_SIZE 64
 #define MAX_MODE_SIZE 8
 
@@ -40,6 +42,7 @@
 // Might not always be correct. First thing to check if mmap stops
 // working. Check the device for 0x1199 and Intel Vendor (0x8086)
 #define MMAP_PATH "/sys/devices/pci0000:00/0000:00:0c.0/resource0"
+#define UART_DEV_PATH "/dev/ttyMFD1"
 
 typedef struct {
     int sysfs;
@@ -57,46 +60,87 @@ typedef struct {
 static mraa_gpio_context tristate;
 
 static mraa_intel_edison_pinmodes_t pinmodes[MRAA_INTEL_EDISON_PINCOUNT];
-static unsigned int outputen[] = {248,249,250,251,252,253,254,255,256,257,258,259,260,261,232,233,234,235,236,237};
-static mraa_gpio_context agpioOutputen[sizeof(outputen)/sizeof(outputen[0])];
+static unsigned int outputen[] = { 248, 249, 250, 251, 252, 253, 254, 255, 256, 257,
+                                   258, 259, 260, 261, 232, 233, 234, 235, 236, 237 };
+static mraa_gpio_context agpioOutputen[sizeof(outputen) / sizeof(outputen[0])];
 
-static unsigned int pullup_map[] = {216,217,218,219,220,221,222,223,224,225,226,227,228,229,208,209,210,211,212,213};
+static unsigned int pullup_map[] = { 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
+                                     226, 227, 228, 229, 208, 209, 210, 211, 212, 213 };
 static int miniboard = 0;
 
-//MMAP
-static uint8_t *mmap_reg = NULL;
+// MMAP
+static uint8_tmmap_reg = NULL;
 static int mmap_fd = 0;
 static int mmap_size;
 static unsigned int mmap_count = 0;
 
+mraa_result_t
+mraa_intel_edison_spi_lsbmode_replace(mraa_spi_context dev, mraa_boolean_t lsb)
+{
+    uint8_t lsb_mode = (uint8_t) lsb;
+
+    // Edison doesn't support LSB_FIRST, we need to react appropriately
+    if (!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;
+        }
+    } else {
+        return MRAA_ERROR_FEATURE_NOT_SUPPORTED;
+    }
+
+    dev->lsb = lsb;
+    return MRAA_SUCCESS;
+}
+
 static mraa_result_t
 mraa_intel_edison_pinmode_change(int sysfs, int mode)
 {
-    if (mode < 0 ) {
+    if (mode < 0) {
         return MRAA_SUCCESS;
     }
 
     char buffer[MAX_SIZE];
-    snprintf(buffer, MAX_SIZE, SYSFS_PINMODE_PATH "%i/current_pinmux",sysfs);
+    int useDebugFS = 0;
+
+    mraa_gpio_context mode_gpio = mraa_gpio_init_raw(sysfs);
+    if (mode_gpio == NULL) {
+        return MRAA_ERROR_NO_RESOURCES;
+    }
+
+    // first try SYSFS_CLASS_GPIO path
+    snprintf(buffer, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%i/pinmux", sysfs);
     int modef = open(buffer, O_WRONLY);
     if (modef == -1) {
+        snprintf(buffer, MAX_SIZE, DEBUGFS_PINMODE_PATH "%i/current_pinmux", sysfs);
+        modef = open(buffer, O_WRONLY);
+        useDebugFS = 1;
+    }
+
+    if (modef == -1) {
         syslog(LOG_ERR, "edison: Failed to open SoC pinmode for opening");
+        mraa_gpio_close(mode_gpio);
         return MRAA_ERROR_INVALID_RESOURCE;
     }
 
     mraa_result_t ret = MRAA_SUCCESS;
     char mode_buf[MAX_MODE_SIZE];
-    int length = sprintf(mode_buf, "mode%u",mode);
-    if (write(modef, mode_buf, length*sizeof(char)) == -1) {
+    int length = sprintf(mode_buf, "%s%u", useDebugFS ? "mode" : "", mode);
+    if (write(modef, mode_buf, length * sizeof(char)) == -1) {
         ret = MRAA_ERROR_INVALID_RESOURCE;
     }
     close(modef);
+    mraa_gpio_close(mode_gpio);
 
     return ret;
 }
 
 mraa_result_t
-mraa_intel_edison_gpio_dir_pre(mraa_gpio_context dev, gpio_dir_t dir)
+mraa_intel_edison_gpio_dir_pre(mraa_gpio_context dev, mraa_gpio_dir_t dir)
 {
 
     if (dev->phy_pin >= 0) {
@@ -129,7 +173,7 @@ mraa_intel_edison_gpio_dir_pre(mraa_gpio_context dev, gpio_dir_t dir)
 }
 
 mraa_result_t
-mraa_intel_edison_gpio_dir_post(mraa_gpio_context dev, gpio_dir_t dir)
+mraa_intel_edison_gpio_dir_post(mraa_gpio_context dev, mraa_gpio_dir_t dir)
 {
     if (dev->phy_pin >= 0) {
         return mraa_gpio_write(tristate, 1);
@@ -206,7 +250,7 @@ mraa_intel_edison_i2c_init_pre(unsigned int bus)
 
         mraa_gpio_write(tristate, 1);
     } else {
-        if(bus != 6 && bus != 1) {
+        if (bus != 6 && bus != 1) {
             syslog(LOG_ERR, "edison: You can't use that bus, switching to bus 6");
             bus = 6;
         }
@@ -222,40 +266,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(111, 1);
-    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;
 }
@@ -263,15 +306,15 @@ mraa_intel_edison_misc_spi()
 mraa_result_t
 mraa_intel_edison_aio_get_fp(mraa_aio_context dev)
 {
-    char file_path[64]= "";
+    char file_path[64] = "";
 
-    snprintf(file_path, 64, "/sys/bus/iio/devices/iio:device1/in_voltage%d_raw",
-            dev->channel );
+    snprintf(file_path, 64, "/sys/bus/iio/devices/iio:device1/in_voltage%d_raw", dev->channel);
 
     dev->adc_in_fp = open(file_path, O_RDONLY);
     if (dev->adc_in_fp == -1) {
         syslog(LOG_ERR, "edison: Failed to open Analog input raw file %s for "
-                "reading!", file_path);
+                        "reading!",
+               file_path);
         return MRAA_ERROR_INVALID_RESOURCE;
     }
 
@@ -376,7 +419,6 @@ mraa_result_t
 mraa_intel_edison_spi_init_pre(int bus)
 {
     if (miniboard == 1) {
-        mraa_intel_edison_pinmode_change(111, 1);
         mraa_intel_edison_pinmode_change(115, 1);
         mraa_intel_edison_pinmode_change(114, 1);
         mraa_intel_edison_pinmode_change(109, 1);
@@ -428,13 +470,13 @@ mraa_intel_edison_spi_init_post(mraa_spi_context spi)
 }
 
 mraa_result_t
-mraa_intel_edison_gpio_mode_replace(mraa_gpio_context dev, gpio_mode_t mode)
+mraa_intel_edison_gpio_mode_replace(mraa_gpio_context dev, mraa_gpio_mode_t mode)
 {
     if (dev->value_fp != -1) {
-         if (close(dev->value_fp) != 0) {
-             return MRAA_ERROR_INVALID_RESOURCE;
-         }
-         dev->value_fp = -1;
+        if (close(dev->value_fp) != 0) {
+            return MRAA_ERROR_INVALID_RESOURCE;
+        }
+        dev->value_fp = -1;
     }
 
     mraa_gpio_context pullup_e;
@@ -449,7 +491,7 @@ mraa_intel_edison_gpio_mode_replace(mraa_gpio_context dev, gpio_mode_t mode)
     }
 
     int value = -1;
-    switch(mode) {
+    switch (mode) {
         case MRAA_GPIO_STRONG:
             break;
         case MRAA_GPIO_PULLUP:
@@ -470,7 +512,7 @@ mraa_intel_edison_gpio_mode_replace(mraa_gpio_context dev, gpio_mode_t mode)
             mraa_gpio_close(pullup_e);
             return MRAA_ERROR_INVALID_RESOURCE;
         }
-        if (mraa_gpio_write(pullup_e, value)!= MRAA_SUCCESS) {
+        if (mraa_gpio_write(pullup_e, value) != MRAA_SUCCESS) {
             syslog(LOG_ERR, "edison: Error setting pullup");
             mraa_gpio_close(pullup_e);
             return MRAA_ERROR_INVALID_RESOURCE;
@@ -481,29 +523,42 @@ mraa_intel_edison_gpio_mode_replace(mraa_gpio_context dev, gpio_mode_t mode)
 }
 
 mraa_result_t
-mraa_intel_edsion_mb_gpio_mode(mraa_gpio_context dev, gpio_mode_t mode)
+mraa_intel_edsion_mb_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
 {
     if (dev->value_fp != -1) {
-         if (close(dev->value_fp) != 0) {
-             return MRAA_ERROR_INVALID_RESOURCE;
-         }
-         dev->value_fp = -1;
+        if (close(dev->value_fp) != 0) {
+            return MRAA_ERROR_INVALID_RESOURCE;
+        }
+        dev->value_fp = -1;
     }
 
     char filepath[MAX_SIZE];
-    snprintf(filepath, MAX_SIZE,
-             SYSFS_PINMODE_PATH "%d/current_pullmode", dev->pin);
 
+    mraa_gpio_context mode_gpio = mraa_gpio_init_raw(dev->pin);
+    if (mode_gpio == NULL) {
+        return MRAA_ERROR_NO_RESOURCES;
+    }
+
+    // first try SYSFS_CLASS_GPIO path
+    snprintf(filepath, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%d/pullmode", dev->pin);
     int drive = open(filepath, O_WRONLY);
+
+    if (drive == -1) {
+        snprintf(filepath, MAX_SIZE, DEBUGFS_PINMODE_PATH "%d/current_pullmode", dev->pin);
+        drive = open(filepath, O_WRONLY);
+    }
+
     if (drive == -1) {
         syslog(LOG_ERR, "edison: Failed to open drive for writing");
+        mraa_gpio_close(mode_gpio);
         return MRAA_ERROR_INVALID_RESOURCE;
     }
 
     char bu[MAX_SIZE];
     int length;
-    switch(mode) {
+    switch (mode) {
         case MRAA_GPIO_STRONG:
+            mraa_gpio_close(mode_gpio);
             close(drive);
             return MRAA_SUCCESS;
         case MRAA_GPIO_PULLUP:
@@ -516,15 +571,18 @@ mraa_intel_edsion_mb_gpio_mode(mraa_gpio_context dev, gpio_mode_t mode)
             length = snprintf(bu, sizeof(bu), "nopull");
             break;
         default:
+            mraa_gpio_close(mode_gpio);
             close(drive);
             return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
     }
-    if (write(drive, bu, length*sizeof(char)) == -1) {
+    if (write(drive, bu, length * sizeof(char)) == -1) {
         syslog(LOG_ERR, "edison: Failed to write to drive mode");
+        mraa_gpio_close(mode_gpio);
         close(drive);
         return MRAA_ERROR_INVALID_RESOURCE;
     }
 
+    mraa_gpio_close(mode_gpio);
     if (close(drive) != 0) {
         return MRAA_ERROR_INVALID_RESOURCE;
     }
@@ -534,6 +592,10 @@ mraa_intel_edsion_mb_gpio_mode(mraa_gpio_context dev, gpio_mode_t mode)
 mraa_result_t
 mraa_intel_edison_uart_init_pre(int index)
 {
+    if (index != 0) {
+        syslog(LOG_ERR, "edison: Failed to write to drive mode");
+        return MRAA_ERROR_INVALID_RESOURCE;
+    }
     if (miniboard == 0) {
         mraa_gpio_write(tristate, 0);
         mraa_gpio_context io0_output = mraa_gpio_init_raw(248);
@@ -555,8 +617,8 @@ mraa_intel_edison_uart_init_pre(int index)
         mraa_gpio_close(io1_pullup);
     }
     mraa_result_t ret;
-    ret = mraa_intel_edison_pinmode_change(130,1); //IO0 RX
-    ret = mraa_intel_edison_pinmode_change(131,1); //IO1 TX
+    ret = mraa_intel_edison_pinmode_change(130, 1); // IO0 RX
+    ret = mraa_intel_edison_pinmode_change(131, 1); // IO1 TX
     return ret;
 }
 
@@ -593,8 +655,7 @@ mraa_intel_edison_mmap_write(mraa_gpio_context dev, int value)
         valoff = 0x4c;
     }
 
-    *(volatile uint32_t*) (mmap_reg + offset + valoff) =
-        (uint32_t)(1 << (dev->pin % 32));
+    *(volatile uint32_t*) (mmap_reg + offset + valoff) = (uint32_t)(1 << (dev->pin % 32));
 
     return MRAA_SUCCESS;
 }
@@ -605,8 +666,8 @@ mraa_intel_edison_mmap_read(mraa_gpio_context dev)
     uint8_t offset = ((dev->pin / 32) * sizeof(uint32_t));
     uint32_t value;
 
-    value = *(volatile uint32_t*) (mmap_reg +0x04+ offset);
-    if (value&(uint32_t)(1 << (dev->pin % 32))) {
+    value = *(volatile uint32_t*) (mmap_reg + 0x04 + offset);
+    if (value & (uint32_t)(1 << (dev->pin % 32))) {
         return 1;
     }
     return 0;
@@ -639,9 +700,9 @@ mraa_intel_edison_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en)
         return MRAA_ERROR_INVALID_PARAMETER;
     }
 
-    //Might need to make some elements of this thread safe.
-    //For example only allow one thread to enter the following block
-    //to prevent mmap'ing twice.
+    // Might need to make some elements of this thread safe.
+    // For example only allow one thread to enter the following block
+    // to prevent mmap'ing twice.
     if (mmap_reg == NULL) {
         if ((mmap_fd = open(MMAP_PATH, O_RDWR)) < 0) {
             syslog(LOG_ERR, "edison map: unable to open resource0 file");
@@ -649,13 +710,14 @@ mraa_intel_edison_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en)
         }
 
         struct stat fd_stat;
-        fstat(mmap_fd, &fd_stat);
+        if (fstat(mmap_fd, &fd_stat) != 0) {
+            syslog(LOG_ERR, "edison map: unable to access resource0 file");
+            return MRAA_ERROR_INVALID_HANDLE;
+        }
         mmap_size = fd_stat.st_size;
 
-        mmap_reg = (uint8_t*) mmap(NULL, fd_stat.st_size,
-                                   PROT_READ | PROT_WRITE,
-                                   MAP_FILE | MAP_SHARED,
-                                   mmap_fd, 0);
+        mmap_reg =
+        (uint8_t*) mmap(NULL, fd_stat.st_size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, mmap_fd, 0);
         if (mmap_reg == MAP_FAILED) {
             syslog(LOG_ERR, "edison mmap: failed to mmap");
             mmap_reg = NULL;
@@ -673,33 +735,46 @@ mraa_intel_edison_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en)
 mraa_result_t
 mraa_intel_edison_i2c_freq(mraa_i2c_context dev, mraa_i2c_mode_t mode)
 {
-    if (dev->busnum == 6) {
-        int sysnode = open("/sys/devices/pci0000:00/0000:00:09.1/i2c_dw_sysnode", O_RDWR);
-        if (sysnode == -1) {
-            return MRAA_ERROR_INVALID_RESOURCE;
-        }
+    int sysnode = -1;
 
-        char bu[5];
-        int length;
-        switch (mode) {
-            case MRAA_I2C_STD:
-                length = snprintf(bu, sizeof(bu), "std");
-                break;
-            case MRAA_I2C_FAST:
-                length = snprintf(bu, sizeof(bu), "fast");
-                break;
-            case MRAA_I2C_HIGH:
-                length = snprintf(bu, sizeof(bu), "high");
-                break;
-        }
-        if (write(sysnode, bu, length*sizeof(char)) == -1) {
+    switch (dev->busnum) {
+        case 1:
+            sysnode = open("/sys/devices/pci0000:00/0000:00:08.0/i2c_dw_sysnode/mode", O_RDWR);
+            break;
+        case 6:
+            sysnode = open("/sys/devices/pci0000:00/0000:00:09.1/i2c_dw_sysnode/mode", O_RDWR);
+            break;
+        default:
+            syslog(LOG_NOTICE, "i2c bus selected does not support frequency changes");
+            return MRAA_ERROR_FEATURE_NOT_SUPPORTED;
+    }
+    if (sysnode == -1) {
+        return MRAA_ERROR_INVALID_RESOURCE;
+    }
+
+    char bu[5];
+    int length;
+    switch (mode) {
+        case MRAA_I2C_STD:
+            length = snprintf(bu, sizeof(bu), "std");
+            break;
+        case MRAA_I2C_FAST:
+            length = snprintf(bu, sizeof(bu), "fast");
+            break;
+        case MRAA_I2C_HIGH:
+            length = snprintf(bu, sizeof(bu), "high");
+            break;
+        default:
+            syslog(LOG_ERR, "Invalid i2c mode selected");
             close(sysnode);
-            return MRAA_ERROR_INVALID_RESOURCE;
-        }
+            return MRAA_ERROR_INVALID_PARAMETER;
+    }
+    if (write(sysnode, bu, length * sizeof(char)) == -1) {
         close(sysnode);
-        return MRAA_SUCCESS;
+        return MRAA_ERROR_INVALID_RESOURCE;
     }
-    return MRAA_ERROR_FEATURE_NOT_SUPPORTED;
+    close(sysnode);
+    return MRAA_SUCCESS;
 }
 
 mraa_result_t
@@ -713,25 +788,28 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     b->pwm_max_period = 218453;
     b->pwm_min_period = 1;
 
-    b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t)*56);
+    b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * 56);
     if (b->pins == NULL) {
         return MRAA_ERROR_UNSPECIFIED;
     }
 
-    advance_func->gpio_init_post = &mraa_intel_edison_gpio_init_post;
-    advance_func->gpio_close_pre = &mraa_intel_edison_gpio_close_pre;
-
-    advance_func->pwm_init_pre = &mraa_intel_edison_pwm_init_pre;
-    advance_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre;
-    advance_func->i2c_set_frequency_replace = &mraa_intel_edison_i2c_freq;
-    advance_func->spi_init_pre = &mraa_intel_edison_spi_init_pre;
-    advance_func->gpio_mode_replace = &mraa_intel_edsion_mb_gpio_mode;
-    advance_func->uart_init_pre = &mraa_intel_edison_uart_init_pre;
-    advance_func->gpio_mmap_setup = &mraa_intel_edison_mmap_setup;
+    b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
+    if (b->adv_func == NULL) {
+        free(b->pins);
+        return MRAA_ERROR_UNSPECIFIED;
+    }
+    b->adv_func->gpio_init_post = &mraa_intel_edison_gpio_init_post;
+    b->adv_func->pwm_init_pre = &mraa_intel_edison_pwm_init_pre;
+    b->adv_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre;
+    b->adv_func->i2c_set_frequency_replace = &mraa_intel_edison_i2c_freq;
+    b->adv_func->spi_init_pre = &mraa_intel_edison_spi_init_pre;
+    b->adv_func->gpio_mode_replace = &mraa_intel_edsion_mb_gpio_mode;
+    b->adv_func->uart_init_pre = &mraa_intel_edison_uart_init_pre;
+    b->adv_func->gpio_mmap_setup = &mraa_intel_edison_mmap_setup;
 
     int pos = 0;
     strncpy(b->pins[pos].name, "J17-1", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 182;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].pwm.pinmap = 2;
@@ -740,27 +818,27 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J17-2", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J17-3", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J17-4", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J17-5", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 135;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
 
     strncpy(b->pins[pos].name, "J17-6", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J17-7", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,1,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
     b->pins[pos].gpio.pinmap = 27;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].i2c.pinmap = 1;
@@ -768,7 +846,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J17-8", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,1,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
     b->pins[pos].gpio.pinmap = 20;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].i2c.pinmap = 1;
@@ -776,7 +854,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J17-9", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,1,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
     b->pins[pos].gpio.pinmap = 28;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].i2c.pinmap = 1;
@@ -784,7 +862,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J17-10", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 111;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].spi.pinmap = 5;
@@ -792,7 +870,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J17-11", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 109;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].spi.pinmap = 5;
@@ -800,25 +878,25 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J17-12", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 115;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].spi.pinmap = 5;
     b->pins[pos].spi.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J17-13", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J17-14", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 128;
     b->pins[pos].gpio.parent_id = 0;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
 
     strncpy(b->pins[pos].name, "J18-1", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 13;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].pwm.pinmap = 1;
@@ -827,22 +905,22 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J18-2", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 165;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J18-3", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J18-4", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J18-5", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J18-6", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,1,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
     b->pins[pos].gpio.pinmap = 19;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].i2c.pinmap = 1;
@@ -850,7 +928,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J18-7", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 12;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].pwm.pinmap = 0;
@@ -859,7 +937,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J18-8", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 183;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].pwm.pinmap = 3;
@@ -867,18 +945,18 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     b->pins[pos].pwm.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J18-9", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J18-10", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 110;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].spi.pinmap = 5;
     b->pins[pos].spi.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J18-11", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 114;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].spi.pinmap = 5;
@@ -886,12 +964,12 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J18-12", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 129;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J18-13", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,1};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
     b->pins[pos].gpio.pinmap = 130;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].uart.pinmap = 0;
@@ -900,41 +978,41 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
 
     pos++;
     strncpy(b->pins[pos].name, "J18-14", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J19-1", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J19-2", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J19-3", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J19-4", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 44;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J19-5", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 46;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J19-6", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 48;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
 
     strncpy(b->pins[pos].name, "J19-7", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
 
     strncpy(b->pins[pos].name, "J19-8", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,1};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
     b->pins[pos].gpio.pinmap = 131;
     b->pins[pos].gpio.mux_total = 0;
     b->pins[pos].uart.pinmap = 0;
@@ -943,103 +1021,103 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     pos++;
 
     strncpy(b->pins[pos].name, "J19-9", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 14;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
 
     strncpy(b->pins[pos].name, "J19-10", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 40;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J19-11", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 43;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J19-12", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 77;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J19-13", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 82;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J19-14", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 83;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
 
     strncpy(b->pins[pos].name, "J20-1", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J20-2", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J20-3", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,0,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
     pos++;
     strncpy(b->pins[pos].name, "J20-4", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 45;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-5", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 47;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-6", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 49;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-7", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 15;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-8", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 84;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-9", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 42;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-10", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 41;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-11", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 78;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-12", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 79;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-13", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 80;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
     strncpy(b->pins[pos].name, "J20-14", 8);
-    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
     b->pins[pos].gpio.pinmap = 81;
     b->pins[pos].gpio.mux_total = 0;
     pos++;
 
-    //BUS DEFINITIONS
+    // BUS DEFINITIONS
     b->i2c_bus_count = 9;
     b->def_i2c_bus = 6;
     int ici;
@@ -1067,6 +1145,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
     b->def_uart_dev = 0;
     b->uart_dev[0].rx = 26;
     b->uart_dev[0].tx = 35;
+    b->uart_dev[0].device_path = UART_DEV_PATH;
 
     return MRAA_SUCCESS;
 }
@@ -1074,18 +1153,12 @@ mraa_intel_edison_miniboard(mraa_board_t* b)
 mraa_board_t*
 mraa_intel_edison_fab_c()
 {
-    mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t));
+    mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
     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;
     // This seciton will also check if the arduino board is there
     tristate = mraa_gpio_init_raw(214);
     if (tristate == NULL) {
@@ -1101,25 +1174,32 @@ mraa_intel_edison_fab_c()
     b->gpio_count = 14;
     b->aio_count = 6;
 
-    advance_func->gpio_dir_pre = &mraa_intel_edison_gpio_dir_pre;
-    advance_func->gpio_init_post = &mraa_intel_edison_gpio_init_post;
-    advance_func->gpio_dir_post = &mraa_intel_edison_gpio_dir_post;
-    advance_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre;
-    advance_func->i2c_set_frequency_replace = &mraa_intel_edison_i2c_freq;
-    advance_func->aio_get_valid_fp = &mraa_intel_edison_aio_get_fp;
-    advance_func->aio_init_pre = &mraa_intel_edison_aio_init_pre;
-    advance_func->aio_init_post = &mraa_intel_edison_aio_init_post;
-    advance_func->pwm_init_pre = &mraa_intel_edison_pwm_init_pre;
-    advance_func->pwm_init_post = &mraa_intel_edison_pwm_init_post;
-    advance_func->spi_init_pre = &mraa_intel_edison_spi_init_pre;
-    advance_func->spi_init_post = &mraa_intel_edison_spi_init_post;
-    advance_func->gpio_mode_replace = &mraa_intel_edison_gpio_mode_replace;
-    advance_func->uart_init_pre = &mraa_intel_edison_uart_init_pre;
-    advance_func->uart_init_post = &mraa_intel_edison_uart_init_post;
-    advance_func->gpio_mmap_setup = &mraa_intel_edison_mmap_setup;
-
-    b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t)*MRAA_INTEL_EDISON_PINCOUNT);
+    b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
+    if (b->adv_func == NULL) {
+        goto error;
+    }
+    b->adv_func->gpio_dir_pre = &mraa_intel_edison_gpio_dir_pre;
+    b->adv_func->gpio_init_post = &mraa_intel_edison_gpio_init_post;
+    b->adv_func->gpio_close_pre = &mraa_intel_edison_gpio_close_pre;
+    b->adv_func->gpio_dir_post = &mraa_intel_edison_gpio_dir_post;
+    b->adv_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre;
+    b->adv_func->i2c_set_frequency_replace = &mraa_intel_edison_i2c_freq;
+    b->adv_func->aio_get_valid_fp = &mraa_intel_edison_aio_get_fp;
+    b->adv_func->aio_init_pre = &mraa_intel_edison_aio_init_pre;
+    b->adv_func->aio_init_post = &mraa_intel_edison_aio_init_post;
+    b->adv_func->pwm_init_pre = &mraa_intel_edison_pwm_init_pre;
+    b->adv_func->pwm_init_post = &mraa_intel_edison_pwm_init_post;
+    b->adv_func->spi_init_pre = &mraa_intel_edison_spi_init_pre;
+    b->adv_func->spi_init_post = &mraa_intel_edison_spi_init_post;
+    b->adv_func->gpio_mode_replace = &mraa_intel_edison_gpio_mode_replace;
+    b->adv_func->uart_init_pre = &mraa_intel_edison_uart_init_pre;
+    b->adv_func->uart_init_post = &mraa_intel_edison_uart_init_post;
+    b->adv_func->gpio_mmap_setup = &mraa_intel_edison_mmap_setup;
+    b->adv_func->spi_lsbmode_replace = &mraa_intel_edison_spi_lsbmode_replace;
+
+    b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * MRAA_INTEL_EDISON_PINCOUNT);
     if (b->pins == NULL) {
+        free(b->adv_func);
         goto error;
     }
 
@@ -1133,7 +1213,7 @@ mraa_intel_edison_fab_c()
     b->pwm_min_period = 1;
 
     strncpy(b->pins[0].name, "IO0", 8);
-    b->pins[0].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,1};
+    b->pins[0].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
     b->pins[0].gpio.pinmap = 130;
     b->pins[0].gpio.parent_id = 0;
     b->pins[0].gpio.mux_total = 0;
@@ -1142,7 +1222,7 @@ mraa_intel_edison_fab_c()
     b->pins[0].uart.mux_total = 0;
 
     strncpy(b->pins[1].name, "IO1", 8);
-    b->pins[1].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,1};
+    b->pins[1].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
     b->pins[1].gpio.pinmap = 131;
     b->pins[1].gpio.parent_id = 0;
     b->pins[1].gpio.mux_total = 0;
@@ -1151,13 +1231,13 @@ mraa_intel_edison_fab_c()
     b->pins[1].uart.mux_total = 0;
 
     strncpy(b->pins[2].name, "IO2", 8);
-    b->pins[2].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0};
+    b->pins[2].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
     b->pins[2].gpio.pinmap = 128;
     b->pins[2].gpio.parent_id = 0;
     b->pins[2].gpio.mux_total = 0;
 
     strncpy(b->pins[3].name, "IO3", 8);
-    b->pins[3].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0};
+    b->pins[3].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
     b->pins[3].gpio.pinmap = 12;
     b->pins[3].gpio.parent_id = 0;
     b->pins[3].gpio.mux_total = 0;
@@ -1166,13 +1246,13 @@ mraa_intel_edison_fab_c()
     b->pins[3].pwm.mux_total = 0;
 
     strncpy(b->pins[4].name, "IO4", 8);
-    b->pins[4].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0};
+    b->pins[4].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
     b->pins[4].gpio.pinmap = 129;
     b->pins[4].gpio.parent_id = 0;
     b->pins[4].gpio.mux_total = 0;
 
     strncpy(b->pins[5].name, "IO5", 8);
-    b->pins[5].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0,0};
+    b->pins[5].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
     b->pins[5].gpio.pinmap = 13;
     b->pins[5].gpio.parent_id = 0;
     b->pins[5].gpio.mux_total = 0;
@@ -1181,7 +1261,7 @@ mraa_intel_edison_fab_c()
     b->pins[5].pwm.mux_total = 0;
 
     strncpy(b->pins[6].name, "IO6", 8);
-    b->pins[6].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0,0};
+    b->pins[6].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
     b->pins[6].gpio.pinmap = 182;
     b->pins[6].gpio.parent_id = 0;
     b->pins[6].gpio.mux_total = 0;
@@ -1190,19 +1270,19 @@ mraa_intel_edison_fab_c()
     b->pins[6].pwm.mux_total = 0;
 
     strncpy(b->pins[7].name, "IO7", 8);
-    b->pins[7].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0};
+    b->pins[7].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
     b->pins[7].gpio.pinmap = 48;
     b->pins[7].gpio.parent_id = 0;
     b->pins[7].gpio.mux_total = 0;
 
     strncpy(b->pins[8].name, "IO8", 8);
-    b->pins[8].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0};
+    b->pins[8].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
     b->pins[8].gpio.pinmap = 49;
     b->pins[8].gpio.parent_id = 0;
     b->pins[8].gpio.mux_total = 0;
 
     strncpy(b->pins[9].name, "IO9", 8);
-    b->pins[9].capabilites = (mraa_pincapabilities_t) {1,1,1,0,0,0,0,0};
+    b->pins[9].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
     b->pins[9].gpio.pinmap = 183;
     b->pins[9].gpio.parent_id = 0;
     b->pins[9].gpio.mux_total = 0;
@@ -1211,7 +1291,7 @@ mraa_intel_edison_fab_c()
     b->pins[9].pwm.mux_total = 0;
 
     strncpy(b->pins[10].name, "IO10", 8);
-    b->pins[10].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[10].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[10].gpio.pinmap = 41;
     b->pins[10].gpio.parent_id = 0;
     b->pins[10].gpio.mux_total = 2;
@@ -1227,7 +1307,7 @@ mraa_intel_edison_fab_c()
     b->pins[10].spi.mux[1].value = 1;
 
     strncpy(b->pins[11].name, "IO11", 8);
-    b->pins[11].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[11].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[11].gpio.pinmap = 43;
     b->pins[11].gpio.parent_id = 0;
     b->pins[11].gpio.mux_total = 2;
@@ -1243,7 +1323,7 @@ mraa_intel_edison_fab_c()
     b->pins[11].spi.mux[1].value = 1;
 
     strncpy(b->pins[12].name, "IO12", 8);
-    b->pins[12].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[12].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[12].gpio.pinmap = 42;
     b->pins[12].gpio.parent_id = 0;
     b->pins[12].gpio.mux_total = 1;
@@ -1255,7 +1335,7 @@ mraa_intel_edison_fab_c()
     b->pins[12].spi.mux[0].value = 1;
 
     strncpy(b->pins[13].name, "IO13", 8);
-    b->pins[13].capabilites = (mraa_pincapabilities_t) {1,1,0,0,1,0,0,0};
+    b->pins[13].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
     b->pins[13].gpio.pinmap = 40;
     b->pins[13].gpio.parent_id = 0;
     b->pins[13].gpio.mux_total = 1;
@@ -1267,7 +1347,7 @@ mraa_intel_edison_fab_c()
     b->pins[13].spi.mux[0].value = 1;
 
     strncpy(b->pins[14].name, "A0", 8);
-    b->pins[14].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,1,0};
+    b->pins[14].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1, 0 };
     b->pins[14].aio.pinmap = 0;
     b->pins[14].aio.mux_total = 1;
     b->pins[14].aio.mux[0].pin = 200;
@@ -1278,7 +1358,7 @@ mraa_intel_edison_fab_c()
     b->pins[14].gpio.mux[0].value = 0;
 
     strncpy(b->pins[15].name, "A1", 8);
-    b->pins[15].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,1,0};
+    b->pins[15].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1, 0 };
     b->pins[15].aio.pinmap = 1;
     b->pins[15].aio.mux_total = 1;
     b->pins[15].aio.mux[0].pin = 201;
@@ -1289,7 +1369,7 @@ mraa_intel_edison_fab_c()
     b->pins[15].gpio.mux[0].value = 0;
 
     strncpy(b->pins[16].name, "A2", 8);
-    b->pins[16].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,1,0};
+    b->pins[16].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1, 0 };
     b->pins[16].aio.pinmap = 2;
     b->pins[16].aio.mux_total = 1;
     b->pins[16].aio.mux[0].pin = 202;
@@ -1300,7 +1380,7 @@ mraa_intel_edison_fab_c()
     b->pins[16].gpio.mux[0].value = 0;
 
     strncpy(b->pins[17].name, "A3", 8);
-    b->pins[17].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,1,0};
+    b->pins[17].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1, 0 };
     b->pins[17].aio.pinmap = 3;
     b->pins[17].aio.mux_total = 1;
     b->pins[17].aio.mux[0].pin = 203;
@@ -1311,7 +1391,7 @@ mraa_intel_edison_fab_c()
     b->pins[17].gpio.mux[0].value = 0;
 
     strncpy(b->pins[18].name, "A4", 8);
-    b->pins[18].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,1,1,0};
+    b->pins[18].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 1, 0 };
     b->pins[18].i2c.pinmap = 1;
     b->pins[18].i2c.mux_total = 1;
     b->pins[18].i2c.mux[0].pin = 204;
@@ -1326,7 +1406,7 @@ mraa_intel_edison_fab_c()
     b->pins[18].gpio.mux[0].value = 0;
 
     strncpy(b->pins[19].name, "A5", 8);
-    b->pins[19].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,1,1,0};
+    b->pins[19].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 1, 0 };
     b->pins[19].i2c.pinmap = 1;
     b->pins[19].i2c.mux_total = 1;
     b->pins[19].i2c.mux[0].pin = 205;
@@ -1340,7 +1420,7 @@ mraa_intel_edison_fab_c()
     b->pins[19].gpio.mux[0].pin = 205;
     b->pins[19].gpio.mux[0].value = 0;
 
-    //BUS DEFINITIONS
+    // BUS DEFINITIONS
     b->i2c_bus_count = 9;
     b->def_i2c_bus = 6;
     int ici;
@@ -1364,9 +1444,10 @@ mraa_intel_edison_fab_c()
     b->def_uart_dev = 0;
     b->uart_dev[0].rx = 0;
     b->uart_dev[0].tx = 1;
+    b->uart_dev[0].device_path = UART_DEV_PATH;
 
     int il;
-    for (il =0; il < MRAA_INTEL_EDISON_PINCOUNT; il++) {
+    for (il = 0; il < MRAA_INTEL_EDISON_PINCOUNT; il++) {
         pinmodes[il].gpio.sysfs = -1;
         pinmodes[il].gpio.mode = -1;
         pinmodes[il].pwm.sysfs = -1;
@@ -1408,7 +1489,7 @@ mraa_intel_edison_fab_c()
     pinmodes[6].pwm.sysfs = 182;
     pinmodes[6].pwm.mode = 1;
 
-    //7 and 8 are provided by something on i2c, very simplepinmodes[3].gpio.sysfs = 12;
+    // 7 and 8 are provided by something on i2c, very simplepinmodes[3].gpio.sysfs = 12;
     pinmodes[9].gpio.sysfs = 183;
     pinmodes[9].gpio.mode = 0;
     pinmodes[9].pwm.sysfs = 183;
@@ -1433,7 +1514,7 @@ mraa_intel_edison_fab_c()
     pinmodes[13].gpio.mode = 0;
     pinmodes[13].spi.sysfs = 109; // Different pin provides, switched at mux level.
     pinmodes[13].spi.mode = 1;
-    //Everything else but A4 A5 LEAVE
+    // Everything else but A4 A5 LEAVE
     pinmodes[18].gpio.sysfs = 14;
     pinmodes[18].gpio.mode = 0;
     pinmodes[18].i2c.sysfs = 28;