From 351e7eedb652e50b5a335a5f37f930e191b96345 Mon Sep 17 00:00:00 2001 From: asterix Date: Mon, 17 Mar 2008 10:18:02 +0000 Subject: [PATCH 1/1] Implement new function and refactor. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1189 38d2e660-2303-0410-9eaa-f027e97ec537 --- drv/pwm.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) 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); } + + + + -- 2.25.1