📄 srvjmp.c
字号:
/**************************************************
*
* srvjmp.c
*
* CVS ID: $Id: srvjmp.c,v 1.20 2007/08/14 15:30:28 dellorto Exp $
* Author: Fabio Dell'Orto [FD] - STM
* Date: $Date: 2007/08/14 15:30:28 $
* Revision: $Revision: 1.20 $
*
* Description:
*
*
***************************************************
*
* COPYRIGHT (C) ST Microelectronics 2005
* All Rights Reserved
*
*******************************************************************************
* \brief Jump management procedures
*
* \par Change History:
*
* - PH040601a Modified profile handling. Introduced profile union
* and pointer to it. So it can be switched ROM/RAM
*
* - ST------- Changes:
* - Hardware AGC algorithm always disabled in short_jump()
* - Added tracks to steps conversion in long_jump()
*
* - BB040928a Code rom and ram size optimisation:
* - Optimised check_servo() and evaluation of check_servo() result
*
* - PH050201a Restore original settings if recovery during short jump occurred
*
* - ST050815c Code optimizations: optimised calls to jump functions
*
***************************************************
*
* STM CVS Log:
*
* $Log: srvjmp.c,v $ * Revision 1.20 2007/08/14 15:30:28 dellorto * multiple mechanisms *
* Revision 1.19 2007/04/11 14:21:04 belardi
* Integration of HAVE_CD_MECHA modification by [GP]
*
* Revision 1.18 2007/03/16 14:19:31 dellorto
* used new profiles
*
* Revision 1.17 2006/10/31 11:11:04 marcucci
* No more static functions for Jump Table
*
* Revision 1.16 2006/10/09 15:13:35 dellorto
* *** empty log message ***
*
* Revision 1.15 2006/09/18 09:55:25 belardi
* Corrected CVS keyword usage
*
* Revision 1.14 2006/09/18 09:25:37 belardi
* AddeLogg$ CVS keyword into file header
*
*
******************************************************************************/
#include "gendef.h"
#include "hwreg.h"
#include "osal.h"
#include "srvinc.h"
#include "pdebug.h"
#if (HAVE_CD_MECHA == 1)
/******************************************************************************/
/* Function: start_short_jump_for_tracking_reset */
/* */
/*! \brief Starts auxiliary short jump execution to reset ntracks
* \param void
* \return void
* \remark
*/
/******************************************************************************/
void start_short_jump_for_tracking_reset(void)
{
DISABLE_INTERRUPTS();
RA_TRKS_TO_SKIP_L = 0x00;
RA_TRKS_TO_SKIP_H = 0x00;
RA_ADDR = 0x03;
RA_DATA = 0x22; /* Execute a zero tracks jump in outside direction */
do { } while (0 != (RA_STATUS.all & 0x80)); /* Be sure that jump is started */
ENABLE_INTERRUPTS();
}
/******************************************************************************/
/* Function: start_short_jump */
/* */
/*! \brief Starts short jump execution
* \param void
* \return void
* \remark
*/
/******************************************************************************/
void start_short_jump(void)
{
uint16 trkno;
uint8 dir;
event_in[DSP_SHORT_JUMP_EVENT].event = SHORT_JUMP_EVENT_MOVING;
RA_CTRL3.all = OPU_PRO_HIGH_RATE_PLL_GAIN; /* high gain for RATE PLL */
trkno = (uint16)(absi(delta_trk));
dir = (uint8)(delta_trk < 0);
dsp_write_xmem(JMP_DIR_ADD, dir);
#if (1 == NLC_DELTA_ZERO_SHORT_JUMP)
nlc_set_delta(NLC_PHI_DELTA_OFF); /* Set NLC threshold to zero => high bandwidth during short jump. */
#endif
set_sledge_for_jump();
DISABLE_INTERRUPTS();
RA_TRKS_TO_SKIP_L = (uint8)(trkno & 0xFF);
RA_TRKS_TO_SKIP_H = (uint8)((trkno >> 8) & 0xFF);
RA_ADDR = 0x03;
if (dir)
{
RA_DATA = 0x22; /* Execute a master jump in outside direction */
}
else
{
RA_DATA = 0x26; /* Execute a master jump in inside direction */
}
do { } while (0 != (RA_STATUS.all & 0x80)); /* Be sure that jump is started */
ENABLE_INTERRUPTS();
dsp_write_xmem(JUMP_MODE_ADD, 1);
}
/******************************************************************************/
/* Function: stop_short_jump */
/* */
/*! \brief Stops or resets short jump execution
* \param void
* \return void
* \remark
*/
/******************************************************************************/
void stop_short_jump(void)
{
DISABLE_INTERRUPTS();
if ((RA_TRKS_TO_SKIP_L != 0x00) || (RA_TRKS_TO_SKIP_H != 0x00))
{
RA_ADDR = 0x03;
if (0 == (RA_STATUS.all & 0x80))
{
RA_DATA = 0x28;
}
}
ENABLE_INTERRUPTS();
}
/******************************************************************************/
/* Function: reset_after_short_jump */
/* */
/*! \brief Stops or resets short jump execution
* \param void
* \return void
* \remark
*/
/******************************************************************************/
void reset_short_jump(t_reset_short_jump_mode reset_short_jump_mode)
{
/* Reset after completed Short Jump or after braking active Short Jump */
#if (1 == NLC_DELTA_ZERO_SHORT_JUMP)
nlc_set_delta(NLC_PHI_DELTA_ON); /* After short jump set NLC threshold back to its value during play. */
#endif
set_sledge_for_play();
dsp_write_xmem(JUMP_MODE_ADD, 0);
RA_CTRL3.all = OPU_PRO_LOW_RATE_PLL_GAIN; /* Low gain for RATE PLL */
RA_CTRL1.field.linear_te = 0; /* classic TE (E-F) */
RA_TRKS_TO_SKIP_L = 0;
RA_TRKS_TO_SKIP_H = 0;
}
/******************************************************************************/
/* Function: short_jump_stopped */
/* */
/*! \brief Checks short jump stopped condition
* \param void
* \return t_bool (TRUE if short jump is completed)
* \remark
*/
/******************************************************************************/
t_bool short_jump_stopped(void)
{
return (t_bool)(SHORT_JUMP_EVENT_STOPPED
== (t_short_jump_event)event_in[DSP_SHORT_JUMP_EVENT].event);
}
/******************************************************************************/
/* Function: short_jump_execution */
/* */
/*! \brief Short jump execution sequence
* \param void
* \return RETVAL: OK / IN_PROGRESS / TTM_STOPPED / FOCUS_LOST / HF_LOST / TRACKING_NOT_FOUND
* \remark
*/
/******************************************************************************/
RETVAL short_jump_execution(void)
{
RETVAL short_jump_execution_result;
short_jump_execution_result = check_servo(CHECK_TTM | CHECK_FOCUS | CHECK_HF);
if (short_jump_execution_result == OK)
{
short_jump_execution_result = IN_PROGRESS;
switch (short_jump_execution_state)
{
case STATE_1:
start_short_jump();
short_jump_execution_state = STATE_2;
break;
case STATE_2:
if (short_jump_stopped())
{
reset_short_jump(RESET_SHORT_JUMP_EXECUTION);
short_jump_execution_result = OK;
}
else if (servo_seek_flags.field.seek_state == NEW_SEEK_REQUESTED)
{
stop_short_jump();
short_jump_execution_state = STATE_3;
}
break;
//case STATE_3:
default:
if (short_jump_stopped())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -