00001
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include "compiler.h"
00050 #include "pwm.h"
00051
00052
00053 int pwm_init(const pwm_opt_t *opt)
00054 {
00055 volatile avr32_pwm_t *pwm = &AVR32_PWM;
00056 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00057
00058 if (opt == 0 )
00059 return PWM_INVALID_INPUT;
00060
00061
00062 if (global_interrupt_enabled) Disable_global_interrupt();
00063 pwm->idr = ((1 << (AVR32_PWM_LINES_MSB + 1)) - 1) << AVR32_PWM_IDR_CHID0_OFFSET;
00064 pwm->isr;
00065 if (global_interrupt_enabled) Enable_global_interrupt();
00066
00067
00068 pwm->mr =
00069 ((opt->diva)<<AVR32_PWM_DIVA_OFFSET) |
00070 ((opt->divb)<<AVR32_PWM_DIVB_OFFSET) |
00071 ((opt->prea)<<AVR32_PWM_PREA_OFFSET) |
00072 ((opt->preb)<<AVR32_PWM_PREB_OFFSET)
00073 ;
00074
00075 return PWM_SUCCESS;
00076 }
00077
00078
00079 int pwm_channel_init( unsigned int channel_id, const avr32_pwm_channel_t *pwm_channel)
00080 {
00081 volatile avr32_pwm_t *pwm = &AVR32_PWM;
00082
00083 if (pwm_channel == 0)
00084 return PWM_INVALID_ARGUMENT;
00085 if (channel_id > AVR32_PWM_LINES_MSB)
00086 return PWM_INVALID_INPUT;
00087
00088 pwm->channel[channel_id].cmr= pwm_channel->cmr;
00089 pwm->channel[channel_id].cdty= pwm_channel->cdty;
00090 pwm->channel[channel_id].cprd= pwm_channel->cprd;
00091
00092 return PWM_SUCCESS;
00093 }
00094
00095
00096 int pwm_start_channels(unsigned long channels_bitmask)
00097 {
00098 if (channels_bitmask & ~((1 << (AVR32_PWM_LINES_MSB + 1)) - 1))
00099 return PWM_INVALID_INPUT;
00100
00101 AVR32_PWM.ena = channels_bitmask;
00102
00103 return PWM_SUCCESS;
00104 }
00105
00106
00107 int pwm_stop_channels(unsigned long channels_bitmask)
00108 {
00109 if (channels_bitmask & ~((1 << (AVR32_PWM_LINES_MSB + 1)) - 1))
00110 return PWM_INVALID_INPUT;
00111
00112 AVR32_PWM.dis = channels_bitmask;
00113
00114 return PWM_SUCCESS;
00115 }
00116
00117
00118 int pwm_sync_update_channel(unsigned int channel_id, const avr32_pwm_channel_t *pwm_channel)
00119 {
00120 volatile avr32_pwm_t *pwm = &AVR32_PWM;
00121
00122 if (channel_id > AVR32_PWM_LINES_MSB)
00123 return PWM_INVALID_INPUT;
00124
00125 AVR32_PWM.isr;
00126 pwm->channel[channel_id].cmr= pwm_channel->cmr;
00127 while (!(AVR32_PWM.isr & (1 << channel_id)));
00128 pwm->channel[channel_id].cupd= pwm_channel->cupd;
00129
00130 return PWM_SUCCESS;
00131 }
00132
00133
00134 int pwm_async_update_channel(unsigned int channel_id, const avr32_pwm_channel_t *pwm_channel)
00135 {
00136 volatile avr32_pwm_t *pwm = &AVR32_PWM;
00137
00138 if (channel_id > AVR32_PWM_LINES_MSB)
00139 return PWM_INVALID_INPUT;
00140
00141 pwm->channel[channel_id].cmr= pwm_channel->cmr;
00142 pwm->channel[channel_id].cupd= pwm_channel->cupd;
00143
00144 return PWM_SUCCESS;
00145 }