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