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

📄 isrchdl.c

📁 本程序为ST公司开发的源代码
💻 C
字号:
/************************************************** * * isrhdl.c * * CVS ID:   $Id: isrchdl.c,v 1.35 2007/09/26 15:05:09 dellorto Exp $ * Author:   Maurizio Marcucci [MM] - STM * Date:     $Date: 2007/09/26 15:05:09 $ * Revision: $Revision: 1.35 $ * * Description: * *   Main interrupt handlers * *************************************************** * * COPYRIGHT (C) ST Microelectronics  2005 *            All Rights Reserved * ******************************************************************************* *  \brief          Channel management procedures (Acquisition / ECC / Audio) * *  \par            Change History: * * - BB060822a      Removed endplay handling from interrupt and moved to *                  active check servo state * *************************************************** * * STM CVS Log: * * $Log: isrchdl.c,v $ * Revision 1.35  2007/09/26 15:05:09  dellorto * no message * * Revision 1.34  2007/04/11 14:19:59  belardi * Integration of HAVE_CD_MECHA modification by [GP] * * Revision 1.33  2007/04/06 06:35:51  hara * Add _EVENT_TEP_HAD_TIME_BEFORE handling for more robust TOC reading. * * Revision 1.32  2006/09/18 09:55:23  belardi * Corrected CVS keyword usage * * Revision 1.31  2006/09/18 09:24:43  belardi * Added Log CVS keyword into file header * * ******************************************************************************/#include "gendef.h"#include "osal.h"#include "srvinc.h"#include "hwreg.h"#include "hwinit.h"#include "player.h"#include "controller.h"#include "utility.h"#ifdef APM_PICKUP#include "service.h"#endif#include "text.h"/******************************************************************************//* Function: oif_isr_irq                                                      *//*                                                                            *//*! \brief     Interrutp handler for the Output Interface, used mainly for CDTEXT *  \param *  \return *  \remark *//******************************************************************************/#if (1==HAVE_CDTEXT)extern void text_isr(void);#endifvoid oif_isr_irq(void){  OIF_INT_REASON_UNION oif_int_stat;  oif_int_stat = OIF_INT_REASON;  if (oif_int_stat.field.int_cdtext == 1)  {#if (1==HAVE_CDTEXT)    text_isr();#endif    OIF_INT_REASON.field.int_cdtext = 0;  }  if (oif_int_stat.field.int_misc_ap)  {    misc_ap_isr();    OIF_INT_REASON.field.int_misc_ap = 0;  }  if (oif_int_stat.field.int_ap)  {    // ap_isr();    OIF_INT_REASON.field.int_ap = 0;  }}/******************************************************************************//* Function:  src_error_isr_irq                                               *//*                                                                            *//*! \brief    Sample Rate Converter interrupt handler *  \param    void *  \return   void *  \remark *//******************************************************************************/void src_error_isr_irq(void){  if (SRC_CS.field.ufl)  {    SRC_CS.field.ufcl = 1; // Clear Interrupt  }}#if (HAVE_CD_MECHA == 1)t_acq_subcode_event acq_subcode_event[EVENT_MAX_STAGES];void * get_acq_subcode_event_data(t_event_stage i){  return (void *)&acq_subcode_event[i];}/******************************************************************************//* Function:  acq_isr_irq                                                     *//*                                                                            *//*! \brief    Acquisition interrupt handler *  \param    void *  \return   void *  \remark *//******************************************************************************/void acq_isr_irq(void){  ACQ_STATUS_UNION acq_status;  t_acq_subcode_event *pacq_event;  STRUCT_Q_SUBCODE *psubcode;  pacq_event = (t_acq_subcode_event *) pevent_get_out(ACQ_IRQ_SUBCODE_EVENT);  psubcode = &(pacq_event->subcode_event.q_subcode);  pacq_event->subcode_event.event_type = ACQ_EVENT_SUBCODE_NONE;  acq_status.all = ACQ_STATUS.all;#ifdef APM_PICKUP  if (acq_status.field.nsi_int && service_flag_is_set(SVCF_NSI_SUBCODE))  /* BB050414c */  {    svc_msg_set_pending(SVC_MSG_READ_Q_SUBCODE);  }#endif  if (acq_status.field.lba_int)   // New Sector Interrupt  {    if (acq_status.field.crc_ok)    {#ifdef APM_PICKUP      if (service_flag_is_set(SVCF_PERMANENT_SUBCODE))     /* BB050414c */      {        svc_msg_set_pending(SVC_MSG_READ_Q_SUBCODE);      }#endif      pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_CRCOK;      start_timer(SERVO_ACQ_INT_TIMER, T100ms);      pacq_event->freq_1T = (uint32)ACQ_PLL_FREQ_L;      pacq_event->freq_1T |= (uint32)ACQ_PLL_FREQ_M << 8;      pacq_event->freq_1T |= (uint32)ACQ_PLL_FREQ_H << 16;      // We store Subcode info for every Mode      psubcode->q_cadr   =  ACQ_SUBCODE_0;      psubcode->q_tno    =  ACQ_SUBCODE_1;      psubcode->q_point  =  ACQ_SUBCODE_2;      psubcode->q_min    =  ACQ_SUBCODE_3;      psubcode->q_sec    =  ACQ_SUBCODE_4;      psubcode->q_frame  =  ACQ_SUBCODE_5;      psubcode->q_zero   =  ACQ_SUBCODE_6;      psubcode->q_amin   =  ACQ_SUBCODE_7;      psubcode->q_asec   =  ACQ_SUBCODE_8;      psubcode->q_aframe =  ACQ_SUBCODE_9;      if ((psubcode->q_cadr & 0x0F) == 0x00)      {        // Mode 0        servo_acq_flags.field.erased_cd_rw = 1;      }      else if ((psubcode->q_cadr & 0x0F) == 0x01)      {        // Mode 1        servo_acq_flags.field.mode1_subcode = 1;        if (psubcode->q_tno != 0)   // Program or Lead-Out Area.        {          if (psubcode->q_tno == 0xAA)          {            pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_LEADOUT;          }          else          {            if (acq_status.field.a_sec)            {              pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_ABS_TIME;            }            if (acq_status.field.r_sec             || ((0 == psubcode->q_frame) && (0 == psubcode->q_sec)))            {              pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_REL_TIME;            }            if (acq_last_tno != psubcode->q_tno)            {              acq_last_tno = psubcode->q_tno;              pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_NEW_TRACK;            }          }          if (psubcode->q_cadr & 0x40)          {            // Data Track            // Disable Audio Concealment            ECC_MODE.field.acon = 0;          }          else          {            //Audio Track            // Enable Audio Concealment            ECC_MODE.field.acon = OIF_AUDIO_CONCEALMENT;          }          pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_NEW_T;          servo_acq_flags.field.new_T_subcode = 1;          pacq_event->T_actual = msf_2_sid(psubcode->q_amin, psubcode->q_asec, psubcode->q_aframe, BCD);        }        else   // (psubcode->q_tno == 0)   // Lead-In Area.        {          // We can say something about position          // only if we receive MODE 1 SubCode.          // In this case if NEW_T flag is not set          // we assume to be in the first lead-in          pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_LEADIN;          if (((CDinfo & MS_R_RW) == MS_R_RW)           && (psubcode->q_min < 0x95))          {            pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_NEW_T;            servo_acq_flags.field.new_T_subcode = 1;            pacq_event->T_actual = msf_2_sid(psubcode->q_min, psubcode->q_sec, psubcode->q_frame, BCD);          }          else          {            /* first leadin, set actual time to 0 so that               after interpolation recovery works */            pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_NEW_T;            servo_acq_flags.field.new_T_subcode = 1;            pacq_event->T_actual = 0;          }        }      }    }    /* Actual time interpolation */    if (!acq_status.field.unlocked            /* PLL is locked */     && !(pacq_event->subcode_event.event_type & ACQ_EVENT_SUBCODE_NEW_T)        /* subcode has bad CRC or not have time info */     && !servo_acq_flags.field.erased_cd_rw   /* not erased cd */     && servo_acq_flags.field.new_T_subcode)  /* and we had at least one time info subcode */    {      pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_INTERPOLATED;      pacq_event->subcode_event.event_type |= ACQ_EVENT_SUBCODE_NEW_T;      pacq_event->T_actual++;      if (pacq_event->T_actual == msf_2_sid(psubcode->q_min, psubcode->q_sec, psubcode->q_frame, BCD))      {      /* do not make recovery if at least absolute time part of subcode is OK */        start_timer(SERVO_ACQ_INT_TIMER, T100ms);      }    }    if (servo_acq_flags.field.new_T_subcode)  /* BB070110a */    {      pacq_event->subcode_event.event_type |= _EVENT_TEP_HAD_TIME_BEFORE;    }    event_set_out(ACQ_IRQ_SUBCODE_EVENT);    event_disable_scheduling();    event_out_shedule(ACQ_IRQ_SUBCODE_EVENT);    event_enable_scheduling();  }}#endif // HAVE_CD_MECHA

⌨️ 快捷键说明

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