pwm.c
Go to the documentation of this file.00001
00040 #include "cfg/cfg_pwm.h"
00041
00042 #include <cfg/macros.h>
00043 #include <cfg/module.h>
00044
00045
00046 #define LOG_LEVEL PWM_LOG_LEVEL
00047 #define LOG_VERBOSITY PWM_LOG_FORMAT
00048
00049 #include <cfg/log.h>
00050 #include <cfg/debug.h>
00051
00052 #include <drv/pwm.h>
00053
00054 #include CPU_HEADER(pwm)
00055
00056 #include <cpu/types.h>
00057 #include <cpu/irq.h>
00058
00059 #include <string.h>
00060
00061 #if CFG_PWM_ENABLE_OLD_API
00062
00069 void pwm_setDuty(PwmDev dev, pwm_duty_t duty)
00070 {
00071 pwm_period_t period = 0;
00072 pwm_duty_t real_duty = 0;
00073
00074 duty = MIN(duty, PWM_MAX_DUTY);
00075
00076 period = pwm_hw_getPeriod(dev);
00077
00078 real_duty = (uint64_t)(duty * period) >> (uint64_t)PWM_MAX_PERIOD_LOG2;
00079
00080 LOG_INFO("real_duty[%d] duty[%d], period[%d]\n", real_duty, duty, period);
00081 pwm_hw_setDutyUnlock(dev, real_duty);
00082 }
00083
00093 void pwm_setFrequency(PwmDev dev, pwm_freq_t freq)
00094 {
00095 pwm_hw_setFrequency(dev, freq);
00096 }
00097
00103 void pwm_enable(PwmDev dev, bool state)
00104 {
00105 if (state)
00106 pwm_hw_enable(dev);
00107 else
00108 pwm_hw_disable(dev);
00109 }
00110
00111 MOD_DEFINE(pwm);
00112
00117 void pwm_init(void)
00118 {
00119 cpu_flags_t flags;
00120 PwmDev dev;
00121
00122 IRQ_SAVE_DISABLE(flags);
00123
00124 pwm_hw_init();
00125
00126
00127 for (dev = 0; dev < PWM_CNT; dev++)
00128 pwm_setDuty(dev, 0);
00129
00130 IRQ_RESTORE(flags);
00131 MOD_INIT(pwm);
00132 }
00133 #endif
00134
00135 #if !CFG_PWM_ENABLE_OLD_API || defined(__doxygen__)
00136
00137 INLINE void setRealDuty(Pwm *ctx, pwm_duty_t duty)
00138 {
00139 if (ctx->pol == PWM_POL_LOW_PULSE)
00140 duty = PWM_MAX_DUTY - duty;
00141
00142 pwm_hwreg_t period = pwm_hw_getPeriod(ctx);
00143 pwm_hwreg_t hw_duty;
00144
00145 switch (duty)
00146 {
00147 case 0:
00148 hw_duty = 0;
00149 break;
00150 case PWM_MAX_DUTY:
00151 hw_duty = period;
00152 break;
00153 default:
00154 hw_duty = (uint64_t)(duty * period) >> (uint64_t)PWM_MAX_PERIOD_LOG2;
00155 }
00156
00157 pwm_hw_setDuty(ctx, hw_duty);
00158 }
00159
00168 void pwm_setDuty(Pwm *ctx, pwm_duty_t duty)
00169 {
00170 ctx->duty = duty;
00171
00172 if (ctx->enabled)
00173 setRealDuty(ctx, duty);
00174 }
00175
00185 void pwm_setFrequency(Pwm *ctx, pwm_freq_t freq)
00186 {
00187 pwm_hw_setFrequency(ctx, freq);
00188 pwm_enable(ctx, ctx->enabled);
00189 }
00190
00202 void pwm_setPolarity(Pwm *ctx, PwmPolarity pol)
00203 {
00204 ctx->pol = pol;
00205 pwm_enable(ctx, ctx->enabled);
00206 }
00207
00220 void pwm_enable(Pwm *ctx, bool enable)
00221 {
00222 ctx->enabled = enable;
00223
00224 if (enable)
00225 setRealDuty(ctx, ctx->duty);
00226 else
00227 setRealDuty(ctx, 0);
00228 }
00229
00237 void pwm_init(Pwm *ctx, unsigned channel)
00238 {
00239 memset(ctx, 0, sizeof(*ctx));
00240 ctx->ch = channel;
00241
00242 pwm_hw_init(ctx, channel);
00243 }
00244
00245 #endif
00246
00247