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

📄 loader.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/************************************************** * * loader.c * * CVS ID:   $Id: loader.c,v 1.27 2007/10/02 14:19:38 dellorto Exp $ * Author:   Fabio Dell'Orto [FD] - STM * Date:     $Date: 2007/10/02 14:19:38 $ * Revision: $Revision: 1.27 $ *  * Description: *  *   Main entry point for the Loader task. * *************************************************** *  * COPYRIGHT (C) ST Microelectronics  2005 *            All Rights Reserved * *************************************************** * * STM CVS Log: * * $Log: loader.c,v $ * Revision 1.27  2007/10/02 14:19:38  dellorto * improved conservative behavior for Shinwa CDC02 * fixed stop insertion for Shinwa CLC01 * fixed size detection for Tanashin * * Revision 1.26  2007/09/26 15:04:54  dellorto * fixed timings for Shinwa CDC02 * * Revision 1.25  2007/09/07 07:07:03  dellorto * Bug fixing and improvements in Tanashin loader * * Revision 1.24  2007/08/14 15:27:56  dellorto * multiple mechanisms * * Revision 1.22  2006/12/19 17:07:29  dellorto * mechanical initialization according to Shinwa recommendation (30 ms Eject, in case of no cd) * fixed insert transition (in case of disc moved in eject direction) * improved error reporting to player, for recoveries * fixed behavior using the following configuration: conservative behavior;  insert/eject with no cd; reverse direction not allowed * improved illegal switching and disc size detection * clean-up from unused ldr_retval variable, updated function headers, code optimization * * Revision 1.21  2006/12/04 14:50:28  dellorto * loader improved, according to new timing specification * * Revision 1.20  2006/10/26 10:23:43  dellorto * improved alignements with Shinwa transition timings * improved protection against illegal switchings * improved handling of mechanisms with altered chuck switch * * Revision 1.19  2006/10/09 15:17:06  dellorto * added LoaderTask, moved from osal.c * * Revision 1.18  2006/09/27 19:52:04  belardi * Removed (global) unused variables * * Revision 1.17  2006/09/18 09:55:23  belardi * Corrected CVS keyword usage * * Revision 1.16  2006/09/18 09:24:22  belardi * Added Log CVS keyword into file header * * ***************************************************/#include "gendef.h"#include "hwreg.h"#include "osal.h"#include "utility.h"#include "loader.h"#include "monitor.h"#include "plr_conf.h"#include "debug.h"#if (HAVE_CD_MECHA == 1)/*----------------------------------------------------------------------------*//*------------------------    Macros -----------------------------------------*//*----------------------------------------------------------------------------*/#define ldrSendEvent(x) do {                              \  event_out[LOADER_STATUS_EVENT].event = (x);             \  DEBUG_LOADER_STATUS_EVENT(("LOADER_EVENT:", 1, 1, x));  \} while(0)/*----------------------------------------------------------------------------*//*------------------------    local vars  ------------------------------------*//*----------------------------------------------------------------------------*/t_disc_size disc_size;uint8 previous_ldr_switch_state;t_loader_state ldr_state;                 /*!<\brief Current loader state */t_motor_direction  ldr_motor_dir;         /*!<\brief Current motor direction */#define LDR_SET_CMD_EVENT(x) do {           \  event_out[LOADER_CMD_EVENT].event = (x);  \  event_cmd_set(LOADER_CMD_EVENT);          \} while(0)#define LDR_CMD_EVENT     event_in[LOADER_CMD_EVENT].event#define LDR_SW_EVENT      event_in[LOADER_SW_EVENT].event#define ldr_command       LDR_CMD_EVENT#define ldr_switch_state  LDR_SW_EVENT/*----------------------------------------------------------------------------*//*------------------------    Function implementations   ---------------------*//*----------------------------------------------------------------------------*//******************************************************************************//* Function:  set_loader_input                                                *//*                                                                            *//* \brief     set the loader motor input * \param     uint16 loader input  * \return    void * \remark *//******************************************************************************/void set_loader_input(int16 loader_input){  DISABLE_INTERRUPTS();  DSP_SSPDL = (uint8)(loader_input & 0xFF);  DSP_SSPDH = (uint8)(loader_input >> 8);  ENABLE_INTERRUPTS();}/******************************************************************************//* Function:  ldrSetMotor                                                     *//*                                                                            *//*! \brief     *  \param    t_motor_direction direction *  \return   void *  \remark *//******************************************************************************/void ldrSetMotor(t_motor_direction direction){  ldr_motor_dir = direction;  if (IS_TANASHIN_MECHANISM(mechanism_model))  {    switch (direction)    {    case LOADER_DIR_INSERT:      DRIVER_ON;      set_loader_input(LOADER_PRO_INSERT_PARAM);      break;    case LOADER_DIR_EJECT:      DRIVER_ON;      set_loader_input(LOADER_PRO_EJECT_PARAM);      break;    //case LOADER_DIR_IDLE:    default:      set_loader_input(0x0000);      DRIVER_OFF;      break;    }  }  else  {    switch (direction)    {    case LOADER_DIR_INSERT:      set_gpio(PORT_A, GPIO_1, LOADER_PRO_INSERT_GPIO_1);      set_gpio(PORT_A, GPIO_2, LOADER_PRO_INSERT_GPIO_2);      break;    case LOADER_DIR_EJECT:      set_gpio(PORT_A, GPIO_1, LOADER_PRO_EJECT_GPIO_1);      set_gpio(PORT_A, GPIO_2, LOADER_PRO_EJECT_GPIO_2);      break;    //case LOADER_DIR_IDLE:    default:      set_gpio(PORT_A, GPIO_1, 0);      set_gpio(PORT_A, GPIO_2, 0);      break;    }  }}/******************************************************************************//* Function:  StartActionTo                                                   *//*                                                                            *//*! \brief     *  \param    t_motor_direction direction *  \param    t_loader_state state *  \param    OSAL_TIME_t time *  \return   void *  \remark *//******************************************************************************/void StartActionTo(t_motor_direction direction, t_loader_state state, OSAL_TIME_t time){  if (LOADER_S_EJECT_8CM_SUSPICIOUS == state)  {    disc_size = DISC_SIZE_8CM_SUSPICIOUS;    state = LOADER_S_EJECT_8CM_1;  }  if (T0ms != time)  {    start_timer(LOADER_TIMER, time);  }  ldrSetMotor(direction);  ldr_state = state;}/******************************************************************************//* Function:  StartInsertTo                                                   *//*                                                                            *//*! \brief     *  \param    t_loader_state state *  \param    OSAL_TIME_t time *  \return   void *  \remark *//******************************************************************************/void StartInsertTo(t_loader_state state, OSAL_TIME_t time){  StartActionTo(LOADER_DIR_INSERT, state, time);}/******************************************************************************//* Function:  StartEjectTo                                                    *//*                                                                            *//*! \brief     *  \param    t_loader_state state *  \param    OSAL_TIME_t time *  \return   void *  \remark *//******************************************************************************/void StartEjectTo(t_loader_state state, OSAL_TIME_t time){  StartActionTo(LOADER_DIR_EJECT, state, time);}/******************************************************************************//* Function:  IdleMode                                                        *//*                                                                            *//*! \brief     *  \param    t_loader_status_event event *  \param    t_loader_state state *  \return   void *  \remark *//******************************************************************************/void IdleMode(t_loader_status_event event, t_loader_state state){  if ((READY != event)   && (LOADER_S_NOCD_INSERTING != ldr_state)   && (LOADER_S_NOCD_EJECTING != ldr_state)   && ((LOADER_S_EJECT_8CM_1 != ldr_state)    || (DISC_SIZE_8CM_SUSPICIOUS != disc_size)))  {    ldr_command = LC_NONE;  }  if (LOADER_S_NO_CD_POSITION == state)  {    disc_size = DISC_SIZE_UNKNOWN;  }  ldrSetMotor(LOADER_DIR_IDLE);  ldrSendEvent(event);  ldr_state = state;}/******************************************************************************//* Function:  ldrPrepareError                                                 *//*                                                                            *//*! \brief    Prepare loader error state *  \param    RETVAL ldr_error_event *  \return   void *  \remarks *//******************************************************************************/void ldrPrepareError(RETVAL ldr_error_event){  IdleMode(ldr_error_event, LOADER_S_ERROR);}/*****************************************************************************//*                                                                           *//*                              M0_SHINWA_CDC02                              *//*                                                                           *//*****************************************************************************//******************************************************************************//* Function:  StartInsert_Shinwa_CDC02                                        *//*                                                                            *//*! \brief    Start disc insertion according to current position *            (implementation for mechanism: M0_SHINWA_CDC02) *  \param    void *  \return   void *  \remark *//******************************************************************************/void StartInsert_Shinwa_CDC02(void){  switch (SW_VALUE(ldr_switch_state))  {  case SW_S_010_INSERT:    StartInsertTo(LOADER_S_INSERT_1, T5s);    break;  case SW_S_110_EJECT:    StartInsertTo(LOADER_S_INSERT_2, T5s);    break;  case SW_S_000_STOP:    StartEjectTo(LOADER_S_INSERT_REPOSITIONING, T1s);    break;  case SW_S_100_TRANSITION:    StartInsertTo(LOADER_S_INSERT_4, T3s5);    break;  case SW_S_111_8CM:    StartEjectTo(LOADER_S_EJECT_8CM_1, T1s);    ldrSendEvent(LOADER_ERROR_8CM);    break;         case SW_S_011_NOCD:    StartEjectTo(LOADER_S_EJECT_8CM_SUSPICIOUS, T1s);    ldrSendEvent(LOADER_ERROR_8CM);    break;  //SW_S_001_ILLEGAL:  //SW_S_101_ILLEGAL:  default:    ldrSendEvent(LOADER_ERROR_SW_ILLEGAL);    StartEjectTo(LOADER_S_EMERGENCY_EJECT, T5s);    break;  }}/******************************************************************************//* Function:  StartEject_Shinwa_CDC02                                         *//*                                                                            *//*! \brief    Start disc ejection according to current position *            (implementation for mechanism: M0_SHINWA_CDC02) *  \param    void *  \return   void *  \remark *//******************************************************************************/void StartEject_Shinwa_CDC02(void){  switch (SW_VALUE(ldr_switch_state))  {  case SW_S_000_STOP:  case SW_S_100_TRANSITION:    StartEjectTo(LOADER_S_EJECT_12CM_1, T2s);    break;  case SW_S_111_8CM:    StartEjectTo(LOADER_S_EJECT_8CM_1, T1s);    break;  case SW_S_010_INSERT:  case SW_S_110_EJECT:    StartInsertTo(LOADER_S_EJECT_REPOSITIONING, T1s);    break;  case SW_S_011_NOCD:    StartEjectTo(LOADER_S_EJECT_8CM_SUSPICIOUS, T1s);    break;   //SW_S_001_ILLEGAL:  //SW_S_101_ILLEGAL:  default:    ldrSendEvent(LOADER_ERROR_SW_ILLEGAL);    StartEjectTo(LOADER_S_EMERGENCY_EJECT, T5s);    break;  }}/******************************************************************************//* Function:  ldrCommandEval_Shinwa_CDC02                                     *//*                                                                            *//*! \brief    Start actions for a new Loader Command *            (implementation for mechanism: M0_SHINWA_CDC02) *  \param    void *  \return   void *  \remarks *//******************************************************************************/void ldrCommandEval_Shinwa_CDC02(void){  t_bool illegal_switch_detected = b_FALSE;  if ((SW_VALUE(ldr_switch_state) != SW_VALUE(previous_ldr_switch_state))   && (LOADER_S_STOP_POSITION != ldr_state)   && (LOADER_S_EMERGENCY_EJECT != ldr_state))  {    if ((SW_INVALID_VAL != SW_VALUE(previous_ldr_switch_state))     && ((SW_S_001_ILLEGAL == SW_VALUE(ldr_switch_state))      || (SW_S_101_ILLEGAL == SW_VALUE(ldr_switch_state))      || ((DISC_SIZE_12CM == disc_size)       && ((SW_S_111_8CM == SW_VALUE(ldr_switch_state))        || ((SW_S_011_NOCD == SW_VALUE(ldr_switch_state))         && (SW_S_010_INSERT != SW_VALUE(previous_ldr_switch_state)))))      || (((DISC_SIZE_8CM == disc_size)        || (DISC_SIZE_8CM_SUSPICIOUS == disc_size))       && ((SW_S_100_TRANSITION == SW_VALUE(ldr_switch_state))        || (SW_S_000_STOP == SW_VALUE(ldr_switch_state))))      || ((DISC_SIZE_UNKNOWN == disc_size)       && (((SW_S_011_NOCD == SW_VALUE(previous_ldr_switch_state))         && (SW_S_010_INSERT != SW_VALUE(ldr_switch_state)))))))    {      // on illegal SW state      illegal_switch_detected = b_TRUE;

⌨️ 快捷键说明

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