]> git.sur5r.net Git - freertos/blob
bcd144d8f55c2642529cc648f695a34b3e72732f
[freertos] /
1 /***************************************************************************//**\r
2  * @file em_chip.h\r
3  * @brief Chip Initialization API\r
4  * @version 4.0.0\r
5  *******************************************************************************\r
6  * @section License\r
7  * <b>(C) Copyright 2014 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 \r
34 #ifndef __SILICON_LABS_EM_CHIP_H_\r
35 #define __SILICON_LABS_EM_CHIP_H_\r
36 \r
37 #include "em_device.h"\r
38 #include "em_system.h"\r
39 \r
40 #ifdef __cplusplus\r
41 extern "C" {\r
42 #endif\r
43 \r
44 /***************************************************************************//**\r
45  * @addtogroup EM_Library\r
46  * @{\r
47  ******************************************************************************/\r
48 \r
49 /***************************************************************************//**\r
50  * @addtogroup CHIP\r
51  * @brief Chip Initialization API\r
52  * @{\r
53  ******************************************************************************/\r
54 \r
55 /**************************************************************************//**\r
56  * @brief\r
57  *   Chip initialization routine for revision errata workarounds\r
58  *\r
59  * This init function will configure the EFM32 device to a state where it is\r
60  * as similar as later revisions as possible, to improve software compatibility\r
61  * with newer parts. See the device specific errata for details.\r
62  *****************************************************************************/\r
63 __STATIC_INLINE void CHIP_Init(void)\r
64 {\r
65 #if defined(_EFM32_GECKO_FAMILY)\r
66   uint32_t                    rev;\r
67   SYSTEM_ChipRevision_TypeDef chipRev;\r
68   volatile uint32_t           *reg;\r
69 \r
70   rev = *(volatile uint32_t *)(0x0FE081FC);\r
71   /* Engineering Sample calibration setup */\r
72   if ((rev >> 24) == 0)\r
73   {\r
74     reg   = (volatile uint32_t *)0x400CA00C;\r
75     *reg &= ~(0x70UL);\r
76     /* DREG */\r
77     reg   = (volatile uint32_t *)0x400C6020;\r
78     *reg &= ~(0xE0000000UL);\r
79     *reg |= ~(7UL << 25);\r
80   }\r
81   if ((rev >> 24) <= 3)\r
82   {\r
83     /* DREG */\r
84     reg   = (volatile uint32_t *)0x400C6020;\r
85     *reg &= ~(0x00001F80UL);\r
86     /* Update CMU reset values */\r
87     reg  = (volatile uint32_t *)0x400C8040;\r
88     *reg = 0;\r
89     reg  = (volatile uint32_t *)0x400C8044;\r
90     *reg = 0;\r
91     reg  = (volatile uint32_t *)0x400C8058;\r
92     *reg = 0;\r
93     reg  = (volatile uint32_t *)0x400C8060;\r
94     *reg = 0;\r
95     reg  = (volatile uint32_t *)0x400C8078;\r
96     *reg = 0;\r
97   }\r
98 \r
99   SYSTEM_ChipRevisionGet(&chipRev);\r
100   if (chipRev.major == 0x01)\r
101   {\r
102     /* Rev A errata handling for EM2/3. Must enable DMA clock in order for EM2/3 */\r
103     /* to work. This will be fixed in later chip revisions, so only do for rev A. */\r
104     if (chipRev.minor == 00)\r
105     {\r
106       reg   = (volatile uint32_t *)0x400C8040;\r
107       *reg |= 0x2;\r
108     }\r
109 \r
110     /* Rev A+B errata handling for I2C when using EM2/3. USART0 clock must be enabled */\r
111     /* after waking up from EM2/EM3 in order for I2C to work. This will be fixed in */\r
112     /* later chip revisions, so only do for rev A+B. */\r
113     if (chipRev.minor <= 0x01)\r
114     {\r
115       reg   = (volatile uint32_t *)0x400C8044;\r
116       *reg |= 0x1;\r
117     }\r
118   }\r
119   /* Ensure correct ADC/DAC calibration value */\r
120   rev = *(volatile uint32_t *)0x0FE081F0;\r
121   if (rev < 0x4C8ABA00)\r
122   {\r
123     uint32_t cal;\r
124 \r
125     /* Enable ADC/DAC clocks */\r
126     reg   = (volatile uint32_t *)0x400C8044UL;\r
127     *reg |= (1 << 14 | 1 << 11);\r
128 \r
129     /* Retrive calibration values */\r
130     cal = ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x00007F00UL) >>\r
131            8) << 24;\r
132 \r
133     cal |= ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x0000007FUL) >>\r
134             0) << 16;\r
135 \r
136     cal |= ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x00007F00UL) >>\r
137             8) << 8;\r
138 \r
139     cal |= ((*(volatile uint32_t *)(0x0FE081B4UL) & 0x0000007FUL) >>\r
140             0) << 0;\r
141 \r
142     /* ADC0->CAL = 1.25 reference */\r
143     reg  = (volatile uint32_t *)0x40002034UL;\r
144     *reg = cal;\r
145 \r
146     /* DAC0->CAL = 1.25 reference */\r
147     reg  = (volatile uint32_t *)(0x4000402CUL);\r
148     cal  = *(volatile uint32_t *)0x0FE081C8UL;\r
149     *reg = cal;\r
150 \r
151     /* Turn off ADC/DAC clocks */\r
152     reg   = (volatile uint32_t *)0x400C8044UL;\r
153     *reg &= ~(1 << 14 | 1 << 11);\r
154   }\r
155 #endif\r
156 \r
157 #if defined(_EFM32_GIANT_FAMILY)\r
158   uint32_t                    rev;\r
159   SYSTEM_ChipRevision_TypeDef chipRev;\r
160 \r
161   rev = *(volatile uint32_t *)(0x0FE081FC);\r
162   SYSTEM_ChipRevisionGet(&chipRev);\r
163 \r
164   if (((rev >> 24) > 15) && (chipRev.minor == 3))\r
165   {\r
166     /* This fixes an issue with the LFXO on high temperatures. */\r
167     *(volatile uint32_t*)0x400C80C0 =\r
168                       ( *(volatile uint32_t*)0x400C80C0 & ~(1<<6) ) | (1<<4);\r
169   }\r
170 #endif\r
171 \r
172 #if defined(_EFM32_HAPPY_FAMILY)\r
173   uint32_t rev;\r
174   rev = *(volatile uint32_t *)(0x0FE081FC);\r
175   \r
176   if ((rev >> 24) <= 129)\r
177   {\r
178     /* This fixes a mistaken internal connection between PC0 and PC4 */\r
179     /* This disables an internal pulldown on PC4 */\r
180     *(volatile uint32_t*)(0x400C6018) = (1 << 26) | (5 << 0); \r
181     /* This disables an internal LDO test signal driving PC4 */\r
182     *(volatile uint32_t*)(0x400C80E4) &= ~(1 << 24);\r
183   }\r
184 #endif\r
185 }\r
186 \r
187 /** @} (end addtogroup CHIP) */\r
188 /** @} (end addtogroup EM_Library) */\r
189 \r
190 #ifdef __cplusplus\r
191 }\r
192 #endif\r
193 \r
194 #endif /* __SILICON_LABS_EM_CHIP_H_ */\r