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