00001
00016
00017
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 #include "compiler.h"
00048 #include "scif_uc3l.h"
00049
00050
00053
00054
00055 typedef union
00056 {
00057 unsigned long oscctrl0;
00058 avr32_scif_oscctrl0_t OSCCTRL0;
00059 } u_avr32_scif_oscctrl0_t;
00060
00061 typedef union
00062 {
00063 unsigned long oscctrl32;
00064 avr32_scif_oscctrl32_t OSCCTRL32;
00065 } u_avr32_scif_oscctrl32_t;
00066
00067 typedef union
00068 {
00069 unsigned long dfll0conf;
00070 avr32_scif_dfll0conf_t DFLL0CONF;
00071 } u_avr32_scif_dfll0conf_t;
00072
00073 typedef union
00074 {
00075 unsigned long dfll0ssg;
00076 avr32_scif_dfll0ssg_t DFLL0SSG;
00077 } u_avr32_scif_dfll0ssg_t;
00078
00080
00081
00085
00086
00087
00091
00092
00093
00098 long int scif_start_osc(scif_osc_t osc, const scif_osc_opt_t *opt, bool wait_for_ready)
00099 {
00100
00101
00102 u_avr32_scif_oscctrl0_t u_avr32_scif_oscctrl0 = {AVR32_SCIF.oscctrl0};
00103
00104
00105 #ifdef AVR32SFW_INPUT_CHECK
00106
00107 if( (opt->freq_hz < SCIF_EXT_CRYSTAL_MIN_FREQ_HZ)
00108 || (opt->freq_hz > SCIF_EXT_CRYSTAL_MAX_FREQ_HZ))
00109 {
00110 return -1;
00111 }
00112
00113 if( (opt->mode != SCIF_OSC_MODE_EXT_CLK)
00114 && (opt->mode != SCIF_OSC_MODE_2PIN_CRYSTAL))
00115 {
00116 return -1;
00117 }
00118
00119 if(opt->startup > (unsigned char)AVR32_SCIF_OSCCTRL0_STARTUP_16384_RCOSC)
00120 {
00121 return -1;
00122 }
00123
00124 if(opt->gain > AVR32_SCIF_OSCCTRL0_GAIN_G3)
00125 {
00126 return -1;
00127 }
00128 #endif // AVR32SFW_INPUT_CHECK
00129
00130
00131 u_avr32_scif_oscctrl0.OSCCTRL0.mode = opt->mode;
00132 u_avr32_scif_oscctrl0.OSCCTRL0.gain = opt->gain;
00133 u_avr32_scif_oscctrl0.OSCCTRL0.startup = opt->startup;
00134 u_avr32_scif_oscctrl0.OSCCTRL0.oscen = ENABLE;
00135 AVR32_ENTER_CRITICAL_REGION( );
00136
00137 SCIF_UNLOCK(AVR32_SCIF_OSCCTRL0);
00138
00139 AVR32_SCIF.oscctrl0 = u_avr32_scif_oscctrl0.oscctrl0;
00140 AVR32_LEAVE_CRITICAL_REGION( );
00141
00142 if(true == wait_for_ready)
00143 {
00144
00145 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_OSC0RDY_MASK))
00146 return -1;
00147 }
00148
00149 return PASS;
00150 }
00151
00152
00153 bool scif_is_osc_ready(scif_osc_t osc)
00154 {
00155
00156
00157 return((AVR32_SCIF.pclksr & AVR32_SCIF_PCLKSR_OSC0RDY_MASK)>>AVR32_SCIF_PCLKSR_OSC0RDY_OFFSET);
00158 }
00159
00160
00161 long int scif_stop_osc(scif_osc_t osc)
00162 {
00163
00164
00165 unsigned long temp = AVR32_SCIF.oscctrl0;
00166 temp &= ~AVR32_SCIF_OSCCTRL0_OSCEN_MASK;
00167
00168 AVR32_ENTER_CRITICAL_REGION( );
00169
00170 SCIF_UNLOCK(AVR32_SCIF_OSCCTRL0);
00171
00172 AVR32_SCIF.oscctrl0 = temp;
00173 AVR32_LEAVE_CRITICAL_REGION( );
00174
00175 return PASS;
00176 }
00177
00178
00179 long int scif_configure_osc_crystalmode(scif_osc_t osc, unsigned int fcrystal)
00180 {
00181
00182
00183 u_avr32_scif_oscctrl0_t u_avr32_scif_oscctrl0 = {AVR32_SCIF.oscctrl0};
00184
00185
00186
00187 u_avr32_scif_oscctrl0.OSCCTRL0.mode = SCIF_OSC_MODE_2PIN_CRYSTAL;
00188 u_avr32_scif_oscctrl0.OSCCTRL0.gain = (fcrystal < 900000) ? AVR32_SCIF_OSCCTRL0_GAIN_G0 :
00189 (fcrystal < 3000000) ? AVR32_SCIF_OSCCTRL0_GAIN_G1 :
00190 (fcrystal < 8000000) ? AVR32_SCIF_OSCCTRL0_GAIN_G2 :
00191 AVR32_SCIF_OSCCTRL0_GAIN_G3;
00192 AVR32_ENTER_CRITICAL_REGION( );
00193
00194 SCIF_UNLOCK(AVR32_SCIF_OSCCTRL0);
00195
00196 AVR32_SCIF.oscctrl0 = u_avr32_scif_oscctrl0.oscctrl0;
00197 AVR32_LEAVE_CRITICAL_REGION( );
00198
00199
00200 return PASS;
00201 }
00202
00203
00204 long int scif_enable_osc(scif_osc_t osc, unsigned int startup, bool wait_for_ready)
00205 {
00206
00207
00208 u_avr32_scif_oscctrl0_t u_avr32_scif_oscctrl0 = {AVR32_SCIF.oscctrl0};
00209
00210
00211
00212 u_avr32_scif_oscctrl0.OSCCTRL0.startup = startup;
00213 u_avr32_scif_oscctrl0.OSCCTRL0.oscen = ENABLE;
00214 AVR32_ENTER_CRITICAL_REGION( );
00215
00216 SCIF_UNLOCK(AVR32_SCIF_OSCCTRL0);
00217
00218 AVR32_SCIF.oscctrl0 = u_avr32_scif_oscctrl0.oscctrl0;
00219 AVR32_LEAVE_CRITICAL_REGION( );
00220
00221 if(true == wait_for_ready)
00222 {
00223
00224 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_OSC0RDY_MASK))
00225 return -1;
00226 }
00227
00228 return PASS;
00229 }
00230
00231
00236 long int scif_start_osc32(const scif_osc32_opt_t *opt, bool wait_for_ready)
00237 {
00238 u_avr32_scif_oscctrl32_t u_avr32_scif_oscctrl32 = {AVR32_SCIF.oscctrl32};
00239
00240
00241 #ifdef AVR32SFW_INPUT_CHECK
00242
00243 if( (opt->freq_hz < SCIF_EXT_CRYSTAL_MIN_FREQ_HZ)
00244 || (opt->freq_hz > SCIF_EXT_CRYSTAL_MAX_FREQ_HZ))
00245 {
00246 return -1;
00247 }
00248
00249 if( (opt->mode < SCIF_OSC_MODE_EXT_CLK)
00250 || (opt->mode > SCIF_OSC_MODE_2PIN_CRYSTAL)
00251 || (opt->mode == SCIF_OSC_MODE_NOT_SUPPORTED_1)
00252 || (opt->mode == SCIF_OSC_MODE_NOT_SUPPORTED_2) )
00253 {
00254 return -1;
00255 }
00256
00257 if(opt->startup > (unsigned char)AVR32_SCIF_OSCCTRL32_STARTUP_524288_RCOSC)
00258 {
00259 return -1;
00260 }
00261 #endif // AVR32SFW_INPUT_CHECK
00262
00263
00264 u_avr32_scif_oscctrl32.OSCCTRL32.mode = opt->mode;
00265 u_avr32_scif_oscctrl32.OSCCTRL32.pinsel = opt->pinsel;
00266 u_avr32_scif_oscctrl32.OSCCTRL32.en32k = opt->en32k;
00267 u_avr32_scif_oscctrl32.OSCCTRL32.en1k = opt->en1k;
00268 u_avr32_scif_oscctrl32.OSCCTRL32.startup = opt->startup;
00269 u_avr32_scif_oscctrl32.OSCCTRL32.osc32en = ENABLE;
00270 #if 0
00271 AVR32_ENTER_CRITICAL_REGION( );
00272
00273 SCIF_UNLOCK(AVR32_SCIF_OSCCTRL32);
00274 #endif
00275
00276 AVR32_SCIF.oscctrl32 = u_avr32_scif_oscctrl32.oscctrl32;
00277 #if 0
00278 AVR32_LEAVE_CRITICAL_REGION( );
00279 #endif
00280
00281 if(true == wait_for_ready)
00282 {
00283
00284 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_OSC32RDY_MASK))
00285 return -1;
00286 }
00287
00288 return PASS;
00289 }
00290
00291
00292 long scif_stop_osc32()
00293 {
00294 unsigned long temp = AVR32_SCIF.oscctrl32;
00295 temp &= ~AVR32_SCIF_OSCCTRL32_OSC32EN_MASK;
00296
00297 #if 0
00298 AVR32_ENTER_CRITICAL_REGION( );
00299
00300 SCIF_UNLOCK(AVR32_SCIF_OSCCTRL32);
00301 #endif
00302
00303 AVR32_SCIF.oscctrl32 = temp;
00304 #if 0
00305 AVR32_LEAVE_CRITICAL_REGION( );
00306 #endif
00307
00308 return PASS;
00309 }
00310
00311
00312
00317
00318 typedef enum
00319 {
00320 SCIF_DFLL0_MODE_OPENLOOP = 0,
00321 SCIF_DFLL0_MODE_CLOSEDLOOP
00322 } scif_dfll_mode_t;
00323
00324 long int scif_dfll0_openloop_start(const scif_dfll_openloop_conf_t *pdfllconfig)
00325 {
00326 u_avr32_scif_dfll0conf_t u_avr32_scif_dfll0conf = {AVR32_SCIF.dfll0conf};
00327
00328
00329 #ifdef AVR32SFW_INPUT_CHECK
00330 if((pdfllconfig->fine >> AVR32_SCIF_DFLL0CONF_FINE_SIZE))
00331 return -1;
00332 if((pdfllconfig->coarse >> AVR32_SCIF_DFLL0CONF_COARSE_SIZE))
00333 return -1;
00334 #endif
00335
00336
00337 u_avr32_scif_dfll0conf.DFLL0CONF.en = ENABLE;
00338 AVR32_ENTER_CRITICAL_REGION( );
00339 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00340 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00341 AVR32_LEAVE_CRITICAL_REGION( );
00342
00343
00344 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00345 return -1;
00346
00347
00348 u_avr32_scif_dfll0conf.DFLL0CONF.mode = SCIF_DFLL0_MODE_OPENLOOP;
00349 AVR32_ENTER_CRITICAL_REGION( );
00350 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00351 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00352 AVR32_LEAVE_CRITICAL_REGION( );
00353
00354
00355 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00356 return -1;
00357
00358
00359 u_avr32_scif_dfll0conf.DFLL0CONF.coarse = pdfllconfig->coarse;
00360 u_avr32_scif_dfll0conf.DFLL0CONF.fine = pdfllconfig->fine;
00361 AVR32_ENTER_CRITICAL_REGION( );
00362 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00363 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00364 AVR32_LEAVE_CRITICAL_REGION( );
00365
00366
00367 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00368 return -1;
00369
00370 return PASS;
00371 }
00372
00373
00374 #define SCIF_DFLL_COARSE_MAX (AVR32_SCIF_COARSE_MASK >> AVR32_SCIF_COARSE_OFFSET)
00375 #define SCIF_DFLL_FINE_MAX (AVR32_SCIF_FINE_MASK >> AVR32_SCIF_FINE_OFFSET)
00376 #define SCIF_DFLL_FINE_HALF (1 << (AVR32_SCIF_DFLL0CONF_FINE_SIZE-1))
00377 long int scif_dfll0_openloop_start_auto(unsigned long TargetFreqkHz)
00378 {
00379 scif_dfll_openloop_conf_t Dfll0Conf;
00380 unsigned long Coarse;
00381 unsigned long Fine;
00382 unsigned long CoarseFreq;
00383 unsigned long DeltaFreq;
00384
00385
00386 #ifdef AVR32SFW_INPUT_CHECK
00387 if((TargetFreqkHz < SCIF_DFLL_MINFREQ_KHZ) || (TargetFreqkHz > SCIF_DFLL_MAXFREQ_KHZ))
00388 return -1;
00389 #endif
00390
00391
00392
00393
00394
00395
00396
00397 Coarse = ((TargetFreqkHz - SCIF_DFLL_MINFREQ_KHZ)*SCIF_DFLL_COARSE_MAX)/(SCIF_DFLL_MAXFREQ_KHZ - SCIF_DFLL_MINFREQ_KHZ);
00398
00399 CoarseFreq = SCIF_DFLL_MINFREQ_KHZ + (((SCIF_DFLL_MAXFREQ_KHZ - SCIF_DFLL_MINFREQ_KHZ)/SCIF_DFLL_COARSE_MAX)*Coarse);
00400
00401 DeltaFreq = TargetFreqkHz - CoarseFreq;
00402
00403
00404
00405
00406 Fine = ((DeltaFreq*SCIF_DFLL_FINE_MAX)*2/CoarseFreq*5) + SCIF_DFLL_FINE_HALF;
00407 Fine >>=2;
00408
00409 Dfll0Conf.coarse = Coarse;
00410 Dfll0Conf.fine = Fine;
00411 return(scif_dfll0_openloop_start(&Dfll0Conf));
00412 }
00413
00414 long int scif_dfll0_openloop_updatefreq(const scif_dfll_openloop_conf_t *pdfllconfig)
00415 {
00416 u_avr32_scif_dfll0conf_t u_avr32_scif_dfll0conf = {AVR32_SCIF.dfll0conf};
00417
00418
00419 #ifdef AVR32SFW_INPUT_CHECK
00420 if((pdfllconfig->fine >> AVR32_SCIF_DFLL0CONF_FINE_SIZE))
00421 return -1;
00422 #endif
00423
00424
00425
00426
00427 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00428 return -1;
00429
00430
00431 u_avr32_scif_dfll0conf.DFLL0CONF.coarse = pdfllconfig->coarse;
00432 u_avr32_scif_dfll0conf.DFLL0CONF.fine = pdfllconfig->fine;
00433 AVR32_ENTER_CRITICAL_REGION( );
00434 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00435 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00436 AVR32_LEAVE_CRITICAL_REGION( );
00437
00438
00439 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00440 return -1;
00441
00442 return PASS;
00443 }
00444
00445
00446 long int scif_dfll0_openloop_stop(void)
00447 {
00448 u_avr32_scif_dfll0conf_t u_avr32_scif_dfll0conf = {AVR32_SCIF.dfll0conf};
00449
00450
00451
00452
00453
00454
00455 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00456 return -1;
00457
00458
00459 u_avr32_scif_dfll0conf.DFLL0CONF.coarse = 0;
00460 AVR32_ENTER_CRITICAL_REGION( );
00461 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00462 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00463 AVR32_LEAVE_CRITICAL_REGION( );
00464
00465
00466 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00467 return -1;
00468
00469
00470 u_avr32_scif_dfll0conf.DFLL0CONF.en = 0;
00471 AVR32_ENTER_CRITICAL_REGION( );
00472 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00473 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00474 AVR32_LEAVE_CRITICAL_REGION( );
00475
00476
00477 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00478 return -1;
00479
00480 return PASS;
00481 }
00482
00483
00484 long int scif_dfll0_ssg_gc_enable(void)
00485 {
00486 scif_gclk_opt_t GcConf = {
00487 SCIF_GCCTRL_SLOWCLOCK,
00488 0,
00489 DISABLE
00490 };
00491
00492
00493
00494
00495
00496 return(scif_start_gclk(AVR32_SCIF_GCLK_DFLL0_SSG, &GcConf));
00497 }
00498
00499
00500 long int scif_dfll0_ssg_enable(scif_dfll_ssg_conf_t *pssg_conf)
00501 {
00502 u_avr32_scif_dfll0ssg_t u_avr32_scif_dfll0ssg = {AVR32_SCIF.dfll0ssg};
00503
00504
00505 u_avr32_scif_dfll0ssg.DFLL0SSG.en = ENABLE;
00506 u_avr32_scif_dfll0ssg.DFLL0SSG.prbs = pssg_conf->use_random;
00507 u_avr32_scif_dfll0ssg.DFLL0SSG.amplitude = pssg_conf->amplitude;
00508 u_avr32_scif_dfll0ssg.DFLL0SSG.stepsize = pssg_conf->step_size;
00509 AVR32_ENTER_CRITICAL_REGION( );
00510 SCIF_UNLOCK(AVR32_SCIF_DFLL0SSG);
00511 AVR32_SCIF.dfll0ssg = u_avr32_scif_dfll0ssg.dfll0ssg;
00512 AVR32_LEAVE_CRITICAL_REGION( );
00513
00514 return PASS;
00515 }
00516
00517
00518 long int scif_dfll0_closedloop_start(const scif_dfll_closedloop_conf_t *pdfllconfig)
00519 {
00520 u_avr32_scif_dfll0conf_t u_avr32_scif_dfll0conf = {AVR32_SCIF.dfll0conf};
00521
00522
00523 #ifdef AVR32SFW_INPUT_CHECK
00524 if((pdfllconfig->coarse >> AVR32_SCIF_DFLL0CONF_COARSE_SIZE))
00525 return -1;
00526 if((pdfllconfig->maxstep >> AVR32_SCIF_DFLL0STEP_MAXSTEP_SIZE))
00527 return -1;
00528 #endif
00529
00530
00531 u_avr32_scif_dfll0conf.DFLL0CONF.en = ENABLE;
00532 AVR32_ENTER_CRITICAL_REGION( );
00533 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00534 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00535 AVR32_LEAVE_CRITICAL_REGION( );
00536
00537
00538 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00539 return -1;
00540
00541
00542 AVR32_ENTER_CRITICAL_REGION( );
00543 SCIF_UNLOCK(AVR32_SCIF_MAXSTEP);
00544 AVR32_SCIF.dfll0step = (pdfllconfig->maxstep << AVR32_SCIF_DFLL0STEP_MAXSTEP_OFFSET)&AVR32_SCIF_DFLL0STEP_MAXSTEP_MASK;
00545 AVR32_LEAVE_CRITICAL_REGION( );
00546
00547
00548 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00549 return -1;
00550
00551
00552 AVR32_ENTER_CRITICAL_REGION( );
00553 SCIF_UNLOCK(AVR32_SCIF_DFLL0FMUL);
00554 AVR32_SCIF.dfll0fmul = (pdfllconfig->fmul << AVR32_SCIF_DFLL0FMUL_FMUL_OFFSET)&AVR32_SCIF_DFLL0FMUL_FMUL_MASK;
00555 AVR32_LEAVE_CRITICAL_REGION( );
00556
00557
00558 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00559 return -1;
00560
00561
00562 u_avr32_scif_dfll0conf.DFLL0CONF.mode = SCIF_DFLL0_MODE_CLOSEDLOOP;
00563 u_avr32_scif_dfll0conf.DFLL0CONF.coarse = pdfllconfig->coarse;
00564 AVR32_ENTER_CRITICAL_REGION( );
00565 SCIF_UNLOCK(AVR32_SCIF_DFLL0CONF);
00566 AVR32_SCIF.dfll0conf = u_avr32_scif_dfll0conf.dfll0conf;
00567 AVR32_LEAVE_CRITICAL_REGION( );
00568
00569
00570 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0RDY_MASK))
00571 return -1;
00572
00573
00574
00575 if(scif_pclksr_statushigh_wait(AVR32_SCIF_PCLKSR_DFLL0LOCKF_MASK))
00576 return -1;
00577
00578 return PASS;
00579 }
00580
00581
00582 long int scif_dfll0_closedloop_configure_and_start( scif_dfll_clkref_t dfll_main_ref_gc,
00583 unsigned long long target_freq_hz,
00584 bool enable_ssg)
00585 {
00586 scif_dfll_closedloop_conf_t DfllConfig;
00587 scif_gclk_opt_t GcConf = { (scif_gcctrl_oscsel_t)dfll_main_ref_gc, 0, OFF };
00588
00589
00590
00591
00592
00593 if(scif_dfll0_closedloop_mainref_gc_enable(&GcConf))
00594 return(-1);
00595
00596
00597
00598 DfllConfig.coarse = ((unsigned long long)(target_freq_hz - SCIF_DFLL_MINFREQ_HZ)*255)/(SCIF_DFLL_MAXFREQ_HZ - SCIF_DFLL_MINFREQ_HZ);
00599
00600
00601
00602 if(SCIF_DFLL_CLKREF_GC_SRC_115KHZ==dfll_main_ref_gc)
00603 DfllConfig.fmul = ((unsigned long long)target_freq_hz<<16)/SCIF_SLOWCLOCK_FREQ_HZ;
00604 else
00605 DfllConfig.fmul = ((unsigned long long)target_freq_hz<<16)/SCIF_RC32K_FREQ_HZ;
00606
00607
00608
00609
00610
00611
00612
00613 DfllConfig.maxstep = 0x0040004;
00614
00615
00616
00617
00618
00619
00620
00621
00622 if(scif_dfll0_closedloop_start(&DfllConfig))
00623 return -1;
00624
00625
00626
00627 if(TRUE == enable_ssg)
00628 {
00629 ;
00630 }
00631 return PASS;
00632 }
00633
00648 void scif_start_rc120M(void)
00649 {
00650 AVR32_ENTER_CRITICAL_REGION( );
00651
00652 SCIF_UNLOCK(AVR32_SCIF_RC120MCR);
00653 AVR32_SCIF.rc120mcr = AVR32_SCIF_RC120MCR_EN_MASK;
00654 AVR32_LEAVE_CRITICAL_REGION( );
00655 }
00656
00657 void scif_stop_rc120M(void)
00658 {
00659 unsigned long temp = AVR32_SCIF.rc120mcr;
00660
00661 temp &= ~AVR32_SCIF_RC120MCR_EN_MASK;
00662 AVR32_ENTER_CRITICAL_REGION( );
00663
00664 SCIF_UNLOCK(AVR32_SCIF_RC120MCR);
00665 AVR32_SCIF.rc120mcr = temp;
00666 AVR32_LEAVE_CRITICAL_REGION( );
00667 }
00668
00669
00670
00674 void scif_start_rc32k(void)
00675 {
00676 AVR32_ENTER_CRITICAL_REGION( );
00677
00678 SCIF_UNLOCK(AVR32_SCIF_RC32KCR);
00679 AVR32_SCIF.rc32kcr = AVR32_SCIF_RC32KCR_EN_MASK;
00680 AVR32_LEAVE_CRITICAL_REGION( );
00681 }
00682
00683 void scif_stop_rc32k(void)
00684 {
00685 unsigned long temp = AVR32_SCIF.rc32kcr;
00686
00687 temp &= ~AVR32_SCIF_RC32KCR_EN_MASK;
00688 AVR32_ENTER_CRITICAL_REGION( );
00689
00690 SCIF_UNLOCK(AVR32_SCIF_RC32KCR);
00691 AVR32_SCIF.rc32kcr = temp;
00692 AVR32_LEAVE_CRITICAL_REGION( );
00693 }
00694
00695
00696
00701 long int scif_start_gclk(unsigned int gclk, const scif_gclk_opt_t *opt)
00702 {
00703 #ifdef AVR32SFW_INPUT_CHECK
00704
00705 if( gclk > AVR32_SCIF_GCLK_NUM )
00706 {
00707 return -1;
00708 }
00709
00710 if(( opt->clock_source >= SCIF_GCCTRL_OSCSEL_INVALID ) || ( opt->clock_source < 0 ))
00711 {
00712 return -1;
00713 }
00714 #endif // AVR32SFW_INPUT_CHECK
00715
00716
00717 if(AVR32_SCIF.gcctrl[gclk] & AVR32_SCIF_GCCTRL_CEN_MASK)
00718 return -1;
00719
00720
00721 AVR32_SCIF.gcctrl[gclk] = ((opt->divider << AVR32_SCIF_GCCTRL_DIV_OFFSET)&AVR32_SCIF_GCCTRL_DIV_MASK)
00722 |((opt->diven << AVR32_SCIF_GCCTRL_DIVEN_OFFSET)&AVR32_SCIF_GCCTRL_DIVEN_MASK)
00723 |((opt->clock_source << AVR32_SCIF_GCCTRL_OSCSEL_OFFSET)&AVR32_SCIF_GCCTRL_OSCSEL_MASK)
00724 |(AVR32_SCIF_GCCTRL_CEN_MASK);
00725
00726 return PASS;
00727 }
00728
00729
00730 long int scif_stop_gclk(unsigned int gclk)
00731 {
00732 unsigned int timeout = SCIF_POLL_TIMEOUT;
00733
00734 #ifdef AVR32SFW_INPUT_CHECK
00735
00736 if( gclk > AVR32_SCIF_GCLK_NUM )
00737 {
00738 return -1;
00739 }
00740 #endif // AVR32SFW_INPUT_CHECK
00741
00742
00743 AVR32_SCIF.gcctrl[gclk] &= ~AVR32_SCIF_GCCTRL_CEN_MASK;
00744
00745
00746 while(AVR32_SCIF.gcctrl[gclk] & AVR32_SCIF_GCCTRL_CEN_MASK)
00747 {
00748 if(--timeout == 0)
00749 return -1;
00750 }
00751
00752 return PASS;
00753 }
00754
00755
00756 long int scif_gc_setup(unsigned int gclk, scif_gcctrl_oscsel_t clk_src, unsigned int diven, unsigned int divfactor)
00757 {
00758 int restart_gc = false;
00759
00760
00761
00762 divfactor = (divfactor>>1) -1;
00763
00764 #ifdef AVR32SFW_INPUT_CHECK
00765
00766 if( gclk > AVR32_SCIF_GCLK_NUM )
00767 {
00768 return -1;
00769 }
00770
00771 if(( clk_src >= SCIF_GCCTRL_OSCSEL_INVALID ) || ( clk_src < 0 ))
00772 {
00773 return -1;
00774 }
00775
00776 if(diven)
00777 {
00778 if(divfactor >= (1<<AVR32_SCIF_GCCTRL_DIV_SIZE))
00779 return -1;
00780 }
00781 #endif // AVR32SFW_INPUT_CHECK
00782
00783
00784 if(AVR32_SCIF.gcctrl[gclk] & AVR32_SCIF_GCCTRL_CEN_MASK)
00785 {
00786 restart_gc = true;
00787 if(scif_stop_gclk(gclk) < 0)
00788 return -1;
00789 }
00790
00791
00792 AVR32_SCIF.gcctrl[gclk] = ((divfactor << AVR32_SCIF_GCCTRL_DIV_OFFSET)&AVR32_SCIF_GCCTRL_DIV_MASK)
00793 |((diven << AVR32_SCIF_GCCTRL_DIVEN_OFFSET)&AVR32_SCIF_GCCTRL_DIVEN_MASK)
00794 |((clk_src << AVR32_SCIF_GCCTRL_OSCSEL_OFFSET)&AVR32_SCIF_GCCTRL_OSCSEL_MASK);
00795
00796
00797 if(true == restart_gc)
00798 AVR32_SCIF.gcctrl[gclk] |= (AVR32_SCIF_GCCTRL_CEN_MASK);
00799
00800 return PASS;
00801 }
00802
00803
00804 long int scif_gc_enable(unsigned int gclk)
00805 {
00806 #ifdef AVR32SFW_INPUT_CHECK
00807
00808 if( gclk > AVR32_SCIF_GCLK_NUM )
00809 {
00810 return -1;
00811 }
00812 #endif // AVR32SFW_INPUT_CHECK
00813
00814
00815 if(!(AVR32_SCIF.gcctrl[gclk] & AVR32_SCIF_GCCTRL_CEN_MASK))
00816 AVR32_SCIF.gcctrl[gclk] |= (AVR32_SCIF_GCCTRL_CEN_MASK);
00817
00818 return PASS;
00819 }
00820
00838 long int scif_pclksr_statushigh_wait(unsigned long statusMask)
00839 {
00840 unsigned int timeout = SCIF_POLL_TIMEOUT;
00841
00842 while(!(AVR32_SCIF.pclksr & statusMask))
00843 {
00844 if(--timeout == 0)
00845 return -1;
00846 }
00847 return PASS;
00848 }