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 "pdca.h"
00051
00052
00053 volatile avr32_pdca_channel_t *pdca_get_handler(unsigned int pdca_ch_number)
00054 {
00055
00056 volatile avr32_pdca_channel_t *pdca_channel = &AVR32_PDCA.channel[pdca_ch_number];
00057
00058 if (pdca_ch_number >= AVR32_PDCA_CHANNEL_LENGTH)
00059 return (volatile avr32_pdca_channel_t *)PDCA_INVALID_ARGUMENT;
00060
00061 return pdca_channel;
00062 }
00063
00064
00065 int pdca_init_channel(unsigned int pdca_ch_number, const pdca_channel_options_t *opt)
00066 {
00067
00068 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00069
00070 pdca_disable_interrupt_transfer_complete(pdca_ch_number);
00071 pdca_disable_interrupt_reload_counter_zero(pdca_ch_number);
00072
00073 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00074
00075 if (global_interrupt_enabled) Disable_global_interrupt();
00076 pdca_channel->mar = (unsigned long)opt->addr;
00077 pdca_channel->tcr = opt->size;
00078 pdca_channel->psr = opt->pid;
00079 pdca_channel->marr = (unsigned long)opt->r_addr;
00080 pdca_channel->tcrr = opt->r_size;
00081 pdca_channel->mr =
00082 #if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED )
00083 opt->etrig << AVR32_PDCA_ETRIG_OFFSET |
00084 #endif // #ifdef AVR32_PDCA_120_H_INCLUDED
00085 opt->transfer_size << AVR32_PDCA_SIZE_OFFSET;
00086 pdca_channel->cr = AVR32_PDCA_ECLR_MASK;
00087 pdca_channel->isr;
00088 if (global_interrupt_enabled) Enable_global_interrupt();
00089
00090 return PDCA_SUCCESS;
00091 }
00092
00093
00094 unsigned int pdca_get_channel_status(unsigned int pdca_ch_number)
00095 {
00096
00097 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00098
00099 return (pdca_channel->sr & AVR32_PDCA_TEN_MASK) != 0;
00100 }
00101
00102
00103 void pdca_disable(unsigned int pdca_ch_number)
00104 {
00105
00106 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00107
00108
00109 pdca_channel->cr = AVR32_PDCA_TDIS_MASK;
00110
00111 }
00112
00113
00114 void pdca_enable(unsigned int pdca_ch_number)
00115 {
00116
00117 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00118
00119
00120 pdca_channel->cr = AVR32_PDCA_TEN_MASK;
00121 }
00122
00123
00124 unsigned int pdca_get_load_size(unsigned int pdca_ch_number)
00125 {
00126
00127 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00128
00129 return pdca_channel->tcr;
00130 }
00131
00132
00133 void pdca_load_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size)
00134 {
00135
00136 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00137
00138 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00139
00140 if (global_interrupt_enabled) Disable_global_interrupt();
00141 pdca_channel->mar = (unsigned long)addr;
00142 pdca_channel->tcr = size;
00143 pdca_channel->cr = AVR32_PDCA_ECLR_MASK;
00144 pdca_channel->isr;
00145 if (global_interrupt_enabled) Enable_global_interrupt();
00146 }
00147
00148
00149 unsigned int pdca_get_reload_size(unsigned int pdca_ch_number)
00150 {
00151
00152 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00153
00154 return pdca_channel->tcrr;
00155 }
00156
00157
00158 void pdca_reload_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size)
00159 {
00160
00161 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00162
00163 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00164
00165 if (global_interrupt_enabled) Disable_global_interrupt();
00166
00167 pdca_channel->marr = (unsigned long)addr;
00168
00169 pdca_channel->tcrr = size;
00170 pdca_channel->cr = AVR32_PDCA_ECLR_MASK;
00171 pdca_channel->isr;
00172 if (global_interrupt_enabled) Enable_global_interrupt();
00173 }
00174
00175
00176 void pdca_set_peripheral_select(unsigned int pdca_ch_number, unsigned int pid)
00177 {
00178
00179 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00180
00181 pdca_channel->psr = pid;
00182 }
00183
00184
00185 void pdca_set_transfer_size(unsigned int pdca_ch_number, unsigned int transfer_size)
00186 {
00187
00188 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00189
00190 pdca_channel->mr = (pdca_channel->mr & ~AVR32_PDCA_SIZE_MASK) |
00191 transfer_size << AVR32_PDCA_SIZE_OFFSET;
00192 }
00193
00194
00195 #if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED )
00196
00197
00198 void pdca_disable_event_trigger(unsigned int pdca_ch_number)
00199 {
00200
00201 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00202
00203 pdca_channel->mr &= ~AVR32_PDCA_ETRIG_MASK;
00204 }
00205
00206
00207 void pdca_enable_event_trigger(unsigned int pdca_ch_number)
00208 {
00209
00210 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00211
00212 pdca_channel->mr |= AVR32_PDCA_ETRIG_MASK;
00213 }
00214
00215
00216 #endif // #ifdef AVR32_PDCA_120_H_INCLUDED
00217
00218
00219 void pdca_disable_interrupt_transfer_error(unsigned int pdca_ch_number)
00220 {
00221
00222 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00223
00224 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00225
00226 if (global_interrupt_enabled) Disable_global_interrupt();
00227 pdca_channel->idr = AVR32_PDCA_TERR_MASK;
00228 pdca_channel->isr;
00229 if (global_interrupt_enabled) Enable_global_interrupt();
00230 }
00231
00232
00233 void pdca_enable_interrupt_transfer_error(unsigned int pdca_ch_number)
00234 {
00235
00236 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00237
00238 pdca_channel->ier = AVR32_PDCA_TERR_MASK;
00239 }
00240
00241
00242 void pdca_disable_interrupt_transfer_complete(unsigned int pdca_ch_number)
00243 {
00244
00245 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00246
00247 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00248
00249 if (global_interrupt_enabled) Disable_global_interrupt();
00250 pdca_channel->idr = AVR32_PDCA_TRC_MASK;
00251 pdca_channel->isr;
00252 if (global_interrupt_enabled) Enable_global_interrupt();
00253 }
00254
00255
00256 void pdca_enable_interrupt_transfer_complete(unsigned int pdca_ch_number)
00257 {
00258
00259 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00260
00261 pdca_channel->ier = AVR32_PDCA_TRC_MASK;
00262 }
00263
00264
00265 void pdca_disable_interrupt_reload_counter_zero(unsigned int pdca_ch_number)
00266 {
00267
00268 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00269
00270 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00271
00272 if (global_interrupt_enabled) Disable_global_interrupt();
00273 pdca_channel->idr = AVR32_PDCA_RCZ_MASK;
00274 pdca_channel->isr;
00275 if (global_interrupt_enabled) Enable_global_interrupt();
00276 }
00277
00278
00279 void pdca_enable_interrupt_reload_counter_zero(unsigned int pdca_ch_number)
00280 {
00281
00282 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00283
00284 pdca_channel->ier = AVR32_PDCA_RCZ_MASK;
00285 }
00286
00287
00288 unsigned long pdca_get_transfer_status(unsigned int pdca_ch_number)
00289 {
00290
00291 volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number);
00292
00293 return pdca_channel->isr;
00294 }