diff --git a/src/intel_galileo_rev_g.c b/src/intel_galileo_rev_g.c index 5999b45..9d27399 100644 --- a/src/intel_galileo_rev_g.c +++ b/src/intel_galileo_rev_g.c @@ -25,6 +25,7 @@ #include #include +#include #include "common.h" #include "intel_galileo_rev_g.h" @@ -32,6 +33,13 @@ #define MAX_SIZE 64 #define SYSFS_CLASS_GPIO "/sys/class/gpio" +#define UIO_PATH "/dev/uio0" + +static uint8_t *mmap_reg = NULL; +static int mmap_fd = 0; +static int mmap_size = 0x1000; +static unsigned int mmap_count = 0; + static unsigned int pullup_map[] = {33,29,35,17,37,19,21,39,41,23,27,25,43,31,49,51,53,55,57,59}; mraa_result_t @@ -178,7 +186,85 @@ mraa_intel_galileo_gen2_uart_init_pre(int index) mraa_gpio_close(io0_output); mraa_gpio_close(io1_output); + return MRAA_SUCCESS; +} +static mraa_result_t +mraa_intel_galileo_g2_mmap_unsetup() +{ + if (mmap_reg == NULL) { + syslog(LOG_ERR, "mmap: null register cant unsetup"); + return MRAA_ERROR_INVALID_RESOURCE; + } + munmap(mmap_reg, mmap_size); + mmap_reg == NULL; + close(mmap_fd); + return MRAA_SUCCESS; +} + +mraa_result_t +mraa_intel_galileo_g2_mmap_write(mraa_gpio_context dev, int value) +{ + int bitpos = plat->pins[dev->phy_pin].mmap.bit_pos; + if (value) { + *((unsigned *)mmap_reg) |= (1<phy_pin, MRAA_PIN_FAST_GPIO) == 0) { + syslog(LOG_ERR, "Galileo mmap: mmap not on this pin"); + return MRAA_ERROR_NO_RESOURCES; + } + if (en == 0) { + if (dev->mmap_write == NULL) { + syslog(LOG_ERR, "mmap: can't disable disabled mmap gpio"); + return MRAA_ERROR_INVALID_PARAMETER; + } + dev->mmap_write = NULL; + mmap_count--; + if (mmap_count == 0) { + return mraa_intel_galileo_g2_mmap_unsetup(); + } + return MRAA_SUCCESS; + } + + if (dev->mmap_write != NULL) { + syslog(LOG_ERR, "mmap: can't enable enabled mmap gpio"); + return MRAA_ERROR_INVALID_PARAMETER; + } + if (mmap_reg == NULL) { + if ((mmap_fd = open(UIO_PATH, O_RDWR)) < 0) { + syslog(LOG_ERR, "mmap: Unable to open UIO device"); + return MRAA_ERROR_INVALID_RESOURCE; + } + mmap_reg = mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, + MAP_SHARED, mmap_fd, 0); + + if (mmap_reg == MAP_FAILED) { + syslog(LOG_ERR, "mmap: failed to mmap"); + mmap_reg = NULL; + close(mmap_fd); + return MRAA_ERROR_NO_RESOURCES; + } + } + if (mraa_setup_mux_mapped(plat->pins[dev->phy_pin].mmap.gpio) + != MRAA_SUCCESS) { + syslog(LOG_ERR, "mmap: unable to setup required multiplexers"); + return MRAA_ERROR_INVALID_RESOURCE; + } + dev->mmap_write = &mraa_intel_galileo_g2_mmap_write; return MRAA_SUCCESS; } @@ -203,6 +289,7 @@ mraa_intel_galileo_gen2() advance_func->pwm_period_replace = &mraa_intel_galileo_gen2_pwm_period_replace; advance_func->gpio_mode_replace = &mraa_intel_galileo_gen2_gpio_mode_replace; advance_func->uart_init_pre = &mraa_intel_galileo_gen2_uart_init_pre; + advance_func->gpio_mmap_setup = &mraa_intel_galileo_g2_mmap_setup; b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t)*MRAA_INTEL_GALILEO_GEN_2_PINCOUNT);