galileo gen 2: port mmap to new structure
Feature parity pre mem branch. Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#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<<bitpos);
|
||||
return MRAA_SUCCESS;
|
||||
}
|
||||
*((unsigned *)mmap_reg) &= ~(1<<bitpos);
|
||||
|
||||
return MRAA_SUCCESS;
|
||||
}
|
||||
|
||||
mraa_result_t
|
||||
mraa_intel_galileo_g2_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en)
|
||||
{
|
||||
if (dev == NULL) {
|
||||
syslog(LOG_ERR, "Galileo mmap: context not valid");
|
||||
return MRAA_ERROR_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if (mraa_pin_mode_test(dev->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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user