]> git.sur5r.net Git - freertos/blob
508ed4230f45361ecc6a5402a1dae37316bf6d8e
[freertos] /
1 /***************************************************************************//**\r
2  * @file em_chip.h\r
3  * @brief Chip Initialization API\r
4  * @version 4.2.1\r
5  *******************************************************************************\r
6  * @section License\r
7  * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>\r
8  *******************************************************************************\r
9  *\r
10  * Permission is granted to anyone to use this software for any purpose,\r
11  * including commercial applications, and to alter it and redistribute it\r
12  * freely, subject to the following restrictions:\r
13  *\r
14  * 1. The origin of this software must not be misrepresented; you must not\r
15  *    claim that you wrote the original software.\r
16  * 2. Altered source versions must be plainly marked as such, and must not be\r
17  *    misrepresented as being the original software.\r
18  * 3. This notice may not be removed or altered from any source distribution.\r
19  *\r
20  * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no\r
21  * obligation to support this Software. Silicon Labs is providing the\r
22  * Software "AS IS", with no express or implied warranties of any kind,\r
23  * including, but not limited to, any implied warranties of merchantability\r
24  * or fitness for any particular purpose or warranties against infringement\r
25  * of any proprietary rights of a third party.\r
26  *\r
27  * Silicon Labs will not be liable for any consequential, incidental, or\r
28  * special damages, or any other relief, or for any claim by any third party,\r
29  * arising from your use of this Software.\r
30  *\r
31  ******************************************************************************/\r
32 \r
33 #ifndef __SILICON_LABS_EM_CHIP_H__\r
34 #define __SILICON_LABS_EM_CHIP_H__\r
35 \r
36 #include "em_device.h"\r
37 #include "em_system.h"\r
38 \r
39 #ifdef __cplusplus\r
40 extern "C" {\r
41 #endif\r
42 \r
43 /***************************************************************************//**\r
44  * @addtogroup EM_Library\r
45  * @{\r
46  ******************************************************************************/\r
47 \r
48 /***************************************************************************//**\r
49  * @addtogroup CHIP\r
50  * @brief Chip Initialization API\r
51  * @{\r
52  ******************************************************************************/\r
53 \r
54 /**************************************************************************//**\r
55  * @brief\r
56  *   Chip initialization routine for revision errata workarounds\r
57  *\r
58  * This init function will configure the device to a state where it is\r
59  * as similar as later revisions as possible, to improve software compatibility\r
60  * with newer parts. See the device specific errata for details.\r
61  *****************************************************************************/\r
62 __STATIC_INLINE void CHIP_Init(void)\r
63 {\r
64 #if defined(_EFM32_GECKO_FAMILY)\r
65   uint32_t                    rev;\r
66   SYSTEM_ChipRevision_TypeDef chipRev;\r
67   volatile uint32_t           *reg;\r
68 \r
69   rev = *(volatile uint32_t *)(0x0FE081FC);\r
70   /* Engineering Sample calibration setup */\r
71   if ((rev >> 24) == 0)\r
72   {\r
73     reg   = (volatile uint32_t *)0x400CA00C;\r
74     *reg &= ~(0x70UL);\r
75     /* DREG */\r
76     reg   = (volatile uint32_t *)0x400C6020;\r
77     *reg &= ~(0xE0000000UL);\r
78     *reg |= ~(7UL << 25);\r
79   }\r
80   if ((rev >> 24) <= 3)\r
81   {\r
82     /* DREG */\r
83     reg   = (volatile uint32_t *)0x400C6020;\r
84     *reg &= ~(0x00001F80UL);\r
85     /* Update CMU reset values */\r
86     reg  = (volatile uint32_t *)0x400C8040;\r
87     *reg = 0;\r
88     reg  = (volatile uint32_t *)0x400C8044;\r
89     *reg = 0;\r
90     reg  = (volatile uint32_t *)0x400C8058;\r
91     *reg = 0;\r
92     reg  = (volatile uint32_t *)0x400C8060;\r
93     *reg = 0;\r
94     reg  = (volatile uint32_t *)0x400C8078;\r
95     *reg = 0;\r
96   }\r
97 \r
98   SYSTEM_ChipRevisionGet(&chipRev);\r
99   if (chipRev.major == 0x01)\r
100   {\r
101     /* Rev A errata handling for EM2/3. Must enable DMA clock in order for EM2/3 */\r
102     /* to work. This will be fixed in later chip revisions, so only do for rev A. */\r
103     if (chipRev.minor == 00)\r
104     {\r
105       reg   = (volatile uint32_t *)0x400C8040;\r
106       *reg |= 0x2;\r
107     }\r
108 \r
109     /* Rev A+B errata handling for I2C when using EM2/3. USART0 clock must be enabled */\r
110     /* after waking up from EM2/EM3 in order for I2C to work. This will be fixed in */\r
111     /* later chip revisions, so only do for rev A+B. */\r
112     if (chipRev.minor <= 0x01)\r
113     {\r
114       reg   = (volatile uint32_t *)0x400C8044;\r
115       *reg |= 0x1;\r
116     }\r
117   }\r
118   /* Ensure correct ADC/DAC calibration value */\r
119   rev = *(volatile uint32_t *)0x0FE081F0;\r
120   if (rev < 0x4C8ABA00)\r
121   {\r
122     uint32_t cal;\r
123 \r
124     /* Enable ADC/DAC clocks */\r
125     reg   = (volatile uint32_t *)0x400C8044UL;\r
126     *reg |= (1 << 14 | 1 << 11);\r
127 \r
128     /* Retrive calibration values */\r
129     cal = ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x00007F00UL) >>\r
130            8) << 24;\r
131 \r
132     cal |= ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x0000007FUL) >>\r
133             0) << 16;\r
134 \r
135     cal |= ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x00007F00UL) >>\r
136             8) << 8;\r
137 \r
138     cal |= ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x0000007FUL) >>\r
139             0) << 0;\r
140 \r
141     /* ADC0->CAL = 1.25 reference */\r
142     reg  = (volatile uint32_t *)0x40002034UL;\r
143     *reg = cal;\r
144 \r
145     /* DAC0->CAL = 1.25 reference */\r
146     reg  = (volatile uint32_t *)(0x4000402CUL);\r
147     cal  = *(volatile uint32_t *)0x0FE081C8UL;\r
148     *reg = cal;\r
149 \r
150     /* Turn off ADC/DAC clocks */\r
151     reg   = (volatile uint32_t *)0x400C8044UL;\r
152     *reg &= ~(1 << 14 | 1 << 11);\r
153   }\r
154 #endif\r
155 \r
156 #if defined(_EFM32_GIANT_FAMILY)\r
157   uint32_t                    rev;\r
158   SYSTEM_ChipRevision_TypeDef chipRev;\r
159 \r
160   rev = *(volatile uint32_t *)(0x0FE081FC);\r
161   SYSTEM_ChipRevisionGet(&chipRev);\r
162 \r
163   if (((rev >> 24) > 15) && (chipRev.minor == 3))\r
164   {\r
165     /* This fixes an issue with the LFXO on high temperatures. */\r
166     *(volatile uint32_t*)0x400C80C0 =\r
167                       ( *(volatile uint32_t*)0x400C80C0 & ~(1<<6) ) | (1<<4);\r
168   }\r
169 #endif\r
170 \r
171 #if defined(_EFM32_HAPPY_FAMILY)\r
172   uint32_t rev;\r
173   rev = *(volatile uint32_t *)(0x0FE081FC);\r
174 \r
175   if ((rev >> 24) <= 129)\r
176   {\r
177     /* This fixes a mistaken internal connection between PC0 and PC4 */\r
178     /* This disables an internal pulldown on PC4 */\r
179     *(volatile uint32_t*)(0x400C6018) = (1 << 26) | (5 << 0);\r
180     /* This disables an internal LDO test signal driving PC4 */\r
181     *(volatile uint32_t*)(0x400C80E4) &= ~(1 << 24);\r
182   }\r
183 #endif\r
184 }\r
185 \r
186 /** @} (end addtogroup CHIP) */\r
187 /** @} (end addtogroup EM_Library) */\r
188 \r
189 #ifdef __cplusplus\r
190 }\r
191 #endif\r
192 \r
193 #endif /* __SILICON_LABS_EM_CHIP_H__ */\r