📄 dsas.c
字号:
SERVO_new_Qcode = 0;#if defined(CD_TEXT) && !defined(ANTI_SHOCK) CD_text_init(1);#endif while (!ltoc_done) {#ifdef ECHO MIC_service();#endif VCX_service();#ifdef LTOC_TV_CHANGE DISP_TV_service();#endif loopcnt++; if (loopcnt > 2000) { /* * Servo is going crazy! This rarely happens; however, I have * seen this happened! */ goto SERVO_ltoc_retry; } /* Higher priority command received. Go handle it */ if ((loopcnt % 8) == 0) if(SERVO_check_key_new()) return(0); timeout = glbTimer + FOUR_SECOND; do { SERVO_service(1); if (!servo_focus_on || (glbTimer > timeout)) goto SERVO_ltoc_retry; /* Focus is down or time out, * * do not proceed */ if(SERVO_new_Qcode) { SERVO_new_Qcode = 0; Q_cnt++; if(Q_cnt > 99) { Q_cnt = 0; SERVO_track_jump(1,1); } break; } if(SERVO_check_key_new()) return(0);#ifdef LTOC_TV_CHANGE DISP_TV_service();#endif } while(1);#if 0 debug_osd("Q",SERVO_Qarray_new[SERVO_QPOINT],10);#endif switch(SERVO_Qarray_new[SERVO_QTRACK]) { case 0x00: switch(SERVO_Qarray_new[SERVO_QPOINT]) { case 0xA0: if (num_of_session==1) { CDinfo.firsttrack = bcd2hex[SERVO_Qarray_new[SERVO_QPMIN]]; pt_A0_PSEC = SERVO_Qarray_new[SERVO_QPSEC]; if(pt_A0_PSEC == 0xa) CDinfo.type = CD_CDI; pt_A0 = 1; } break; case 0xA1: CDinfo.lasttrack = bcd2hex[SERVO_Qarray_new[SERVO_QPMIN]] - 1; if (CDinfo.type == CD_CDI) num_of_track = -1; else num_of_track = CDinfo.lasttrack - CDinfo.firsttrack + 1; pt_A1 = 1; break; case 0xA2: CDinfo.leadout = SERVO_Qarray_new[SERVO_QPMIN]<<16 ; CDinfo.leadout |= SERVO_Qarray_new[SERVO_QPSEC]<<8; CDinfo.leadout |= SERVO_Qarray_new[SERVO_QPFRAME]; pt_A2 = 1; break;#ifdef MULTI_SESSION case 0xB0: if (pt_B0) break; if (!((SERVO_Qarray_new[SERVO_QRMIN]==0xff) && (SERVO_Qarray_new[SERVO_QRSEC]==0xff) && (SERVO_Qarray_new[SERVO_QRFRAME]==0xff))){ multi_session=1; last_session_msf_1=last_session_msf; last_session_msf = SERVO_Qarray_new[SERVO_QRMIN]<<16 ; last_session_msf|= SERVO_Qarray_new[SERVO_QRSEC]<<8; last_session_msf|= SERVO_Qarray_new[SERVO_QRFRAME]; } pt_B0 = 1; break; case 0xC0: pt_C0 = 1; break;#endif /*MULTI_SESSION*/ default: if ((SERVO_Qarray_new[SERVO_QPOINT] < 0xa0) && (SERVO_Qarray_new[SERVO_QPOINT] > 0x00)) { int trk_index; trk_index = bcd2hex[SERVO_Qarray_new[SERVO_QPOINT]] - 1; if (pTk[trk_index] == xff000000) { pTk[trk_index] = SERVO_Qarray_new[SERVO_QCTRADD] << 24; pTk[trk_index] |= SERVO_Qarray_new[SERVO_QPMIN] << 16; pTk[trk_index] |= SERVO_Qarray_new[SERVO_QPSEC] << 8; pTk[trk_index] |= SERVO_Qarray_new[SERVO_QPFRAME];#if 0 /* for single session DATA discs (MP3...) which have * only one track, depending on the order of Q-code, * we may not have a chance to set tk1_ctl_adr. * tk1_ctl_adr can be more reliably set after all the * TOC info has been acquired. */ if (SERVO_Qarray_new[SERVO_QPOINT] == CDinfo.firsttrack) tk1_ctl_adr = SERVO_Qarray_new[SERVO_QCTRADD];#endif track_rd_num++; } } if ((pt_A0 && pt_A1 && pt_A2) && (track_rd_num > num_of_track)) { pt_A0 = pt_A1 = pt_A2 = 0;#ifdef MULTI_SESSION pt_B0 = 0;#endif /* set tk1_ctl_adr after getting all toc info */ tk1_ctl_adr = pTk[CDinfo.firsttrack-1] >> 24; if ((tk1_ctl_adr & 0xcf) == 0x01) { CDinfo.type = CD_CDDA; CLR_Fcdrom; Command_Out(AUDIO1); DSP_Data_Write(0x000045); } else if (pt_A0_PSEC != 0 && (tk1_ctl_adr == 0x41 || tk1_ctl_adr == 0x61)) { CDinfo.type = CD_VCD; /* Note: Photo-CD will also pass as VCD */ SET_Fcdrom; Command_Out(AUDIO2); tmp = bcd2hex[((CDinfo.leadout >> 16) & 0xff)]; if(tmp >= 75){#ifdef AN22002#ifdef SONY_213C DSP_Data_Write(0x000045);#endif#ifdef SAMSUNG_B31 DSP_Data_Write(0x000045);#endif#ifdef SANYO_DA11 DSP_Data_Write(0x000245);#endif#ifdef SAMSUNG_B33 DSP_Data_Write(0x000045);#endif#endif /* AN22002 */#ifdef AN8849#ifdef SONY_213C DSP_Data_Write(0x000045);#endif#ifdef SAMSUNG_B31 DSP_Data_Write(0x001245);#endif#ifdef SANYO_DA11 DSP_Data_Write(0x000245);#endif#endif /* AN8849 */ } else {#ifdef AN22002#ifdef SONY_213C DSP_Data_Write(0x001445); /*@xiao*/#endif#ifdef SAMSUNG_B31 DSP_Data_Write(0x0001445); /*@xiao*/#endif#ifdef SANYO_DA11 DSP_Data_Write(0x001545); /*@xiao*/ DSP_Data_Write(0x4161f2);#endif#ifdef SAMSUNG_B33 DSP_Data_Write(0x0001445); /*@xiao*/#endif#endif /* AN22002 */#ifdef AN8849#ifdef SONY_213C DSP_Data_Write(0x000545); /*@xiao*/#endif#ifdef SAMSUNG_B31 DSP_Data_Write(0x001445); /*@xiao*/#endif#ifdef SANYO_DA11 DSP_Data_Write(0x001545); /*@xiao*/ DSP_Data_Write(0x4161f2);#endif#endif /* AN8849 */ } } else {#ifdef DATA_CD if (!pt_A0_PSEC) { CDinfo.type = CD_DATA; SET_Fcdrom; DSP_Data_Write(0x000045); } else#endif CDinfo.type = CD_UNKNOWN; } if (!multi_session){ ltoc_done = 1; }#ifdef MULTI_SESSION else { return_val = SERVO_go_next_session(); if (return_val ==3 ) { last_session_msf=last_session_msf_1; ltoc_done = 1; } else if (!return_val) { goto SERVO_ltoc_retry; } else { multi_session = 0; loopcnt=0; num_of_session++; /*debug_osd("SESS ", num_of_session, 7);*/ } }#endif /*MULTI_SESSION*/ } break; } break; /* case 0xaa: if (SERVO_FOK_HIGH) SERVO_2N_trackjump(0, 32); break; */ default: SERVO_track_jump(0,64); break; } } /* end of while(ltoc_done) */#if defined(CD_TEXT) && !defined(ANTI_SHOCK) CD_text_init(0);#endif dsa_mode(MODE_ATTI_REL | MODE_CDROM | MODE_SPEED_NORMAL); CDinited = 1; CPRINTF("LTOC DONE", 0); DISP_cigam(CDinfo.type != CD_CDDA); return(1);ltoc_err_return: cd_stop = CDinited = 1; dsa_stop(); return(0);}#else /* not MSERVO */int dsa_ltoc(pTk, szTk)unsigned int * pTk;int szTk;{ int track_rd_num; /* # of track info have been read */ unsigned char data; int i; int pt_A0, pt_A1, pt_A2; /* Keep track whether we have received * * 64h, 65h, 66h (A0, A1, A2) */ int ltoc_done; /* LTOC is done */ int retry_cnt = 0; /* This routine's retry count */ int loopcnt; /* Number of replies from servo. */ int tk1_ctl_adr; /* Track #1 Control/Address */ int pt_A0_PSEC; /* Track #64 data */ int timeout; int pt_B0, pt_C0; int multi_session; int first_session_cdda=0; /*set if the first session has CDDA track*/#ifdef MULTI_SESSION int return_val=0; int last_session_msf_1=0; int first_session_retry_cnt=0;#endif /* No digital-out during ltoc */ if (use_dig_out) SET_SERVO_DIG_MUTE; CDinited = 0; /* Avoid partially initialized CD info */ /* Make sure FOCUS is on before reading LTOC */#if (!FASTER && !FASTEST) if (!servo_focus_on) { CDinfo.type = CD_NODISC; err_code = ERR_TRAYEMPTY; goto ltoc_err_return; }#endif CXD_init(); SERVO_start_init(); if (power_up) { int timer = glbTimer + HALF_SECOND; while(glbTimer<timer); }#if (defined MP3_LOGO && defined ENABLE_MP3)#ifdef CXD3059 CLEAR_SERVO_MUTE; /* enable cxd3059 audio-dac */#endif /*moved here from top.c, for slideshow problems due to longjump*/ play_mp3_logo((int *)mp3logo, T_mp3logo_SZ>>2);#endif /* MP3_LOGO */ SERVO_close(); retry_cnt = 0;SERVO_ltoc_retry: /* Interrupted by user */ if (SERVO_check_key_new()) goto ltoc_err_return; /* Focus off, sled into inner position to read TOC, and focus again */ SERVO_all_servo_off(); CLEAR_SERVO_LDON; CLEAR_SERVO_AGC; SERVO_sledin(); SERVO_mode = SERVO_TOC; servo_task = SERVO_focus; SERVO_schedule(); if (!servo_focus_on) { CDinfo.type = CD_NODISC; err_code = ERR_TRAYEMPTY; goto ltoc_err_return; } if (retry_cnt > 2) { CDinfo.type = CD_UNKNOWN; err_code = ERR_LTOC; goto ltoc_err_return; /* Retried twice and still fails */ } retry_cnt ++; /* initialize some CDinfo */ CDinfo.type = 255; CDinfo.firsttrack = 0; CDinfo.lasttrack = 0; for (i = 0; i < szTk; i++) pTk[i] = xff000000; pt_A0 = pt_A1 = pt_A2 = 0; track_rd_num = num_of_track = 0; multi_session = 0; num_of_session = 1;#ifdef MULTI_SESSION pt_B0 = pt_C0 = 0; last_session_msf = 0;#endif MULTI_SESSION /* process received data until it is done */ loopcnt = ltoc_done = 0; SERVO_new_Qcode = 0;#if defined(CD_TEXT) && !defined(ANTI_SHOCK) CD_text_init(1);#endif while (!ltoc_done) {#ifdef ECHO MIC_service();#endif VCX_service();#ifdef LTOC_TV_CHANGE DISP_TV_service();#endif loopcnt++; if (loopcnt > 2000) { /* * Servo is going crazy! This rarely happens; however, I have * seen this happened! */ goto SERVO_ltoc_retry; } /* Higher priority command received. Go handle it */ if ((loopcnt % 8) == 0) if(SERVO_check_key_new()) goto ltoc_err_return; timeout = glbTimer + 2*FOUR_SECOND; do { SERVO_service(1); if (!servo_focus_on || (glbTimer > timeout)) { goto SERVO_ltoc_retry; /* Focus is down or time out, * * do not proceed */ } if (SERVO_new_Qcode) { SERVO_new_Qcode = 0; break; } if (SERVO_check_key_new()) goto ltoc_err_return;#ifdef LTOC_TV_CHANGE DISP_TV_service();#endif } while (1); switch (SERVO_Qarray_new[SERVO_QTRACK]) { case 0x00: switch (SERVO_Qarray_new[SERVO_QPOINT]) { case 0xA0: CDinfo.firsttrack = bcd2hex[SERVO_Qarray_new[SERVO_QPMIN]]; pt_A0_PSEC = SERVO_Qarray_new[SERVO_QPSEC]; if (pt_A0_PSEC == 0xa) CDinfo.type = CD_CDI; pt_A0 = 1; break; case 0xA1: /*make sure we have read first track info before set pt_A1*/ if(!pt_A0) break; CDinfo.lasttrack = bcd2hex[SERVO_Qarray_new[SERVO_QPMIN]] - 1; if (CDinfo.type == CD_CDI) num_of_track = -1; else num_of_track = CDinfo.lasttrack - CDinfo.firsttrack + 1; pt_A1 = 1; break; case 0xA2: CDinfo.leadout = SERVO_Qarray_new[SERVO_QPMIN]<<16 ; CDinfo.leadout |= SERVO_Qarray_new[SERVO_QPSEC]<<8; CDinfo.leadout |= SERVO_Qarray_new[SERVO_QPFRAME]; pt_A2 = 1; break;#ifdef MULTI_SESSION case 0xB0: if (pt_B0) break; first_session_retry_cnt++; if (!((SERVO_Qarray_new[SERVO_QRMIN]==0xff) && (SERVO_Qarray_new[SERVO_QRSEC]==0xff) && (SERVO_Qarray_new[SERVO_QRFRAME]==0xff))){ multi_session=1; last_session_msf_1=last_session_msf; last_session_msf = SERVO_Qarray_new[SERVO_QRMIN]<<16 ; last_session_msf|= SERVO_Qarray_new[SERVO_QRSEC]<<8; last_session_msf|= SERVO_Qarray_new[SERVO_QRFRAME]; } pt_B0 = 1; break; case 0xC0: pt_C0=1; break;#endif /*MULTI_SESSION*/ default: if ((SERVO_Qarray_new[SERVO_QPOINT] < 0xa0) && (SERVO_Qarray_new[SERVO_QPOINT] > 0x00)) { int trk_index; trk_index = bcd2hex[SERVO_Qarray_new[SERVO_QPOINT]] - 1; /*allow toc overriding*/ i = (SERVO_Qarray_new[SERVO_QCTRADD] << 24) | (SERVO_Qarray_new[SERVO_QPMIN] << 16)| (SERVO_Qarray_new[SERVO_QPSEC] << 8)| SERVO_Qarray_new[SERVO_QPFRAME]; if(pTk[trk_index] != i){ if (pTk[trk_index] == xff000000) track_rd_num++; pTk[trk_index] = i; if ((num_of_session==1) && ((SERVO_Qarray_new[SERVO_QCTRADD] & 0x4f) == 0x01))/*CDDA*/ first_session_cdda = 1;#if 0 /* for single session DATA discs (MP3...) which have * only one track, depending on the order of Q-code, * we may not have a chance to set tk1_ctl_adr. * tk1_ctl_adr can be more reliably set after all the * TOC info has been acquired. */ if (SERVO_Qarray_new[SERVO_QPOINT] == CDinfo.firsttrack) tk1_ctl_adr = SERVO_Qarray_new[SERVO_QCTRADD];#endif } } break; } /*One Point of a qcode*/ if ((pt_A0 && pt_A1 && pt_A2) && (track_rd_num > num_of_track)) {#ifdef MULTI_SESSION if((num_of_session==1) && ((!pt_C0 && pt_B0) /*more than two open/close sessions*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -