]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_AT91SAM3U256_IAR/AT91Lib/peripherals/supc/supc.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_AT91SAM3U256_IAR / AT91Lib / peripherals / supc / supc.c
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 //------------------------------------------------------------------------------\r
31 //         Headers\r
32 //------------------------------------------------------------------------------\r
33 \r
34 #include "supc.h"\r
35 #include <board.h>\r
36 #include <utility/assert.h>\r
37 \r
38 //------------------------------------------------------------------------------\r
39 //         Local definitions\r
40 //------------------------------------------------------------------------------\r
41 \r
42 /// Key value for the SUPC_MR register.\r
43 #define SUPC_KEY            ((unsigned int) (0xA5 << 24))\r
44 \r
45 //------------------------------------------------------------------------------\r
46 //         Global functions\r
47 //------------------------------------------------------------------------------\r
48 \r
49 //------------------------------------------------------------------------------\r
50 /// Enables the SLCD power supply.\r
51 /// \param internal  If 1, the power supply is configured as internal; otherwise\r
52 ///                  it is set at external.\r
53 //------------------------------------------------------------------------------\r
54 void SUPC_EnableSlcd(unsigned char internal)\r
55 {\r
56     if (internal) {\r
57 \r
58          AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_LCDMODE) | AT91C_SUPC_LCDMODE_INTERNAL;\r
59     }\r
60     else {\r
61 \r
62         AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_LCDMODE) | AT91C_SUPC_LCDMODE_EXTERNAL;\r
63     }\r
64     while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_LCDS) != AT91C_SUPC_LCDS);\r
65 }\r
66 \r
67 //------------------------------------------------------------------------------\r
68 /// Disables the SLCD power supply.\r
69 //------------------------------------------------------------------------------\r
70 void SUPC_DisableSlcd(void)\r
71 {\r
72     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_LCDMODE);\r
73     while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_LCDS) == AT91C_SUPC_LCDS);\r
74 }\r
75 \r
76 //------------------------------------------------------------------------------\r
77 /// Sets the output voltage of the SLCD charge pump.\r
78 /// \param voltage  Output voltage.\r
79 //------------------------------------------------------------------------------\r
80 void SUPC_SetSlcdVoltage(unsigned int voltage)\r
81 {\r
82     SANITY_CHECK((voltage & ~AT91C_SUPC_LCDOUT) == 0);\r
83     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_LCDOUT) | voltage;\r
84 }\r
85 \r
86 #if !defined(__ICCARM__)\r
87 __attribute__ ((section (".ramfunc"))) // GCC\r
88 #endif\r
89 //------------------------------------------------------------------------------\r
90 /// Enables the flash power supply with the given wake-up setting.\r
91 /// \param time  Wake-up time.\r
92 //------------------------------------------------------------------------------\r
93 void SUPC_EnableFlash(unsigned int time)\r
94 {\r
95     AT91C_BASE_SUPC->SUPC_FWUTR = time;\r
96     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | AT91C_BASE_SUPC->SUPC_MR | AT91C_SUPC_FLASHON;\r
97     while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_FLASHS) != AT91C_SUPC_FLASHS);\r
98 }\r
99 \r
100 #if !defined(__ICCARM__)\r
101 __attribute__ ((section (".ramfunc"))) // GCC\r
102 #endif\r
103 //------------------------------------------------------------------------------\r
104 /// Disables the flash power supply.\r
105 //------------------------------------------------------------------------------\r
106 void SUPC_DisableFlash(void)\r
107 {\r
108     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_FLASHON);\r
109     while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_FLASHS) == AT91C_SUPC_FLASHS);\r
110 }\r
111 \r
112 //------------------------------------------------------------------------------\r
113 /// Sets the voltage regulator output voltage.\r
114 /// \param voltage  Voltage to set.\r
115 //------------------------------------------------------------------------------\r
116 void SUPC_SetVoltageOutput(unsigned int voltage)\r
117 {\r
118     SANITY_CHECK((voltage & ~AT91C_SUPC_VRVDD) == 0);\r
119     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_VRVDD) | voltage;\r
120 }\r
121 \r
122 //------------------------------------------------------------------------------\r
123 /// Puts the voltage regulator in deep mode.\r
124 //------------------------------------------------------------------------------\r
125 void SUPC_EnableDeepMode(void)\r
126 {\r
127     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | AT91C_BASE_SUPC->SUPC_MR | AT91C_SUPC_VRDEEP;\r
128 }\r
129 \r
130 //------------------------------------------------------------------------------\r
131 /// Puts the voltage regulator in normal mode.\r
132 //------------------------------------------------------------------------------\r
133 void SUPC_DisableDeepMode(void)\r
134 {\r
135     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_VRDEEP);\r
136 }\r
137 \r
138 //-----------------------------------------------------------------------------\r
139 /// Enables the backup SRAM power supply, so its data is saved while the device\r
140 /// is in backup mode.\r
141 //-----------------------------------------------------------------------------\r
142 void SUPC_EnableSram(void)\r
143 {\r
144     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | AT91C_BASE_SUPC->SUPC_MR | AT91C_SUPC_SRAMON;\r
145 }\r
146 \r
147 //-----------------------------------------------------------------------------\r
148 /// Disables the backup SRAM power supply.\r
149 //-----------------------------------------------------------------------------\r
150 void SUPC_DisableSram(void)\r
151 {\r
152     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_SRAMON);\r
153 }\r
154 \r
155 //-----------------------------------------------------------------------------\r
156 /// Enables the RTC power supply.\r
157 //-----------------------------------------------------------------------------\r
158 void SUPC_EnableRtc(void)\r
159 {\r
160     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | AT91C_BASE_SUPC->SUPC_MR | AT91C_SUPC_RTCON;\r
161     while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_RTS) != AT91C_SUPC_RTS);\r
162 }\r
163 \r
164 //-----------------------------------------------------------------------------\r
165 /// Disables the RTC power supply.\r
166 //-----------------------------------------------------------------------------\r
167 void SUPC_DisableRtc(void)\r
168 {\r
169     AT91C_BASE_SUPC->SUPC_MR = SUPC_KEY | (AT91C_BASE_SUPC->SUPC_MR & ~AT91C_SUPC_RTCON);\r
170     while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_RTS) == AT91C_SUPC_RTS);\r
171 }\r
172 \r
173 //-----------------------------------------------------------------------------\r
174 /// Sets the BOD sampling mode (or disables it).\r
175 /// \param mode  BOD sampling mode.\r
176 //-----------------------------------------------------------------------------\r
177 void SUPC_SetBodSampling(unsigned int mode)\r
178 {\r
179     SANITY_CHECK((mode & ~AT91C_SUPC_BODSMPL) == 0);\r
180     AT91C_BASE_SUPC->SUPC_BOMR &= ~AT91C_SUPC_BODSMPL;\r
181     AT91C_BASE_SUPC->SUPC_BOMR |= mode;\r
182 }\r
183 \r
184 //------------------------------------------------------------------------------\r
185 /// Disables the voltage regulator, which makes the device enter backup mode.\r
186 //------------------------------------------------------------------------------\r
187 void SUPC_DisableVoltageRegulator(void)\r
188 {\r
189     AT91C_BASE_SUPC->SUPC_CR = SUPC_KEY | AT91C_SUPC_VROFF;\r
190     while (1);\r
191 }\r
192 \r
193 //------------------------------------------------------------------------------\r
194 /// Shuts the device down so it enters Off mode.\r
195 //------------------------------------------------------------------------------\r
196 void SUPC_Shutdown(void)\r
197 {\r
198     AT91C_BASE_SUPC->SUPC_CR = SUPC_KEY | AT91C_SUPC_SHDW;\r
199     while (1);\r
200 }\r
201 \r
202 //------------------------------------------------------------------------------\r
203 /// Sets the wake-up sources when in backup mode.\r
204 /// \param sources  Wake-up sources to enable.\r
205 //------------------------------------------------------------------------------\r
206 void SUPC_SetWakeUpSources(unsigned int sources)\r
207 {\r
208     SANITY_CHECK((sources & ~0x0000000B) == 0);\r
209     AT91C_BASE_SUPC->SUPC_WUMR &= ~0x0000000B;\r
210     AT91C_BASE_SUPC->SUPC_WUMR |= sources;\r
211 }\r
212 \r
213 //------------------------------------------------------------------------------\r
214 /// Sets the wake-up inputs when in backup mode.\r
215 /// \param inputs  Wake up inputs to enable.\r
216 //------------------------------------------------------------------------------\r
217 void SUPC_SetWakeUpInputs(unsigned int inputs)\r
218 {\r
219     SANITY_CHECK((inputs & ~0xFFFF) == 0);\r
220     AT91C_BASE_SUPC->SUPC_WUIR &= ~0xFFFF;\r
221     AT91C_BASE_SUPC->SUPC_WUIR |= inputs;\r
222 }\r
223 \r