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

📄 dsas.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -