Private
Public Access
2
0

mmap: remove implementation of mmap gpio

Instead of trying to have an implementation that covers most platforms
Leave all mmap up to platform definition. Through function pointers.

gpio_mmap_setup sets up the mmap

Within the internal gpio context struct two more function pointers now
exist mmap_read & mmap_write. They exist there so each context can its
own function for handling a write and read.

Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
This commit is contained in:
Thomas Ingleby
2014-11-07 02:02:29 +00:00
parent d1f9e98060
commit 3865bebe8d
5 changed files with 13 additions and 95 deletions

View File

@@ -42,10 +42,7 @@ typedef struct {
mraa_result_t (*gpio_write_pre) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_write_post) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_mmaped_write_replace) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_mmaped_write_pre) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_mmaped_write_post) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_mmap_setup) (mraa_gpio_context dev, mraa_boolean_t en);
mraa_result_t (*i2c_init_pre) (unsigned int bus);
mraa_result_t (*i2c_init_post) (mraa_i2c_context dev);

View File

@@ -45,14 +45,6 @@ extern mraa_board_t* plat;
*/
mraa_result_t mraa_setup_mux_mapped(mraa_pin_t meta);
/**
* Setup gpio mux to go straight to SoC, galileo.
*
* @param pin physical pin to use
* @return mraa_mmap_pin_t
*/
mraa_mmap_pin_t* mraa_setup_mmap_gpio(int pin);
/**
* Setup uart muxes to exposes the pins physically.
*

View File

@@ -26,6 +26,7 @@
#pragma once
#include "common.h"
#include "mraa.h"
// general status failures for internal functions
#define MRAA_PLATFORM_NO_INIT -3
@@ -45,10 +46,8 @@ struct _gpio {
pthread_t thread_id; /**< the isr handler thread id */
int isr_value_fp; /**< the isr file pointer on the value */
mraa_boolean_t owner; /**< If this context originally exported the pin */
mraa_boolean_t mmap;
void *reg;
unsigned int reg_sz;
unsigned int reg_bit_pos;
mraa_result_t (*mmap_write) (mraa_gpio_context dev, int value);
int (*mmap_read) (mraa_gpio_context dev);
/*@}*/
};

View File

@@ -138,26 +138,6 @@ mraa_gpio_init_raw(int pin)
return dev;
}
static mraa_result_t
mraa_gpio_write_register(mraa_gpio_context dev,int value)
{
if (advance_func->gpio_mmaped_write_replace != NULL)
return advance_func->gpio_mmaped_write_replace(dev,value);
if (advance_func->gpio_mmaped_write_pre != NULL) {
mraa_result_t pre_ret = (advance_func->gpio_mmaped_write_pre(dev,value));
if(pre_ret != MRAA_SUCCESS)
return pre_ret;
}
if (value == 1) {
*((unsigned *)dev->reg) |= (1<<dev->reg_bit_pos);
return MRAA_SUCCESS;
}
*((unsigned *)dev->reg) &= ~(1<<dev->reg_bit_pos);
if (advance_func->gpio_mmaped_write_post != NULL)
return advance_func->gpio_mmaped_write_post(dev,value);
return MRAA_SUCCESS;
}
static mraa_result_t
mraa_gpio_wait_interrupt(int fd)
@@ -455,6 +435,9 @@ mraa_gpio_read(mraa_gpio_context dev)
if (dev == NULL)
return -1;
if (dev->mmap_read != NULL)
return dev->mmap_read(dev);
if (dev->value_fp == -1) {
if (mraa_gpio_get_valfp(dev) != MRAA_SUCCESS) {
syslog(LOG_ERR, "gpio: Failed to get value file pointer");
@@ -480,8 +463,8 @@ mraa_gpio_write(mraa_gpio_context dev, int value)
if (dev == NULL)
return MRAA_ERROR_INVALID_HANDLE;
if (dev->mmap == 1)
return mraa_gpio_write_register(dev,value);
if (dev->mmap_write != NULL)
return dev->mmap_write(dev,value);
if (advance_func->gpio_write_pre != NULL) {
mraa_result_t pre_ret = (advance_func->gpio_write_pre(dev,value));
@@ -560,44 +543,10 @@ mraa_gpio_owner(mraa_gpio_context dev, mraa_boolean_t own)
mraa_result_t
mraa_gpio_use_mmaped(mraa_gpio_context dev, mraa_boolean_t mmap_en)
{
if (dev == NULL) {
return MRAA_ERROR_INVALID_RESOURCE;
if (advance_func->gpio_mmap_setup != NULL) {
return advance_func->gpio_mmap_setup(dev,mmap_en);
}
if (mraa_pin_mode_test(dev->phy_pin, MRAA_PIN_FAST_GPIO) == 0)
return MRAA_ERROR_NO_RESOURCES;
mraa_mmap_pin_t *mmp = mraa_setup_mmap_gpio(dev->phy_pin);
if (mmp == NULL)
return MRAA_ERROR_INVALID_RESOURCE;
if (mmap_en == 1) {
if (dev->mmap == 0) {
close(dev->value_fp);
int fd;
fd = open(mmp->mem_dev, O_RDWR);
if (fd < 1) {
syslog(LOG_ERR, "gpio: Unable to open memory device");
close(fd);
return MRAA_ERROR_INVALID_RESOURCE;
}
dev->reg_sz = mmp->mem_sz;
dev->reg = mmap(NULL, dev->reg_sz, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
dev->reg_bit_pos = mmp->bit_pos;
dev->mmap = 1;
close(fd);
return MRAA_SUCCESS;
}
return MRAA_ERROR_INVALID_PARAMETER;
}
if (mmap_en == 0) {
if (dev ->mmap == 1) {
munmap(dev->reg, dev->reg_sz);
dev->mmap = 0;
}
return MRAA_ERROR_INVALID_PARAMETER;
}
return MRAA_SUCCESS;
syslog(LOG_ERR, "gpio: mmap not implemented on this platform");
return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
}

View File

@@ -264,25 +264,6 @@ mraa_pin_mode_test(int pin, mraa_pinmodes_t mode)
return 0;
}
mraa_mmap_pin_t*
mraa_setup_mmap_gpio(int pin)
{
if (plat == NULL)
return NULL;
if (plat->pins[pin].capabilites.fast_gpio != 1)
return NULL;
if (plat->pins[pin].mmap.gpio.mux_total > 0)
if (mraa_setup_mux_mapped(plat->pins[pin].mmap.gpio) != MRAA_SUCCESS)
return NULL;
if (mraa_setup_mux_mapped(plat->pins[pin].mmap.gpio) != MRAA_SUCCESS)
return NULL;
mraa_mmap_pin_t *ret = &(plat->pins[pin].mmap);
return ret;
}
mraa_platform_t mraa_get_platform_type()
{
return platform_type;