112 lines
3.1 KiB
C
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();
|
|
}
|