📄 lv2400x.c
字号:
BYTE byOrgAudioMute, byOrgAudioMode;
WORD wCfg;
// Check limit
{
WORD wRfBandLo, wRfBandHi;
wRfBandHi = DisplayFreqToRf(g_wDisplayBandHigh);
wRfBandLo = DisplayFreqToRf(g_wDisplayBandLow);
byResult = CheckRfLimit(&wRfFreq, wRfBandLo, wRfBandHi, 2);
if (byResult != LVLS_NO_ERROR)
return(byResult);
}
// No valid station by a frequency set
g_byStnFlag &= (~STN_VALID);
// Select correct oscillator output and enable measuring mode
wCfg = SetUpChipMode(CO_RF_OSC|CHIP_MEASURE_MODE|CHIP_AFC_OFF);
// Mute audio and force mono mode
byOrgAudioMute = SetChipAudioMute(TRUE, MUTESRC_OPERATION);
byOrgAudioMode = SetChipStereo(FALSE);
// Save the new RF frequency
g_wLastSetRF = wRfFreq;
// Quick frequency set
{
WORD wCap, wOsc;
CalculateRfCapOsc(wRfFreq, &wCap, &wOsc, QSSF_PRECISION_MED);
//WriteRfCap(wCap); // Will be done in FineTuneRfOsc
byResult = FineTuneRfOsc(wRfFreq, LV_MSR_TIME_32ms, wOsc, FALSE);
}
// Do finetuning if frequency is set
//if ( (dwResult == LVLS_NO_ERROR) && (dwOption & SETSTN_FINETUNE) )
// FineTuneFmToIF(&m_bValidStation);
// Restore chip config
SetUpChipMode(wCfg);
// Restore status
SetChipAudioMute(byOrgAudioMute, MUTESRC_OPERATION);
SetChipStereo(byOrgAudioMode);
return(byResult);
} // End SetRfFrequency
BYTE GetHwFeatureLimit(BYTE byFeatureId)
{
// Return upper limit of a feature (lower limit is always 0)
// Upper limit 0 means feature is not supported
BYTE i;
// Headphone amplifier: depends on hardware capapbility
if (byFeatureId == IHCAP_HPA)
{
if ( (g_byHwFlag1 & HF1_HP)==0 )
return(0); // Not supported by hardware
}
for (i=0; i<LV2400X_FEATLIMIT_LSIZE; i++)
{
if ( g_Lv2400xFeatLimit[i].byFeatureId == byFeatureId)
return(g_Lv2400xFeatLimit[i].byUpperLimit);
}
return(0); // Not support - no upper limit
} // End GetHwFeatureLimit
BYTE GetHwFeatureValue(BYTE byFeatureId)
{
// Return current value of a feature
BYTE byTmp, byValue;
// Default returned value
byValue=0;
switch (byFeatureId)
{
case IHCAP_TUNERPWR:
byTmp = GetSwRegValue(IR01_PW_SCTRL_REG);
if ( byTmp & IR1_PSCTL_PW_RAD ) // FM power on bit = 1: power is on
byValue = 1;
break;
case IHCAP_AMUTE:
if ( g_bySwFlag1 & MUTESRC_APPLICATION )
byValue = 1; // Muted
break;
case IHCAP_VOLUME:
byValue = GetChipVolume();
if ( (g_bySwFlag1 & MUTESRC_VOLUME)==0 )
byValue++; // Convert hardware level to logical level (add 1 when we are not muted)
break;
case IHCAP_STEREO:
byTmp = GetSwRegValue(IR01_STEREO_CTRL_REG);
if ( (byTmp & IR1_STCTL_STEREO_L) == 0) // Stereo bit = 0: stereo is enabled
byValue=1;
break;
// case IHCAP_DEEMP:
// wTmp = GetSwRegValue(IR01_AUDIO_CTRL2_REG);
// if ( wTmp & IR1_ACTL2_DEEMP75 ) // Deemphasis bit = 1: 75us
// pValue->State.bState = DEEMP_75;
// else
// pValue->State.bState = DEEMP_50;
// break;
case IHCAP_SMUTE: // Soft mute
// Soft mute is in bit [4:2] of IR01_PW_SCTRL_REG
byTmp = (BYTE)(GetSwRegValue(IR01_PW_SCTRL_REG) & IR1_PSCTL_SOFT_MUTE);
byValue = byTmp>>2; // Shift to logical level
break;
case IHCAP_SOFT_ST: // Soft stereo
// Soft stereo is in bit [7:5] of IR01_PW_SCTRL_REG
byTmp = (BYTE)(GetSwRegValue(IR01_PW_SCTRL_REG) & IR1_PSCTL_SOFT_ST);
byValue = byTmp>>5; // Shift to logical level
break;
// case IHCAP_AFC: // AFC (automatic frequency control)
// byTmp = GetSwRegValue(IR01_RADIO_CTRL1_REG);
// if (byTmp & IR1_RCTL1_EN_AFC)
// byValue = 1;
// break;
case IHCAP_ATREBLE: // Audio treble
// Fetch current setting
byTmp = (BYTE)(GetSwRegValue(IR01_AUDIO_CTRL2_REG) & IR1_ATREBLE_MASK);
// Return the logical level
byValue = SearchInByteArray(byTmp, g_Lv24001Treble, IMR1_TREBLE_LSIZE);
break;
case IHCAP_ABASS: // Audio bass
// Fetch current setting
byTmp = (BYTE)(GetSwRegValue(IR01_AUDIO_CTRL2_REG) & IR1_ABASS_MASK);
// Return the logical level
byValue = SearchInByteArray(byTmp, g_Lv24001Bass, IMR1_BASS_LSIZE);
break;
case IHCAP_RADIOSOURCE:
// Return: 0: off, 1: FM
byTmp = GetSwRegValue(IR01_RADIO_CTRL3_REG);
if (byTmp & IR1_RCTL3_SE_FM)
byValue = 1;
break;
case IHCAP_EXTSOURCE:
// Input: on/off (true/false)
byTmp = GetSwRegValue(IR01_RADIO_CTRL3_REG);
if (byTmp & IR1_RCTL3_SE_EXT)
byValue = 1;
break;
case IHCAP_BEEPSOURCE:
// Beep source: check beep source enable bit and beep tone select bits
// Source enable BeepSelect HW beep Value
// Disable X off (=0)
// Enable Beep_High off
// Enable 500/1000/2000Hz 1,2,3
// Fist beep source enable bit
byTmp = GetSwRegValue(IR01_RADIO_CTRL3_REG);
if ( byTmp & IR1_RCTL3_SE_BEEP ) // Beep source is enabled
{
byTmp = (BYTE)(GetSwRegValue(IR01_AUDIO_CTRL2_REG) & IR1_ACTL2_BPFREQ);
if (byTmp == IR1_BEEP_500Hz) // 0.5 kHz beep tone
byValue = 1;
else if (byTmp == IR1_BEEP_1KHz) // 1 kHz beep tone
byValue = 2;
else if (byTmp == IR1_BEEP_2KHz) // 2 kHz beep tone
byValue = 3;
}
break;
case IHCAP_DYNBASSBOOST: // Dynamic bass boost feature
byValue = g_byDynBassBoost;
break;
case IHCAP_HPA: // Headphone amplifier
if ( g_byHwFlag1 & HF1_HP )
{
if ( GetSwRegValue(IR01_PW_SCTRL_REG) & IR2_PSCTL_HPA )
byValue=1;
}
break;
// case IHCAP_CNT2:
// Software settings
case IHCAP_SCANLVL: // Scan level
byValue = g_byScanLevel;
break;
case IHCAP_SCANWRP: // Scan wrapping
byValue = (BYTE)(g_byStnFlag & STN_WRAP_MODE);
break;
case IHCAP_REGION: // Region
byValue = g_byRegion;
break;
case IHCAP_BEEPVOL: // Beep volume
byValue = g_byBeepVol;
break;
#ifdef USE_EXTCLK
case IHCAP_EXTCLK:
byValue = (BYTE)(g_bySwFlag1 & SF1_EXTCLK);
break;
#endif //USE_EXTCLK
default:
break;
//break;
} // EndSwitch
return(byValue);
} // End GetHwFeatureValue
/* ************************************************************************************************
*
* Function: SetHwFeatureValue
*
* Authors: Hung van Le
* Purpose: Setting capability value of the device
* Input: byFeatureId: see Lv24Ekit.h for definitions
* pbyValue: pointer to the value to be set
* Output: Status as defined in LvErr.h
* Comments: None
*
* ************************************************************************************************
* Copyright (c) 2004. Semiconductor Ideas to the Market (ItoM) B.V. All rights reserved.
* ************************************************************************************************ */
BYTE SetHwFeatureValue(BYTE byFeatureId, BYTE byValue)
{
BYTE byResult;
BYTE byTmp;
// Init local
byResult = LVLS_NO_ERROR;
switch (byFeatureId)
{
case IHCAP_TUNERPWR:
DriveBit(IR01_PW_SCTRL_REG, IR1_PSCTL_PW_RAD, byValue);
break;
case IHCAP_AMUTE:
SetChipAudioMute(byValue, MUTESRC_APPLICATION);
break;
case IHCAP_VOLUME:
AdjustVolume(byValue);
break;
case IHCAP_STEREO:
byResult = SetStereoMono(byValue);
break;
//case IHCAP_DEEMP:
// SetDeemphasis(byValue);
// break;
case IHCAP_SMUTE: // Soft mute
// Soft mute is in bit [4:2] of IR01_PW_SCTRL_REG
byTmp = (BYTE)((byValue) & 0x7); // Make sure we have valid level
SetRegBits(IR01_PW_SCTRL_REG, IR1_PSCTL_SOFT_MUTE, (byTmp<<2));
break;
case IHCAP_SOFT_ST: // Soft stereo
// Soft stereo is in bit [7:5] of IR01_PW_SCTRL_REG
byTmp = (BYTE)((byValue) & 0x7); // Make sure we have valid level
SetRegBits(IR01_PW_SCTRL_REG, IR1_PSCTL_SOFT_ST, (byTmp<<5));
break;
//case IHCAP_AFC: // AFC (automatic frequency control)
// SetAFCMode(byValue);
// break;
case IHCAP_ATREBLE: // Audio treble
if ( byValue >= IMR1_TREBLE_LSIZE)
byResult = LVLS_INV_FEATURE_VALUE_ERR;
else
{
SetRegBits(IR01_AUDIO_CTRL2_REG, IR1_ATREBLE_MASK, g_Lv24001Treble[byValue]);
AdjustHwToneControl();
}
break;
case IHCAP_ABASS: // Audio bass
if ( byValue >= IMR1_BASS_LSIZE)
byResult = LVLS_INV_FEATURE_VALUE_ERR;
else
{
SetRegBits(IR01_AUDIO_CTRL2_REG, IR1_ABASS_MASK, g_Lv24001Bass[byValue]);
AdjustHwToneControl();
}
break;
case IHCAP_RADIOSOURCE:
// Input: 0: off, 1: FM, 2: AM
DriveBit(IR01_RADIO_CTRL3_REG, IR1_RCTL3_SE_FM, byValue);
break;
case IHCAP_EXTSOURCE:
// Input: 0=off 1=on
DriveBit(IR01_RADIO_CTRL3_REG, IR1_RCTL3_SE_EXT, byValue);
break;
case IHCAP_BEEPSOURCE:
// Beep source: Driving beep source enable bit and beep tone select bits
// HW beep Value Source enable BeepSelect
// 0 (off) Disable High
// 1,2,3 Enable 500/1000/2000Hz
// Adjust registers according to input value
if ( byValue==1) // Beep at 500 Hz
byTmp = IR1_BEEP_500Hz;
else if ( byValue==2) // Beep at 1000 Hz
byTmp = IR1_BEEP_1KHz;
else if ( byValue==3) // Beep at 2000 Hz
byTmp = IR1_BEEP_2KHz;
else
byTmp = IR1_BEEP_OFF; // 0 or unknown values: turn off
// Change beep frequency select bits
SetRegBits(IR01_AUDIO_CTRL2_REG, IR1_ACTL2_BPFREQ, byTmp);
// Change beep source enable bit
DriveBit(IR01_RADIO_CTRL3_REG, IR1_RCTL3_SE_BEEP, (byTmp != IR1_BEEP_OFF));
break;
/*
case IHCAP_BEEPBIT:
if (pValue->Beep.byDuration != SET_BEEP_OFF) // Always OK to turn off
{
if (GetSwRegValue(IR01_RADIO_CTRL3_REG) & IR1_RCTL3_SE_BEEP ) // Hardware beep busy - can not set software beep value
dwResult = LVLS_IMPROPER_HW_SETTING_ERR;
}
if (dwResult == LVLS_NO_ERROR)
{
// Update the shadow software beep state
if (pValue->Beep.byDuration == SET_BEEP_OFF) // Always OK to turn off
m_bSwBeepOn = false;
else
m_bSwBeepOn = true;
dwResult = BeepHandler(pValue->Beep.wFreqHz, pValue->Beep.byDuration);
}
break;
*/
case IHCAP_DYNBASSBOOST: // Dynamic bass boost feature
if (g_byDynBassBoost != byValue )
{
BYTE byTone, byVolume;
// Dynamic bass level changed
g_byDynBassBoost = byValue; // Fecth new dynamic bass boost level
// IR01_AUDIO_CTRL1_REG has bit[7:4] as tone control, [3:0] as volume.
// Set the tone control level if it is not correct
byVolume = GetSwRegValue(IR01_AUDIO_CTRL1_REG); // Fetch tone and volume value
byTone = (BYTE)((byVolume & IR1_ACTL1_TONE_LVL)>>4); // extract tone value
byVolume &= (IR1_ACTL1_VOL_LVL); // extract volume value
byVolume = 15-byVolume; // IMR01 has volume bits inverted - we have now the logical volume level
byTone = 15 - byTone; // The 4 tone bits are inverted - we have now the logical tone level
// Modify tone when it's not equal to dynamic bass level
if ( byTone != g_byDynBassBoost )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -