00001
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
00048 #include <avr32/io.h>
00049 #include "compiler.h"
00050 #include "pm.h"
00051 #include "rtc.h"
00052
00053
00054 int rtc_is_busy(volatile avr32_rtc_t *rtc)
00055 {
00056 return (rtc->ctrl & AVR32_RTC_CTRL_BUSY_MASK) != 0;
00057 }
00058
00059
00060 int rtc_init(volatile avr32_rtc_t *rtc, unsigned char osc_type, unsigned char psel)
00061 {
00062
00063 if (osc_type > (1 << AVR32_RTC_CTRL_CLK32_SIZE) - 1 ||
00064 psel > (1 << AVR32_RTC_CTRL_PSEL_SIZE) - 1)
00065 return 0;
00066
00067
00068 if (osc_type == RTC_OSC_32KHZ)
00069 {
00070
00071 pm_enable_osc32_crystal(&AVR32_PM);
00072
00073 pm_enable_clk32_no_wait(&AVR32_PM, AVR32_PM_OSCCTRL32_STARTUP_0_RCOSC);
00074 }
00075
00076
00077 while (rtc_is_busy(rtc));
00078
00079
00080 rtc->ctrl = osc_type << AVR32_RTC_CTRL_CLK32_OFFSET |
00081 psel << AVR32_RTC_CTRL_PSEL_OFFSET |
00082 AVR32_RTC_CTRL_CLKEN_MASK;
00083
00084
00085 while (rtc_is_busy(rtc));
00086
00087
00088 rtc_set_value(rtc, 0x00000000);
00089
00090 rtc_set_top_value(rtc, 0xFFFFFFFF);
00091
00092 return 1;
00093 }
00094
00095
00096 void rtc_set_value(volatile avr32_rtc_t *rtc, unsigned long val)
00097 {
00098
00099 while (rtc_is_busy(rtc));
00100
00101 rtc->val = val;
00102
00103 while (rtc_is_busy(rtc));
00104 }
00105
00106
00107 unsigned long rtc_get_value(volatile avr32_rtc_t *rtc)
00108 {
00109 return rtc->val;
00110 }
00111
00112
00113 void rtc_enable_wake_up(volatile avr32_rtc_t *rtc)
00114 {
00115
00116 while (rtc_is_busy(rtc));
00117
00118 rtc->ctrl |= AVR32_RTC_CTRL_WAKE_EN_MASK;
00119
00120 while (rtc_is_busy(rtc));
00121 }
00122
00123
00124 void rtc_disable_wake_up(volatile avr32_rtc_t *rtc)
00125 {
00126
00127 while (rtc_is_busy(rtc));
00128
00129 rtc->ctrl &= ~AVR32_RTC_CTRL_WAKE_EN_MASK;
00130
00131 while (rtc_is_busy(rtc));
00132 }
00133
00134
00135 void rtc_enable(volatile avr32_rtc_t *rtc)
00136 {
00137
00138 while (rtc_is_busy(rtc));
00139
00140 rtc->ctrl |= AVR32_RTC_CTRL_EN_MASK;
00141
00142 while (rtc_is_busy(rtc));
00143 }
00144
00145
00146 void rtc_disable(volatile avr32_rtc_t *rtc)
00147 {
00148
00149 while (rtc_is_busy(rtc));
00150
00151 rtc->ctrl &= ~AVR32_RTC_CTRL_EN_MASK;
00152
00153 while (rtc_is_busy(rtc));
00154 }
00155
00156
00157 void rtc_enable_interrupt(volatile avr32_rtc_t *rtc)
00158 {
00159 rtc->ier = AVR32_RTC_IER_TOPI_MASK;
00160 }
00161
00162
00163 void rtc_disable_interrupt(volatile avr32_rtc_t *rtc)
00164 {
00165 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00166
00167 if (global_interrupt_enabled) Disable_global_interrupt();
00168 rtc->idr = AVR32_RTC_IDR_TOPI_MASK;
00169 rtc->imr;
00170 if (global_interrupt_enabled) Enable_global_interrupt();
00171 }
00172
00173
00174 void rtc_clear_interrupt(volatile avr32_rtc_t *rtc)
00175 {
00176 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00177
00178 if (global_interrupt_enabled) Disable_global_interrupt();
00179 rtc->icr = AVR32_RTC_ICR_TOPI_MASK;
00180 rtc->isr;
00181 if (global_interrupt_enabled) Enable_global_interrupt();
00182 }
00183
00184
00185 void rtc_set_top_value(volatile avr32_rtc_t *rtc, unsigned long top)
00186 {
00187
00188 while (rtc_is_busy(rtc));
00189
00190 rtc->top = top;
00191
00192 while (rtc_is_busy(rtc));
00193 }
00194
00195
00196 unsigned long rtc_get_top_value(volatile avr32_rtc_t *rtc)
00197 {
00198 return rtc->top;
00199 }
00200
00201
00202 int rtc_interrupt_enabled(volatile avr32_rtc_t *rtc)
00203 {
00204 return (rtc->imr & AVR32_RTC_IMR_TOPI_MASK) != 0;
00205 }
00206
00207
00208 int rtc_is_interrupt(volatile avr32_rtc_t *rtc)
00209 {
00210 return (rtc->isr & AVR32_RTC_ISR_TOPI_MASK) != 0;
00211 }