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 #if defined( _DEVINFO_PART_DEVICE_FAMILY_EZR32HG )
00090   systemPartFamilyEzr32Happy   = _DEVINFO_PART_DEVICE_FAMILY_EZR32HG,  
00091 #endif
00092 /* Legacy family #defines */
00093 #if defined( _DEVINFO_PART_DEVICE_FAMILY_G )
00094   systemPartFamilyGecko   = _DEVINFO_PART_DEVICE_FAMILY_G,   
00095 #endif
00096 #if defined( _DEVINFO_PART_DEVICE_FAMILY_GG )
00097   systemPartFamilyGiant   = _DEVINFO_PART_DEVICE_FAMILY_GG,  
00098 #endif
00099 #if defined( _DEVINFO_PART_DEVICE_FAMILY_TG )
00100   systemPartFamilyTiny    = _DEVINFO_PART_DEVICE_FAMILY_TG,  
00101 #endif
00102 #if defined( _DEVINFO_PART_DEVICE_FAMILY_LG )
00103   systemPartFamilyLeopard = _DEVINFO_PART_DEVICE_FAMILY_LG,  
00104 #endif
00105 #if defined( _DEVINFO_PART_DEVICE_FAMILY_WG )
00106   systemPartFamilyWonder  = _DEVINFO_PART_DEVICE_FAMILY_WG,  
00107 #endif
00108 #if defined( _DEVINFO_PART_DEVICE_FAMILY_ZG )
00109   systemPartFamilyZero    = _DEVINFO_PART_DEVICE_FAMILY_ZG,  
00110 #endif
00111 #if defined( _DEVINFO_PART_DEVICE_FAMILY_HG )
00112   systemPartFamilyHappy   = _DEVINFO_PART_DEVICE_FAMILY_HG,  
00113 #endif
00114   systemPartFamilyUnknown = 0xFF                             
00117 } SYSTEM_PartFamily_TypeDef;
00118 
00119 
00120 /*******************************************************************************
00121  *******************************   STRUCTS   ***********************************
00122  ******************************************************************************/
00123 
00125 typedef struct
00126 {
00127   uint8_t minor; 
00128   uint8_t major; 
00129   uint8_t family;
00130 } SYSTEM_ChipRevision_TypeDef;
00131 
00132 #if defined( __FPU_PRESENT ) && ( __FPU_PRESENT == 1 )
00133 
00134 typedef enum
00135 {
00136   fpuAccessDenied         = (0x0 << 20),  
00137   fpuAccessPrivilegedOnly = (0x5 << 20),  
00138   fpuAccessReserved       = (0xA << 20),  
00139   fpuAccessFull           = (0xF << 20)   
00140 } SYSTEM_FpuAccess_TypeDef;
00141 #endif
00142 
00143 /*******************************************************************************
00144  *****************************   PROTOTYPES   **********************************
00145  ******************************************************************************/
00146 
00147 void     SYSTEM_ChipRevisionGet(SYSTEM_ChipRevision_TypeDef *rev);
00148 uint32_t SYSTEM_GetCalibrationValue(volatile uint32_t *regAddress);
00149 
00150 #if defined( __FPU_PRESENT ) && ( __FPU_PRESENT == 1 )
00151 /***************************************************************************/
00159 __STATIC_INLINE void SYSTEM_FpuAccessModeSet(SYSTEM_FpuAccess_TypeDef accessMode)
00160 {
00161   SCB->CPACR = (SCB->CPACR & ~(0xF << 20)) | accessMode;
00162 }
00163 #endif
00164 
00165 /***************************************************************************/
00172 __STATIC_INLINE uint64_t SYSTEM_GetUnique(void)
00173 {
00174   return ((uint64_t) ((uint64_t) DEVINFO->UNIQUEH << 32) | (uint64_t) DEVINFO->UNIQUEL);
00175 }
00176 
00177 /***************************************************************************/
00184 __STATIC_INLINE uint8_t SYSTEM_GetProdRev(void)
00185 {
00186   return ((DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK)
00187                          >> _DEVINFO_PART_PROD_REV_SHIFT);
00188 }
00189 
00190 /***************************************************************************/
00202 __STATIC_INLINE uint16_t SYSTEM_GetSRAMSize(void)
00203 {
00204 #if defined(_EFM32_GECKO_FAMILY)
00205   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */
00206   if (SYSTEM_GetProdRev() < 5)
00207   {
00208     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)
00209                            >> _DEVINFO_MSIZE_FLASH_SHIFT;
00210   }
00211 #endif
00212   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)
00213                          >> _DEVINFO_MSIZE_SRAM_SHIFT;
00214 }
00215 
00216 /***************************************************************************/
00228 __STATIC_INLINE uint16_t SYSTEM_GetFlashSize(void)
00229 {
00230 #if defined(_EFM32_GECKO_FAMILY)
00231   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */
00232   if (SYSTEM_GetProdRev() < 5)
00233   {
00234     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)
00235                            >> _DEVINFO_MSIZE_SRAM_SHIFT;
00236   }
00237 #endif
00238   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)
00239                          >> _DEVINFO_MSIZE_FLASH_SHIFT;
00240 }
00241 
00242 
00243 /***************************************************************************/
00255 __STATIC_INLINE uint32_t SYSTEM_GetFlashPageSize(void)
00256 {
00257   uint32_t tmp;
00258 
00259 #if defined( _EFM32_GIANT_FAMILY )
00260   tmp = SYSTEM_GetProdRev();
00261   if (tmp < 18)
00262   {
00263     /* Early Giant/Leopard devices did not have MEMINFO in DEVINFO. */
00264     return FLASH_PAGE_SIZE;
00265   }
00266 #elif defined( _EFM32_ZERO_FAMILY )
00267   tmp = SYSTEM_GetProdRev();
00268   if (tmp < 24)
00269   {
00270     /* Early Zero devices have an incorrect DEVINFO flash page size */
00271     return FLASH_PAGE_SIZE;
00272   }
00273 #endif
00274   tmp = (DEVINFO->MEMINFO & _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_MASK)
00275                  >> _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_SHIFT;
00276 
00277   return 1 << ((tmp + 10) & 0xFF);
00278 }
00279 
00280 
00281 /***************************************************************************/
00288 __STATIC_INLINE uint16_t SYSTEM_GetPartNumber(void)
00289 {
00290   return (DEVINFO->PART & _DEVINFO_PART_DEVICE_NUMBER_MASK)
00291                         >> _DEVINFO_PART_DEVICE_NUMBER_SHIFT;
00292 }
00293 
00294 /***************************************************************************/
00308 __STATIC_INLINE SYSTEM_PartFamily_TypeDef SYSTEM_GetFamily(void)
00309 {
00310   return (SYSTEM_PartFamily_TypeDef)
00311     ((DEVINFO->PART & _DEVINFO_PART_DEVICE_FAMILY_MASK)
00312      >> _DEVINFO_PART_DEVICE_FAMILY_SHIFT);
00313 }
00314 
00315 
00316 /***************************************************************************/
00323 __STATIC_INLINE uint8_t SYSTEM_GetCalibrationTemperature(void)
00324 {
00325   return (DEVINFO->CAL & _DEVINFO_CAL_TEMP_MASK)
00326                        >> _DEVINFO_CAL_TEMP_SHIFT;
00327 }
00328 
00332 #ifdef __cplusplus
00333 }
00334 #endif
00335 
00336 #endif /* __SILICON_LABS_EM_SYSTEM_H_ */