]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M4_ATSAM4L_Atmel_Studio/src/asf/common/services/clock/sam4l/osc.c
Add SAM4L demo.
[freertos] / FreeRTOS / Demo / CORTEX_M4_ATSAM4L_Atmel_Studio / src / asf / common / services / clock / sam4l / osc.c
1 /**\r
2  * \file\r
3  *\r
4  * \brief Chip-specific oscillator management functions\r
5  *\r
6  * Copyright (c) 2012 Atmel Corporation. All rights reserved.\r
7  *\r
8  * \asf_license_start\r
9  *\r
10  * \page License\r
11  *\r
12  * Redistribution and use in source and binary forms, with or without\r
13  * modification, are permitted provided that the following conditions are met:\r
14  *\r
15  * 1. Redistributions of source code must retain the above copyright notice,\r
16  *    this list of conditions and the following disclaimer.\r
17  *\r
18  * 2. Redistributions in binary form must reproduce the above copyright notice,\r
19  *    this list of conditions and the following disclaimer in the documentation\r
20  *    and/or other materials provided with the distribution.\r
21  *\r
22  * 3. The name of Atmel may not be used to endorse or promote products derived\r
23  *    from this software without specific prior written permission.\r
24  *\r
25  * 4. This software may only be redistributed and used in connection with an\r
26  *    Atmel microcontroller product.\r
27  *\r
28  * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED\r
29  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
30  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
31  * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR\r
32  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
36  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
37  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
38  * POSSIBILITY OF SUCH DAMAGE.\r
39  *\r
40  * \asf_license_stop\r
41  *\r
42  */\r
43 #include <osc.h>\r
44 \r
45 #ifdef BOARD_OSC0_HZ\r
46 void osc_priv_enable_osc0(void)\r
47 {\r
48         irqflags_t flags;\r
49 \r
50         flags = cpu_irq_save();\r
51         SCIF->SCIF_UNLOCK = SCIF_UNLOCK_KEY(0xAAu)\r
52                 | SCIF_UNLOCK_ADDR((uint32_t)&SCIF->SCIF_OSCCTRL0 - (uint32_t)SCIF);\r
53         SCIF->SCIF_OSCCTRL0 =\r
54                         OSC0_STARTUP_VALUE\r
55 # if BOARD_OSC0_IS_XTAL == true\r
56                         | OSC0_GAIN_VALUE\r
57 #endif\r
58                         | OSC0_MODE_VALUE\r
59                         | SCIF_OSCCTRL0_OSCEN;\r
60         cpu_irq_restore(flags);\r
61 }\r
62 \r
63 void osc_priv_disable_osc0(void)\r
64 {\r
65         irqflags_t flags;\r
66 \r
67         flags = cpu_irq_save();\r
68         SCIF->SCIF_UNLOCK = SCIF_UNLOCK_KEY(0xAAu)\r
69                 | SCIF_UNLOCK_ADDR((uint32_t)&SCIF->SCIF_OSCCTRL0 - (uint32_t)SCIF);\r
70         SCIF->SCIF_OSCCTRL0 = 0;\r
71         cpu_irq_restore(flags);\r
72 }\r
73 #endif /* BOARD_OSC0_HZ */\r
74 \r
75 #ifdef BOARD_OSC32_HZ\r
76 void osc_priv_enable_osc32(void)\r
77 {\r
78         irqflags_t flags;\r
79 \r
80         flags = cpu_irq_save();\r
81         BSCIF->BSCIF_UNLOCK = BSCIF_UNLOCK_KEY(0xAAu)\r
82                 | BSCIF_UNLOCK_ADDR((uint32_t)&BSCIF->BSCIF_OSCCTRL32 - (uint32_t)BSCIF);\r
83         BSCIF->BSCIF_OSCCTRL32 =\r
84                         OSC32_STARTUP_VALUE\r
85                         | BOARD_OSC32_SELCURR\r
86                         | OSC32_MODE_VALUE\r
87                         | BSCIF_OSCCTRL32_EN1K\r
88                         | BSCIF_OSCCTRL32_EN32K\r
89                         | BSCIF_OSCCTRL32_OSC32EN;\r
90         cpu_irq_restore(flags);\r
91 }\r
92 \r
93 void osc_priv_disable_osc32(void)\r
94 {\r
95         irqflags_t flags;\r
96 \r
97         flags = cpu_irq_save();\r
98         BSCIF->BSCIF_UNLOCK = BSCIF_UNLOCK_KEY(0xAAu)\r
99                 | BSCIF_UNLOCK_ADDR((uint32_t)&BSCIF->BSCIF_OSCCTRL32 - (uint32_t)BSCIF);\r
100         BSCIF->BSCIF_OSCCTRL32 &= ~BSCIF_OSCCTRL32_OSC32EN;\r
101         // Wait until OSC32 RDY flag is cleared.\r
102         while (BSCIF->BSCIF_PCLKSR & BSCIF_PCLKSR_OSC32RDY);\r
103         cpu_irq_restore(flags);\r
104 }\r
105 #endif /* BOARD_OSC32_HZ */\r
106 \r
107 void osc_priv_enable_rc32k(void)\r
108 {\r
109         irqflags_t flags;\r
110         uint32_t temp;\r
111 \r
112         flags = cpu_irq_save();\r
113         temp = BSCIF->BSCIF_RC32KCR;\r
114         BSCIF->BSCIF_UNLOCK = BSCIF_UNLOCK_KEY(0xAAu)\r
115                 | BSCIF_UNLOCK_ADDR((uint32_t)&BSCIF->BSCIF_RC32KCR - (uint32_t)BSCIF);\r
116         BSCIF->BSCIF_RC32KCR = temp | BSCIF_RC32KCR_EN32K | BSCIF_RC32KCR_EN;\r
117         cpu_irq_restore(flags);\r
118 }\r
119 \r
120 void osc_priv_disable_rc32k(void)\r
121 {\r
122         irqflags_t flags;\r
123         uint32_t temp;\r
124 \r
125         flags = cpu_irq_save();\r
126         temp = BSCIF->BSCIF_RC32KCR;\r
127         temp &= ~BSCIF_RC32KCR_EN;\r
128         BSCIF->BSCIF_UNLOCK = BSCIF_UNLOCK_KEY(0xAAu)\r
129                 | BSCIF_UNLOCK_ADDR((uint32_t)&BSCIF->BSCIF_RC32KCR - (uint32_t)BSCIF);\r
130         BSCIF->BSCIF_RC32KCR = temp;\r
131         cpu_irq_restore(flags);\r
132 }\r
133 \r
134 void osc_priv_enable_rc1m(void)\r
135 {\r
136         irqflags_t flags;\r
137         uint32_t temp;\r
138 \r
139         flags = cpu_irq_save();\r
140         temp = BSCIF->BSCIF_RC1MCR;\r
141         BSCIF->BSCIF_UNLOCK = BSCIF_UNLOCK_KEY(0xAAu)\r
142                 | BSCIF_UNLOCK_ADDR((uint32_t)&BSCIF->BSCIF_RC1MCR - (uint32_t)BSCIF);\r
143         BSCIF->BSCIF_RC1MCR = temp | BSCIF_RC1MCR_CLKOE;\r
144         cpu_irq_restore(flags);\r
145 }\r
146 \r
147 void osc_priv_disable_rc1m(void)\r
148 {\r
149         irqflags_t flags;\r
150         uint32_t temp;\r
151 \r
152         flags = cpu_irq_save();\r
153         temp = BSCIF->BSCIF_RC1MCR;\r
154         temp &= ~BSCIF_RC1MCR_CLKOE;\r
155         BSCIF->BSCIF_UNLOCK = BSCIF_UNLOCK_KEY(0xAAu)\r
156                 | BSCIF_UNLOCK_ADDR((uint32_t)&BSCIF->BSCIF_RC1MCR - (uint32_t)BSCIF);\r
157         BSCIF->BSCIF_RC1MCR = temp;\r
158         cpu_irq_restore(flags);\r
159 }\r
160 \r
161 void osc_priv_enable_rc80m(void)\r
162 {\r
163         irqflags_t flags;\r
164         uint32_t temp;\r
165 \r
166         flags = cpu_irq_save();\r
167         temp = SCIF->SCIF_RC80MCR;\r
168         SCIF->SCIF_UNLOCK = SCIF_UNLOCK_KEY(0xAAu)\r
169                 | SCIF_UNLOCK_ADDR((uint32_t)&SCIF->SCIF_RC80MCR - (uint32_t)SCIF);\r
170         SCIF->SCIF_RC80MCR = temp | SCIF_RC80MCR_EN;\r
171         cpu_irq_restore(flags);\r
172 }\r
173 \r
174 void osc_priv_disable_rc80m(void)\r
175 {\r
176         irqflags_t flags;\r
177         uint32_t temp;\r
178 \r
179         flags = cpu_irq_save();\r
180         temp = SCIF->SCIF_RC80MCR;\r
181         temp &= ~SCIF_RC80MCR_EN ;\r
182         SCIF->SCIF_UNLOCK = SCIF_UNLOCK_KEY(0xAAu)\r
183                 | SCIF_UNLOCK_ADDR((uint32_t)&SCIF->SCIF_RC80MCR - (uint32_t)SCIF);\r
184         SCIF->SCIF_RC80MCR = temp;\r
185         cpu_irq_restore(flags);\r
186 }\r
187 \r
188 void osc_priv_enable_rcfast(void)\r
189 {\r
190         irqflags_t flags;\r
191         uint32_t temp;\r
192 \r
193         flags = cpu_irq_save();\r
194         // Let FCD and calibration value by default\r
195         temp = SCIF->SCIF_RCFASTCFG;\r
196         // Clear previous FRANGE value\r
197         temp &= ~SCIF_RCFASTCFG_FRANGE_Msk;\r
198 \r
199         SCIF->SCIF_UNLOCK = SCIF_UNLOCK_KEY(0xAAu)\r
200                 | SCIF_UNLOCK_ADDR((uint32_t)&SCIF->SCIF_RCFASTCFG - (uint32_t)SCIF);\r
201         SCIF->SCIF_RCFASTCFG = temp | SCIF_RCFASTCFG_EN\r
202                 | SCIF_RCFASTCFG_FRANGE(CONFIG_RCFAST_FRANGE);\r
203         cpu_irq_restore(flags);\r
204 }\r
205 \r
206 void osc_priv_disable_rcfast(void)\r
207 {\r
208         irqflags_t flags;\r
209         uint32_t temp;\r
210         flags = cpu_irq_save();\r
211         // Let FCD and calibration value by default\r
212         temp = SCIF->SCIF_RCFASTCFG;\r
213         // Clear previous FRANGE value\r
214         temp &= ~SCIF_RCFASTCFG_FRANGE_Msk;\r
215         // Disalbe RCFAST\r
216         temp &= ~SCIF_RCFASTCFG_EN;\r
217         SCIF->SCIF_UNLOCK = SCIF_UNLOCK_KEY(0xAAu)\r
218                 | SCIF_UNLOCK_ADDR((uint32_t)&SCIF->SCIF_RCFASTCFG - (uint32_t)SCIF);\r
219         SCIF->SCIF_RCFASTCFG = temp;\r
220         cpu_irq_restore(flags);\r
221 }\r
222 \r