00001
00002
00003
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 "pm.h"
00047
00048
00051
00052
00053 typedef union
00054 {
00055 unsigned long mcctrl;
00056 avr32_pm_mcctrl_t MCCTRL;
00057 } u_avr32_pm_mcctrl_t;
00058
00059 typedef union
00060 {
00061 unsigned long cksel;
00062 avr32_pm_cksel_t CKSEL;
00063 } u_avr32_pm_cksel_t;
00064
00065 typedef union
00066 {
00067 unsigned long pll;
00068 avr32_pm_pll_t PLL;
00069 } u_avr32_pm_pll_t;
00070
00071 typedef union
00072 {
00073 unsigned long oscctrl0;
00074 avr32_pm_oscctrl0_t OSCCTRL0;
00075 } u_avr32_pm_oscctrl0_t;
00076
00077 typedef union
00078 {
00079 unsigned long oscctrl1;
00080 avr32_pm_oscctrl1_t OSCCTRL1;
00081 } u_avr32_pm_oscctrl1_t;
00082
00083 typedef union
00084 {
00085 unsigned long oscctrl32;
00086 avr32_pm_oscctrl32_t OSCCTRL32;
00087 } u_avr32_pm_oscctrl32_t;
00088
00089 typedef union
00090 {
00091 unsigned long ier;
00092 avr32_pm_ier_t IER;
00093 } u_avr32_pm_ier_t;
00094
00095 typedef union
00096 {
00097 unsigned long idr;
00098 avr32_pm_idr_t IDR;
00099 } u_avr32_pm_idr_t;
00100
00101 typedef union
00102 {
00103 unsigned long icr;
00104 avr32_pm_icr_t ICR;
00105 } u_avr32_pm_icr_t;
00106
00107 typedef union
00108 {
00109 unsigned long gcctrl;
00110 avr32_pm_gcctrl_t GCCTRL;
00111 } u_avr32_pm_gcctrl_t;
00112
00113 typedef union
00114 {
00115 unsigned long rccr;
00116 avr32_pm_rccr_t RCCR;
00117 } u_avr32_pm_rccr_t;
00118
00119 typedef union
00120 {
00121 unsigned long bgcr;
00122 avr32_pm_bgcr_t BGCR;
00123 } u_avr32_pm_bgcr_t;
00124
00125 typedef union
00126 {
00127 unsigned long vregcr;
00128 avr32_pm_vregcr_t VREGCR;
00129 } u_avr32_pm_vregcr_t;
00130
00131 typedef union
00132 {
00133 unsigned long bod;
00134 avr32_pm_bod_t BOD;
00135 } u_avr32_pm_bod_t;
00136
00138
00139
00145 static void pm_set_osc0_mode(volatile avr32_pm_t *pm, unsigned int mode)
00146 {
00147
00148 u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0};
00149
00150 u_avr32_pm_oscctrl0.OSCCTRL0.mode = mode;
00151
00152 pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0;
00153 }
00154
00155
00156 void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm)
00157 {
00158 pm_set_osc0_mode(pm, AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK);
00159 }
00160
00161
00162 void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0)
00163 {
00164 pm_set_osc0_mode(pm, (fosc0 < 8000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2 :
00165 AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3);
00166 }
00167
00168
00169 void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup)
00170 {
00171 pm_enable_clk0_no_wait(pm, startup);
00172 pm_wait_for_clk0_ready(pm);
00173 }
00174
00175
00176 void pm_disable_clk0(volatile avr32_pm_t *pm)
00177 {
00178 pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC0EN_MASK;
00179 }
00180
00181
00182 void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup)
00183 {
00184
00185 u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0};
00186
00187 u_avr32_pm_oscctrl0.OSCCTRL0.startup = startup;
00188
00189 pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0;
00190
00191 pm->mcctrl |= AVR32_PM_MCCTRL_OSC0EN_MASK;
00192 }
00193
00194
00195 void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm)
00196 {
00197 while (!(pm->poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK));
00198 }
00199
00200
00206 static void pm_set_osc1_mode(volatile avr32_pm_t *pm, unsigned int mode)
00207 {
00208
00209 u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1};
00210
00211 u_avr32_pm_oscctrl1.OSCCTRL1.mode = mode;
00212
00213 pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1;
00214 }
00215
00216
00217 void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm)
00218 {
00219 pm_set_osc1_mode(pm, AVR32_PM_OSCCTRL1_MODE_EXT_CLOCK);
00220 }
00221
00222
00223 void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1)
00224 {
00225 pm_set_osc1_mode(pm, (fosc1 < 8000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G2 :
00226 AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G3);
00227 }
00228
00229
00230 void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup)
00231 {
00232 pm_enable_clk1_no_wait(pm, startup);
00233 pm_wait_for_clk1_ready(pm);
00234 }
00235
00236
00237 void pm_disable_clk1(volatile avr32_pm_t *pm)
00238 {
00239 pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC1EN_MASK;
00240 }
00241
00242
00243 void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup)
00244 {
00245
00246 u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1};
00247
00248 u_avr32_pm_oscctrl1.OSCCTRL1.startup = startup;
00249
00250 pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1;
00251
00252 pm->mcctrl |= AVR32_PM_MCCTRL_OSC1EN_MASK;
00253 }
00254
00255
00256 void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm)
00257 {
00258 while (!(pm->poscsr & AVR32_PM_POSCSR_OSC1RDY_MASK));
00259 }
00260
00261
00267 static void pm_set_osc32_mode(volatile avr32_pm_t *pm, unsigned int mode)
00268 {
00269
00270 u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32};
00271
00272 u_avr32_pm_oscctrl32.OSCCTRL32.mode = mode;
00273
00274 pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32;
00275 }
00276
00277
00278 void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm)
00279 {
00280 pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_EXT_CLOCK);
00281 }
00282
00283
00284 void pm_enable_osc32_crystal(volatile avr32_pm_t *pm)
00285 {
00286 pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_CRYSTAL);
00287 }
00288
00289
00290 void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup)
00291 {
00292 pm_enable_clk32_no_wait(pm, startup);
00293 pm_wait_for_clk32_ready(pm);
00294 }
00295
00296
00297 void pm_disable_clk32(volatile avr32_pm_t *pm)
00298 {
00299 pm->oscctrl32 &= ~AVR32_PM_OSCCTRL32_OSC32EN_MASK;
00300 }
00301
00302
00303 void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup)
00304 {
00305
00306 u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32};
00307
00308 u_avr32_pm_oscctrl32.OSCCTRL32.osc32en = 1;
00309 u_avr32_pm_oscctrl32.OSCCTRL32.startup = startup;
00310
00311 pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32;
00312 }
00313
00314
00315 void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm)
00316 {
00317 while (!(pm->poscsr & AVR32_PM_POSCSR_OSC32RDY_MASK));
00318 }
00319
00320
00321 void pm_cksel(volatile avr32_pm_t *pm,
00322 unsigned int pbadiv,
00323 unsigned int pbasel,
00324 unsigned int pbbdiv,
00325 unsigned int pbbsel,
00326 unsigned int hsbdiv,
00327 unsigned int hsbsel)
00328 {
00329 u_avr32_pm_cksel_t u_avr32_pm_cksel = {0};
00330
00331 u_avr32_pm_cksel.CKSEL.cpusel = hsbsel;
00332 u_avr32_pm_cksel.CKSEL.cpudiv = hsbdiv;
00333 u_avr32_pm_cksel.CKSEL.hsbsel = hsbsel;
00334 u_avr32_pm_cksel.CKSEL.hsbdiv = hsbdiv;
00335 u_avr32_pm_cksel.CKSEL.pbasel = pbasel;
00336 u_avr32_pm_cksel.CKSEL.pbadiv = pbadiv;
00337 u_avr32_pm_cksel.CKSEL.pbbsel = pbbsel;
00338 u_avr32_pm_cksel.CKSEL.pbbdiv = pbbdiv;
00339
00340 pm->cksel = u_avr32_pm_cksel.cksel;
00341
00342
00343 while (!(pm->poscsr & AVR32_PM_POSCSR_CKRDY_MASK));
00344 }
00345
00346
00347 void pm_gc_setup(volatile avr32_pm_t *pm,
00348 unsigned int gc,
00349 unsigned int osc_or_pll,
00350 unsigned int pll_osc,
00351 unsigned int diven,
00352 unsigned int div)
00353 {
00354 u_avr32_pm_gcctrl_t u_avr32_pm_gcctrl = {0};
00355
00356 u_avr32_pm_gcctrl.GCCTRL.oscsel = pll_osc;
00357 u_avr32_pm_gcctrl.GCCTRL.pllsel = osc_or_pll;
00358 u_avr32_pm_gcctrl.GCCTRL.diven = diven;
00359 u_avr32_pm_gcctrl.GCCTRL.div = div;
00360
00361 pm->gcctrl[gc] = u_avr32_pm_gcctrl.gcctrl;
00362 }
00363
00364
00365 void pm_gc_enable(volatile avr32_pm_t *pm,
00366 unsigned int gc)
00367 {
00368 pm->gcctrl[gc] |= AVR32_PM_GCCTRL_CEN_MASK;
00369 }
00370
00371
00372 void pm_gc_disable(volatile avr32_pm_t *pm,
00373 unsigned int gc)
00374 {
00375 pm->gcctrl[gc] &= ~AVR32_PM_GCCTRL_CEN_MASK;
00376 }
00377
00378
00379 void pm_pll_setup(volatile avr32_pm_t *pm,
00380 unsigned int pll,
00381 unsigned int mul,
00382 unsigned int div,
00383 unsigned int osc,
00384 unsigned int lockcount)
00385 {
00386 u_avr32_pm_pll_t u_avr32_pm_pll = {0};
00387
00388 u_avr32_pm_pll.PLL.pllosc = osc;
00389 u_avr32_pm_pll.PLL.plldiv = div;
00390 u_avr32_pm_pll.PLL.pllmul = mul;
00391 u_avr32_pm_pll.PLL.pllcount = lockcount;
00392
00393 pm->pll[pll] = u_avr32_pm_pll.pll;
00394 }
00395
00396
00397 void pm_pll_set_option(volatile avr32_pm_t *pm,
00398 unsigned int pll,
00399 unsigned int pll_freq,
00400 unsigned int pll_div2,
00401 unsigned int pll_wbwdisable)
00402 {
00403 u_avr32_pm_pll_t u_avr32_pm_pll = {pm->pll[pll]};
00404 u_avr32_pm_pll.PLL.pllopt = pll_freq | (pll_div2 << 1) | (pll_wbwdisable << 2);
00405 pm->pll[pll] = u_avr32_pm_pll.pll;
00406 }
00407
00408
00409 unsigned int pm_pll_get_option(volatile avr32_pm_t *pm,
00410 unsigned int pll)
00411 {
00412 return (pm->pll[pll] & AVR32_PM_PLLOPT_MASK) >> AVR32_PM_PLLOPT_OFFSET;
00413 }
00414
00415
00416 void pm_pll_enable(volatile avr32_pm_t *pm,
00417 unsigned int pll)
00418 {
00419 pm->pll[pll] |= AVR32_PM_PLLEN_MASK;
00420 }
00421
00422
00423 void pm_pll_disable(volatile avr32_pm_t *pm,
00424 unsigned int pll)
00425 {
00426 pm->pll[pll] &= ~AVR32_PM_PLLEN_MASK;
00427 }
00428
00429
00430 void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm)
00431 {
00432 while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK0_MASK));
00433
00434
00435 pm->pll[0] |= AVR32_PM_PLL0_PLLBPL_MASK;
00436 }
00437
00438
00439 void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm)
00440 {
00441 while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK1_MASK));
00442
00443
00444 pm->pll[1] |= AVR32_PM_PLL1_PLLBPL_MASK;
00445 }
00446
00447
00448 void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock)
00449 {
00450
00451 u_avr32_pm_mcctrl_t u_avr32_pm_mcctrl = {pm->mcctrl};
00452
00453 u_avr32_pm_mcctrl.MCCTRL.mcsel = clock;
00454
00455 pm->mcctrl = u_avr32_pm_mcctrl.mcctrl;
00456 }
00457
00458
00459 void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup)
00460 {
00461 pm_enable_osc0_crystal(pm, fosc0);
00462 pm_enable_clk0(pm, startup);
00463 pm_switch_to_clock(pm, AVR32_PM_MCSEL_OSC0);
00464 }
00465
00466
00467 void pm_bod_enable_irq(volatile avr32_pm_t *pm)
00468 {
00469 pm->ier = AVR32_PM_IER_BODDET_MASK;
00470 }
00471
00472
00473 void pm_bod_disable_irq(volatile avr32_pm_t *pm)
00474 {
00475 pm->idr = AVR32_PM_IDR_BODDET_MASK;
00476 }
00477
00478
00479 void pm_bod_clear_irq(volatile avr32_pm_t *pm)
00480 {
00481 pm->icr = AVR32_PM_ICR_BODDET_MASK;
00482 }
00483
00484
00485 unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm)
00486 {
00487 return ((pm->isr & AVR32_PM_ISR_BODDET_MASK) != 0);
00488 }
00489
00490
00491 unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm)
00492 {
00493 return ((pm->imr & AVR32_PM_IMR_BODDET_MASK) != 0);
00494 }
00495
00496
00497 unsigned long pm_bod_get_level(volatile avr32_pm_t *pm)
00498 {
00499 return (pm->bod & AVR32_PM_BOD_LEVEL_MASK) >> AVR32_PM_BOD_LEVEL_OFFSET;
00500 }
00501
00502
00503 void pm_write_gplp(volatile avr32_pm_t *pm,unsigned long gplp, unsigned long value)
00504 {
00505 pm->gplp[gplp] = value;
00506 }
00507
00508
00509 unsigned long pm_read_gplp(volatile avr32_pm_t *pm,unsigned long gplp)
00510 {
00511 return pm->gplp[gplp];
00512 }