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 #include "power_clocks_lib.h"
00049
00050
00052 #if (( defined (__GNUC__) && ( defined (__AVR32_UC3L016__) || defined (__AVR32_UC3L032__) || defined (__AVR32_UC3L064__))) \
00053 ||(defined (__ICCAVR32__) && (defined (__AT32UC3L016__) || defined (__AT32UC3L032__) || defined (__AT32UC3L064__) )))
00054 static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param);
00055 #endif
00056
00057
00058 long int pcl_configure_clocks(pcl_freq_param_t *param)
00059 {
00060 #ifndef AVR32_PM_VERSION_RESETVALUE
00061
00062 return(pm_configure_clocks(param));
00063 #else
00064 #ifdef AVR32_PM_410_H_INCLUDED
00065
00066 #define PM_MAX_MUL ((1 << AVR32_SCIF_PLLMUL_SIZE) - 1)
00067 #define AVR32_PM_PBA_MAX_FREQ 66000000
00068 #define AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ 240000000
00069 #define AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ 33000000
00070 #define AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ 66000000
00071 #define AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ 160000000
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 unsigned long in_cpu_f = param->cpu_f;
00089 unsigned long in_osc0_f = param->osc0_f;
00090 unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0;
00091 unsigned long pll_freq, rest;
00092 Bool b_div2_pba, b_div2_cpu;
00093
00094
00095 scif_configure_osc_crystalmode(SCIF_OSC0, in_osc0_f);
00096
00097 scif_enable_osc(SCIF_OSC0, param->osc0_startup, true);
00098
00099 pm_set_mclk_source(PM_CLK_SRC_OSC0);
00100
00101
00102 if (in_cpu_f == in_osc0_f)
00103 {
00104 param->cpu_f = in_osc0_f;
00105 param->pba_f = in_osc0_f;
00106 return PASS;
00107 }
00108 else if (in_cpu_f < in_osc0_f)
00109 {
00110
00111 }
00112
00113 rest = in_cpu_f % in_osc0_f;
00114
00115 for (div = 1; div < 32; div++)
00116 {
00117 if ((div * rest) % in_osc0_f == 0)
00118 break;
00119 }
00120 if (div == 32)
00121 return FAIL;
00122
00123 mul = (in_cpu_f * div) / in_osc0_f;
00124
00125 if (mul > PM_MAX_MUL)
00126 return FAIL;
00127
00128
00129 while (!(div % 2))
00130 {
00131 div /= 2;
00132 div2_cpu++;
00133 }
00134
00135
00136
00137
00138
00139 while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ)
00140 {
00141 if (2 * mul > PM_MAX_MUL)
00142 break;
00143 mul *= 2;
00144 div2_cpu++;
00145 }
00146
00147 if (div2_cpu != 0)
00148 {
00149 div2_cpu--;
00150 div2_en = 1;
00151 }
00152
00153 pll_freq = in_osc0_f * mul / (div * (1 << div2_en));
00154
00155
00156 param->cpu_f = pll_freq / (1 << div2_cpu);
00157 mul--;
00158
00159 scif_pll_opt_t opt;
00160
00161 opt.osc = SCIF_OSC0,
00162 opt.lockcount = 16,
00163 opt.div = div,
00164 opt.mul = mul,
00165 opt.pll_div2 = div2_en,
00166 opt.pll_wbwdisable = 0,
00167 opt.pll_freq = (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0,
00168
00169
00170 scif_pll_setup(SCIF_PLL0, opt);
00171
00172
00173 scif_pll_enable(SCIF_PLL0);
00174
00175
00176 scif_wait_for_pll_locked(SCIF_PLL0) ;
00177
00178 rest = pll_freq;
00179 while (rest > AVR32_PM_PBA_MAX_FREQ ||
00180 rest != param->pba_f)
00181 {
00182 div2_pba++;
00183 rest = pll_freq / (1 << div2_pba);
00184 if (rest < param->pba_f)
00185 break;
00186 }
00187
00188
00189 param->pba_f = pll_freq / (1 << div2_pba);
00190
00191
00192 if (div2_cpu)
00193 {
00194 b_div2_cpu = TRUE;
00195 div2_cpu--;
00196 }
00197 else
00198 b_div2_cpu = FALSE;
00199
00200 if (div2_pba)
00201 {
00202 b_div2_pba = TRUE;
00203 div2_pba--;
00204 }
00205 else
00206 b_div2_pba = FALSE;
00207
00208 if (b_div2_cpu == TRUE )
00209 {
00210 pm_set_clk_domain_div(PM_CLK_DOMAIN_0, (pm_divratio_t) div2_cpu);
00211 pm_set_clk_domain_div(PM_CLK_DOMAIN_1, (pm_divratio_t) div2_cpu);
00212 pm_set_clk_domain_div(PM_CLK_DOMAIN_3, (pm_divratio_t) div2_cpu);
00213 }
00214 if (b_div2_pba == TRUE )
00215 {
00216 pm_set_clk_domain_div(PM_CLK_DOMAIN_2, (pm_divratio_t) div2_pba);
00217 pm_set_clk_domain_div(PM_CLK_DOMAIN_4, (pm_divratio_t) div2_pba);
00218 }
00219
00220 if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ)
00221 {
00222 flashc_set_wait_state(1);
00223 #if (defined AVR32_FLASHC_300_H_INCLUDED)
00224 if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ)
00225 flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1);
00226 else
00227 flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1);
00228 #endif
00229 }
00230 else
00231 {
00232 flashc_set_wait_state(0);
00233 #if (defined AVR32_FLASHC_300_H_INCLUDED)
00234 if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ)
00235 flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1);
00236 else
00237 flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1);
00238 #endif
00239 }
00240
00241
00242 pm_set_mclk_source(PM_CLK_SRC_PLL0);
00243
00244 return PASS;
00245 #else
00246 return(pcl_configure_clocks_uc3l(param));
00247 #endif
00248 #endif
00249 }
00250
00251
00253 #if (( defined (__GNUC__) && ( defined (__AVR32_UC3L016__) || defined (__AVR32_UC3L032__) || defined (__AVR32_UC3L064__))) \
00254 ||(defined (__ICCAVR32__) && (defined (__AT32UC3L016__) || defined (__AT32UC3L032__) || defined (__AT32UC3L064__) )))
00255
00256 static long int pcl_configure_synchronous_clocks( pm_clk_src_t main_clk_src,
00257 unsigned long main_clock_freq_hz,
00258 pcl_freq_param_t *param);
00259
00260 long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param)
00261 {
00262
00263
00264
00265
00266
00267
00268
00269
00270 #ifdef AVR32SFW_INPUT_CHECK
00271
00272 if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f))
00273 return(-1);
00274 #endif
00275
00276 #ifdef AVR32SFW_INPUT_CHECK
00277
00278 if((param->cpu_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pba_f > SCIF_SLOWCLOCK_FREQ_HZ)
00279 || (param->pbb_f > SCIF_SLOWCLOCK_FREQ_HZ))
00280 return(-1);
00281 #endif
00282
00283 return(pcl_configure_synchronous_clocks(PM_CLK_SRC_SLOW, SCIF_SLOWCLOCK_FREQ_HZ, param));
00284 }
00285
00286
00287 long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param)
00288 {
00289
00290
00291
00292
00293
00294
00295
00296
00297 #ifdef AVR32SFW_INPUT_CHECK
00298
00299 if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f))
00300 return(-1);
00301 #endif
00302
00303 #ifdef AVR32SFW_INPUT_CHECK
00304
00305 if((param->cpu_f > SCIF_RC120M_FREQ_HZ) || (param->pba_f > SCIF_RC120M_FREQ_HZ)
00306 || (param->pbb_f > SCIF_RC120M_FREQ_HZ))
00307 return(-1);
00308 #endif
00309
00310
00311 scif_start_rc120M();
00312
00313 return(pcl_configure_synchronous_clocks(PM_CLK_SRC_RC120M, SCIF_RC120M_FREQ_HZ, param));
00314 }
00315
00316
00317 long int pcl_configure_clocks_osc0(pcl_freq_param_t *param)
00318 {
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 unsigned long main_clock_freq;
00329
00330
00331 #ifdef AVR32SFW_INPUT_CHECK
00332
00333 if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f))
00334 return(-1);
00335 #endif
00336
00337 main_clock_freq = param->osc0_f;
00338 #ifdef AVR32SFW_INPUT_CHECK
00339
00340 if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq)
00341 || (param->pbb_f > main_clock_freq))
00342 return(-1);
00343 #endif
00344
00345 scif_configure_osc_crystalmode(SCIF_OSC0, main_clock_freq);
00346
00347 scif_enable_osc(SCIF_OSC0, param->osc0_startup, true);
00348
00349 return(pcl_configure_synchronous_clocks(PM_CLK_SRC_OSC0, main_clock_freq, param));
00350 }
00351
00352
00353 long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param)
00354 {
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 unsigned long main_clock_freq;
00365
00366
00367 #ifdef AVR32SFW_INPUT_CHECK
00368
00369 if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f))
00370 return(-1);
00371 #endif
00372
00373 main_clock_freq = param->dfll_f;
00374 #ifdef AVR32SFW_INPUT_CHECK
00375
00376 if((main_clock_freq > SCIF_DFLL_MAXFREQ_HZ) || (main_clock_freq < SCIF_DFLL_MINFREQ_HZ))
00377 return(-1);
00378
00379 if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq)
00380 || (param->pbb_f > main_clock_freq))
00381 return(-1);
00382 #endif
00383
00384
00385
00386 scif_dfll0_closedloop_configure_and_start(SCIF_DFLL_CLKREF_GC_SRC_115KHZ, main_clock_freq, TRUE);
00387
00388 return(pcl_configure_synchronous_clocks(PM_CLK_SRC_DFLL0, main_clock_freq, param));
00389 }
00390
00391
00392 static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param)
00393 {
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 #ifdef AVR32SFW_INPUT_CHECK
00415
00416 if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f))
00417 return(-1);
00418 #endif
00419
00420 if(PCL_MC_RCSYS == param->main_clk_src)
00421 {
00422 return(pcl_configure_clocks_rcsys(param));
00423 }
00424 else if(PCL_MC_RC120M == param->main_clk_src)
00425 {
00426 return(pcl_configure_clocks_rc120m(param));
00427 }
00428 else if(PCL_MC_OSC0 == param->main_clk_src)
00429 {
00430 return(pcl_configure_clocks_osc0(param));
00431 }
00432 else
00433 {
00434 return(pcl_configure_clocks_dfll0(param));
00435 }
00436 }
00437
00438
00439 static long int pcl_configure_synchronous_clocks(pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param)
00440 {
00441
00442
00443
00444 pm_set_all_cksel(main_clock_freq_hz, param->cpu_f, param->pba_f, param->pbb_f);
00445
00446
00447
00448
00449 flashcdw_set_flash_waitstate_and_readmode(param->cpu_f);
00450
00451
00452
00453
00454 pm_set_mclk_source(main_clk_src);
00455
00456 return PASS;
00457 }
00458
00459 #endif // UC3L device-specific implementation
00460
00461
00462 long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup)
00463 {
00464 #ifndef AVR32_PM_VERSION_RESETVALUE
00465
00466 if(PCL_OSC0 == osc)
00467 {
00468
00469
00470 pm_switch_to_osc0(&AVR32_PM, fcrystal, startup);
00471 }
00472 else
00473 {
00474 return PCL_NOT_SUPPORTED;
00475 }
00476 #else
00477
00478 #if AVR32_PM_VERSION_RESETVALUE < 0x400
00479 return PCL_NOT_SUPPORTED;
00480 #else
00481 if(PCL_OSC0 == osc)
00482 {
00483
00484 scif_configure_osc_crystalmode(SCIF_OSC0, fcrystal);
00485
00486 scif_enable_osc(SCIF_OSC0, startup, true);
00487
00488 flashcdw_set_flash_waitstate_and_readmode(fcrystal);
00489
00490 pm_set_mclk_source(PM_CLK_SRC_OSC0);
00491 }
00492 else
00493 {
00494 return PCL_NOT_SUPPORTED;
00495 }
00496 #endif
00497 #endif
00498 return PASS;
00499 }
00500
00501 long int pcl_configure_usb_clock(void)
00502 {
00503 #ifndef AVR32_PM_VERSION_RESETVALUE
00504
00505 pm_configure_usb_clock();
00506 #else
00507 #ifdef AVR32_PM_410_H_INCLUDED
00508 const scif_pll_opt_t opt = {
00509 .osc = SCIF_OSC0,
00510 .lockcount = 16,
00511 .div = 1,
00512 .mul = 5,
00513 .pll_div2 = 1,
00514 .pll_wbwdisable = 0,
00515 .pll_freq = 1,
00516 };
00517
00518
00519 scif_pll_setup(SCIF_PLL1, opt);
00520
00521
00522 scif_pll_enable(SCIF_PLL1);
00523
00524
00525 scif_wait_for_pll_locked(SCIF_PLL1) ;
00526
00527
00528
00529 scif_gc_setup(AVR32_SCIF_GCLK_USB,
00530 SCIF_GCCTRL_PLL1,
00531 AVR32_SCIF_GC_NO_DIV_CLOCK,
00532 0);
00533
00534 scif_gc_enable(AVR32_SCIF_GCLK_USB);
00535 #else
00536 return PCL_NOT_SUPPORTED;
00537 #endif
00538 #endif
00539 return PASS;
00540 }