📄 srvcmd.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 + -