X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Fpwm.c;h=3946188262263c0f406062adef2fac522a19d77b;hb=2535cb94ec2183791128f8bbd109ca69a960cf78;hp=7cc36876ee7d59e8193a2beef3e51f4cebbb6d70;hpb=77c1d6ba65a199f60faa0e0a68e63ef0eb87677c;p=bertos.git diff --git a/drv/pwm.c b/drv/pwm.c index 7cc36876..39461882 100644 --- a/drv/pwm.c +++ b/drv/pwm.c @@ -29,54 +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 */ -/*#* - *#* $Log$ - *#* Revision 1.2 2006/07/19 12:56:26 bernie - *#* Convert to new Doxygen style. - *#* - *#* Revision 1.1 2005/11/04 18:08:49 bernie - *#* Import into DevLib. - *#* - *#* Revision 1.2 2005/05/24 13:35:01 batt - *#* Add missing; reformat. - *#* - *#* Revision 1.1 2005/05/24 09:17:58 batt - *#* Move drivers to top-level. - *#* - *#* Revision 1.4 2005/05/09 16:36:12 batt - *#* Change some function names to accomplish coding standard. - *#* - *#* Revision 1.3 2005/05/02 16:35:47 batt - *#* Add some comments. - *#* - *#* Revision 1.2 2005/05/02 16:02:58 batt - *#* Remove unusefull interrupt saving. - *#* - *#* Revision 1.1 2005/05/02 12:36:39 batt - *#* Add pwm driver. - *#* - *#*/ - -#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); } /** @@ -93,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); } + + + +