Just to assist with the investigation, I added some extra logging to the following functions and recompiled master
-> LMS7002M::SetTRFPAD_dB
-> LMS7002M::GetTRFPAD_dB
-> LMS7002M::SetTBBIAMP_dB
-> LMS7002M::GetTBBIAMP_dB
As followed :
LMS7002M::SetTRFPAD_dB
int LMS7002M::SetTRFPAD_dB(const float_type value)
{
const double pmax = 52;
int loss_int = (pmax-value)+0.5;
//different scaling realm
if (loss_int > 10) loss_int = (loss_int+10)/2;
//clip
if (loss_int > 31) loss_int = 31;
if (loss_int < 0) loss_int = 0;
int ret = 0;
ret |= this->Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), loss_int);
ret |= this->Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), loss_int);
Log(LOG_INFO, "SetTRFPAD_dB: loss_int: %i", loss_int);
return ret;
}
LMS7002M::GetTRFPAD_dB
float_type LMS7002M::GetTRFPAD_dB(void)
{
const double pmax = 52;
auto loss_int = this->Get_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF));
Log(LOG_INFO, "GetTRFPAD_dB: loss_int: %g return: %g return2: %g", loss_int, pmax-10-2*(loss_int-10), pmax-loss_int);
if (loss_int > 10) return pmax-10-2*(loss_int-10);
return pmax-loss_int;
}
LMS7002M::SetTBBIAMP_dB
int LMS7002M::SetTBBIAMP_dB(const float_type gain)
{
int ind = this->GetActiveChannelIndex()%2;
if (opt_gain_tbb[ind] <= 0)
{
if (CalibrateTxGain(0,nullptr)!=0) //set optimal BB gain
return -1;
if (std::fabs(gain) < 0.2) // optimal gain = ~0dB
return 0;
}
int g_iamp = (float_type)opt_gain_tbb[ind]*pow(10.0,gain/20.0)+0.4;
Log(LOG_INFO, "SetTBBIAMP_dB: g_iamp: %i opt_gain_tbb[ind]: %g gain: %g", g_iamp, opt_gain_tbb[ind],gain);
int modify_return = Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),g_iamp > 63 ? 63 : g_iamp<1 ? 1 :g_iamp , true);
Log(LOG_INFO, "SetTBBIAMP_dB: Modify_SPI_Reg_bits: %i", modify_return);
return 0;
}
LMS7002M::GetTBBIAMP_dB
float_type LMS7002M::GetTBBIAMP_dB(void)
{
int g_current = Get_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),true);
int ind = this->GetActiveChannelIndex()%2;
if (opt_gain_tbb[ind] <= 0)
{
if (CalibrateTxGain(0,nullptr)!=0)
return 0.0;
Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),g_current, true); //restore
}
Log(LOG_INFO, "GetTBBIAMP_dB: g_current: %g", (float_type)g_current);
Log(LOG_INFO, "GetTBBIAMP_dB: opt_gain_tbb: %g", (float_type)opt_gain_tbb[ind]);
Log(LOG_INFO, "GetTBBIAMP_dB: return: %g", 20.0*log10((float_type)g_current / (float_type) opt_gain_tbb[ind]));
return 20.0*log10((float_type)g_current / (float_type) opt_gain_tbb[ind]);
}
When I run set_normalized_gain(0) I get:
SetTRFPAD_dB: loss_int: 31
GetTRFPAD_dB: loss_int: 0 return: 21 return2: 0
SetTBBIAMP_dB: g_iamp: 16 opt_gain_tbb[ind]: -12 gain: 63
SetTBBIAMP_dB: Modify_SPI_Reg_bits: 0
When I run get_normalized_gain() I get:
GetTRFPAD_dB: loss_int: 0 return: 21 return2: 0
GetTBBIAMP_dB: g_current: 16
GetTBBIAMP_dB: opt_gain_tbb: 63
GetTBBIAMP_dB: return: -11.9044
When I run set_normalized_gain(1) I get:
SetTRFPAD_dB: loss_int: 0
GetTRFPAD_dB: loss_int: 62 return: 52 return2: 62
SetTBBIAMP_dB: g_iamp: 251 opt_gain_tbb[ind]: 12 gain: 63
SetTBBIAMP_dB: Modify_SPI_Reg_bits: 0
When I run get_normalized_gain() I get:
GetTRFPAD_dB: loss_int: 62 return: 52 return2: 62
GetTBBIAMP_dB: g_current: 63
GetTBBIAMP_dB: opt_gain_tbb: 63
GetTBBIAMP_dB: return: 0
I tried emulating the same test with SoapySDR but Soapy seems to work as expected.
Soapy python code:
print("Setting TX gain to maximum 64")
sdr.setGain(SOAPY_SDR_TX,0, 64);
print("Gain after ", sdr.getGain(SOAPY_SDR_TX,0))
print("PAD: ", sdr.getGain(SOAPY_SDR_TX,0, "PAD"))
print("IAMP: ", sdr.getGain(SOAPY_SDR_TX,0, "IAMP"))
Output:
Setting TX gain to maximum 64
[INFO] SetTRFPAD_dB: loss_int: 0
[INFO] GetTRFPAD_dB: loss_int: 62 return: 52 return2: 62
[INFO] SetTBBIAMP_dB: g_iamp: 8 opt_gain_tbb[ind]: 12 gain: 2
[INFO] SetTBBIAMP_dB: Modify_SPI_Reg_bits: 0
[INFO] GetTRFPAD_dB: loss_int: 62 return: 52 return2: 62
[INFO] GetTBBIAMP_dB: g_current: 8
[INFO] GetTBBIAMP_dB: opt_gain_tbb: 2
[INFO] GetTBBIAMP_dB: return: 12.0412
[INFO] GetTRFPAD_dB: loss_int: 62 return: 52 return2: 62
[INFO] GetTBBIAMP_dB: g_current: 8
[INFO] GetTBBIAMP_dB: opt_gain_tbb: 2
[INFO] GetTBBIAMP_dB: return: 12.0412
Gain after 64.04119982655925
[INFO] GetTRFPAD_dB: loss_int: 62 return: 52 return2: 62
PAD: 52.0
[INFO] GetTBBIAMP_dB: g_current: 8
[INFO] GetTBBIAMP_dB: opt_gain_tbb: 2
[INFO] GetTBBIAMP_dB: return: 12.0412
IAMP: 12.041199826559248
I get a correct value of 12 for IAMP
Hope this helps even a bit