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:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
/*@}*/
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
19
src/mraa.c
19
src/mraa.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user