#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;
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;
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;
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);
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
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");