edison: add inital miniboard support
authorThomas Ingleby <thomas.c.ingleby@intel.com>
Tue, 7 Oct 2014 18:20:03 +0000 (19:20 +0100)
committerThomas Ingleby <thomas.c.ingleby@intel.com>
Tue, 7 Oct 2014 18:20:03 +0000 (19:20 +0100)
* Only GPIO will work currently
* This fixes #11

Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
src/intel_edison_fab_c.c

index 70ad5fd..7ca4d76 100644 (file)
@@ -51,6 +51,7 @@ 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 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;
 
 static mraa_result_t
 mraa_intel_edison_pinmode_change(int sysfs, int mode)
@@ -110,8 +111,14 @@ mraa_intel_edison_gpio_init_post(mraa_gpio_context dev)
     if (dev == NULL)
         return MRAA_ERROR_INVALID_RESOURCE;
 
-    int sysfs = pinmodes[dev->phy_pin].gpio.sysfs;
-    int mode = pinmodes[dev->phy_pin].gpio.mode;
+    int sysfs, mode;
+    if (miniboard == 1) {
+        sysfs = dev->pin;
+        mode = 0;
+    } else {
+        sysfs = pinmodes[dev->phy_pin].gpio.sysfs;
+        mode = pinmodes[dev->phy_pin].gpio.mode;
+    }
     mraa_result_t ret = mraa_intel_edison_pinmode_change(sysfs, mode);
 
     return ret;
@@ -250,6 +257,9 @@ mraa_intel_edison_aio_init_post(mraa_aio_context dev)
 mraa_result_t
 mraa_intel_edison_pwm_init_pre(int pin)
 {
+    if (miniboard == 1) {
+        return mraa_intel_edison_pinmode_change(plat->pins[pin].gpio.pinmap, 1);
+    }
     if (pin < 0 || pin > 19)
         return MRAA_ERROR_INVALID_RESOURCE;
 
@@ -374,6 +384,340 @@ mraa_intel_edison_gpio_mode_replace(mraa_gpio_context dev, gpio_mode_t mode)
     return MRAA_SUCCESS;
 }
 
+// EDISON MINIBOARD CHECKLIST
+// GPIO -
+//       INPUT - Expected to work
+//       OUTPUT - Expected to work
+// PWM - SEG FAULT
+// I2C - Some Issues need to be solved
+// SPI - Some Issues need to be solved
+
+mraa_result_t
+mraa_intel_edsion_miniboard(mraa_board_t* b)
+{
+    miniboard = 1;
+    b->phy_pin_count = 56;
+    b->gpio_count = 56; // A bit of a hack I suppose
+    b->aio_count = 0;
+
+    b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t)*56);
+
+    advance_func->gpio_init_post = &mraa_intel_edison_gpio_init_post;
+
+    ////FIXME i2c
+    ////pwm_init_pre
+    ////spi maybe
+    // // gpio drie modes
+
+    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].gpio.pinmap = 182;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].pwm.pinmap = 2;
+    b->pins[pos].pwm.parent_id = 0;
+    b->pins[pos].pwm.mux_total = 0;
+    pos++;
+
+    strncpy(b->pins[pos].name, "J17-2", 8);
+    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};
+    pos++;
+    strncpy(b->pins[pos].name, "J17-4", 8);
+    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].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};
+    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].gpio.pinmap = 27;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].i2c.pinmap = 1;
+    b->pins[pos].i2c.mux_total = 0;
+    //FIXME
+    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].gpio.pinmap = 20;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].i2c.pinmap = 1;
+    b->pins[pos].i2c.mux_total = 0;
+    //FIXME
+    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].gpio.pinmap = 28;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].i2c.pinmap = 1;
+    b->pins[pos].i2c.mux_total = 0;
+    //FIXME
+    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].gpio.pinmap = 111;
+    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-11", 8);
+    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;
+    b->pins[pos].spi.mux_total = 0;
+    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].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};
+    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].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].gpio.pinmap = 13;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].pwm.pinmap = 1;
+    b->pins[pos].pwm.parent_id = 0;
+    b->pins[pos].pwm.mux_total = 0;
+    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].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};
+    pos++;
+    strncpy(b->pins[pos].name, "J18-4", 8);
+    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};
+    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].gpio.pinmap = 19;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].i2c.pinmap = 1;
+    b->pins[pos].i2c.mux_total = 0;
+    //FIXME
+    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].gpio.pinmap = 12;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].pwm.pinmap = 0;
+    b->pins[pos].pwm.parent_id = 0;
+    b->pins[pos].pwm.mux_total = 0;
+    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].gpio.pinmap = 182;
+    b->pins[pos].gpio.mux_total = 0;
+    b->pins[pos].pwm.pinmap = 3;
+    b->pins[pos].pwm.parent_id = 0;
+    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};
+    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].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].gpio.pinmap = 114;
+    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-12", 8);
+    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,0};
+    b->pins[pos].gpio.pinmap = 130;
+    b->pins[pos].gpio.mux_total = 0;
+    pos++;
+    strncpy(b->pins[pos].name, "J18-14", 8);
+    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};
+    pos++;
+    strncpy(b->pins[pos].name, "J19-2", 8);
+    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};
+    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].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].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].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};
+    pos++;
+
+    strncpy(b->pins[pos].name, "J19-8", 8);
+    b->pins[pos].capabilites = (mraa_pincapabilities_t) {1,1,0,0,0,0,0,0};
+    b->pins[pos].gpio.pinmap = 131;
+    b->pins[pos].gpio.mux_total = 0;
+    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].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].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].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].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].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].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};
+    pos++;
+    strncpy(b->pins[pos].name, "J20-2", 8);
+    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};
+    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].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].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].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].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].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].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].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].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].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].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].gpio.pinmap = 81;
+    b->pins[pos].gpio.mux_total = 0;
+    pos++;
+
+    return MRAA_SUCCESS;
+}
 
 mraa_board_t*
 mraa_intel_edison_fab_c()
@@ -382,6 +726,18 @@ mraa_intel_edison_fab_c()
     if (b == NULL)
         return NULL;
 
+    // This seciton will also check if the arduino board is there
+    tristate = mraa_gpio_init_raw(214);
+    if (tristate == NULL) {
+        syslog(LOG_INFO, "Intel Edison Failed to initialise Arduino board TriState,\
+                assuming Intel Edison Miniboard\n");
+        if (mraa_intel_edsion_miniboard(b) != MRAA_SUCCESS) {
+            free(b);
+            return NULL;
+        }
+        return b;
+    }
+    // Now Assuming the edison is attached to the Arduino board.
     b->phy_pin_count = 20;
     b->gpio_count = 14;
     b->aio_count = 6;