em_system.h

Go to the documentation of this file.
00001 /***************************************************************************/
00034 #ifndef __EM_SYSTEM_H
00035 #define __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   systemPartFamilyGecko   = _DEVINFO_PART_DEVICE_FAMILY_G,   
00062   systemPartFamilyGiant   = _DEVINFO_PART_DEVICE_FAMILY_GG,  
00063   systemPartFamilyTiny    = _DEVINFO_PART_DEVICE_FAMILY_TG,  
00064   systemPartFamilyLeopard = _DEVINFO_PART_DEVICE_FAMILY_LG,  
00065   systemPartFamilyWonder  = _DEVINFO_PART_DEVICE_FAMILY_WG,  
00066   systemPartFamilyZero    = _DEVINFO_PART_DEVICE_FAMILY_ZG,  
00067   systemPartFamilyUnknown = 0xFF                             
00070 } SYSTEM_PartFamily_TypeDef;
00071 
00072 
00073 /*******************************************************************************
00074  *******************************   STRUCTS   ***********************************
00075  ******************************************************************************/
00076 
00078 typedef struct
00079 {
00080   uint8_t minor; 
00081   uint8_t major; 
00082   uint8_t family;
00083 } SYSTEM_ChipRevision_TypeDef;
00084 
00085 #if defined( __FPU_PRESENT ) && ( __FPU_PRESENT == 1 )
00086 
00087 typedef enum
00088 {
00089   fpuAccessDenied         = (0x0 << 20),  
00090   fpuAccessPrivilegedOnly = (0x5 << 20),  
00091   fpuAccessReserved       = (0xA << 20),  
00092   fpuAccessFull           = (0xF << 20)   
00093 } SYSTEM_FpuAccess_TypeDef;
00094 #endif
00095 
00096 /*******************************************************************************
00097  *****************************   PROTOTYPES   **********************************
00098  ******************************************************************************/
00099 
00100 void     SYSTEM_ChipRevisionGet(SYSTEM_ChipRevision_TypeDef *rev);
00101 uint32_t SYSTEM_GetCalibrationValue(volatile uint32_t *regAddress);
00102 
00103 #if defined( __FPU_PRESENT ) && ( __FPU_PRESENT == 1 )
00104 /***************************************************************************/
00112 __STATIC_INLINE void SYSTEM_FpuAccessModeSet(SYSTEM_FpuAccess_TypeDef accessMode)
00113 {
00114   SCB->CPACR = (SCB->CPACR & ~(0xF << 20)) | accessMode;
00115 }
00116 #endif
00117 
00118 /***************************************************************************/
00125 __STATIC_INLINE uint64_t SYSTEM_GetUnique(void)
00126 {
00127   return ((uint64_t) ((uint64_t) DEVINFO->UNIQUEH << 32) | (uint64_t) DEVINFO->UNIQUEL);
00128 }
00129 
00130 /***************************************************************************/
00137 __STATIC_INLINE uint8_t SYSTEM_GetProdRev(void)
00138 {
00139   return ((DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK)
00140                          >> _DEVINFO_PART_PROD_REV_SHIFT);
00141 }
00142 
00143 /***************************************************************************/
00155 __STATIC_INLINE uint16_t SYSTEM_GetSRAMSize(void)
00156 {
00157 #if defined(_EFM32_GECKO_FAMILY)
00158   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */
00159   if (SYSTEM_GetProdRev() < 5)
00160   {
00161     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)
00162                            >> _DEVINFO_MSIZE_FLASH_SHIFT;
00163   }
00164 #endif
00165   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)
00166                          >> _DEVINFO_MSIZE_SRAM_SHIFT;
00167 }
00168 
00169 /***************************************************************************/
00181 __STATIC_INLINE uint16_t SYSTEM_GetFlashSize(void)
00182 {
00183 #if defined(_EFM32_GECKO_FAMILY)
00184   /* Early Gecko devices had a bug where SRAM and Flash size were swapped. */
00185   if (SYSTEM_GetProdRev() < 5)
00186   {
00187     return (DEVINFO->MSIZE & _DEVINFO_MSIZE_SRAM_MASK)
00188                            >> _DEVINFO_MSIZE_SRAM_SHIFT;
00189   }
00190 #endif
00191   return (DEVINFO->MSIZE & _DEVINFO_MSIZE_FLASH_MASK)
00192                          >> _DEVINFO_MSIZE_FLASH_SHIFT;
00193 }
00194 
00195 
00196 /***************************************************************************/
00208 __STATIC_INLINE uint32_t SYSTEM_GetFlashPageSize(void)
00209 {
00210 #if defined(_EFM32_GIANT_FAMILY)
00211   if (SYSTEM_GetProdRev() < 18)
00212   {
00213     /* Early Giant/Leopard devices did not have MEMINFO in DEVINFO. */
00214     return FLASH_PAGE_SIZE;
00215   }
00216 #endif
00217   uint32_t tmp = (DEVINFO->MEMINFO & _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_MASK)
00218                  >> _DEVINFO_MEMINFO_FLASH_PAGE_SIZE_SHIFT;
00219 
00220   return 1 << ((tmp + 10) & 0xFF);
00221 }
00222 
00223 /***************************************************************************/
00230 __STATIC_INLINE uint16_t SYSTEM_GetPartNumber(void)
00231 {
00232   return (DEVINFO->PART & _DEVINFO_PART_DEVICE_NUMBER_MASK)
00233                         >> _DEVINFO_PART_DEVICE_NUMBER_SHIFT;
00234 }
00235 
00236 /***************************************************************************/
00250 __STATIC_INLINE SYSTEM_PartFamily_TypeDef SYSTEM_GetFamily(void)
00251 {
00252   return (SYSTEM_PartFamily_TypeDef)
00253     ((DEVINFO->PART & _DEVINFO_PART_DEVICE_FAMILY_MASK)
00254      >> _DEVINFO_PART_DEVICE_FAMILY_SHIFT);
00255 }
00256 
00257 /***************************************************************************/
00264 __STATIC_INLINE uint8_t SYSTEM_GetCalibrationTemperature(void)
00265 {
00266   return (DEVINFO->CAL & _DEVINFO_CAL_TEMP_MASK)
00267                        >> _DEVINFO_CAL_TEMP_SHIFT;
00268 }
00269 
00273 #ifdef __cplusplus
00274 }
00275 #endif
00276 
00277 #endif /* __EM_SYSTEM_H */