00001
00002
00003
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 #include "rtc.h"
00047 #include "pm.h"
00048
00049 int rtc_is_busy(volatile avr32_rtc_t *rtc)
00050 {
00051 return rtc->CTRL.busy;
00052 }
00053
00054 int rtc_init(volatile avr32_rtc_t *rtc, unsigned char osc_type, unsigned char psel)
00055 {
00056 int ctrl;
00057
00058
00059 if (osc_type == RTC_OSC_32KHZ)
00060 {
00061
00062 pm_enable_osc32_crystal(&AVR32_PM);
00063
00064 pm_enable_clk32_no_wait(&AVR32_PM, 0);
00065 }
00066
00067
00068 while(rtc_is_busy(rtc));
00069
00070
00071 ctrl =
00072 (((int) osc_type) << AVR32_RTC_CTRL_CLK32_OFFSET)
00073 | (((int) psel) << AVR32_RTC_CTRL_PSEL_OFFSET)
00074 #ifdef AVR32_RTC_CLKEN
00075 | AVR32_RTC_CLKEN_MASK
00076 #endif
00077 ;
00078
00079
00080 rtc->ctrl = ctrl;
00081
00082
00083 while(rtc_is_busy(rtc));
00084
00085
00086 if (rtc->ctrl != ctrl)
00087 return 0;
00088
00089
00090 rtc_set_value(rtc, 0);
00091
00092 rtc_set_top_value(rtc, (unsigned long) -1);
00093
00094 return 1;
00095 }
00096
00097 void rtc_set_value(volatile avr32_rtc_t *rtc, unsigned long val)
00098 {
00099
00100 while(rtc_is_busy(rtc));
00101
00102 rtc->val = val;
00103
00104 while(rtc_is_busy(rtc));
00105 }
00106
00107 unsigned long rtc_get_value(volatile avr32_rtc_t *rtc)
00108 {
00109 return rtc->val;
00110 }
00111
00112 void rtc_enable_wake_up(volatile avr32_rtc_t *rtc)
00113 {
00114
00115 while(rtc_is_busy(rtc));
00116
00117 rtc->ctrl |= 1 << AVR32_RTC_CTRL_WAKE_EN_OFFSET;
00118
00119 while(rtc_is_busy(rtc));
00120 }
00121
00122 void rtc_disable_wake_up(volatile avr32_rtc_t *rtc)
00123 {
00124 int ctrl;
00125
00126
00127 while(rtc_is_busy(rtc));
00128
00129 ctrl = rtc->ctrl;
00130
00131 rtc->ctrl = ctrl & (~AVR32_RTC_CTRL_WAKE_EN_MASK);
00132
00133 while(rtc_is_busy(rtc));
00134 }
00135
00136 void rtc_enable(volatile avr32_rtc_t *rtc)
00137 {
00138
00139 while(rtc_is_busy(rtc));
00140
00141 rtc->ctrl |= 1 << AVR32_RTC_CTRL_EN_OFFSET;
00142
00143 while(rtc_is_busy(rtc));
00144 }
00145
00146 void rtc_disable(volatile avr32_rtc_t *rtc)
00147 {
00148 int ctrl;
00149
00150
00151 while(rtc_is_busy(rtc));
00152
00153 ctrl = rtc->ctrl;
00154
00155 rtc->ctrl = ctrl & (~AVR32_RTC_CTRL_EN_MASK);
00156
00157 while(rtc_is_busy(rtc));
00158 }
00159
00160 void rtc_enable_interrupt(volatile avr32_rtc_t *rtc)
00161 {
00162 rtc->IER.topi = 1;
00163 }
00164
00165 void rtc_disable_interrupt(volatile avr32_rtc_t *rtc)
00166 {
00167 rtc->IDR.topi = 1;
00168 }
00169
00170 void rtc_clear_interrupt(volatile avr32_rtc_t *rtc)
00171 {
00172 rtc->ICR.topi = 1;
00173 }
00174
00175 void rtc_set_top_value(volatile avr32_rtc_t *rtc, unsigned long top)
00176 {
00177
00178 while(rtc_is_busy(rtc));
00179
00180 rtc->top = top;
00181
00182 while(rtc_is_busy(rtc));
00183 }
00184
00185 unsigned long rtc_get_top_value(volatile avr32_rtc_t *rtc)
00186 {
00187 return rtc->top;
00188 }
00189
00190 int rtc_interrupt_enabled(volatile avr32_rtc_t *rtc)
00191 {
00192 return rtc->IMR.topi;
00193 }
00194
00195 int rtc_is_interrupt(volatile avr32_rtc_t *rtc)
00196 {
00197 return rtc->ISR.topi;
00198 }