From: Thomas Ingleby Date: Fri, 7 Nov 2014 02:02:29 +0000 (+0000) Subject: mmap: remove implementation of mmap gpio X-Git-Tag: v0.5.3~49 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3865bebe8db6c9600de2f439d48d1490b059a394;p=contrib%2Fmraa.git 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 --- diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index 4a1af66..78962c5 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -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); diff --git a/include/mraa_internal.h b/include/mraa_internal.h index 22c4ad5..235dcfc 100644 --- a/include/mraa_internal.h +++ b/include/mraa_internal.h @@ -46,14 +46,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. * * @param index of the uart in the board definition to expose physically diff --git a/include/mraa_internal_types.h b/include/mraa_internal_types.h index 182f456..a7d75bb 100644 --- a/include/mraa_internal_types.h +++ b/include/mraa_internal_types.h @@ -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); /*@}*/ }; diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index dd63183..2f8519c 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -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<reg_bit_pos); - return MRAA_SUCCESS; - } - *((unsigned *)dev->reg) &= ~(1<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; } diff --git a/src/mraa.c b/src/mraa.c index bd22ee8..1321a02 100644 --- a/src/mraa.c +++ b/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;