UHSDR/UHSDR-active-devel/mchf-eclipse/drivers/ui/oscillator/osc_interface.c
2022-11-08 16:13:55 +01:00

112 lines
3.1 KiB
C

/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** UHSDR **
** a powerful firmware for STM32 based SDR transceivers **
** **
**---------------------------------------------------------------------------------**
** **
** File name: **
** Description: **
** Last Modified: **
** Licence: GNU GPLv3 **
************************************************************************************/
// Common
#include "osc_interface.h"
#include "uhsdr_board.h"
#include "osc_si570.h"
#include "osc_si5351a.h"
#include "soft_tcxo.h"
// -------------------------------------------------------------------------------------
// Local Oscillator
// ------------------
static void OscDummy_Init(void);
const OscillatorInterface_t* osc;
static bool OscDummy_IsPresent(void)
{
return false;
}
static void OscDummy_SetPPM(float32_t ppm)
{
}
static Oscillator_ResultCodes_t OscDummy_PrepareNextFrequency(ulong freq, int temp_factor)
{
return OSC_OK;
}
static Oscillator_ResultCodes_t OscDummy_ChangeToNextFrequency(void)
{
return OSC_OK;
}
static bool OscDummy_IsNextStepLarge(void)
{
return false;
}
/**
* @brief Checks if all oscillator resources are available for switching frequency
* This function must be called before changing the oscillator in interrupts
* otherwise deadlocks may happen
* @return true if it is safe to call oscillator functions in an interrupt
*/
static bool OscDummy_ReadyForIrqCall(void)
{
return true;
}
static uint32_t OscDummy_getMinFrequency(void)
{
return 1; // 1 Hz
}
static uint32_t OscDummy_getMaxFrequency(void)
{
return UINT32_MAX-1;
}
const OscillatorInterface_t osc_dummy =
{
.init = OscDummy_Init,
.isPresent = OscDummy_IsPresent,
.setPPM = OscDummy_SetPPM,
.prepareNextFrequency = OscDummy_PrepareNextFrequency,
.changeToNextFrequency = OscDummy_ChangeToNextFrequency,
.isNextStepLarge = OscDummy_IsNextStepLarge,
.readyForIrqCall = OscDummy_ReadyForIrqCall,
.name = "Dummy",
.type = OSC_DUMMY,
.getMinFrequency = OscDummy_getMinFrequency,
.getMaxFrequency = OscDummy_getMaxFrequency,
};
static void OscDummy_Init()
{
osc = &osc_dummy;
}
void Osc_Init()
{
#ifdef USE_OSC_SI5351A
if (osc == NULL)
{
Si5351a_Init();
}
#endif
#ifdef USE_OSC_SI570
if (osc == NULL)
{
Si570_Init();
}
#endif
if (osc == NULL)
{
OscDummy_Init();
}
SoftTcxo_Init();
}