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