From 2558866d4add55d590f17b77cbe1b8cd4767d807 Mon Sep 17 00:00:00 2001 From: belugon Date: Tue, 4 Oct 2016 08:17:00 +0000 Subject: [PATCH] intel_edison_fab_c.c: Fix edison disabled pwm stuck at high Edison pwm can stuck at high if pin is disabled during ON pwm peroid. Workaround is to force zero duty time before disabling the pin. Signed-off-by: Billy Bai Signed-off-by: Brendan Le Foll --- src/x86/intel_edison_fab_c.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/x86/intel_edison_fab_c.c b/src/x86/intel_edison_fab_c.c index 9aca6a8..2b1b448 100644 --- a/src/x86/intel_edison_fab_c.c +++ b/src/x86/intel_edison_fab_c.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "common.h" #include "x86/intel_edison_fab_c.h" @@ -377,7 +378,18 @@ mraa_result_t mraa_intel_edison_pwm_enable_pre(mraa_pwm_context dev, int enable) { // PWM 0% duty workaround: update state array // if someone first ran write(0) and then enable(1). - if ((pwm_disabled[dev->pin] == 1) && (enable == 1)) { pwm_disabled[dev->pin] = 0; } + if ((pwm_disabled[dev->pin] == 1) && (enable == 1)) { + pwm_disabled[dev->pin] = 0; + return MRAA_SUCCESS; + } + if (enable == 0) { + // Set duty cycle to 0 before disable pwm. + // Edison PWM output stuck at high if disabled during ON period + mraa_pwm_pulsewidth_us(dev, 0); + // Sleep 2 period to allow change take effect + usleep(dev->period / 500); + } + return MRAA_SUCCESS; }