]> git.sur5r.net Git - freertos/blob
a84843440c2ecd0afc6263f03077cb9cd263ec08
[freertos] /
1 /***************************************************************************//**\r
2  * @file em_system.h\r
3  * @brief System 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_SYSTEM_H__\r
34 #define __SILICON_LABS_EM_SYSTEM_H__\r
35 \r
36 #include <stdbool.h>\r
37 #include "em_device.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 SYSTEM\r
50  * @{\r
51  ******************************************************************************/\r
52 \r
53 /*******************************************************************************\r
54  ********************************   ENUMS   ************************************\r
55  ******************************************************************************/\r
56 \r
57 /** Family identifiers. */\r
58 typedef enum\r
59 {\r
60 /* New style family #defines */\r
61 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32G)\r
62   systemPartFamilyEfm32Gecko   = _DEVINFO_PART_DEVICE_FAMILY_EFM32G,      /**< EFM32 Gecko Device Family */\r
63 #endif\r
64 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32GG)\r
65   systemPartFamilyEfm32Giant   = _DEVINFO_PART_DEVICE_FAMILY_EFM32GG,     /**< EFM32 Giant Gecko Device Family */\r
66 #endif\r
67 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32TG)\r
68   systemPartFamilyEfm32Tiny    = _DEVINFO_PART_DEVICE_FAMILY_EFM32TG,     /**< EFM32 Tiny Gecko Device Family */\r
69 #endif\r
70 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32LG)\r
71   systemPartFamilyEfm32Leopard = _DEVINFO_PART_DEVICE_FAMILY_EFM32LG,     /**< EFM32 Leopard Gecko Device Family */\r
72 #endif\r
73 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32WG)\r
74   systemPartFamilyEfm32Wonder  = _DEVINFO_PART_DEVICE_FAMILY_EFM32WG,     /**< EFM32 Wonder Gecko Device Family */\r
75 #endif\r
76 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32ZG)\r
77   systemPartFamilyEfm32Zero    = _DEVINFO_PART_DEVICE_FAMILY_EFM32ZG,     /**< EFM32 Zero Gecko Device Family */\r
78 #endif\r
79 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32HG)\r
80   systemPartFamilyEfm32Happy   = _DEVINFO_PART_DEVICE_FAMILY_EFM32HG,     /**< EFM32 Happy Gecko Device Family */\r
81 #endif\r
82 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32PG1B)\r
83   systemPartFamilyEfm32Pearl1B = _DEVINFO_PART_DEVICE_FAMILY_EFM32PG1B,   /**< EFM32 Pearl Gecko Gen1 Basic Device Family */\r
84 #endif\r
85 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFM32JG1B)\r
86   systemPartFamilyEfm32Jade1B  = _DEVINFO_PART_DEVICE_FAMILY_EFM32JG1B,   /**< EFM32 Jade Gecko Gen1 Basic Device Family */\r
87 #endif\r
88 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EZR32WG)\r
89   systemPartFamilyEzr32Wonder  = _DEVINFO_PART_DEVICE_FAMILY_EZR32WG,     /**< EZR32 Wonder Device Family */\r
90 #endif\r
91 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EZR32LG)\r
92   systemPartFamilyEzr32Leopard = _DEVINFO_PART_DEVICE_FAMILY_EZR32LG,     /**< EZR32 Leopard Device Family */\r
93 #endif\r
94 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EZR32HG)\r
95   systemPartFamilyEzr32Happy   = _DEVINFO_PART_DEVICE_FAMILY_EZR32HG,     /**< EZR32 Happy Device Family */\r
96 #endif\r
97 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32MG1P)\r
98   systemPartFamilyMighty1P = _DEVINFO_PART_DEVICE_FAMILY_EFR32MG1P,       /**< EFR32 Mighty Gecko Gen1 Premium Device Family */\r
99 #endif\r
100 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32MG1B)\r
101   systemPartFamilyMighty1B = _DEVINFO_PART_DEVICE_FAMILY_EFR32MG1B,       /**< EFR32 Mighty Gecko Gen1 Basic Device Family */\r
102 #endif\r
103 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32MG1V)\r
104   systemPartFamilyMighty1V = _DEVINFO_PART_DEVICE_FAMILY_EFR32MG1V,       /**< EFR32 Mighty Gecko Gen1 Value Device Family */\r
105 #endif\r
106 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32BG1P)\r
107   systemPartFamilyBlue1P   = _DEVINFO_PART_DEVICE_FAMILY_EFR32BG1P,       /**< EFR32 Blue Gecko Gen1 Premium Device Family */\r
108 #endif\r
109 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32BG1B)\r
110   systemPartFamilyBlue1B   = _DEVINFO_PART_DEVICE_FAMILY_EFR32BG1B,       /**< EFR32 Blue Gecko Gen1 Basic Device Family */\r
111 #endif\r
112 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32BG1V)\r
113   systemPartFamilyBlue1V   = _DEVINFO_PART_DEVICE_FAMILY_EFR32BG1V,       /**< EFR32 Blue Gecko Gen1 Value Device Family */\r
114 #endif\r
115 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32SG1P)\r
116   systemPartFamilySnappy1P = _DEVINFO_PART_DEVICE_FAMILY_EFR32SG1P,       /**< EFR32 Snappy Gecko Gen1 Premium Device Family */\r
117 #endif\r
118 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32SG1B)\r
119   systemPartFamilySnappy1B = _DEVINFO_PART_DEVICE_FAMILY_EFR32SG1B,       /**< EFR32 Snappy Gecko Gen1 Basic Device Family */\r
120 #endif\r
121 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32SG1V)\r
122   systemPartFamilySnappy1V = _DEVINFO_PART_DEVICE_FAMILY_EFR32SG1V,       /**< EFR32 Snappy Gecko Gen1 Value Device Family */\r
123 #endif\r
124 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32FG1P)\r
125   systemPartFamilyFlex1P   = _DEVINFO_PART_DEVICE_FAMILY_EFR32FG1P,       /**< EFR32 Flex Gecko Gen1 Premium Device Family */\r
126 #endif\r
127 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32FG1B)\r
128   systemPartFamilyFlex1B   = _DEVINFO_PART_DEVICE_FAMILY_EFR32FG1B,       /**< EFR32 Flex Gecko Gen1 Basic Device Family */\r
129 #endif\r
130 #if defined(_DEVINFO_PART_DEVICE_FAMILY_EFR32FG1V)\r
131   systemPartFamilyFlex1V   = _DEVINFO_PART_DEVICE_FAMILY_EFR32FG1V,       /**< EFR32 Flex Gecko Gen1 Value Device Family */\r
132 #endif\r
133 /* Legacy family #defines */\r
134 #if defined(_DEVINFO_PART_DEVICE_FAMILY_G)\r
135   systemPartFamilyGecko   = _DEVINFO_PART_DEVICE_FAMILY_G,   /**< Gecko Device Family */\r
136 #endif\r
137 #if defined(_DEVINFO_PART_DEVICE_FAMILY_GG)\r
138   systemPartFamilyGiant   = _DEVINFO_PART_DEVICE_FAMILY_GG,  /**< Giant Gecko Device Family */\r
139 #endif\r
140 #if defined(_DEVINFO_PART_DEVICE_FAMILY_TG)\r
141   systemPartFamilyTiny    = _DEVINFO_PART_DEVICE_FAMILY_TG,  /**< Tiny Gecko Device Family */\r
142 #endif\r
143 #if defined(_DEVINFO_PART_DEVICE_FAMILY_LG)\r
144   systemPartFamilyLeopard = _DEVINFO_PART_DEVICE_FAMILY_LG,  /**< Leopard Gecko Device Family */\r
145 #endif\r
146 #if defined(_DEVINFO_PART_DEVICE_FAMILY_WG)\r
147   systemPartFamilyWonder  = _DEVINFO_PART_DEVICE_FAMILY_WG,  /**< Wonder Gecko Device Family */\r
148 #endif\r
149 #if defined(_DEVINFO_PART_DEVICE_FAMILY_ZG)\r
150   systemPartFamilyZero    = _DEVINFO_PART_DEVICE_FAMILY_ZG,  /**< Zero Gecko Device Family */\r
151 #endif\r
152 #if defined(_DEVINFO_PART_DEVICE_FAMILY_HG)\r
153   systemPartFamilyHappy   = _DEVINFO_PART_DEVICE_FAMILY_HG,  /**< Happy Gecko Device Family */\r
154 #endif\r
155   systemPartFamilyUnknown = 0xFF                             /**< Unknown Device Family.\r
156                                                                   The family id is missing\r
157                                                                   on unprogrammed parts. */\r
158 } SYSTEM_PartFamily_TypeDef;\r
159 \r
160 \r
161 /*******************************************************************************\r
162  *******************************   STRUCTS   ***********************************\r
163  ******************************************************************************/\r
164 \r
165 /** Chip revision details */\r
166 typedef struct\r
167 {\r
168   uint8_t minor; /**< Minor revision number */\r
169   uint8_t major; /**< Major revision number */\r
170   uint8_t family;/**< Device family number  */\r
171 } SYSTEM_ChipRevision_TypeDef;\r
172 \r
173 #if defined(__FPU_PRESENT) && (__FPU_PRESENT == 1)\r
174 /** Floating point coprocessor access modes. */\r
175 typedef enum\r
176 {\r
177   fpuAccessDenied         = (0x0 << 20),  /**< Access denied, any attempted access generates a NOCP UsageFault. */\r
178   fpuAccessPrivilegedOnly = (0x5 << 20),  /**< Privileged access only, an unprivileged access generates a NOCP UsageFault. */\r
179   fpuAccessReserved       = (0xA << 20),  /**< Reserved. */\r
180   fpuAccessFull           = (0xF << 20)   /**< Full access. */\r
181 } SYSTEM_FpuAccess_TypeDef;\r
182 #endif\r
183 \r
184 /*******************************************************************************\r
185  *****************************   PROTOTYPES   **********************************\r
186  ******************************************************************************/\r
187 \r
188 void     SYSTEM_ChipRevisionGet(SYSTEM_ChipRevision_TypeDef *rev);\r
189 uint32_t SYSTEM_GetCalibrationValue(volatile uint32_t *regAddress);\r
190 \r
191 #if defined(__FPU_PRESENT) && (__FPU_PRESENT == 1)\r
192 /***************************************************************************//**\r
193  * @brief\r
194  *   Set floating point coprocessor (FPU) access mode.\r
195  *\r
196  * @param[in] accessMode\r
197  *   Floating point coprocessor access mode. See @ref SYSTEM_FpuAccess_TypeDef\r
198  *   for details.\r
199  ******************************************************************************/\r
200 __STATIC_INLINE void SYSTEM_FpuAccessModeSet(SYSTEM_FpuAccess_TypeDef accessMode)\r
201 {\r
202   SCB->CPACR = (SCB->CPACR & ~(0xF << 20)) | accessMode;\r
203 }\r
204 #endif\r
205 \r
206 /***************************************************************************//**\r
207  * @brief\r
208  *   Get the unique number for this part.\r
209  *\r
210  * @return\r
211  *   Unique number for this part.\r
212  ******************************************************************************/\r
213 __STATIC_INLINE uint64_t SYSTEM_GetUnique(void)\r
214 {\r
215   return (uint64_t)((uint64_t)DEVINFO->UNIQUEH << 32) | (uint64_t)DEVINFO->UNIQUEL;\r
216 }\r
217 \r
218 /***************************************************************************//**\r
219  * @brief\r
220  *   Get the production revision for this part.\r
221  *\r
222  * @return\r
223  *   Production revision for this part.\r
224  ******************************************************************************/\r
225 __STATIC_INLINE uint8_t SYSTEM_GetProdRev(void)\r
226 {\r
227   return (DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK)\r
228          >> _DEVINFO_PART_PROD_REV_SHIFT;\r
229 }\r
230 \r
231 /***************************************************************************//**\r
232  * @brief\r
233  *   Get the SRAM size (in KB).\r
234  *\r
235  * @note\r
236  *   This function retrievs the correct value by reading the chip device\r
237  *   info structure. If your binary is made for one specific device only,\r
238  *   the \#define SRAM_SIZE can be used instead.\r
239  *\r
240  * @return\r
241  *   The size of the internal SRAM (in KB).\r
242  ******************************************************************************/\r
243 __STATIC_INLINE uint16_t SYSTEM_GetSRAMSize(void)\r
244 {\r
245 #if defined(_EFM32_GECKO_FAMILY)\r
246   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */\r
247   if (SYSTEM_GetProdRev() < 5)\r
248   {\r
249     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)\r
250            >> _DEVINFO_MSIZE_FLASH_SHIFT;\r
251   }\r
252 #endif\r
253   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)\r
254          >> _DEVINFO_MSIZE_SRAM_SHIFT;\r
255 }\r
256 \r
257 /***************************************************************************//**\r
258  * @brief\r
259  *   Get the flash size (in KB).\r
260  *\r
261  * @note\r
262  *   This function retrievs the correct value by reading the chip device\r
263  *   info structure. If your binary is made for one specific device only,\r
264  *   the \#define FLASH_SIZE can be used instead.\r
265  *\r
266  * @return\r
267  *   The size of the internal flash (in KB).\r
268  ******************************************************************************/\r
269 __STATIC_INLINE uint16_t SYSTEM_GetFlashSize(void)\r
270 {\r
271 #if defined(_EFM32_GECKO_FAMILY)\r
272   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */\r
273   if (SYSTEM_GetProdRev() < 5)\r
274   {\r
275     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)\r
276            >> _DEVINFO_MSIZE_SRAM_SHIFT;\r
277   }\r
278 #endif\r
279   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)\r
280          >> _DEVINFO_MSIZE_FLASH_SHIFT;\r
281 }\r
282 \r
283 \r
284 /***************************************************************************//**\r
285  * @brief\r
286  *   Get the flash page size in bytes.\r
287  *\r
288  * @note\r
289  *   This function retrievs the correct value by reading the chip device\r
290  *   info structure. If your binary is made for one specific device only,\r
291  *   the \#define FLASH_PAGE_SIZE can be used instead.\r
292  *\r
293  * @return\r
294  *   The page size of the internal flash in bytes.\r
295  ******************************************************************************/\r
296 __STATIC_INLINE uint32_t SYSTEM_GetFlashPageSize(void)\r
297 {\r
298   uint32_t tmp;\r
299 \r
300 #if defined(_EFM32_GIANT_FAMILY)\r
301   if (SYSTEM_GetProdRev() < 18)\r
302   {\r
303     /* Early Giant/Leopard devices did not have MEMINFO in DEVINFO. */\r
304     return FLASH_PAGE_SIZE;\r
305   }\r
306 #elif defined(_EFM32_ZERO_FAMILY)\r
307   if (SYSTEM_GetProdRev() < 24)\r
308   {\r
309     /* Early Zero devices have an incorrect DEVINFO flash page size */\r
310     return FLASH_PAGE_SIZE;\r
311   }\r
312 #endif\r
313 \r
314   tmp = (DEVINFO->MEMINFO & _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_MASK)\r
315         >> _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_SHIFT;\r
316 \r
317   return 1 << ((tmp + 10) & 0xFF);\r
318 }\r
319 \r
320 \r
321 #if defined( _DEVINFO_DEVINFOREV_DEVINFOREV_MASK )\r
322 /***************************************************************************//**\r
323  * @brief\r
324  *   Get DEVINFO revision.\r
325  *\r
326  * @return\r
327  *   Revision of the DEVINFO contents.\r
328  ******************************************************************************/\r
329 __STATIC_INLINE uint8_t SYSTEM_GetDevinfoRev(void)\r
330 {\r
331   return (DEVINFO->DEVINFOREV & _DEVINFO_DEVINFOREV_DEVINFOREV_MASK)\r
332           >> _DEVINFO_DEVINFOREV_DEVINFOREV_SHIFT;\r
333 }\r
334 #endif\r
335 \r
336 \r
337 /***************************************************************************//**\r
338  * @brief\r
339  *   Get part number of the MCU.\r
340  *\r
341  * @return\r
342  *   The part number of the MCU.\r
343  ******************************************************************************/\r
344 __STATIC_INLINE uint16_t SYSTEM_GetPartNumber(void)\r
345 {\r
346   return (DEVINFO->PART & _DEVINFO_PART_DEVICE_NUMBER_MASK)\r
347          >> _DEVINFO_PART_DEVICE_NUMBER_SHIFT;\r
348 }\r
349 \r
350 /***************************************************************************//**\r
351  * @brief\r
352  *   Get family identifier of the MCU.\r
353  *\r
354  * @note\r
355  *   This function retrievs the family id by reading the chip's device info\r
356  *   structure in flash memory. The user can retrieve the family id directly\r
357  *   by reading the DEVINFO->PART item and decode with the mask and shift\r
358  *   \#defines defined in \<part_family\>_devinfo.h (please refer to code\r
359  *   below for details).\r
360  *\r
361  * @return\r
362  *   The family identifier of the MCU.\r
363  ******************************************************************************/\r
364 __STATIC_INLINE SYSTEM_PartFamily_TypeDef SYSTEM_GetFamily(void)\r
365 {\r
366   return (SYSTEM_PartFamily_TypeDef)\r
367          ((DEVINFO->PART & _DEVINFO_PART_DEVICE_FAMILY_MASK)\r
368           >> _DEVINFO_PART_DEVICE_FAMILY_SHIFT);\r
369 }\r
370 \r
371 \r
372 /***************************************************************************//**\r
373  * @brief\r
374  *   Get the calibration temperature (in degrees Celsius).\r
375  *\r
376  * @return\r
377  *   The calibration temperature in Celsius.\r
378  ******************************************************************************/\r
379 __STATIC_INLINE uint8_t SYSTEM_GetCalibrationTemperature(void)\r
380 {\r
381   return (DEVINFO->CAL & _DEVINFO_CAL_TEMP_MASK)\r
382          >> _DEVINFO_CAL_TEMP_SHIFT;\r
383 }\r
384 \r
385 /** @} (end addtogroup SYSTEM) */\r
386 /** @} (end addtogroup EM_Library) */\r
387 \r
388 #ifdef __cplusplus\r
389 }\r
390 #endif\r
391 \r
392 #endif /* __SILICON_LABS_EM_SYSTEM_H__ */\r