Removed platform_getCalibrationData() function because of limited usefulness.

Given that each radio driver loads its calibration data when initializing
and that the radio driver is strongly platform-specific, there is no strong
need for an intermediate redirection layer through the platform API.
pull/147/head
Silvano Seva 2023-07-13 09:57:36 +02:00
rodzic 6d58230c8c
commit 313e9615a6
14 zmienionych plików z 92 dodań i 169 usunięć

Wyświetl plik

@ -149,15 +149,6 @@ void platform_beepStop();
*/
void platform_setBacklightLevel(uint8_t level);
/**
* This function returns a pointer to the device-specific calbration data,
* application code has to cast it to the correct data structure.
* WARNING: calling code must ensure that free() is never called on the returned
* pointer!
* @return pointer to device's calibration data.
*/
const void *platform_getCalibrationData();
/**
* This function returns a pointer to a data structure containing all the
* hardware information.

Wyświetl plik

@ -25,9 +25,12 @@
#include <OpMode_M17.hpp>
#include <audio_codec.h>
#include <rtx.h>
#ifdef PLATFORM_MOD17
#include <calibInfo_Mod17.h>
#include <interfaces/platform.h>
extern mod17Calib_t mod17CalData;
#endif
using namespace std;
@ -87,10 +90,8 @@ void OpMode_M17::update(rtxStatus_t *const status, const bool newCfg)
//
// Get phase inversion settings from calibration.
//
const mod17Calib_t *calData =
reinterpret_cast< const mod17Calib_t * >(platform_getCalibrationData());
invertTxPhase = (calData->tx_invert == 1) ? true : false;
invertRxPhase = (calData->rx_invert == 1) ? true : false;
invertTxPhase = (mod17CalData.tx_invert == 1) ? true : false;
invertRxPhase = (mod17CalData.rx_invert == 1) ? true : false;
#endif
// Main FSM logic

Wyświetl plik

@ -48,7 +48,7 @@ static const uint32_t MEM_MAGIC = 0x584E504F; // "OPNX"
static const uint32_t baseAddress = 0x080E0000;
memory_t *memory = ((memory_t *) baseAddress);
extern mod17Calib_t mod17CalData; // Calibration data, to be saved and loaded
mod17Calib_t mod17CalData; // Calibration data, to be saved and loaded
/**
* \internal

Wyświetl plik

@ -18,8 +18,8 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#include <interfaces/platform.h>
#include <interfaces/radio.h>
#include <interfaces/nvmem.h>
#include <interfaces/gpio.h>
#include <calibInfo_GDx.h>
#include <hwconfig.h>
@ -29,9 +29,9 @@
#include "HR_C6000.h"
#include "AT1846S.h"
const gdxCalibration_t *calData; // Pointer to calibration data
const rtxStatus_t *config; // Pointer to data structure with radio configuration
static gdxCalibration_t calData; // Calibration data
Band currRxBand = BND_NONE; // Current band for RX
Band currTxBand = BND_NONE; // Current band for TX
uint16_t apcVoltage = 0; // APC voltage for TX output power control
@ -43,11 +43,6 @@ AT1846S& at1846s = AT1846S::instance(); // AT1846S driver
void radio_init(const rtxStatus_t *rtxState)
{
/*
* Load calibration data
*/
calData = reinterpret_cast< const gdxCalibration_t * >(platform_getCalibrationData());
config = rtxState;
radioStatus = OFF;
@ -78,6 +73,11 @@ void radio_init(const rtxStatus_t *rtxState)
DAC0->C0 |= DAC_C0_DACRFS_MASK // Reference voltage is Vref2
| DAC_C0_DACEN_MASK; // Enable DAC
/*
* Load calibration data
*/
nvm_readCalibData(&calData);
/*
* Enable and configure both AT1846S and HR_C6000, keep AF output disabled
* at power on.
@ -121,7 +121,7 @@ void radio_setOpmode(const enum opmode mode)
gpio_setPin(TX_AUDIO_MUX); // Audio in from HR_C6000
at1846s.setOpMode(AT1846S_OpMode::DMR);
at1846s.setBandwidth(AT1846S_BW::_12P5);
at1846s.setTxDeviation(calData->data[currTxBand].mixGainNarrowband);
at1846s.setTxDeviation(calData.data[currTxBand].mixGainNarrowband);
break;
default:
@ -157,8 +157,8 @@ void radio_enableRx()
if(currRxBand == BND_NONE) return;
// Adjust reference oscillator bias and offset.
C6000.writeCfgRegister(0x04, calData->data[currRxBand].mod2Offset);
C6000.setModOffset(calData->data[currRxBand].modBias);
C6000.writeCfgRegister(0x04, calData.data[currRxBand].mod2Offset);
C6000.setModOffset(calData.data[currRxBand].modBias);
// Set frequency and enable AT1846S RX
at1846s.setFrequency(config->rxFrequency);
@ -194,8 +194,8 @@ void radio_enableTx()
if(currTxBand == BND_NONE) return;
// Adjust reference oscillator bias and offset.
C6000.writeCfgRegister(0x04, calData->data[currTxBand].mod2Offset);
C6000.setModOffset(calData->data[currTxBand].modBias);
C6000.writeCfgRegister(0x04, calData.data[currTxBand].mod2Offset);
C6000.setModOffset(calData.data[currTxBand].modBias);
// Set frequency and enable AT1846S TX
at1846s.setFrequency(config->txFrequency);
@ -252,7 +252,7 @@ void radio_updateConfiguration()
/*
* Parameters dependent on RX frequency only
*/
const bandCalData_t *cal = &(calData->data[currRxBand]);
const bandCalData_t *cal = &(calData.data[currRxBand]);
at1846s.setRxAudioGain(cal->rxDacGain, cal->rxVoiceGain);
@ -274,12 +274,12 @@ void radio_updateConfiguration()
uint8_t sqlTresh = 0;
if(currRxBand == BND_VHF)
{
sqlTresh = interpCalParameter(config->rxFrequency, calData->vhfCalPoints,
sqlTresh = interpCalParameter(config->rxFrequency, calData.vhfCalPoints,
cal->analogSqlThresh, 8);
}
else
{
sqlTresh = interpCalParameter(config->rxFrequency, calData->uhfCalPoints,
sqlTresh = interpCalParameter(config->rxFrequency, calData.uhfCalPoints,
cal->analogSqlThresh, 8);
}
@ -288,10 +288,10 @@ void radio_updateConfiguration()
/*
* Parameters dependent on TX frequency only
*/
at1846s.setPgaGain(calData->data[currTxBand].PGA_gain);
at1846s.setMicGain(calData->data[currTxBand].analogMicGain);
at1846s.setAgcGain(calData->data[currTxBand].rxAGCgain);
at1846s.setPaDrive(calData->data[currTxBand].PA_drv);
at1846s.setPgaGain(calData.data[currTxBand].PGA_gain);
at1846s.setMicGain(calData.data[currTxBand].analogMicGain);
at1846s.setAgcGain(calData.data[currTxBand].rxAGCgain);
at1846s.setPaDrive(calData.data[currTxBand].PA_drv);
uint8_t mod1Amp = 0;
uint8_t txpwr_lo = 0;
@ -300,25 +300,25 @@ void radio_updateConfiguration()
if(currTxBand == BND_VHF)
{
/* VHF band */
txpwr_lo = interpCalParameter(config->txFrequency, calData->vhfCalPoints,
calData->data[currTxBand].txLowPower, 8);
txpwr_lo = interpCalParameter(config->txFrequency, calData.vhfCalPoints,
calData.data[currTxBand].txLowPower, 8);
txpwr_hi = interpCalParameter(config->txFrequency, calData->vhfCalPoints,
calData->data[currTxBand].txHighPower, 8);
txpwr_hi = interpCalParameter(config->txFrequency, calData.vhfCalPoints,
calData.data[currTxBand].txHighPower, 8);
mod1Amp = interpCalParameter(config->txFrequency, calData->vhfCalPoints,
mod1Amp = interpCalParameter(config->txFrequency, calData.vhfCalPoints,
cal->mod1Amplitude, 8);
}
else
{
/* UHF band */
txpwr_lo = interpCalParameter(config->txFrequency, calData->uhfPwrCalPoints,
calData->data[currTxBand].txLowPower, 16);
txpwr_lo = interpCalParameter(config->txFrequency, calData.uhfPwrCalPoints,
calData.data[currTxBand].txLowPower, 16);
txpwr_hi = interpCalParameter(config->txFrequency, calData->uhfPwrCalPoints,
calData->data[currTxBand].txHighPower, 16);
txpwr_hi = interpCalParameter(config->txFrequency, calData.uhfPwrCalPoints,
calData.data[currTxBand].txHighPower, 16);
mod1Amp = interpCalParameter(config->txFrequency, calData->uhfCalPoints,
mod1Amp = interpCalParameter(config->txFrequency, calData.uhfCalPoints,
cal->mod1Amplitude, 8);
}
@ -338,13 +338,13 @@ void radio_updateConfiguration()
{
case BW_12_5:
at1846s.setBandwidth(AT1846S_BW::_12P5);
at1846s.setTxDeviation(calData->data[currTxBand].mixGainNarrowband);
at1846s.setTxDeviation(calData.data[currTxBand].mixGainNarrowband);
break;
case BW_20:
case BW_25:
at1846s.setBandwidth(AT1846S_BW::_25);
at1846s.setTxDeviation(calData->data[currTxBand].mixGainWideband);
at1846s.setTxDeviation(calData.data[currTxBand].mixGainWideband);
break;
default:

Wyświetl plik

@ -18,8 +18,8 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#include <interfaces/platform.h>
#include <toneGenerator_MDx.h>
#include <interfaces/nvmem.h>
#include <interfaces/radio.h>
#include <interfaces/gpio.h>
#include <calibInfo_MDx.h>
@ -32,9 +32,9 @@
static const freq_t IF_FREQ = 49950000; // Intermediate frequency: 49.95MHz
const md3x0Calib_t *calData; // Pointer to calibration data
const rtxStatus_t *config; // Pointer to data structure with radio configuration
static md3x0Calib_t calData; // Calibration data
bool isVhfBand = false; // True if rtx stage is for VHF band
uint8_t vtune_rx = 0; // Tuning voltage for RX input filter
uint8_t txpwr_lo = 0; // APC voltage for TX output power control, low power
@ -88,11 +88,6 @@ void _setBandwidth(const enum bandwidth bw)
void radio_init(const rtxStatus_t *rtxState)
{
/*
* Load calibration data
*/
calData = reinterpret_cast< const md3x0Calib_t * >(platform_getCalibrationData());
config = rtxState;
radioStatus = OFF;
isVhfBand = (platform_getHwInfo()->vhf_band == 1) ? true : false;
@ -134,6 +129,11 @@ void radio_init(const rtxStatus_t *rtxState)
DAC->DHR12R2 = 0;
DAC->DHR12R1 = 0;
/*
* Load calibration data
*/
nvm_readCalibData(&calData);
/*
* Enable and configure PLL
*/
@ -148,8 +148,8 @@ void radio_init(const rtxStatus_t *rtxState)
/*
* Modulation bias settings, as per TYT firmware.
*/
DAC->DHR12R2 = (calData->freqAdjustMid)*4 + 0x600;
C5000.setModOffset(calData->freqAdjustMid);
DAC->DHR12R2 = (calData.freqAdjustMid)*4 + 0x600;
C5000.setModOffset(calData.freqAdjustMid);
}
void radio_terminate()
@ -186,7 +186,7 @@ void radio_tuneVcxo(const int16_t vhfOffset, const int16_t uhfOffset)
* register, as we still have to deeply understand how TYT computes
* the values written there.
*/
int16_t calValue = static_cast< int16_t >(calData->freqAdjustMid);
int16_t calValue = static_cast< int16_t >(calData.freqAdjustMid);
int16_t oscTune = (calValue*4 + 0x600) + uhfOffset;
oscTune = std::max(std::min(oscTune, int16_t(4095)), int16_t(0));
DAC->DHR12R2 = static_cast< uint16_t >(oscTune);
@ -333,28 +333,28 @@ void radio_disableRtx()
void radio_updateConfiguration()
{
// Tuning voltage for RX input filter
vtune_rx = interpCalParameter(config->rxFrequency, calData->rxFreq,
calData->rxSensitivity, 9);
vtune_rx = interpCalParameter(config->rxFrequency, calData.rxFreq,
calData.rxSensitivity, 9);
// APC voltage for TX output power control
txpwr_lo = interpCalParameter(config->txFrequency, calData->txFreq,
calData->txLowPower, 9);
txpwr_lo = interpCalParameter(config->txFrequency, calData.txFreq,
calData.txLowPower, 9);
txpwr_hi = interpCalParameter(config->txFrequency, calData->txFreq,
calData->txHighPower, 9);
txpwr_hi = interpCalParameter(config->txFrequency, calData.txFreq,
calData.txHighPower, 9);
// HR_C5000 modulation amplitude
const uint8_t *Ical = calData->sendIrange;
const uint8_t *Qcal = calData->sendQrange;
const uint8_t *Ical = calData.sendIrange;
const uint8_t *Qcal = calData.sendQrange;
if(config->opMode == OPMODE_FM)
{
Ical = calData->analogSendIrange;
Qcal = calData->analogSendQrange;
Ical = calData.analogSendIrange;
Qcal = calData.analogSendQrange;
}
uint8_t I = interpCalParameter(config->txFrequency, calData->txFreq, Ical, 9);
uint8_t Q = interpCalParameter(config->txFrequency, calData->txFreq, Qcal, 9);
uint8_t I = interpCalParameter(config->txFrequency, calData.txFreq, Ical, 9);
uint8_t Q = interpCalParameter(config->txFrequency, calData.txFreq, Qcal, 9);
C5000.setModAmplitude(I, Q);

Wyświetl plik

@ -18,7 +18,6 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#include <interfaces/platform.h>
#include <interfaces/radio.h>
#include <interfaces/gpio.h>
#include <calibInfo_Mod17.h>
@ -27,7 +26,7 @@
#include "../audio/MAX9814.h"
enum opstatus radioStatus; // Current operating status
const mod17Calib_t *calData; // Calibration data
extern mod17Calib_t mod17CalData; // Calibration data
void radio_init(const rtxStatus_t *rtxState)
@ -35,10 +34,9 @@ void radio_init(const rtxStatus_t *rtxState)
(void) rtxState;
radioStatus = OFF;
calData = reinterpret_cast< const mod17Calib_t * >(platform_getCalibrationData());
mcp4551_setWiper(SOFTPOT_TX, calData->tx_wiper);
mcp4551_setWiper(SOFTPOT_RX, calData->rx_wiper);
mcp4551_setWiper(SOFTPOT_TX, mod17CalData.tx_wiper);
mcp4551_setWiper(SOFTPOT_RX, mod17CalData.rx_wiper);
}
void radio_terminate()
@ -77,8 +75,8 @@ void radio_enableRx()
radioStatus = RX;
gpio_clearPin(PTT_OUT);
mcp4551_setWiper(SOFTPOT_TX, calData->tx_wiper);
mcp4551_setWiper(SOFTPOT_RX, calData->rx_wiper);
mcp4551_setWiper(SOFTPOT_TX, mod17CalData.tx_wiper);
mcp4551_setWiper(SOFTPOT_RX, mod17CalData.rx_wiper);
}
void radio_enableTx()
@ -86,9 +84,9 @@ void radio_enableTx()
radioStatus = TX;
gpio_setPin(PTT_OUT);
mcp4551_setWiper(SOFTPOT_TX, calData->tx_wiper);
mcp4551_setWiper(SOFTPOT_RX, calData->rx_wiper);
max9814_setGain(calData->mic_gain);
mcp4551_setWiper(SOFTPOT_TX, mod17CalData.tx_wiper);
mcp4551_setWiper(SOFTPOT_RX, mod17CalData.rx_wiper);
max9814_setGain(mod17CalData.mic_gain);
}
void radio_disableRtx()

Wyświetl plik

@ -18,7 +18,7 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#include <interfaces/platform.h>
#include <interfaces/nvmem.h>
#include <interfaces/radio.h>
#include <interfaces/gpio.h>
#include <calibInfo_MDx.h>
@ -30,9 +30,9 @@
#include "AT1846S.h"
const mduv3x0Calib_t *calData; // Pointer to calibration data
const rtxStatus_t *config; // Pointer to data structure with radio configuration
static mduv3x0Calib_t calData; // Calibration data
Band currRxBand = BND_NONE; // Current band for RX
Band currTxBand = BND_NONE; // Current band for TX
uint8_t txpwr_lo = 0; // APC voltage for TX output power control, low power
@ -47,11 +47,6 @@ AT1846S& at1846s = AT1846S::instance(); // AT1846S driver
void radio_init(const rtxStatus_t *rtxState)
{
/*
* Load calibration data
*/
calData = reinterpret_cast< const mduv3x0Calib_t * >(platform_getCalibrationData());
config = rtxState;
radioStatus = OFF;
@ -83,6 +78,11 @@ void radio_init(const rtxStatus_t *rtxState)
DAC->CR = DAC_CR_EN1;
DAC->DHR12R1 = 0;
/*
* Load calibration data
*/
nvm_readCalibData(&calData);
/*
* Configure AT1846S and HR_C6000, keep AF output disabled at power on.
*/
@ -287,33 +287,28 @@ void radio_updateConfiguration()
* VCXO bias voltage, separated values for TX and RX to allow for cross-band
* operation.
*/
txModBias = calData->vhfCal.freqAdjustMid;
rxModBias = calData->vhfCal.freqAdjustMid;
if(currRxBand == BND_UHF) rxModBias = calData->uhfCal.freqAdjustMid;
if(currTxBand == BND_UHF) txModBias = calData->uhfCal.freqAdjustMid;
txModBias = calData.vhfCal.freqAdjustMid;
rxModBias = calData.vhfCal.freqAdjustMid;
if(currRxBand == BND_UHF) rxModBias = calData.uhfCal.freqAdjustMid;
if(currTxBand == BND_UHF) txModBias = calData.uhfCal.freqAdjustMid;
/*
* Discarding "const" qualifier to suppress compiler warnings.
* This operation is safe anyway because calibration data is only read.
*/
mduv3x0Calib_t *cal = const_cast< mduv3x0Calib_t * >(calData);
uint8_t calPoints = 5;
freq_t *txCalPoints = cal->vhfCal.txFreq;
uint8_t *loPwrCal = cal->vhfCal.txLowPower;
uint8_t *hiPwrCal = cal->vhfCal.txHighPower;
freq_t *txCalPoints = calData.vhfCal.txFreq;
uint8_t *loPwrCal = calData.vhfCal.txLowPower;
uint8_t *hiPwrCal = calData.vhfCal.txHighPower;
uint8_t *qRangeCal = (config->opMode == OPMODE_FM)
? cal->vhfCal.analogSendQrange
: cal->vhfCal.sendQrange;
? calData.vhfCal.analogSendQrange
: calData.vhfCal.sendQrange;
if(currTxBand == BND_UHF)
{
calPoints = 9;
txCalPoints = cal->uhfCal.txFreq;
loPwrCal = cal->uhfCal.txLowPower;
hiPwrCal = cal->uhfCal.txHighPower;
txCalPoints = calData.uhfCal.txFreq;
loPwrCal = calData.uhfCal.txLowPower;
hiPwrCal = calData.uhfCal.txHighPower;
qRangeCal = (config->opMode == OPMODE_FM)
? cal->uhfCal.analogSendQrange
: cal->uhfCal.sendQrange;
? calData.uhfCal.analogSendQrange
: calData.uhfCal.sendQrange;
}
// APC voltage for TX output power control

Wyświetl plik

@ -61,6 +61,7 @@ void platform_init()
backlight_init(); /* Initialise backlight driver */
audio_init(); /* Initialise audio management module */
adc0_init(); /* Initialise ADC */
nvm_init(); /* Initialise NVM manager */
pthread_mutex_init(&adc_mutex, NULL);
/*
@ -71,14 +72,6 @@ void platform_init()
gpio_setAlternateFunction(I2C_SDA, 3);
gpio_setAlternateFunction(I2C_SCL, 3);
i2c0_init();
/*
* Initialise non volatile memory manager and zero calibration data.
* Actual loading of calibration data is deferred to the first call of
* platform_getCalibrationData().
*/
nvm_init();
memset(&calibration, 0x00, sizeof(gdxCalibration_t));
}
void platform_terminate()
@ -198,17 +191,6 @@ void platform_beepStop()
/* TODO */
}
const void *platform_getCalibrationData()
{
/* The first time this function is called, load calibration data from flash */
if(calibration.vhfCalPoints[0] == 0)
{
nvm_readCalibData(&calibration);
}
return ((const void *) &calibration);
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;

Wyświetl plik

@ -61,6 +61,7 @@ void platform_init()
backlight_init(); /* Initialise backlight driver */
audio_init(); /* Initialise audio management module */
adc0_init(); /* Initialise ADC */
nvm_init(); /* Initialise NVM manager */
pthread_mutex_init(&adc_mutex, NULL);
/*
@ -71,14 +72,6 @@ void platform_init()
gpio_setAlternateFunction(I2C_SDA, 3);
gpio_setAlternateFunction(I2C_SCL, 3);
i2c0_init();
/*
* Initialise non volatile memory manager and zero calibration data.
* Actual loading of calibration data is deferred to the first call of
* platform_getCalibrationData().
*/
nvm_init();
memset(&calibration, 0x00, sizeof(gdxCalibration_t));
}
void platform_terminate()
@ -198,17 +191,6 @@ void platform_beepStop()
/* TODO */
}
const void *platform_getCalibrationData()
{
/* The first time this function is called, load calibration data from flash */
if(calibration.vhfCalPoints[0] == 0)
{
nvm_readCalibData(&calibration);
}
return ((const void *) &calibration);
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;

Wyświetl plik

@ -29,7 +29,6 @@
#include <interfaces/rtc.h>
#include <interfaces/audio.h>
md3x0Calib_t calibration;
static hwInfo_t hwInfo;
void platform_init()
@ -61,7 +60,6 @@ void platform_init()
memset(&hwInfo, 0x00, sizeof(hwInfo));
nvm_init(); /* Initialise non volatile memory manager */
nvm_readCalibData(&calibration); /* Load calibration data */
nvm_readHwInfo(&hwInfo); /* Load hardware information data */
toneGen_init(); /* Initialise tone generator */
rtc_init(); /* Initialise RTC */
@ -200,11 +198,6 @@ void platform_beepStop()
toneGen_beepOff();
}
const void *platform_getCalibrationData()
{
return ((const void *) &calibration);
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;

Wyświetl plik

@ -220,11 +220,6 @@ void platform_beepStop()
/* TODO */
}
const void *platform_getCalibrationData()
{
return NULL;
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;

Wyświetl plik

@ -200,11 +200,6 @@ void platform_beepStop()
toneGen_beepOff();
}
const void *platform_getCalibrationData()
{
return ((const void *) &calibration);
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;

Wyświetl plik

@ -32,7 +32,8 @@
#include <calibInfo_Mod17.h>
#include <MCP4551.h>
mod17Calib_t mod17CalData;
extern mod17Calib_t mod17CalData;
static hwInfo_t hwInfo =
{
.vhf_maxFreq = 0,
@ -187,11 +188,6 @@ void platform_beepStop()
/* TODO */
}
const void *platform_getCalibrationData()
{
return ((const void *) &mod17CalData);
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;

Wyświetl plik

@ -134,11 +134,6 @@ void platform_beepStop()
printf("platform_beepStop()\n");
}
const void *platform_getCalibrationData()
{
return NULL;
}
const hwInfo_t *platform_getHwInfo()
{
return &hwInfo;