Xmega Application Note


pmic.h

Go to the documentation of this file.
00001 
00038 #ifndef PMIC_H
00039 #define PMIC_H
00040 
00041 #include <compiler.h>
00042 #include <ccp.h>
00043 
00063 enum pmic_level {
00064         PMIC_LVL_LOW    = PMIC_LOLVLEN_bm,    
00065         PMIC_LVL_MEDIUM = PMIC_MEDLVLEN_bm,   
00066         PMIC_LVL_HIGH   = PMIC_HILVLEN_bm,    
00067 
00071         PMIC_LVL_NMI    = PMIC_NMIEX_bp,
00072 };
00073 
00075 enum pmic_vector {
00076         PMIC_VEC_APPLICATION,    
00077         PMIC_VEC_BOOT,           
00078         PMIC_NR_OF_VECTORS,      
00079 };
00080 
00082 enum pmic_schedule {
00083         PMIC_SCH_FIXED_PRIORITY, 
00084         PMIC_SCH_ROUND_ROBIN,    
00085         PMIC_NR_OF_SCHEDULES,    
00086 };
00087 
00094 static inline void pmic_init(void)
00095 {
00096         PMIC.CTRL = PMIC_LVL_LOW | PMIC_LVL_MEDIUM |
00097                         PMIC_LVL_HIGH;
00098 }
00099 
00105 static inline void pmic_enable_level(enum pmic_level level)
00106 {
00107         Assert(!(level & PMIC_LVL_NMI));
00108 
00109         PMIC.CTRL |= level;
00110 }
00111 
00117 static inline void pmic_disable_level(enum pmic_level level)
00118 {
00119         Assert(!(level & PMIC_LVL_NMI));
00120 
00121         PMIC.CTRL &= ~level;
00122 }
00123 
00131 static inline bool pmic_level_is_enabled(enum pmic_level level)
00132 {
00133         Assert(!(level & PMIC_LVL_NMI));
00134 
00135         return PMIC.CTRL & level;
00136 }
00137 
00143 static inline enum pmic_level pmic_get_enabled_levels(void)
00144 {
00145         return (enum pmic_level)(PMIC.CTRL & (PMIC_LVL_LOW | PMIC_LVL_MEDIUM
00146                                 | PMIC_LVL_HIGH));
00147 }
00148 
00156 static inline bool pmic_level_is_executing(enum pmic_level level)
00157 {
00158         return PMIC.STATUS & level;
00159 }
00160 
00169 static inline void pmic_set_scheduling(enum pmic_schedule schedule)
00170 {
00171         Assert(schedule < PMIC_NR_OF_SCHEDULES);
00172 
00173         switch (schedule) {
00174         case PMIC_SCH_FIXED_PRIORITY:
00175                 PMIC.CTRL &= ~PMIC_RREN_bm;
00176                 PMIC.INTPRI = 0;
00177                 break;
00178 
00179         case PMIC_SCH_ROUND_ROBIN:
00180                 PMIC.CTRL |= PMIC_RREN_bm;
00181                 break;
00182 
00183         default:
00184                 break;
00185         };
00186 }
00187 
00193 static inline void pmic_set_vector_location(enum pmic_vector vector)
00194 {
00195         uint8_t ctrl = PMIC.CTRL;
00196 
00197         Assert(vector < PMIC_NR_OF_VECTORS);
00198 
00199         switch (vector) {
00200         case PMIC_VEC_APPLICATION:
00201                 ctrl &= ~PMIC_IVSEL_bm;
00202                 break;
00203 
00204         case PMIC_VEC_BOOT:
00205                 ctrl |= PMIC_IVSEL_bm;
00206                 break;
00207 
00208         default:
00209                 break;
00210         }
00211 
00212         ccp_write_io((uint8_t*)&PMIC.CTRL, ctrl);
00213 }
00214 
00216 
00217 #endif /* PMIC_H */
@DOC_TITLE@
Generated on Fri Oct 22 12:15:25 2010 for AVR1300 Using the Xmega ADC by doxygen 1.6.3