pwm: move pwm setup to module
authorThomas Ingleby <thomas.c.ingleby@intel.com>
Thu, 6 Nov 2014 17:32:31 +0000 (17:32 +0000)
committerThomas Ingleby <thomas.c.ingleby@intel.com>
Mon, 17 Nov 2014 17:41:47 +0000 (17:41 +0000)
Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
include/mraa_internal.h
src/mraa.c
src/pwm/pwm.c

index fa026ff..f301bed 100644 (file)
@@ -46,14 +46,6 @@ extern mraa_board_t* plat;
 mraa_result_t mraa_setup_mux_mapped(mraa_pin_t meta);
 
 /**
- * Will check input is valid for pwm and will also setup required multiplexers.
- * IF the pin also does gpio (strong chance), DO NOTHING, REV D quirk
- * @param pin the pin as read from the board surface.
- * @return the pwm pin_info_t of that IO pin
- */
-mraa_pin_t* mraa_setup_pwm(int pin);
-
-/**
  * Setup gpio mux to go straight to SoC, galileo.
  *
  * @param pin physical pin to use
index f1cf70c..bd22ee8 100644 (file)
@@ -165,40 +165,6 @@ mraa_setup_mux_mapped(mraa_pin_t meta)
     return MRAA_SUCCESS;
 }
 
-mraa_pin_t*
-mraa_setup_pwm(int pin)
-{
-    if (plat == NULL)
-        return NULL;
-
-    if (plat->pins[pin].capabilites.pwm != 1)
-        return NULL;
-
-    if (plat->pins[pin].capabilites.gpio == 1) {
-        mraa_gpio_context mux_i;
-        mux_i = mraa_gpio_init_raw(plat->pins[pin].gpio.pinmap);
-        if (mux_i == NULL)
-            return NULL;
-        if (mraa_gpio_dir(mux_i, MRAA_GPIO_OUT) != MRAA_SUCCESS)
-            return NULL;
-        // Current REV D quirk. //TODO GEN 2
-        if (mraa_gpio_write(mux_i, 1) != MRAA_SUCCESS)
-            return NULL;
-        if (mraa_gpio_close(mux_i) != MRAA_SUCCESS)
-            return NULL;
-    }
-
-    if (plat->pins[pin].pwm.mux_total > 0)
-       if (mraa_setup_mux_mapped(plat->pins[pin].pwm) != MRAA_SUCCESS)
-            return NULL;
-
-    mraa_pin_t *ret;
-    ret = (mraa_pin_t*) malloc(sizeof(mraa_pin_t));
-    ret->pinmap = plat->pins[pin].pwm.pinmap;
-    ret->parent_id = plat->pins[pin].pwm.parent_id;
-    return ret;
-}
-
 void
 mraa_result_print(mraa_result_t result)
 {
index dc8b058..7cefbfc 100644 (file)
@@ -142,17 +142,52 @@ mraa_pwm_read_duty(mraa_pwm_context dev)
 }
 
 mraa_pwm_context
-mraa_pwm_init(int pin) {
+mraa_pwm_init(int pin)
+{
     if (advance_func->pwm_init_pre != NULL) {
         if (advance_func->pwm_init_pre(pin) != MRAA_SUCCESS)
             return NULL;
     }
-    mraa_pin_t* pinm = mraa_setup_pwm(pin);
-    if (pinm == NULL)
+    if (plat == NULL) {
+        syslog(LOG_ERR, "pwm: Platform Not Initialised");
+        return NULL;
+    }
+    if (plat->pins[pin].capabilites.pwm != 1) {
+        syslog(LOG_ERR, "pwm: pin not capable of pwm");
         return NULL;
-    int chip = pinm->parent_id;
-    int pinn = pinm->pinmap;
-    free(pinm);
+    }
+
+    if (plat->pins[pin].capabilites.gpio == 1) {
+        // This deserves more investigation
+        mraa_gpio_context mux_i;
+        mux_i = mraa_gpio_init_raw(plat->pins[pin].gpio.pinmap);
+        if (mux_i == NULL) {
+            syslog(LOG_ERR, "pwm: error in gpio->pwm transition");
+            return NULL;
+        }
+        if (mraa_gpio_dir(mux_i, MRAA_GPIO_OUT) != MRAA_SUCCESS) {
+            syslog(LOG_ERR, "pwm: error in gpio->pwm transition");
+            return NULL;
+        }
+        if (mraa_gpio_write(mux_i, 1) != MRAA_SUCCESS) {
+            syslog(LOG_ERR, "pwm: error in gpio->pwm transition");
+            return NULL;
+        }
+        if (mraa_gpio_close(mux_i) != MRAA_SUCCESS) {
+            syslog(LOG_ERR, "pwm: error in gpio->pwm transition");
+            return NULL;
+        }
+    }
+
+    if (plat->pins[pin].pwm.mux_total > 0) {
+        if (mraa_setup_mux_mapped(plat->pins[pin].pwm) != MRAA_SUCCESS) {
+            syslog(LOG_ERR, "pwm: Failed to set-up multiplexer");
+            return NULL;
+        }
+    }
+
+    int chip = plat->pins[pin].pwm.parent_id;
+    int pinn = plat->pins[pin].pwm.pinmap;
 
     if (advance_func->pwm_init_post != NULL) {
         mraa_pwm_context pret = mraa_pwm_init_raw(chip,pinn);