BeRTOS
|
00001 00040 #include "cfg/cfg_pwm.h" 00041 00042 #include <cfg/macros.h> 00043 #include <cfg/module.h> 00044 00045 // Define logging setting (for cfg/log.h module). 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 /* set all pwm to 0 */ 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