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

📄 drv_dsp_adjust.c

📁 ROHM 公司BU9432:application:应用范围
💻 C
📖 第 1 页 / 共 5 页
字号:
#if CHK_SWEEP
			mu08_Q1 = gu08_sts_AdjustAuto - ADJUST_FG;
#endif

		case EXECUTE_SWEEP:
			if( SweepCtrl(  ) )
			{
				mu08_MainSC = ADJUST_END;
			}
	}
	return;
}


/*******************************************************************************
	Sweep Control
*******************************************************************************/
/*------------------------------------------------------------------------------
	SweepCtr
------------------------------------------------------------------------------*/
UINT08 SweepCtrl( void )
{
	UINT08 u08_MeasResult;		// Result Average 8 times

	switch ( mu08_SubSC )
	{
		case SWEEP_START:
			mu08_LowerLimit = 0x00;											// 嫟捠

			if( mu08_Kind == ADJUST_FB_CMD )
			{
				// Focus Bias ------------------------------------------------------
				mu08_Target = 128;
				mu08_Offset = 4;
				mu08_AdjustValue = Tbl_PRE_FB[mu08_index_FB];
				mu08_UpperLimit = 0xFC;
//				DrvDSP_BIOS_WriteReg( 0xED, DISTURB_FB );
				DrvDSP_BIOS_WriteReg( 0xED, Tbl_DISTURB_FB[gu08_Mech] );
			}
			else
			{
				// Gain ------------------------------------------------------------
				mu08_Target = 131;
				mu08_Offset = 2;
				mu08_AdjustValue = 0x0A;
				mu08_UpperLimit = 20;
				if( mu08_Kind == ADJUST_FG_CMD )	//Sxxx Okumura Request
				{
					DrvDSP_BIOS_WriteReg( 0xED, Tbl_DISTURB_FG[gu08_Mech] );
				}
				else
				{
					DrvDSP_BIOS_WriteReg( 0xED, Tbl_DISTURB_TG[gu08_Mech] );
				}
			}

			DrvDSP_BIOS_WriteReg( 0xD2, 0x15 );	// Meas. Time
			DrvDSP_BIOS_WriteReg( 0xD4, 0x50 );	// 
			DrvDSP_BIOS_WriteReg( 0xD5, 0x00 );	// Select read signal

#if CHK_SWEEP
			mu08_Servo[mu08_Q1][0][0] = 0;
			mu08_Servo[mu08_Q1][1][0] = 0;
			mu08_Servo[mu08_Q1][2][0] = 0;
			mu08_Servo[mu08_Q1][3][0] = 0;
			mu08_Servo[mu08_Q1][4][0] = 0;
			mu08_Servo[mu08_Q1][5][0] = 0;
			mu08_Servo[mu08_Q1][6][0] = 0;
			mu08_Servo[mu08_Q1][7][0] = 0;
			mu08_Servo[mu08_Q1][8][0] = 0;
			mu08_Servo[mu08_Q1][9][0] = 0;
			mu08_Servo[mu08_Q1][10][0] = 0;
			mu08_Servo[mu08_Q1][11][0] = 0;
			mu08_Servo[mu08_Q1][12][0] = 0;
			mu08_Servo[mu08_Q1][13][0] = 0;
			mu08_Servo[mu08_Q1][14][0] = 0;
			mu08_Servo[mu08_Q1][15][0] = 0;

			mu08_Servo[mu08_Q1][0][1] = 0;
			mu08_Servo[mu08_Q1][1][1] = 0;
			mu08_Servo[mu08_Q1][2][1] = 0;
			mu08_Servo[mu08_Q1][3][1] = 0;
			mu08_Servo[mu08_Q1][4][1] = 0;
			mu08_Servo[mu08_Q1][5][1] = 0;
			mu08_Servo[mu08_Q1][6][1] = 0;
			mu08_Servo[mu08_Q1][7][1] = 0;
			mu08_Servo[mu08_Q1][8][1] = 0;
			mu08_Servo[mu08_Q1][9][1] = 0;
			mu08_Servo[mu08_Q1][10][1] = 0;
			mu08_Servo[mu08_Q1][11][1] = 0;
			mu08_Servo[mu08_Q1][12][1] = 0;
			mu08_Servo[mu08_Q1][13][1] = 0;
			mu08_Servo[mu08_Q1][14][1] = 0;
			mu08_Servo[mu08_Q1][15][1] = 0;

			mu08_Q2 = 0;
#endif

			AdjustAuto_SetTimer(  );

			// Start Meas.
//			mu08_SweepFlag =0;
			mu08_SubSC = JUDGE_SWEEP_1ST;
			mu08_MeasSC = MEAS_START;

		case JUDGE_SWEEP_1ST:
		case JUDGE_SWEEP_LOOP:
			// Measure
			u08_MeasResult = MeasSweep(  );

			// Judge
			if( mu08_MeasSC == MEAS_DONE_AVERAGE )
			{
				// Meas. Compleat
				if( mu08_SubSC == JUDGE_SWEEP_LOOP )
						gu32Work.b.ll = JudgeSweepLoop( u08_MeasResult );
				else	gu32Work.b.ll = JudgeSweep1st( u08_MeasResult );

				if( gu32Work.b.ll )
				{
					// Adjust Done!
					mu08_SubSC = WAIT_END;
				}
				else
				{
					if( SetSweepStep( u08_MeasResult ) )
					{
						if( mu08_SubSC == JUDGE_SWEEP_LOOP )
						{
							DrvDSP_BIOS_AdjEnd();
							DrvDSP_BIOS_WriteResult();
							return TRUE;									// YTC001 20041224
						}else	mu08_SubSC = WAIT_END;
					}
					else
					{
						DrvDSP_BIOS_WriteResult();
						mu08_MeasSC = MEAS_NEXT;
						MeasSweep(  );
						mu08_SubSC = JUDGE_SWEEP_LOOP;
					}
				}
			}
			break;

		case WAIT_END:
			if( DrvDSP_BIOS_ReadBusy(  ) )
			{
				DrvDSP_BIOS_AdjEnd();
				return TRUE;
			}
	}
	if( gu16_TimerAdjustMain == 0 )
	{
		// Time Up ( Force end )
		mu08_SubSC = WAIT_END;
	}
	return FALSE;
}


