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

📄 srvjmp.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************
 *
 * 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 + -