Initial commit of firmware

This commit is contained in:
2025-04-12 13:30:57 +01:00
commit 264a3462e0
374 changed files with 332649 additions and 0 deletions

View File

@@ -0,0 +1,144 @@
/***************************************************************************//**
* @file
* @brief HFXO Manager API definition.
*******************************************************************************
* # License
* <b>Copyright 2019 Silicon Laboratories Inc. www.silabs.com</b>
*******************************************************************************
*
* 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.
*
******************************************************************************/
/***************************************************************************//**
* @addtogroup hfxo_manager HFXO Manager
* @brief HFXO Manager
* @details
* ## Overview
*
* HFXO Manager is a platform service module intended to manage the High
* Frequency Crystal Oscillator (HFXO) module and offer related functionalities
* and services.
* For the moment, this module is only supported on Silicon Labs series 2
* devices.
* Among others, it handles the HFXO startup failures. This is to support
* sleepy crystals (crystals where the ESR value could change unexpectedly up
* to 5 times its value during the startup). In case of a failure during the
* HFXO startup, the HFXO Manager will retry the startup process with more
* aggressive settings (sleepy crystal settings) to try waking up the crystal
* from its sleepy state so that the ESR value can fall back to normal values.
* Once the crystal is out of its sleepy state, the module will put back the
* normal settings ensuring the right oscillation frequency. This feature can
* be enabled/disabled via the configuration define
* SL_HFXO_MANAGER_SLEEPY_CRYSTAL_SUPPORT.
* The module catches startup failures through interrupts using the HFXO
* interrupt handler. If your application also needs the HFXO interrupt
* handler, the configuration define SL_HFXO_MANAGER_CUSTOM_HFXO_IRQ_HANDLER
* can be used to remove the HFXO interrupt handler definition from the HFXO
* Manager so that it can be defined in your application. In that case, your
* definition of the HFXO Interrupt Handler will need to call the
* sl_hfxo_manager_irq_handler() function so that HFXO Manager can continue
* to work properly.
* The HFXO Manager is also required by the Power Manager module for some
* internal features and therefore becomes mandatory every time the Power
* Manager is present.
*
*
* ## Initialization
*
* Two functions are required to initialize the module.
* sl_hfxo_manager_init_hardware() is to initialize the HFXO interrupts and
* must therefore be called before any other HFXO initialization functions like
* the emlib CMU_HFXOInit() or device_init function sl_device_init_hfxo().
* The second initialization function sl_hfxo_manager_init() is required for
* internal use and needs to be called before going to sleep.
*
* @{
******************************************************************************/
#ifndef SL_HFXO_MANAGER_H
#define SL_HFXO_MANAGER_H
#include "sl_status.h"
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/// @brief Sleepy Crystal settings
typedef struct sl_hfxo_manager_sleepy_xtal_settings {
uint32_t ana_ctune; ///< Tuning Capacitance values for XI and XO during startup intermediate and steady stages
uint32_t core_bias_current; ///< Core Bias current value during all stages
} sl_hfxo_manager_sleepy_xtal_settings_t;
/***************************************************************************//**
* HFXO Manager module hardware specific initialization.
******************************************************************************/
void sl_hfxo_manager_init_hardware(void);
/***************************************************************************//**
* Initialize HFXO Manager module.
*
* @return Status Code.
******************************************************************************/
sl_status_t sl_hfxo_manager_init(void);
/***************************************************************************//**
* Updates Sleepy Crystal settings.
*
* @param settings Pointer to settings structure
*
* @return Status Code.
*
* @note Those settings are temporarily used to force oscillation on sleepy
* crystal.
* Default values should be enough to wake-up sleepy crystals. Otherwise,
* this function can be used.
******************************************************************************/
sl_status_t sl_hfxo_manager_update_sleepy_xtal_settings(const sl_hfxo_manager_sleepy_xtal_settings_t *settings);
/***************************************************************************//**
* When this callback function is called, it means that HFXO failed twice in
* a row to start with normal configurations. This may mean that there is a
* bad crystal. When getting this callback, HFXO is running but its properties
* (frequency, precision) are not guaranteed. This should be considered as an
* error situation.
******************************************************************************/
void sl_hfxo_manager_notify_consecutive_failed_startups(void);
/***************************************************************************//**
* HFXO Manager HFXO interrupt handler.
*
* @note This function must be called by the HFXO interrupt handler in order
* to support the HFXO Manager module.
* This function handles the HFXO_IF_RDY, HFXO_IF_DNSERR and
* HFXO_XTALCTRL_SKIPCOREBIASOPT interrupt flags.
******************************************************************************/
void sl_hfxo_manager_irq_handler(void);
/** @} (end addtogroup hfxo_manager) */
#ifdef __cplusplus
}
#endif
#endif // SL_HFXO_MANAGER_H

View File

@@ -0,0 +1,102 @@
/***************************************************************************//**
* @file
* @brief HFXO Manager API definition.
*******************************************************************************
* # License
* <b>Copyright 2019 Silicon Laboratories Inc. www.silabs.com</b>
*******************************************************************************
*
* 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 SLI_HFXO_MANAGER_H
#define SLI_HFXO_MANAGER_H
#include <stdbool.h>
#if defined(SL_COMPONENT_CATALOG_PRESENT)
#include "sl_component_catalog.h"
#endif
#if defined(SL_CATALOG_SLEEPTIMER_PRESENT) && defined(SYSRTC_PRESENT)
#include "sli_sleeptimer.h"
#if (SL_SLEEPTIMER_PERIPHERAL == SL_SLEEPTIMER_PERIPHERAL_SYSRTC)
#define HFXO_MANAGER_SLEEPTIMER_SYSRTC_INTEGRATION_ON
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************************//**
* HFXO Manager module hardware specific initialization.
******************************************************************************/
void sli_hfxo_manager_init_hardware(void);
/***************************************************************************//**
* Function to call just before starting HFXO, to save current tick count.
******************************************************************************/
void sli_hfxo_manager_begin_startup_measurement(void);
#if defined(HFXO_MANAGER_SLEEPTIMER_SYSRTC_INTEGRATION_ON)
/***************************************************************************//**
* Function to call when a SYSRTC compare match event produces a PRS signal to
start HFXO.
******************************************************************************/
void sli_hfxo_manager_retrieve_begining_startup_measurement(void);
#endif
/***************************************************************************//**
* Function to call just after HFXO becomes ready, to save current tick count
* and calculate HFXO startup time.
******************************************************************************/
void sli_hfxo_manager_end_startup_measurement(void);
/***************************************************************************//**
* Retrieves HFXO startup time average value.
******************************************************************************/
uint32_t sli_hfxo_manager_get_startup_time(void);
/***************************************************************************//**
* Retrieves HFXO startup time latest value.
******************************************************************************/
uint32_t sli_hfxo_manager_get_latest_startup_time(void);
/***************************************************************************//**
* Checks if HFXO is ready and, if needed, waits for it to be.
*
* @param wait True, to wait for HFXO to be ready.
* False, otherwise.
*
* @return True, if HFXO is ready.
* False, otherwise.
*
* @note This will also make sure we are not in the process of restarting HFXO
* with different settings.
******************************************************************************/
bool sli_hfxo_manager_is_hfxo_ready(bool wait);
#ifdef __cplusplus
}
#endif
#endif /* SLI_HFXO_MANAGER_H */