Private
Public Access
2
0

PWM: added workaround for Edison's problem with 0% duty

As described in issue #91, on Edison setting 0% duty doesn't
disable the PWM on a pin completely.

Therefore we add a couple of Edison-specific _pre functions
and an internal PWM state variable, which we use to toggle PWM
enabled/disabled based on what duty is set for the pin.

Closes #91.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Alex Tereschenko
2016-05-24 23:12:24 +02:00
committed by Brendan Le Foll
parent c413a43d5a
commit 8af6843566
3 changed files with 48 additions and 0 deletions

View File

@@ -340,6 +340,13 @@ mraa_pwm_write(mraa_pwm_context dev, float percentage)
return MRAA_ERROR_INVALID_HANDLE;
}
if (IS_FUNC_DEFINED(dev, pwm_write_pre)) {
if (dev->advance_func->pwm_write_pre(dev, percentage) != MRAA_SUCCESS) {
syslog(LOG_ERR, "mraa_pwm_write (pwm%i): pwm_write_pre failed, see syslog", dev->pin);
return MRAA_ERROR_UNSPECIFIED;
}
}
if (dev->period == -1) {
if (mraa_pwm_read_period(dev) <= 0)
return MRAA_ERROR_NO_DATA_AVAILABLE;
@@ -433,6 +440,13 @@ mraa_pwm_enable(mraa_pwm_context dev, int enable)
return dev->advance_func->pwm_enable_replace(dev, enable);
}
if (IS_FUNC_DEFINED(dev, pwm_enable_pre)) {
if (dev->advance_func->pwm_enable_pre(dev, enable) != MRAA_SUCCESS) {
syslog(LOG_ERR, "mraa_pwm_enable (pwm%i): pwm_enable_pre failed, see syslog", dev->pin);
return MRAA_ERROR_UNSPECIFIED;
}
}
char bu[MAX_SIZE];
snprintf(bu, MAX_SIZE, "/sys/class/pwm/pwmchip%d/pwm%d/enable", dev->chipid, dev->pin);