From: asterix Date: Mon, 17 Mar 2008 10:18:02 +0000 (+0000) Subject: Implement new function and refactor. X-Git-Tag: 1.0.0~63 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=351e7eedb652e50b5a335a5f37f930e191b96345;p=bertos.git Implement new function and refactor. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1189 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/drv/pwm.c b/drv/pwm.c index 6a44e33c..39461882 100644 --- a/drv/pwm.c +++ b/drv/pwm.c @@ -29,26 +29,60 @@ * Copyright 2005 Develer S.r.l. (http://www.develer.com/) * --> * - * \version $Id$ * * \brief PWM driver (implementation) * * \version $Id$ + * * \author Francesco Sacchi + * \author Daniele Basile */ -#include +#include +#include + #include +#include + #include +#include + /** - * Set duty of pwm channel \a dev. + * Set duty of pwm channel \p dev. */ void pwm_setDuty(PwmDev dev, pwm_duty_t duty) { + pwm_period_t period = 0; + pwm_duty_t real_duty = 0; + duty = MIN(duty, (pwm_duty_t)PWM_MAX_DUTY); - pwm_hw_setDutyUnlock(dev, duty); + period = pwm_hw_getPeriod(dev); + + real_duty = (uint64_t)(duty * period) >> (uint64_t)PWM_MAX_PERIOD_LOG2; + +// kprintf("real_duty[%d] duty[%d], period[%d]\n", real_duty, duty, period); + pwm_hw_setDutyUnlock(dev, real_duty); +} + +/** + * Set frequency of pwm channel \p dev at \p freq in Hz. + */ +void pwm_setFrequency(PwmDev dev, pwm_freq_t freq) +{ + pwm_hw_setFrequency(dev, freq); +} + +/** + * Set duty of pwm channel \p dev. + */ +void pwm_enable(PwmDev dev, bool state) +{ + if (state) + pwm_hw_enable(dev); + else + pwm_hw_disable(dev); } /** @@ -65,7 +99,11 @@ void pwm_init(void) for (dev = 0; dev < PWM_CNT; dev++) pwm_setDuty(dev, 0); - PWM_HW_INIT; + pwm_hw_init(); IRQ_RESTORE(flags); } + + + +