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

📄 srvcmd.c

📁 本程序为ST公司开发的源代码
💻 C
字号:
/************************************************** * * srvcmd.c * * CVS ID:   $Id: srvcmd.c,v 1.32 2007/04/11 14:21:04 belardi Exp $ * Author:   Fabio Dell'Orto [FD] - STM * Date:     $Date: 2007/04/11 14:21:04 $ * Revision: $Revision: 1.32 $ * * Description: * * *************************************************** * * COPYRIGHT (C) ST Microelectronics  2005 *            All Rights Reserved * ******************************************************************************* * *  \par            Change History: * * - FD060929b      Added descriptive READY * *************************************************** * * STM CVS Log: * * $Log: srvcmd.c,v $ * Revision 1.32  2007/04/11 14:21:04  belardi * Integration of HAVE_CD_MECHA modification by [GP] * * Revision 1.31  2007/03/16 14:18:11  dellorto * modifications to hold TTM during short jumps * * Revision 1.30  2006/10/26 10:20:23  dellorto * simplified servo_cmd(), removing servo_cmd_result * * Revision 1.29  2006/10/09 15:11:11  dellorto * added descriptive READY * clean-up of unused functions * * Revision 1.28  2006/09/18 09:55:25  belardi * Corrected CVS keyword usage * * Revision 1.27  2006/09/18 09:25:37  belardi * Added Log CVS keyword into file header * * ***************************************************/#include "gendef.h"#include "hwreg.h"#include "osal.h"#include "srvinc.h"#include "isrchdl.h"uint8 current_tno_bcd;uint8 current_pause_tno_bcd;uint8 acq_last_tno;#if (HAVE_CD_MECHA == 1)t_servo_cmd_event servo_cmd_event_data[EVENT_MAX_STAGES];void *get_servo_cmd_event_data(t_event_stage i){  return (void *)&servo_cmd_event_data[i];}#ifdef APM_PICKUPRETVAL servo_check_init_for_new_disc(void){  RETVAL servo_check_init_for_new_disc_result;  switch (get_servo_action())  {  case INIT_ACTION:  case INIT_FOR_NEW_DISC_ACTION:    servo_check_init_for_new_disc_result = BUSY;    break;  default:    servo_check_init_for_new_disc_result = READY;    break;  }  return servo_check_init_for_new_disc_result;}#endif// function callable from servovoid servo_reset_play_data_cmd_from_servo(void){  current_pause_tno_bcd = 0;  current_tno_bcd = 0;  acq_last_tno = 0;  lastplay_T = 0;}RETVAL servo_cmd(t_servo_cmd_event *cmd_event){  RETVAL cmd_result = READY;  uint8 new_cmd = 0;  tmp_cmd = cmd_event->command;  if (cmd_event->command == SERVO_CMD_INIT)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_INIT---------------------", 4, 0));    switch (get_servo_action())    {    case INIT_ACTION:      if ((servo_misc_flags.field.start_request)       || (servo_misc_flags.field.init_for_new_disc_request))      {        new_cmd = 1;      }      break;    //case IDLE_ACTION:    //case INIT_FOR_NEW_DISC_ACTION:    //case MOVING_ACTION:    //case ACTIVE_ACTION:    //case STOPPING_ACTION:    //case FATAL_ERROR_ACTION:    default:      new_cmd = 1;      break;    }    cmd_result = BUSY;  }  else if (cmd_event->command == SERVO_CMD_INIT_FOR_NEW_DISC)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_INIT_FOR_NEW_DISC--------", 4, 0));    switch (get_servo_action())    {    case INIT_FOR_NEW_DISC_ACTION:      if (servo_misc_flags.field.start_request)      {        new_cmd = 1;      }      break;    //case IDLE_ACTION:    //case INIT_ACTION:    //case MOVING_ACTION:    //case ACTIVE_ACTION:    //case STOPPING_ACTION:    //case FATAL_ERROR_ACTION:    default:      new_cmd = 1;      break;    }    cmd_result = BUSY;  }  else if (cmd_event->command == SERVO_CMD_START)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_START--------------------", 4, 0));    switch (get_servo_action())    {    case MOVING_ACTION:    case ACTIVE_ACTION:      cmd_result = servo_fsm_result;      break;    //case IDLE_ACTION:    //case INIT_ACTION:    //case INIT_FOR_NEW_DISC_ACTION:    //case STOPPING_ACTION:    //case FATAL_ERROR_ACTION:    default:      new_cmd = 1;      cmd_result = BUSY;      break;    }  }  else if (cmd_event->command == SERVO_CMD_STOP)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_STOP---------------------", 4, 0));    switch (get_servo_action())    {    case IDLE_ACTION:    case FATAL_ERROR_ACTION:      cmd_result = READY;      break;    case INIT_ACTION:    case INIT_FOR_NEW_DISC_ACTION:    case STOPPING_ACTION:      if (servo_misc_flags.field.start_request)      {        new_cmd = 1;      }      cmd_result = BUSY;      break;    //case MOVING_ACTION:    //case ACTIVE_ACTION:    default:      new_cmd = 1;      cmd_result = BUSY;      break;    }  }  else if (cmd_event->command == SERVO_CMD_SEEK)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_SEEK---------------------", 4, 0));    DEBUG_SERVO_CMD(("    target sector:", 4, 1, cmd_event->params.seek.target));    new_cmd = 1;    cmd_result = BUSY;  }  else if (cmd_event->command == SERVO_CMD_TOC_JUMP)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_TOC_JUMP-----------------", 4, 0));    new_cmd = 1;    cmd_result = BUSY;  }  else if (cmd_event->command == SERVO_CMD_PAUSE)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_PAUSE--------------------", 4, 0));    new_cmd = 1;    cmd_result = BUSY;  }  else if (cmd_event->command == SERVO_CMD_SET_SPEED)  {    DEBUG_SERVO_CMD(("----SERVO_CMD_SET_SPEED----------------", 4, 0));    if (target_ttm_speed == cmd_event->params.set_speed)    {      cmd_result = READY;    }    else    {      new_cmd = 1;      cmd_result = BUSY;    }  }  if (0 != new_cmd)  {    t_servo_cmd_event *pout_event = (t_servo_cmd_event *) pevent_get_out(SERVO_CMD_EVENT);    *pout_event = *cmd_event;    event_set_out(SERVO_CMD_EVENT);    event_cmd_set(SERVO_CMD_EVENT);  }  if (READY == cmd_result)  /* FD060929b */  {//TODO  cmd_result = (((RETVAL)tmp_cmd << 8) | READY);  /* to be enabled when extended READY will be supported */    tmp_cmd = SERVO_CMD_NOEVENT;  }  return cmd_result;}void start_for_active_state(void){  switch (get_servo_action())  {  case IDLE_ACTION:    if (servo_misc_flags.field.init_for_new_disc_done)    {      servo_fsm_state = SERVO_START;    }    else    {      if (servo_misc_flags.field.init_done)      {        servo_fsm_state = SERVO_INIT_FOR_NEW_DISC;      }      else      {        servo_fsm_state = SERVO_INIT;        servo_misc_flags.field.init_for_new_disc_request = 1;      }      servo_misc_flags.field.start_request = 1;    }    reset_servo_errors();    break;  case FATAL_ERROR_ACTION:    servo_fsm_state = SERVO_INIT;  case INIT_ACTION:    servo_misc_flags.field.init_for_new_disc_request = 1;  case INIT_FOR_NEW_DISC_ACTION:    servo_misc_flags.field.start_request = 1;    reset_servo_errors();    break;  case STOPPING_ACTION:    if (!servo_misc_flags.field.init_for_new_disc_done)    {      servo_misc_flags.field.init_for_new_disc_request = 1;    }    servo_misc_flags.field.start_request = 1;    reset_servo_errors();    break;  //case MOVING_ACTION:  //case ACTIVE_ACTION:  default:    break;  }}void servo_exec_cmd(t_servo_cmd_event *cmd_event){  uint8 local_start_mode;  if (SERVO_CMD_NOEVENT == cmd_event->command)  {    return;  }  if (cmd_event->command == SERVO_CMD_INIT)  {    servo_misc_flags.field.init_for_new_disc_request = 0;    servo_misc_flags.field.start_request = 0;    servo_misc_flags.field.init_for_new_disc_done = 0;    switch (get_servo_action())    {    case INIT_FOR_NEW_DISC_ACTION:    case STOPPING_ACTION:    case MOVING_ACTION:    case ACTIVE_ACTION:      servo_fsm_state = SERVO_STOP;      servo_misc_flags.field.init_request = 1;      reset_servo_errors();      break;    case IDLE_ACTION:    case FATAL_ERROR_ACTION:      servo_fsm_state = SERVO_INIT;      reset_servo_errors();      break;    //case INIT_ACTION:    default:      break;    }  }  else if (cmd_event->command == SERVO_CMD_INIT_FOR_NEW_DISC)  {    servo_misc_flags.field.start_request = 0;    switch (get_servo_action())    {    case IDLE_ACTION:      if (servo_misc_flags.field.init_done)      {        servo_fsm_state = SERVO_INIT_FOR_NEW_DISC;      }      else      {        servo_fsm_state = SERVO_INIT;        servo_misc_flags.field.init_for_new_disc_request = 1;      }      reset_servo_errors();      break;    case FATAL_ERROR_ACTION:      servo_fsm_state = SERVO_INIT;    case INIT_ACTION:    case STOPPING_ACTION:      servo_misc_flags.field.init_for_new_disc_request = 1;      reset_servo_errors();      break;    case MOVING_ACTION:    case ACTIVE_ACTION:      servo_fsm_state = SERVO_STOP;      servo_misc_flags.field.init_for_new_disc_request = 1;      reset_servo_errors();      break;    //case INIT_FOR_NEW_DISC_ACTION:    default:      break;    }  }  else if (cmd_event->command == SERVO_CMD_START)  {    switch (get_servo_action())    {    case IDLE_ACTION:    case INIT_ACTION:    case INIT_FOR_NEW_DISC_ACTION:    case STOPPING_ACTION:    case FATAL_ERROR_ACTION:      servo_seek_flags.field.seek_state = NO_SEEK_REQUESTED;      servo_active_flags.field.servo_mode = START_MODE;      break;    //case MOVING_ACTION:    //case ACTIVE_ACTION:    default:      break;    }    start_for_active_state();  }  else if (cmd_event->command == SERVO_CMD_STOP)  {    servo_misc_flags.field.start_request = 0;    switch (get_servo_action())    {    case MOVING_ACTION:    case ACTIVE_ACTION:      servo_fsm_state = SERVO_STOP;      reset_servo_errors();      break;    //case IDLE_ACTION:    //case INIT_ACTION:    //case INIT_FOR_NEW_DISC_ACTION:    //case STOPPING_ACTION:    //case FATAL_ERROR_ACTION:    default:      break;    }  }  else if (cmd_event->command == SERVO_CMD_SEEK)  {    local_start_mode = cmd_event->params.seek.start_mode;    if ((START_MODE == servo_active_flags.field.servo_mode)     || (PAUSE_MODE == servo_active_flags.field.servo_mode))    {      local_start_mode |= SEEK_START_TRAGET_MSF;    }    endplay_T = cmd_event->params.seek.endplay;    target_T = cmd_event->params.seek.target;    if (local_start_mode & SEEK_START_TRAGET_MSF)    {      previous_T = 0;      lastrecovery_T = 0;    }    else    {      if ((0 != servo_seek_flags.field.seek_cmd_executed)       && (start_mode & SEEK_START_TRAGET_MSF))      {        local_start_mode |= SEEK_START_TRAGET_MSF;      }    }    if (local_start_mode & SEEK_START_TRAGET_MSF)    {      servo_seek_flags.field.seek_cmd_executed = 1;      servo_seek_flags.field.seek_state = NEW_SEEK_REQUESTED;      servo_seek_flags.field.seek_mode = SEEK_TARGET;    }    start_mode = local_start_mode;    end_mode = cmd_event->params.seek.end_mode;    data_mode = cmd_event->params.seek.data_mode;    servo_active_flags.field.servo_mode = PLAY_MODE;    servo_active_flags.field.play_state = WAIT_START_MSF;    start_for_active_state();  }  else if (cmd_event->command == SERVO_CMD_TOC_JUMP)  {    target_T = cmd_event->params.toc_jump.target_time;    skip_trk = cmd_event->params.toc_jump.extra_tracks;    servo_seek_flags.field.seek_mode = cmd_event->params.toc_jump.seek_mode;    servo_active_flags.field.servo_mode = TOC_JUMP_MODE;    servo_seek_flags.field.seek_state = NEW_SEEK_REQUESTED;    start_for_active_state();  }  else if (cmd_event->command == SERVO_CMD_PAUSE)  {    local_start_mode = cmd_event->params.pause.start_mode;    if (START_MODE == servo_active_flags.field.servo_mode)    {      local_start_mode |= SEEK_START_TRAGET_MSF;    }    if (!(local_start_mode & SEEK_START_TRAGET_MSF))    {      if ((0 != servo_seek_flags.field.seek_cmd_executed)       && (start_mode & SEEK_START_TRAGET_MSF))      {        local_start_mode |= SEEK_START_TRAGET_MSF;      }      else if (servo_active_flags.field.servo_mode != PAUSE_MODE)      {        target_T = T_actual;      }    }    else    {      target_T = cmd_event->params.pause.target;    }    if (target_T < CDT_1SEC) /* BBTODO QUICKFIX */    {      target_T = CDT_1SEC;    }    if ((local_start_mode & SEEK_START_TRAGET_MSF))    {      servo_seek_flags.field.seek_cmd_executed = 1;      servo_seek_flags.field.seek_state = NEW_SEEK_REQUESTED;      servo_seek_flags.field.seek_mode = SEEK_TARGET;    }    start_mode = local_start_mode;    servo_active_flags.field.servo_mode = PAUSE_MODE;    servo_active_flags.field.pause_state = START_PAUSE;    start_for_active_state();  }  else if (cmd_event->command == SERVO_CMD_SET_SPEED)  {    target_ttm_speed = cmd_event->params.set_speed;    servo_misc_flags.field.set_speed_request = 1;    servo_misc_flags.field.check_speed_request = 1;#if 0    cmd_result = READY;    if ((cmd_event->params.set_speed != oif_requested_speed)     || (cmd_event->params.set_speed != ttm_speed))    {      oif_requested_speed = cmd_event->params.set_speed;      ttm_speed = cmd_event->params.set_speed;      if (toc_fsm_result != BUSY)      {         servo_misc_flags.field.set_speed_request = 1;         servo_misc_flags.field.check_speed_request = 1;      }      else      {        switch (get_servo_action())        {        case STARTING_ACTION:        case MOVING_ACTION:        case ACTIVE_ACTION:          cmd_result = BUSY;          break;        //case IDLE_ACTION:        //case INIT_ACTION:        //case INIT_FOR_NEW_DISC_ACTION:        //case STOPPING_ACTION:        //case FATAL_ERROR_ACTION:        default:          break;        }      }    }#endif  }}#endif // HAVE_CD_MECHA

⌨️ 快捷键说明

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