⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lv2400x.c

📁 LV24000的单片机DEMO程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -