/***************************************************************************//**
* @file
* @brief System API (Generic)
*******************************************************************************
* # License
* Copyright 2024 Silicon Laboratories Inc. www.silabs.com
*******************************************************************************
*
* SPDX-License-Identifier: Zlib
*
* The licensor of this software is Silicon Laboratories Inc.
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
******************************************************************************/
#ifndef _SL_HAL_SYSTEM_GENERIC_H
#define _SL_HAL_SYSTEM_GENERIC_H
#include "sl_enum.h"
#include
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************//**
* @addtogroup system SYSTEM - System Utils
* @{
******************************************************************************/
/*******************************************************************************
******************************** ENUMS ************************************
******************************************************************************/
/// Family security capability.
SL_ENUM(sl_hal_system_security_capability_t) {
/// Unknown security capability.
SL_SYSTEM_SECURITY_CAPABILITY_UNKNOWN,
/// Security capability not applicable.
SL_SYSTEM_SECURITY_CAPABILITY_NA,
/// Basic security capability.
SL_SYSTEM_SECURITY_CAPABILITY_BASIC,
/// Root of Trust security capability.
SL_SYSTEM_SECURITY_CAPABILITY_ROT,
/// Secure Element security capability.
SL_SYSTEM_SECURITY_CAPABILITY_SE,
/// Secure Vault security capability.
SL_SYSTEM_SECURITY_CAPABILITY_VAULT
};
/// Floating point co-processor access modes.
SL_ENUM_GENERIC(sl_hal_system_fpu_access_t, uint32_t) {
/// Access denied, any attempted access generates a NOCP UsageFault.
SL_SYSTEM_FPU_ACCESS_DENIED = (0x0 << 20),
/// Privileged access only, an unprivileged access generates a NOCP UsageFault.
SL_SYSTEM_FPU_ACCESS_PRIVILEGED_ONLY = (0x5 << 20),
/// Reserved.
SL_SYSTEM_FPU_ACCESS_RESERVED = (0xA << 20),
/// Full access.
SL_SYSTEM_FPU_ACCESS_FULL = (0xF << 20)
};
/*******************************************************************************
******************************* STRUCTS ***********************************
******************************************************************************/
/// Chip revision details.
typedef struct {
uint8_t minor; ///< Minor revision number.
uint8_t major; ///< Major revision number.
uint16_t part_number; ///< Device part number. (0xFFFF if unavailable)
uint16_t family; ///< Device family number. (0xFFFF if unavailable)
} sl_hal_system_chip_revision_t;
/// ADC Calibration DEVINFO Structures.
typedef struct sl_hal_system_devinfo_adc_cal_data_t {
uint8_t trim_vros0;
uint8_t trim_vros1;
uint8_t trim_gain_4x;
uint8_t trim_gain_0x3_int;
} sl_hal_system_devinfo_adc_cal_data_t;
typedef struct sl_hal_system_devinfo_adc_offset_t {
uint8_t trim_off_1x;
uint8_t trim_off_2x;
uint8_t trim_off_4x;
uint8_t dummy_byte;
} sl_hal_system_devinfo_adc_offset_t;
typedef struct sl_hal_system_devinfo_adc_t {
sl_hal_system_devinfo_adc_cal_data_t cal_data;
sl_hal_system_devinfo_adc_offset_t offset;
} sl_hal_system_devinfo_adc_t;
/// Temperature DEVINFO Structure.
typedef struct sl_hal_system_devinfo_temperature_t {
uint16_t emu_temp_room;
uint16_t cal_temp;
} sl_hal_system_devinfo_temperature_t;
/// Chip features Structure.
typedef struct sl_hal_system_features {
char feature1;
char feature2;
char feature3;
} sl_hal_system_features_t;
/*******************************************************************************
************************** GLOBAL CONSTANTS *******************************
******************************************************************************/
extern const sl_hal_system_devinfo_adc_t SL_HAL_SYSTEM_DEVINFO_ADC_RESET_VALUES;
extern const sl_hal_system_devinfo_temperature_t SL_HAL_SYSTEM_DEVINFO_TEMPERATURE_RESET_VALUES;
/*******************************************************************************
***************************** PROTOTYPES **********************************
******************************************************************************/
/*******************************************************************************
* @brief
* Get the chip revision.
*
* @param [out]
* rev Pointer to return the chip revision to.
*
* @warning
* The chip revision structure may be returned with either the partnumber or
* family unpopulated (0xFFFF) depending on the device.
******************************************************************************/
void sl_hal_system_get_chip_revision(sl_hal_system_chip_revision_t *rev);
/***************************************************************************//**
* @brief
* Get DEVINFO revision.
*
* @return
* Revision of the DEVINFO contents.
******************************************************************************/
uint8_t sl_hal_system_get_devinfo_rev(void);
/***************************************************************************//**
* @brief
* Get the default factory calibration value for HFRCO oscillator.
*
* @return
* HFRCOCAL default value.
******************************************************************************/
uint32_t sl_hal_system_get_hfrco_default_calibration(void);
/***************************************************************************//**
* @brief
* Get the speed factory calibration value for HFRCO oscillator.
*
* @return
* HFRCOCAL speed value.
******************************************************************************/
uint32_t sl_hal_system_get_hfrco_speed_calibration(void);
/***************************************************************************//**
* @brief Get the HFRCO calibration based on the frequency band.
*
* @param[in] frequency
* Frequency for which to retrieve calibration.
*
* @return
* HFRCOCAL value for the given band.
*
* @note
* Those calibrations are only valid for the HFRCO oscillator when used with
* the DPLL module.
******************************************************************************/
uint32_t sl_hal_system_get_hfrcodpll_band_calibration(uint32_t frequency);
/***************************************************************************//**
* @brief
* Get a factory calibration value for HFRCOCEM23 oscillator.
*
* @return
* HFRCOEM23 calibration value.
******************************************************************************/
uint32_t sl_hal_system_get_hfrcoem23_calibration(void);
/***************************************************************************//**
* @brief
* Get a factory calibration value for HFXOCAL.
*
* @return
* HFXOCAL value.
******************************************************************************/
uint32_t sl_hal_system_get_hfxocal(void);
/***************************************************************************//**
* @brief
* Get family security capability.
*
* @note
* This function retrieves the family security capability based on the
* device number.
*
* @return
* Security capability of MCU.
******************************************************************************/
sl_hal_system_security_capability_t sl_hal_system_get_security_capability(void);
/***************************************************************************//**
* @brief
* Get the unique number for this device.
*
* @return
* Unique number for this device.
******************************************************************************/
uint64_t sl_hal_system_get_unique(void);
/***************************************************************************//**
* @brief
* Get the production revision for this part.
*
* @return
* Production revision for this part.
******************************************************************************/
uint8_t sl_hal_system_get_prod_rev(void);
/***************************************************************************//**
* @brief
* Get the SRAM Base Address.
*
* @return
* Base address SRAM (32-bit unsigned integer).
******************************************************************************/
uint32_t sl_hal_system_get_sram_base_address(void);
/***************************************************************************//**
* @brief
* Get the SRAM size (in KB).
*
* @note
* This function retrieves SRAM size by reading the chip device
* info structure. If your binary is made for one specific device only,
* use SRAM_SIZE instead.
*
* @return
* Size of internal SRAM (in KB).
******************************************************************************/
uint16_t sl_hal_system_get_sram_size(void);
/***************************************************************************//**
* @brief
* Get the flash size (in KB).
*
* @note
* This function retrieves flash size by reading the chip device info structure or
* DEVINFO->EMBMSIZE (embedded flash. not the case for S3 for now) or
* user config (external flash).
*
* @return
* Size of flash (in KB).
******************************************************************************/
uint16_t sl_hal_system_get_flash_size(void);
/***************************************************************************//**
* @brief
* Get the flash page size in bytes.
*
* @note
* This function retrieves flash page size by reading the SE or
* user config (external flash)
*
* @return
* Page size of flash in bytes.
******************************************************************************/
uint32_t sl_hal_system_get_flash_page_size(void);
/***************************************************************************//**
* @brief
* Get the MCU part number.
*
* @return
* The part number of MCU.
******************************************************************************/
uint16_t sl_hal_system_get_part_number(void);
/***************************************************************************//**
* @brief
* Get the SoC or MCU features.
*
* @return
* The features of the current SoC or MCU.
*
* @note The features can be decoded by referring to the SoC or MCU datasheet.
******************************************************************************/
sl_hal_system_features_t sl_hal_system_get_part_features(void);
/***************************************************************************//**
* @brief
* Get the temperature information.
*
* @param[out] info
* Pointer to variable where to store the temperature info.
******************************************************************************/
void sl_hal_system_get_temperature_info(sl_hal_system_devinfo_temperature_t *info);
/***************************************************************************//**
* @brief
* Set floating point co-processor (FPU) access mode.
*
* @param[in] accessMode
* Floating point co-processor access mode.
******************************************************************************/
void sl_hal_system_fpu_set_access_mode(sl_hal_system_fpu_access_t access_mode);
/***************************************************************************//**
* @brief Get the ADC calibration info.
*
* @param[out] info
* Pointer to variable where to store the adc calibration info.
******************************************************************************/
void sl_hal_system_get_adc_calibration_info(sl_hal_system_devinfo_adc_t *info);
/** @} (end addtogroup system) */
#ifdef __cplusplus
}
#endif
#endif /* #ifndef _SL_HAL_SYSTEM_GENERIC_H */