em_system.h

Go to the documentation of this file.
00001 /***************************************************************************/
00034 #ifndef __SILICON_LABS_EM_SYSTEM_H_
00035 #define __SILICON_LABS_EM_SYSTEM_H_
00036 
00037 #include <stdbool.h>
00038 #include "em_device.h"
00039 
00040 #ifdef __cplusplus
00041 extern "C" {
00042 #endif
00043 
00044 /***************************************************************************/
00049 /***************************************************************************/
00054 /*******************************************************************************
00055  ********************************   ENUMS   ************************************
00056  ******************************************************************************/
00057 
00059 typedef enum
00060 {
00061 /* New style family #defines */
00062 #if defined ( _DEVINFO_PART_DEVICE_FAMILY_EFM32G )
00063   systemPartFamilyEfm32Gecko   = _DEVINFO_PART_DEVICE_FAMILY_EFM32G,   
00064 #endif
00065 #if defined ( _DEVINFO_PART_DEVICE_FAMILY_EFM32GG )
00066   systemPartFamilyEfm32Giant   = _DEVINFO_PART_DEVICE_FAMILY_EFM32GG,  
00067 #endif
00068 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EFM32TG )
00069   systemPartFamilyEfm32Tiny    = _DEVINFO_PART_DEVICE_FAMILY_EFM32TG,  
00070 #endif
00071 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EFM32LG )
00072   systemPartFamilyEfm32Leopard = _DEVINFO_PART_DEVICE_FAMILY_EFM32LG,  
00073 #endif
00074 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EFM32WG )
00075   systemPartFamilyEfm32Wonder  = _DEVINFO_PART_DEVICE_FAMILY_EFM32WG,  
00076 #endif
00077 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EFM32ZG )
00078   systemPartFamilyEfm32Zero    = _DEVINFO_PART_DEVICE_FAMILY_EFM32ZG,  
00079 #endif
00080 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EFM32HG )
00081   systemPartFamilyEfm32Happy   = _DEVINFO_PART_DEVICE_FAMILY_EFM32HG,  
00082 #endif
00083 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EZR32WG )
00084   systemPartFamilyEzr32Wonder   = _DEVINFO_PART_DEVICE_FAMILY_EZR32WG,  
00085 #endif
00086 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EZR32LG )
00087   systemPartFamilyEzr32Leopard  = _DEVINFO_PART_DEVICE_FAMILY_EZR32LG,  
00088 #endif
00089 /* Legacy family #defines */
00090 #if defined( _DEVINFO_PART_DEVICE_FAMILY_G )
00091   systemPartFamilyGecko   = _DEVINFO_PART_DEVICE_FAMILY_G,   
00092 #endif
00093 #if defined( _DEVINFO_PART_DEVICE_FAMILY_GG )
00094   systemPartFamilyGiant   = _DEVINFO_PART_DEVICE_FAMILY_GG,  
00095 #endif
00096 #if defined( _DEVINFO_PART_DEVICE_FAMILY_TG )
00097   systemPartFamilyTiny    = _DEVINFO_PART_DEVICE_FAMILY_TG,  
00098 #endif
00099 #if defined( _DEVINFO_PART_DEVICE_FAMILY_LG )
00100   systemPartFamilyLeopard = _DEVINFO_PART_DEVICE_FAMILY_LG,  
00101 #endif
00102 #if defined( _DEVINFO_PART_DEVICE_FAMILY_WG )
00103   systemPartFamilyWonder  = _DEVINFO_PART_DEVICE_FAMILY_WG,  
00104 #endif
00105 #if defined( _DEVINFO_PART_DEVICE_FAMILY_ZG )
00106   systemPartFamilyZero    = _DEVINFO_PART_DEVICE_FAMILY_ZG,  
00107 #endif
00108 #if defined( _DEVINFO_PART_DEVICE_FAMILY_HG )
00109   systemPartFamilyHappy   = _DEVINFO_PART_DEVICE_FAMILY_HG,  
00110 #endif
00111   systemPartFamilyUnknown = 0xFF                             
00114 } SYSTEM_PartFamily_TypeDef;
00115 
00116 
00117 /*******************************************************************************
00118  *******************************   STRUCTS   ***********************************
00119  ******************************************************************************/
00120 
00122 typedef struct
00123 {
00124   uint8_t minor; 
00125   uint8_t major; 
00126   uint8_t family;
00127 } SYSTEM_ChipRevision_TypeDef;
00128 
00129 #if defined( __FPU_PRESENT ) && ( __FPU_PRESENT == 1 )
00130 
00131 typedef enum
00132 {
00133   fpuAccessDenied         = (0x0 << 20),  
00134   fpuAccessPrivilegedOnly = (0x5 << 20),  
00135   fpuAccessReserved       = (0xA << 20),  
00136   fpuAccessFull           = (0xF << 20)   
00137 } SYSTEM_FpuAccess_TypeDef;
00138 #endif
00139 
00140 /*******************************************************************************
00141  *****************************   PROTOTYPES   **********************************
00142  ******************************************************************************/
00143 
00144 void     SYSTEM_ChipRevisionGet(SYSTEM_ChipRevision_TypeDef *rev);
00145 uint32_t SYSTEM_GetCalibrationValue(volatile uint32_t *regAddress);
00146 
00147 #if defined( __FPU_PRESENT ) && ( __FPU_PRESENT == 1 )
00148 /***************************************************************************/
00156 __STATIC_INLINE void SYSTEM_FpuAccessModeSet(SYSTEM_FpuAccess_TypeDef accessMode)
00157 {
00158   SCB->CPACR = (SCB->CPACR & ~(0xF << 20)) | accessMode;
00159 }
00160 #endif
00161 
00162 /***************************************************************************/
00169 __STATIC_INLINE uint64_t SYSTEM_GetUnique(void)
00170 {
00171   return ((uint64_t) ((uint64_t) DEVINFO->UNIQUEH << 32) | (uint64_t) DEVINFO->UNIQUEL);
00172 }
00173 
00174 /***************************************************************************/
00181 __STATIC_INLINE uint8_t SYSTEM_GetProdRev(void)
00182 {
00183   return ((DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK)
00184                          >> _DEVINFO_PART_PROD_REV_SHIFT);
00185 }
00186 
00187 /***************************************************************************/
00199 __STATIC_INLINE uint16_t SYSTEM_GetSRAMSize(void)
00200 {
00201 #if defined(_EFM32_GECKO_FAMILY)
00202   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */
00203   if (SYSTEM_GetProdRev() < 5)
00204   {
00205     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)
00206                            >> _DEVINFO_MSIZE_FLASH_SHIFT;
00207   }
00208 #endif
00209   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)
00210                          >> _DEVINFO_MSIZE_SRAM_SHIFT;
00211 }
00212 
00213 /***************************************************************************/
00225 __STATIC_INLINE uint16_t SYSTEM_GetFlashSize(void)
00226 {
00227 #if defined(_EFM32_GECKO_FAMILY)
00228   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */
00229   if (SYSTEM_GetProdRev() < 5)
00230   {
00231     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)
00232                            >> _DEVINFO_MSIZE_SRAM_SHIFT;
00233   }
00234 #endif
00235   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)
00236                          >> _DEVINFO_MSIZE_FLASH_SHIFT;
00237 }
00238 
00239 
00240 /***************************************************************************/
00252 __STATIC_INLINE uint32_t SYSTEM_GetFlashPageSize(void)
00253 {
00254   uint32_t tmp;
00255 
00256 #if defined( _EFM32_GIANT_FAMILY )
00257   tmp = SYSTEM_GetProdRev();
00258   if (tmp < 18)
00259   {
00260     /* Early Giant/Leopard devices did not have MEMINFO in DEVINFO. */
00261     return FLASH_PAGE_SIZE;
00262   }
00263 #elif defined( _EFM32_ZERO_FAMILY )
00264   tmp = SYSTEM_GetProdRev();
00265   if (tmp < 24)
00266   {
00267     /* Early Zero devices have an incorrect DEVINFO flash page size */
00268     return FLASH_PAGE_SIZE;
00269   }
00270 #endif
00271   tmp = (DEVINFO->MEMINFO & _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_MASK)
00272                  >> _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_SHIFT;
00273 
00274   return 1 << ((tmp + 10) & 0xFF);
00275 }
00276 
00277 
00278 /***************************************************************************/
00285 __STATIC_INLINE uint16_t SYSTEM_GetPartNumber(void)
00286 {
00287   return (DEVINFO->PART & _DEVINFO_PART_DEVICE_NUMBER_MASK)
00288                         >> _DEVINFO_PART_DEVICE_NUMBER_SHIFT;
00289 }
00290 
00291 /***************************************************************************/
00305 __STATIC_INLINE SYSTEM_PartFamily_TypeDef SYSTEM_GetFamily(void)
00306 {
00307   return (SYSTEM_PartFamily_TypeDef)
00308     ((DEVINFO->PART & _DEVINFO_PART_DEVICE_FAMILY_MASK)
00309      >> _DEVINFO_PART_DEVICE_FAMILY_SHIFT);
00310 }
00311 
00312 
00313 /***************************************************************************/
00320 __STATIC_INLINE uint8_t SYSTEM_GetCalibrationTemperature(void)
00321 {
00322   return (DEVINFO->CAL & _DEVINFO_CAL_TEMP_MASK)
00323                        >> _DEVINFO_CAL_TEMP_SHIFT;
00324 }
00325 
00329 #ifdef __cplusplus
00330 }
00331 #endif
00332 
00333 #endif /* __SILICON_LABS_EM_SYSTEM_H_ */