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

📄 tcservo.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Pause release. This is for CDDA. */int dsa_pauserelease(void){    if (TC_SERVO_search(0)) {	/* We need this for MP3 and WMA in case when we pause after all 	 * the file's data is already in..we'll restart at "paused" location	 * saved in "previous_sector". 	 */	end_of_play = 0;		return (1);    } else {	return (0);    }}/* * Read the table of content. CD-module passes all track info. Information * depends on track number: *	0 <= track number <= 63 *		track number *		control & address *		start time (min) *		start time (sec) *		start time (frm) * * This routine initialize track information as well as lead out time. * * Input: *	pTk:	Pointer to the track information buffer *	szTk:	Size (number of entries) of track information buffer * * Return: *	0:	failed *	1:	OK */int dsa_ltoc(pTk, szTk)unsigned int *pTk;int szTk;{    int track_rd_num;           /* # of track info have been read */    unsigned char data, cmd;    int i;    int t64r, t65r, t66r;       /* Keep track whether we have received   *                                 * 64h, 65h, 66h (A0, A1, A2)            */    int ltoc_done;              /* LTOC is done                          */    unsigned char track;        /* Current track number                  */    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 tk64_data;              /* Track #64 data                        */    int dly1 = 0;    int num, test;    int pt_B0, pt_C0;    int multi_session=0;    int return_val=0;    CDinited = 0;               /* Avoid partially initialized CD info   *//* Start Servo until Servo on stable */    SET_servo_adj;    SERVO_mode = Mode_Focusing;    SERVO_state = Focus_Para;    while (1) {        microEngine();        /* Servo Process in dsa_ltoc() - Start Servo */        i = TC_SERVO_process();        if (i == SERVO_RET_clvok)            break;        if (i == SERVO_RET_int)            return (0);        if ((i == SERVO_RET_fng) || (i == SERVO_RET_clvng)) {            CDinfo.type = CD_NODISC;            return (0);        }    }    /* initialize some CDinfo */    CDinfo.type = 255;    CDinfo.firsttrack = 0;    CDinfo.lasttrack = 0;    for (i = 0; i < szTk; i++)        pTk[i] = xff000000;    t64r = t65r = t66r = 0;    pt_B0 = pt_C0 = 0;    track_rd_num = num_of_track = 0;    multi_session = 0;    num_of_session = 1;    last_session_msf = 0;    /* process received data until it is done */    loopcnt = ltoc_done = 0;    while (!ltoc_done) {        VCX_service();        dly1 = glbTimer;        do {            /* Monitor Servo Stability in dsa_ltoc() */            i = TC_SERVO_process();            if (i == SERVO_RET_Qcode)                break;            if (i == SERVO_RET_int)                return (0);            if ((i == SERVO_RET_fng) || (i == SERVO_RET_clvng)) {                CDinfo.type = CD_NODISC;                return (0);            }        }        while (1);	/*OUTOSD(12,"QDATA","QDATA",1);           /* OSD-Q DATA READY */        for (num = 0; num < 5; num++) {            test = SERVO_Qarray_new[num];            Qcode[num * 2] = (unsigned char) ((test >> 8) & 0x00ff);            Qcode[num * 2 + 1] = (unsigned char) (test & 0x00ff);        }        switch ((int) Qcode[SERVO_QTRACK]) {          case 0x00:            switch (Qcode[SERVO_QPOINT]) {              case 0xA0:/*              OUTOSD(6,"MIN","MIN",10);       /* OSD-FIRST TRACK */                if( num_of_session == 1){                   CDinfo.firsttrack = (unsigned int) bcd2hex[Qcode[SERVO_QPMIN]];                   tk64_data = Qcode[SERVO_QPSEC];                   if (tk64_data == 0xa) CDinfo.type = CD_CDI;                }                t64r = 1;                break;            case 0xA1:/*              OUTOSD(9,"MAX","MAX",10);       /* OSD-LAST TRACK */                CDinfo.lasttrack = bcd2hex[Qcode[SERVO_QPMIN]] - 1;                if (CDinfo.type == CD_CDI)                    num_of_track = -1;                else                    num_of_track = CDinfo.lasttrack - CDinfo.firsttrack + 1;                t65r = 1;                break;            case 0xA2:/*              OUTOSD(10,"LEAD","LEAD",10);    /* OSD-LEAD OUT */                t66r = 1;                if (multi_session) break;                CDinfo.leadout = (Qcode[SERVO_QPMIN] << 16) & 0x00ff0000;                CDinfo.leadout |= (Qcode[SERVO_QPSEC] << 8) & 0x0000ff00;                CDinfo.leadout |= (Qcode[SERVO_QPFRAME]) & 0x000000ff;                break;#ifdef MULTI_SESSION            case 0xB0:/*              OUTOSD(7,"B0","B0",10);*/                if (!((Qcode[SERVO_QRMIN]==0xff) &&                    (Qcode[SERVO_QRSEC]==0xff) &&                    (Qcode[SERVO_QRFRAME]==0xff))){                    multi_session=1;/*                  OUTOSD(11,"MULT","MULT",10); */                    last_session_msf = Qcode[SERVO_QRMIN]<<16 ;                    last_session_msf|= Qcode[SERVO_QRSEC]<<8;                    last_session_msf|= Qcode[SERVO_QRFRAME];                    target_min  = Qcode[SERVO_QRMIN] ;                    target_sec  = Qcode[SERVO_QRSEC];                    target_frame= Qcode[SERVO_QRFRAME];                 }                 CDinfo.leadout = Qcode[SERVO_QPMIN]<<16 ;                 CDinfo.leadout |= Qcode[SERVO_QPSEC]<<8;                 CDinfo.leadout |= Qcode[SERVO_QPFRAME];                 pt_B0 = 1;                 break;            case 0xC0:/*               OUTOSD(8,"C0","C0",10); */                 if (!multi_session) { multi_session=1; }                    pt_C0=0;                    break;#endif /*MULTI_SESSION*/            default:                 if(t64r&&t65r&&t66r)                    if ((Qcode[SERVO_QPOINT] < 0xa0) &&                        (Qcode[SERVO_QPOINT] > 0x00)){                        if (pTk[((bcd2hex[Qcode[SERVO_QPOINT]]) - 1)] ==                            0xff000000) {                            pTk[(bcd2hex[Qcode[SERVO_QPOINT]] - 1)] =                                ((Qcode[SERVO_QCTRADD] << 24) & 0xff000000);                            pTk[(bcd2hex[Qcode[SERVO_QPOINT]] - 1)] |=                                ((Qcode[SERVO_QPMIN] << 16) & 0x00ff0000);                            pTk[(bcd2hex[Qcode[SERVO_QPOINT]] - 1)] |=                                ((Qcode[SERVO_QPSEC] << 8) & 0x0000ff00);                            pTk[(bcd2hex[Qcode[SERVO_QPOINT]] - 1)] |=                                ((Qcode[SERVO_QPFRAME]) & 0x000000ff);#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 (Qcode[SERVO_QPOINT] == CDinfo.firsttrack)                                tk1_ctl_adr = Qcode[SERVO_QCTRADD];#endif                            track_rd_num++;                        }                }                break;            }            break;        default:/*          OUTOSD(11,"JUMP","JUMP",1); /* OSD-TOC JUMP */            SERVO_near_jump(32, J_BACKWARD);   /* old is 32 , HuaBin */            break;        }	        if(/*t64r&&t65r&&t66r&&*/(track_rd_num > num_of_track) ){	    /* set tk1_ctl_adr after getting all toc info */	   tk1_ctl_adr = pTk[CDinfo.firsttrack-1] >> 24;	   t64r = t65r = t66r = 0;           if(num_of_session == 1){	       if ((tk1_ctl_adr & 0xcf) == 0x01) {		   CDinfo.type = CD_CDDA;	       } else if (tk64_data != 0 && 			  (tk1_ctl_adr == 0x41 || tk1_ctl_adr == 0x61)) {		   CDinfo.type = CD_VCD;		   /* Note: Photo-CD will also pass as VCD */	       } else {#ifdef DATA_CD		   if (!tk64_data) CDinfo.type = CD_DATA;		   else#endif		       CDinfo.type = CD_UNKNOWN;	       }           }           if (!multi_session) {               ltoc_done = 1;/*             DBG_OSD(8, "TOC OK", "TOC OK", 1); */           }#ifdef MULTI_SESSION           else {               multi_session = 0;               loopcnt=0;               num_of_session++;              return_val = SERVO_go_next_session();           }#endif /*MULTI_SESSION*/       }    }                           /* end of while(ltoc_done) *//* *    SERVO_stop(); */    dsa_mode(MODE_ATTI_REL | MODE_CDROM | MODE_SPEED_NORMAL);    CDinited = 1;    DISP_cigam(CDinfo.type != CD_CDDA);    return (1);ltoc_err_return:    (void) dsa_stop();    return (0);}/* * Goto time. This command forces the CD-module to jump to the requested * absolute time location. * * Input: *	time:	CD sector time in MMSSFF format where each of MM/SS/FF *		is a BCD number. * * Return: *	1:	successful *	0:	otherwise */int dsa_go(unsigned int time){    int return_val;    int r_tmp;    dsa_go_state = DSA_GO_INIT;        do {        return_val = dsa_go_step_by_step(time);    } while (return_val==1);    return ((return_val == 2));}void reset_dsa_go(void){    dsa_go_state = DSA_GO_INIT;}/**************************************************************************** Step by step go time. Returns 0 if failed, 1 if don't know, 2 if succeed. ****************************************************************************/int dsa_go_step_by_step(unsigned int time){    int return_val, r_tmp;    static int search_timer;    switch (dsa_go_state) {      case DSA_GO_INIT:	/*OUTOSD(5,"GO","GO",1);	/* Goto target */	if (SERVO_mode == Mode_Stopping)        {	    while (SERVO_state != STOP_idle)		return_val = TC_SERVO_process();/* Wait until stop idle */	    /* Start Servo until Servo on stable */	    SERVO_mode = Mode_Focusing;	    SERVO_state = Focus_Para;	    while (1) {		microEngine();		return_val = TC_SERVO_process();		if (return_val == SERVO_RET_clvok)		    break;		if ((return_val == SERVO_RET_int)||		    (return_val == SERVO_RET_fng)||		    (return_val == SERVO_RET_clvng)) {		    return (0);		}	    }	}	target_frame = time & 0x00ff;	target_sec = time >> 8 & 0x00ff;	target_min = time >> 16 & 0x00ff;	search_timer = glbTimer + 5*ONE_SECOND;	dsa_go_state = DSA_GO_SEARCHING;	TC_SERVO_search_init();	TC_SERVO_search_request(0);	return_val = 1;	break;      case DSA_GO_SEARCHING:	return_val = TC_SERVO_search_request(0);	if (return_val == 2) {	    dsa_go_state = DSA_GO_FOUND_TARGET;	    /*OUTOSD(4,"FOUND","FOUND",1);	/* Found target */	} 	check_user_input();	/* derek */	if(forceDSAabort || (glbTimer > search_timer)) {	    dsa_go_state = DSA_GO_INIT;	    return_val = 0;    	} else {	    return_val = 1;	}		break;      case DSA_GO_FOUND_TARGET:	servo_info = 0;	if (CDinfo.type != CD_CDI) {	    servo_info = (((SERVO_Qarray_new[1] << 8) & 0x00ffff00)			  | ((SERVO_Qarray_new[2] >> 8) & 0x000000ff));	} else servo_info = currCDtime >> 8;		r_tmp = bcd2hex[SERVO_Qarray_new[0] & 0x000000ff];	r_tmp = r_tmp - ((CDinfo.type == CD_CDDA) ? 0 : 1);	/* Modify by Andy Yam */	/*	   servo_info |= (hex2bcd[r_tmp] & 0x0000ff)<<24 |	   (SERVO_Qarray_new[1]>>8 & 0x0000ff)<<16;	   */	servo_info |= (hex2bcd[r_tmp] << 24) & xff000000;#if 0	for (r_tmp = 0; r_tmp < 7; r_tmp++)	    SERVO_Qarray_current[r_tmp] = SERVO_Qarray_new[r_tmp] & 0xffff;#endif	/* Modify by Andy Yam */	last_servo_info = servo_info;	updateLCDtime();	OSD_update_info();	/* OSD info needs to update */		dsa_go_state = DSA_GO_INIT;	return_val = 2;	break;    }    TC_SERVO_process();    return (return_val);}/* Added by Mao Mar-28-2001 for Shutter  */void Slide_In();void Open_Shutter();void Close_Shutter();void CloseTray(){    int ii;    SET_MOTOR_REV;    CLEAR_MOTOR_FWD;    if(share_open_close)    for (ii = 0; ii < 9000000; ii++);    /* about 200 ms */}void OpenTray(){    int ii;    Slide_In();    CLEAR_MOTOR_REV;    SET_MOTOR_FWD;    if(share_open_close)    for (ii = 0; ii < 9000000; ii++);    /* about 200 ms */}void StopTray(){    SET_MOTOR_REV;    SET_MOTOR_FWD;}void Slide_In(){    int slide_delay;    if(LIMIT_SW_HIGH){       Pull_PickUp();       slide_delay = glbTimer+0x300;       while(1){       if(LIMIT_SW_LOW) break;       if(slide_delay<glbTimer) break;       };       Stop_PickUp();      }    Close_Shutter();}void Open_Shutter(){    int i;    if(use_shutter&&(!shutter_opened)){       Push_PickUp();       for(i=0;i<0x20000;i++);       Stop_PickUp();    }    shutter_opened = 1;}void Close_Shutter(){    int i;    if(use_shutter&&(shutter_opened)){       Pull_PickUp();       for(i=0;i<0x20000;i++);       Stop_PickUp();    }    shutter_opened = 0;}

⌨️ 快捷键说明

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