/*------------------------------------------------------------------------------
	JudgeSweep1st
 ------------------------------------------------------------------------------
	Function :	Check 1st. result, diside direction & target
	Arguments:	UINT08* mu08_SweepFlag		Sweep Status
				UINT08* mu08_Target		Target
				UINT08 mu08_Offset		Target Window Offset
				UINT08 u08_MeasResult	Meas. Result
	Return   :	UINT08 					Sweep Status
------------------------------------------------------------------------------*/
UINT08 JudgeSweep1st( UINT08 u08_MeasResult )
{
	if( u08_MeasResult > ( mu08_Target + mu08_Offset ) )
	{
		// Too High ------------------------------------------------------------
		mu08_SweepFlag = FALSE;	// Down Sweep
		mu08_Target += mu08_Offset;
		mu08_Limit =mu08_LowerLimit;
	}
	else
	{
		if( u08_MeasResult > ( mu08_Target - mu08_Offset ) )
		{
			// Just in Target! -------------------------------------------------
			return TRUE;
		}
		else
		{
			// Too Low ---------------------------------------------------------
			mu08_SweepFlag = TRUE;	// Up Sweep
			mu08_Target -= mu08_Offset;
			mu08_Limit =mu08_UpperLimit;
		}
	}
	return FALSE;
}


/*------------------------------------------------------------------------------
	JudgeSweepLoop
 ------------------------------------------------------------------------------
	Function :	Check result to across the target
	Arguments:	UINT08* mu08_SweepFlag		Sweep Status
				UINT08* mu08_Target		Target
				UINT08 u08_MeasResult	Meas. Result
	Return   :	UINT08 					Across or yet
------------------------------------------------------------------------------*/
UINT08 JudgeSweepLoop( UINT08 u08_MeasResult )
{
	if( mu08_SweepFlag )
	{
		// Up Sweep
		if( u08_MeasResult > mu08_Target )
		{
			return TRUE;
		}
	}
	else
	{
		// Down Sweep
		if( u08_MeasResult <= mu08_Target )
		{
			return TRUE;
		}
	}
	return FALSE;
}


