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_pre) (mraa_gpio_context dev, int value);
|
||||||
mraa_result_t (*gpio_write_post) (mraa_gpio_context dev, int value);
|
mraa_result_t (*gpio_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 (*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 (*i2c_init_pre) (unsigned int bus);
|
mraa_result_t (*i2c_init_pre) (unsigned int bus);
|
||||||
mraa_result_t (*i2c_init_post) (mraa_i2c_context dev);
|
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);
|
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.
|
* Setup uart muxes to exposes the pins physically.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "mraa.h"
|
||||||
|
|
||||||
// general status failures for internal functions
|
// general status failures for internal functions
|
||||||
#define MRAA_PLATFORM_NO_INIT -3
|
#define MRAA_PLATFORM_NO_INIT -3
|
||||||
@@ -45,10 +46,8 @@ struct _gpio {
|
|||||||
pthread_t thread_id; /**< the isr handler thread id */
|
pthread_t thread_id; /**< the isr handler thread id */
|
||||||
int isr_value_fp; /**< the isr file pointer on the value */
|
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 owner; /**< If this context originally exported the pin */
|
||||||
mraa_boolean_t mmap;
|
mraa_result_t (*mmap_write) (mraa_gpio_context dev, int value);
|
||||||
void *reg;
|
int (*mmap_read) (mraa_gpio_context dev);
|
||||||
unsigned int reg_sz;
|
|
||||||
unsigned int reg_bit_pos;
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -138,26 +138,6 @@ mraa_gpio_init_raw(int pin)
|
|||||||
return dev;
|
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
|
static mraa_result_t
|
||||||
mraa_gpio_wait_interrupt(int fd)
|
mraa_gpio_wait_interrupt(int fd)
|
||||||
@@ -455,6 +435,9 @@ mraa_gpio_read(mraa_gpio_context dev)
|
|||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (dev->mmap_read != NULL)
|
||||||
|
return dev->mmap_read(dev);
|
||||||
|
|
||||||
if (dev->value_fp == -1) {
|
if (dev->value_fp == -1) {
|
||||||
if (mraa_gpio_get_valfp(dev) != MRAA_SUCCESS) {
|
if (mraa_gpio_get_valfp(dev) != MRAA_SUCCESS) {
|
||||||
syslog(LOG_ERR, "gpio: Failed to get value file pointer");
|
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)
|
if (dev == NULL)
|
||||||
return MRAA_ERROR_INVALID_HANDLE;
|
return MRAA_ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
if (dev->mmap == 1)
|
if (dev->mmap_write != NULL)
|
||||||
return mraa_gpio_write_register(dev,value);
|
return dev->mmap_write(dev,value);
|
||||||
|
|
||||||
if (advance_func->gpio_write_pre != NULL) {
|
if (advance_func->gpio_write_pre != NULL) {
|
||||||
mraa_result_t pre_ret = (advance_func->gpio_write_pre(dev,value));
|
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_result_t
|
||||||
mraa_gpio_use_mmaped(mraa_gpio_context dev, mraa_boolean_t mmap_en)
|
mraa_gpio_use_mmaped(mraa_gpio_context dev, mraa_boolean_t mmap_en)
|
||||||
{
|
{
|
||||||
if (dev == NULL) {
|
if (advance_func->gpio_mmap_setup != NULL) {
|
||||||
return MRAA_ERROR_INVALID_RESOURCE;
|
return advance_func->gpio_mmap_setup(dev,mmap_en);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mraa_pin_mode_test(dev->phy_pin, MRAA_PIN_FAST_GPIO) == 0)
|
syslog(LOG_ERR, "gpio: mmap not implemented on this platform");
|
||||||
return MRAA_ERROR_NO_RESOURCES;
|
return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
19
src/mraa.c
19
src/mraa.c
@@ -264,25 +264,6 @@ mraa_pin_mode_test(int pin, mraa_pinmodes_t mode)
|
|||||||
return 0;
|
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()
|
mraa_platform_t mraa_get_platform_type()
|
||||||
{
|
{
|
||||||
return platform_type;
|
return platform_type;
|
||||||
|
|||||||
Reference in New Issue
Block a user