X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Farm%2Fdrv%2Fpwm_at91.c;h=39fd4a66e466eb46240adc71e70502d3ecf7c97d;hb=c5c1386457a0c9d4d37c8574d1626553449d4c4a;hp=76a53d398482aa88e0a4dee9a57dc7279235d84c;hpb=6286e79f3da8091ec8da66469488a11035cada11;p=bertos.git diff --git a/bertos/cpu/arm/drv/pwm_at91.c b/bertos/cpu/arm/drv/pwm_at91.c index 76a53d39..39fd4a66 100644 --- a/bertos/cpu/arm/drv/pwm_at91.c +++ b/bertos/cpu/arm/drv/pwm_at91.c @@ -34,13 +34,18 @@ * \brief PWM hardware-specific implementation * * \version $Id$ - * * \author Daniele Basile */ #include "pwm_at91.h" #include "hw/pwm_map.h" -#include "hw/hw_cpu.h" +#include +#include "cfg/cfg_pwm.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL PWM_LOG_LEVEL +#define LOG_FORMAT PWM_LOG_FORMAT +#include #include #include @@ -115,8 +120,8 @@ void pwm_hw_setFrequency(PwmDev dev, uint32_t freq) for(int i = 0; i <= PWM_HW_MAX_PRESCALER_STEP; i++) { - period = CLOCK_FREQ / (BV(i) * freq); -// TRACEMSG("period[%ld], prescale[%d]", period, i); + period = CPU_FREQ / (BV(i) * freq); + LOG_INFO("period[%ld], prescale[%d]\n", period, i); if ((period < PWM_HW_MAX_PERIOD) && (period != 0)) { //Clean previous channel prescaler, and set new @@ -128,7 +133,7 @@ void pwm_hw_setFrequency(PwmDev dev, uint32_t freq) } } - TRACEMSG("PWM ch[%d] period[%ld]", dev, period); + LOG_INFO("PWM ch[%d] period[%ld]\n", dev, period); } /** @@ -141,36 +146,37 @@ void pwm_hw_setDutyUnlock(PwmDev dev, uint16_t duty) ASSERT(duty <= (uint16_t)*pwm_map[dev].period_reg); + /* + * If polarity flag is true we must invert + * PWM polarity. + */ + if (pwm_map[dev].pol) + { + duty = (uint16_t)*pwm_map[dev].period_reg - duty; + LOG_INFO("Inverted duty[%d], pol[%d]\n", duty, pwm_map[dev].pol); + } + /* * WARNING: is forbidden to write 0 to duty cycle value, * and so for duty = 0 we must enable PIO and clear output! */ if (!duty) { - PWM_PIO_PER = pwm_map[dev].pwm_pin; + PWM_PIO_CODR = pwm_map[dev].pwm_pin; + PWM_PIO_PER = pwm_map[dev].pwm_pin; pwm_map[dev].duty_zero = true; } else { - ASSERT(PWM_CCNT0); - /* - * If polarity flag is true we must invert - * PWM polarity. - */ - if (pwm_map[dev].pol) - { - duty = (uint16_t)*pwm_map[dev].period_reg - duty; -// TRACEMSG("Inverted duty[%d], pol[%d]", duty, pwm_map[dev].pol); - } - PWM_PIO_PDR = pwm_map[dev].pwm_pin; + PWM_PIO_ABSR = pwm_map[dev].pwm_pin; + *pwm_map[dev].update_reg = duty; pwm_map[dev].duty_zero = false; } PWM_ENA = BV(dev); - -// TRACEMSG("PWM ch[%d] duty[%d], period[%ld]", dev, duty, *pwm_map[dev].period_reg); + LOG_INFO("PWM ch[%d] duty[%d], period[%ld]\n", dev, duty, *pwm_map[dev].period_reg); } @@ -180,7 +186,10 @@ void pwm_hw_setDutyUnlock(PwmDev dev, uint16_t duty) void pwm_hw_enable(PwmDev dev) { if (!pwm_map[dev].duty_zero) - PWM_PIO_PDR = pwm_map[dev].pwm_pin; + { + PWM_PIO_PDR = pwm_map[dev].pwm_pin; + PWM_PIO_ABSR = pwm_map[dev].pwm_pin; + } } /** @@ -196,8 +205,8 @@ void pwm_hw_disable(PwmDev dev) */ void pwm_hw_setPolarity(PwmDev dev, bool pol) { - pwm_map[dev].pol = pol; -// TRACEMSG("Set pol[%d]", pwm_map[dev].pol); + pwm_map[dev].pol = pol; + LOG_INFO("Set pol[%d]\n", pwm_map[dev].pol); } /** @@ -216,8 +225,8 @@ void pwm_hw_init(void) * - Power on PWM */ PWM_PIO_CODR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); - PWM_PIO_OER = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); - PWM_PIO_PDR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); + PWM_PIO_OER = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); + PWM_PIO_PDR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); PWM_PIO_ABSR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); PMC_PCER |= BV(PWMC_ID);