/*------------------------------------------------------------------------------
	MeasSweep
 ------------------------------------------------------------------------------
	Function :	Meas Engine
	Arguments:	UINT08* pu08_MeasSC		Sequence Counter
				UINT08* mu08_Kind		Kind
	Return   :	UINT08 					Average
------------------------------------------------------------------------------*/
UINT08 MeasSweep(  )
{
	static UINT08 su08_MeasCounter;	// Meas. Counter
	static UINT16 su16_MeasAveBuffer;
	UINT08 u08_MeasAve;
//	UINT08 u08_DspStatus;

	switch ( mu08_MeasSC )
	{
		case MEAS_START:
			DrvDSP_BIOS_KindStart();

		case MEAS_NEXT:
			su08_MeasCounter = 8;
			su16_MeasAveBuffer = 0;
			mu08_MeasSC = MEAS_AVERAGE;
			break;

		case MEAS_AVERAGE:
			if( DrvDSP_BIOS_ReadBusy() )
			{
				// BUSY High( Meas. Done ) ---------------------------------------------
				if( DrvDSP_BIOS_GetStatus(  ) & 0x08 )
				{
					// SENS is High ( Meas. Error )
					// ReTry Meas.
					DrvDSP_BIOS_KindStart();
					break;
				}

				// Meas. Success -------------------------------------------------------
				su16_MeasAveBuffer += DrvDSP_BIOS_ReadResult();

				if( --su08_MeasCounter == 0 )
				{
					// Done Meas 8 times
					su08_MeasCounter = 8;

					//// CPU BUG ///////////////////////
//					su16_MeasAveBuffer /=8;
					u08_MeasAve = 0;
					while ( TRUE )
					{
						if( su16_MeasAveBuffer < 8 )
						{
							break;
						}
						su16_MeasAveBuffer -= 8;
						u08_MeasAve++;
					}
					/////////////////////// CPU BUG ////

					mu08_MeasSC = MEAS_DONE_AVERAGE;

#if CHK_SWEEP
					mu08_Servo[mu08_Q1][mu08_Q2][0] = mu08_AdjustParameter;
					mu08_Servo[mu08_Q1][mu08_Q2][1] = u08_MeasAve;
					mu08_Q2++;
#endif
				}
				else
				{
					// Dosn't Done Meas 8 times
					DrvDSP_BIOS_KindStart();
				}
			}
			break;
	}

	return u08_MeasAve;
}


/*------------------------------------------------------------------------------
	SetSweepStep
 ------------------------------------------------------------------------------
	Function :	Set Adjust DSP Parameter
	Arguments:	UINT08 mu08_Kind					Meas Kind
				UINT08 mu08_SweepFlag			Direction
				UINT08 mu08_Limit				Upper or Lower Limit
				UINT08 mu08_Target				Target
				UINT08 u08_MeasResult			MeasResult
				UINT08* mu08_AdjustValue	
	Return   :	UINT08 							Limit UnLimit
------------------------------------------------------------------------------*/
UINT08 SetSweepStep( UINT08 u08_MeasResult )
{
	UINT08 u08_StepSize;
	UINT08 u08_Diff;

	if( mu08_SweepFlag )
	{
		u08_Diff = mu08_Target - u08_MeasResult;
	}
	else
	{
		u08_Diff = u08_MeasResult - mu08_Target;
	}


	u08_StepSize = 4;
	if( mu08_Kind != ADJUST_FB_CMD )
	{
		// Gain ----------------------------------------------------------------
		if( u08_Diff > 16 )
		{
			u08_StepSize = 3;
		}
		else if( u08_Diff > 8 )
		{
			u08_StepSize = 2;
		}
		else
		{
			u08_StepSize = 1;
		}
	}

	for ( gu08_i = 0; gu08_i < u08_StepSize; gu08_i++ )
	{
		if( mu08_SweepFlag )
		{
			// Up Sweep
			mu08_AdjustValue++;
		}
		else
		{
			// Down Sweep
			mu08_AdjustValue--;
		}

		// Limit Check
		if( mu08_AdjustValue == mu08_Limit )
		{
			break;
		}
	}

	mu08_AdjustParameter = mu08_AdjustValue;

	if( mu08_Kind != ADJUST_FB_CMD )
	{
		mu08_AdjustParameter = Tbl_GAIN_00dB[mu08_AdjustValue];

		// Backup Sweep Counter
		if( mu08_Kind == ADJUST_FG_CMD )
		{
			gu08_AdjFgSweep =mu08_AdjustValue;
		}
		else
		{
			gu08_AdjTgSweep =mu08_AdjustValue;
		}
	}

	gu08_AdjResult[mu08_Kind - 8] = mu08_AdjustParameter;

	if( mu08_AdjustValue == mu08_Limit )
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}


