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 #ifndef _PM_UC3C_H_
00047 #define _PM_UC3C_H_
00048
00049 #define _PM_UC3C_H_
00050
00051 #ifdef __cplusplus
00052 extern "C" {
00053 #endif
00054
00055 #include <avr32/io.h>
00056 #include "compiler.h"
00057
00058
00059 #ifdef AVR32_PM_410_H_INCLUDED
00060
00061 #define AVR32_PM_UNLOCK_KEY_VALUE 0x000000AA
00062 #endif
00063
00065
00067 typedef enum
00068 {
00069 PM_CLK_SRC_SLOW = AVR32_PM_MCSEL_SLOW,
00070 PM_CLK_SRC_OSC0 = AVR32_PM_MCSEL_OSC0,
00071 PM_CLK_SRC_OSC1 = AVR32_PM_MCSEL_OSC1,
00072 PM_CLK_SRC_PLL0 = AVR32_PM_MCSEL_PLL0,
00073 PM_CLK_SRC_PLL1 = AVR32_PM_MCSEL_PLL1,
00074 PM_CLK_SRC_RC8M = AVR32_PM_MCSEL_RCOSC8,
00075 PM_CLK_SRC_RCRIPOSC = AVR32_PM_MCSEL_CRIPOSC,
00076 PM_CLK_SRC_RC120M = AVR32_PM_MCSEL_RC120M,
00077 PM_CLK_SRC_INVALID
00078 } pm_clk_src_t;
00079
00081 typedef enum
00082 {
00083 PM_CLK_DOMAIN_0 = AVR32_PM_CLK_GRP_CPU,
00084 PM_CLK_DOMAIN_1 = AVR32_PM_CLK_GRP_HSB,
00085 PM_CLK_DOMAIN_2 = AVR32_PM_CLK_GRP_PBA,
00086 PM_CLK_DOMAIN_3 = AVR32_PM_CLK_GRP_PBB,
00087 PM_CLK_DOMAIN_4 = AVR32_PM_CLK_GRP_PBC,
00088 PM_CLK_DOMAIN_INVALID
00089 } pm_clk_domain_t;
00090
00091
00093 typedef enum
00094 {
00095 PM_CKSEL_DIVRATIO_2 = 0,
00096 PM_CKSEL_DIVRATIO_4,
00097 PM_CKSEL_DIVRATIO_8,
00098 PM_CKSEL_DIVRATIO_16,
00099 PM_CKSEL_DIVRATIO_32,
00100 PM_CKSEL_DIVRATIO_64,
00101 PM_CKSEL_DIVRATIO_128,
00102 PM_CKSEL_DIVRATIO_256
00103 } pm_divratio_t;
00104
00106 #define PM_POLL_TIMEOUT 100000
00107
00109 #define PM_NOT_SUPPORTED (-10000)
00110
00111
00113 #define PM_UNLOCK(reg) (AVR32_PM.unlock = (unsigned long)(AVR32_PM_UNLOCK_KEY_VALUE << AVR32_PM_UNLOCK_KEY_OFFSET)|(reg))
00114
00115
00118
00119
00131 extern long pm_set_mclk_source(pm_clk_src_t src);
00132
00147 extern long pm_config_mainclk_safety(bool cfd, bool final);
00148
00161 extern long pm_set_clk_domain_div(pm_clk_domain_t clock_domain, pm_divratio_t divratio);
00162
00174 extern long pm_disable_clk_domain_div(pm_clk_domain_t clock_domain);
00175
00185 extern long pm_wait_for_clk_ready(void);
00186
00188
00189
00192
00193
00204 extern long pm_enable_module(unsigned long module);
00205
00216 extern long pm_disable_module(unsigned long module);
00217
00218
00220
00223
00224
00232 #define pm_sleep(sleep_mode) {__asm__ __volatile__ ("sleep "STRINGZ(sleep_mode));}
00233
00240 #define SLEEP(mode) pm_sleep(mode)
00241
00247 #if defined (__GNUC__)
00248 __attribute__((__always_inline__))
00249 #endif
00250 extern __inline__ unsigned long pm_get_wake_cause(void)
00251 {
00252 return AVR32_PM.wcause;
00253 }
00254
00261 #if defined (__GNUC__)
00262 __attribute__((__always_inline__))
00263 #endif
00264 extern __inline__ void pm_asyn_wake_up_enable(unsigned long awen_mask)
00265 {
00266 AVR32_PM.awen |= awen_mask;
00267 }
00268
00275 #if defined (__GNUC__)
00276 __attribute__((__always_inline__))
00277 #endif
00278 extern __inline__ void pm_asyn_wake_up_disable(unsigned long awen_mask)
00279 {
00280 AVR32_PM.awen &= ~awen_mask;
00281 }
00282
00284
00285
00286
00289
00290
00296 #if defined (__GNUC__)
00297 __attribute__((__always_inline__))
00298 #endif
00299 extern __inline__ unsigned long pm_get_reset_cause(void)
00300 {
00301 return AVR32_PM.rcause;
00302 }
00303
00305
00306
00307
00310
00311
00317 #if defined (__GNUC__)
00318 __attribute__((__always_inline__))
00319 #endif
00320 extern __inline__ void pm_enable_interrupts(unsigned long mask)
00321 {
00322 AVR32_PM.ier |= mask;
00323 }
00324
00330 #if defined (__GNUC__)
00331 __attribute__((__always_inline__))
00332 #endif
00333 extern __inline__ void pm_disable_interrupts(unsigned long mask)
00334 {
00335 AVR32_PM.idr |= mask;
00336 }
00337
00342 #if defined (__GNUC__)
00343 __attribute__((__always_inline__))
00344 #endif
00345 extern __inline__ unsigned long pm_get_enabled_interrupts(void)
00346 {
00347 return(AVR32_PM.imr);
00348 }
00349
00354 #if defined (__GNUC__)
00355 __attribute__((__always_inline__))
00356 #endif
00357 extern __inline__ unsigned long pm_get_interrupts_status(void)
00358 {
00359 return(AVR32_PM.isr);
00360 }
00361
00366 #if defined (__GNUC__)
00367 __attribute__((__always_inline__))
00368 #endif
00369 extern __inline__ void pm_clear_interrupt_status(unsigned long mask)
00370 {
00371 AVR32_PM.icr |= mask;
00372 }
00373
00375
00376
00377
00380
00381
00386 #if defined (__GNUC__)
00387 __attribute__((__always_inline__))
00388 #endif
00389 extern __inline__ unsigned long pm_get_status(void)
00390 {
00391 return AVR32_PM.sr;
00392 }
00393
00395
00396 #ifdef __cplusplus
00397 }
00398 #endif
00399
00400 #endif // _PM_UC3C_H_