mmap: remove implementation of mmap gpio
authorThomas Ingleby <thomas.c.ingleby@intel.com>
Fri, 7 Nov 2014 02:02:29 +0000 (02:02 +0000)
committerThomas Ingleby <thomas.c.ingleby@intel.com>
Mon, 17 Nov 2014 17:41:47 +0000 (17:41 +0000)
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>
include/mraa_adv_func.h
include/mraa_internal.h
include/mraa_internal_types.h
src/gpio/gpio.c
src/mraa.c

index 4a1af66..78962c5 100644 (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);
index 22c4ad5..235dcfc 100644 (file)
@@ -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
index 182f456..a7d75bb 100644 (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);
     /*@}*/
 };
 
index dd63183..2f8519c 100644 (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;
 }
index bd22ee8..1321a02 100644 (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;