/*------------------------------------------------------------------------------
	[NAME]     :AdjustAuto_SetTimer
	[FUNCTION] :
	[RETURN]   :void
	[PARAMETER]:void
	[HISTORY]  :
	[NOTE]     :
------------------------------------------------------------------------------*/
void AdjustAuto_SetTimer( void )
{
	gu16_TimerAdjustMain = TIME_LIMIT_ADJUST;

	return;
}


/*******************************************************************************
 ******************************************************************************
 ******************************************************************************

	Offset

 ******************************************************************************
 ******************************************************************************
*******************************************************************************/
#if CHECK_OFFSET
void CheckOffset(UINT08 u08_Gain)
{
	UINT08 u08_MeasResult;
//	UINT08 i;

	for( gu08_i=1; gu08_i<8; gu08_i++ )
	{
		DrvDSP_BIOS_WriteReg( 0xD0, 0x10*gu08_i );
		while( TRUE )
		{
			if( DrvDSP_BIOS_ReadBusy(  ) )
			{
				u08_MeasResult = DrvDSP_BIOS_ReadReg( 0xDE );
				DrvDSP_BIOS_WriteReg( 0xD0, 0x00 );
				break;
			}
		}

		mu08_CheckOffset[u08_Gain][gu08_i-1] =u08_MeasResult;
	}
}
#endif


/*------------------------------------------------------------------------------
	[NAME]     :DrvDSP_AdjustOffset
	[FUNCTION] :
	[RETURN]   :void
	[PARAMETER]:void
------------------------------------------------------------------------------*/
void DrvDSP_AdjustOffset( void )
{
#if	ROM	// SDC 20050209
	if(	gu08_sts_DSPINIT==0)	//YTC000 俢俽俹弶婜壔慜偼懸偨偣傞
	{	//DSP弶婜壔慜丅
		return;	//-> 僆僼僙僢僩挷惍偵擖傜側偄丅
	}
	if( gu08_sts_AdjustOffset == 0 )
	{
		return;
	}
	else if( gu08_sts_AdjustOffset == ADJUST_ERROR )
	{
		return;
	}
	else if( gu08_sts_AdjustOffset == ADJUST_START )
	{
		mu08_MoveLensSC = START_DOWN;
		gu08_sts_MovePickupIn=1;			//YTC000 僗儗僢僪堷偒崬傒傪偙偙偱梫媮偡傞丅
		gu08_sts_AdjustOffset = OFS_VCO;
		mu08_MainSC = ADJUST_GO;
	}
	else
	{
		// Type Switcher
		if( mu08_MainSC == ADJUST_END )
		{
			switch ( gu08_sts_AdjustOffset )
			{
				case OFS_VCO:
					gu08_kind_Gain = GAIN_X5;
					gu08_sts_AdjustOffset = OFS_READY;
					break;

				case OFS_READY:
					gu08_sts_AdjustOffset = OFS_INPUT;
					mu08_SubSC = OFFSET_START;
					break;

				case OFS_INPUT:
#if	ROM	// SDC 20050209
					gu08_sts_AdjustOffset = OFS_DRIVE_TD_FD;
					mu08_SubSC = OFFSET_START;
					break;

				case OFS_DRIVE_TD_FD:
#endif
					gu08_sts_AdjustOffset = OFS_DRIVE_SD;
					mu08_SubSC = OFFSET_START;
					break;

				case OFS_DRIVE_SD:
					gu08_sts_AdjustOffset = OFS_FIT_RF_FOK;
					mu08_SubSC = OFFSET_START;
					break;

				case OFS_FIT_RF_FOK:
#if	ROM	// SDC 20050208
					switch ( gu08_kind_Gain )
					{
						case GAIN_X5:
#if CHECK_OFFSET
							CheckOffset(gu08_kind_Gain);
#endif
							gu08_sts_AdjustOffset = OFS_INPUT;
							mu08_SubSC = OFFSET_START;
							gu08_kind_Gain = GAIN_X3;
							break;

						case GAIN_X3:
#if CHECK_OFFSET
							CheckOffset(gu08_kind_Gain);
#endif
							gu08_sts_AdjustOffset = OFS_INPUT;
							mu08_SubSC = OFFSET_START;
							gu08_kind_Gain = GAIN_X1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -