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

📄 gdtservo.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * 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,i;		/* # of track info have been read */    unsigned char data_1,cmd;    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		 */    char 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	 */    SERVO_rest();/* 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 */	SERVO_service();	if (SERVO_STATUS == SERVO_RET_clvok) break;	if (SERVO_STATUS == SERVO_RET_int) return (0);	if ((SERVO_STATUS==SERVO_RET_loss)            || (SERVO_STATUS==SERVO_RET_clvng)) {	    CDinfo.type = CD_NODISC;	    return (0);	}        if(SERVO_check_key_new()) return(0);    }    CDinfo.type = 255;    for (i = 0; i < szTk; i++) pTk[i] = 0xff000000;    t64r = t65r = t66r = 0;    track_rd_num = num_of_track = 0;    multi_session = 0;    num_of_session = 1;    last_session_msf = 0;#if defined(CD_TEXT) && !defined(ANTI_SHOCK)    CD_text_init(1);#endif    /* process received data until it is done */    loopcnt = ltoc_done = 0;    while (!ltoc_done) {#ifdef ECHO        MIC_service();#endif	VCX_service();	dly1 = glbTimer;        SERVO_STATUS = 0;        if(SERVO_check_key_new()) return(0);	do {	    /* Monitor Servo Stability in dsa_ltoc() */	    SERVO_service();	    if (SERVO_STATUS == SERVO_RET_Qcode) break;	    if (SERVO_STATUS == SERVO_RET_int) return (0);	    if((SERVO_STATUS==SERVO_RET_loss)                || (SERVO_STATUS==SERVO_RET_clvng)){		CDinfo.type = CD_NODISC;		return (0);	    }            if(SERVO_check_key_new()) return(0);	} while (1);/*	OUTOSD(12,"QDATA","QDATA",1);		/* OSD-Q DATA READY */	for (num = 0; num < 10; num++) {	    Qcode[num ] = (unsigned char)SERVO_Qarray_current[num];	   	}	switch ( 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 = bcd2hex[Qcode[SERVO_QPMIN]];		   tk64_data = Qcode[SERVO_QPSEC];		   if (tk64_data == 0xa) CDinfo.type = CD_CDI;                }		t64r = 1;		break;	    case 0xA1:/*		OUTOSD(8,"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 (Qcode[SERVO_QPOINT] == 1)				tk1_ctl_adr = Qcode[SERVO_QCTRADD];			    track_rd_num++;			}		}		break;	    }	    break;	default:            SERVO_near_jump(1, 32);	    break;	}        if(/*t64r&&t65r&&t66r&&*/(track_rd_num > num_of_track) ){           t64r = t65r = t66r = 0;           if(num_of_session == 1){              if (tk1_ctl_adr == 0x01 || tk1_ctl_adr == 0x11 ||                  tk1_ctl_adr == 0x21 || tk1_ctl_adr == 0x31)                  CDinfo.type = CD_CDDA;              else if (tk64_data != 0 && (tk1_ctl_adr == 0x41                       || tk1_ctl_adr == 0x61)) {                  CDinfo.type = CD_VCD;                  OUTOSD(10, "CD_VCD", "CD_VCD", 0);              /* Note: Photo-CD will also pass as VCD */             } else#ifdef DATA_CD             if (!tk64_data) {               CDinfo.type = CD_DATA;               OUTOSD(10, "CD_DATA", "CD_DATA", 0);             } else#endif             CDinfo.type = CD_UNKNOWN;           }           if (!multi_session) {               ltoc_done = 1;               OUTOSD(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) */#if defined(CD_TEXT) && !defined(ANTI_SHOCK)    CD_text_init(0);#endif    if (CDinfo.type == CD_CDDA) {	/*	 * We need to adjust the track info. Even track 0 is used here. We	 * want to map track i to track i+1.	 */        OUTOSD(10, "CD_CDDA", "CD_CDDA", 0);	CDinfo.lasttrack += 1;	num_of_track++;	for (i = CDinfo.lasttrack; i >= CDinfo.firsttrack; i--)	    pTk[i] = pTk[i - 1];	dsa_mode(currDSAmode = MODE_ATTI_REL | MODE_AUDIO | MODE_SPEED_NORMAL);    }     dsa_mode(currDSAmode = MODE_ATTI_REL | MODE_CDROM | MODE_SPEED_NORMAL);    bcd_num_of_track = (int) hex2bcd[num_of_track];    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 ssearch_cnt;*/    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)		   GDT_SERVO_process();/* Wait until stop idle */	    /* Start Servo until Servo on stable */	    SERVO_mode = Mode_Focusing;	    SERVO_state = Focus_Para;	    while (1) {		microEngine();                SERVO_service();		return_val = SERVO_STATUS;		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 = bcd2hex[time&0xff];	target_sec = bcd2hex[(time>>8)&0xff];	target_min = bcd2hex[(time>>16)&0xff];#if 0	/*ssearch_cnt = 0;*/	search_timer = glbTimer + 3000;#endif	dsa_go_state = DSA_GO_SEARCHING;        SERVO_mode = Mode_Seek;        SERVO_state = Seek_Initial;        CLR_search_flag;        GDT_SERVO_process();	return_val = 1;	break;      case DSA_GO_SEARCHING:        GDT_SERVO_process();        return_val = 1;        if (search_flag_TRUE){	    dsa_go_state = DSA_GO_FOUND_TARGET;            CLR_search_flag;        }          else if ((SERVO_STATUS == SERVO_RET_int)||            (SERVO_STATUS == SERVO_RET_fng)||            (SERVO_STATUS == SERVO_RET_clvng)) {#if 0            if (glbTimer > search_timer)                return(0);            else#endif                return(1);        }		break;      case DSA_GO_FOUND_TARGET:	servo_info = 0;	if (CDinfo.type != CD_CDI)	{ 	    /* TTMMSSFF */	    servo_info = 		(SERVO_Qarray_current[SERVO_QTRACK] << 24) |		(SERVO_Qarray_current[SERVO_QRMIN] << 16) |		(SERVO_Qarray_current[SERVO_QRSEC] << 8) |		SERVO_Qarray_current[SERVO_QRFRAME]; 			} else 	servo_info = currCDtime >> 8;		r_tmp = bcd2hex[SERVO_Qarray_current[SERVO_QCTRADD]];	r_tmp = r_tmp - ((CDinfo.type == CD_CDDA) ? 0 : 1);	/* Modify by Andy Yam */	/*	   servo_info |= (hex2bcd[r_tmp] & 0x0000ff)<<24 |	   (SERVO_Qarray_current[1]>>8 & 0x0000ff)<<16;	   */	servo_info |=((long)(hex2bcd[r_tmp]) << 24) & 0xff000000;	/* Modify by Andy Yam */	last_servo_info = servo_info;	updateLCDtime();	OSD_update_info();	/* OSD info needs to update */		dsa_go_state = DSA_GO_INIT;/*	OUTOSD(1,"FOUND","FOUND",1);	/* Found target */	return_val = 2;	break;    }    GDT_SERVO_process();    return (return_val);}/* * Open the tray, need to stop the motor first if it is playing */int SERVO_open(){    unsigned int timeout;    volatile int flag = 0;    SERVO_off();    SET_servo_stop;       Start_Open_Tray();    timeout = glbTimer + FIVE_SECOND;    do {        GDT_SERVO_process();        if (SERVO_STATUS == SERVO_RET_trayoutok) flag = 1;        if (SERVO_STATUS == SERVO_RET_int ) break;        if (glbTimer > timeout || SERVO_check_key_new()) break;    } while (!flag);    return (0);}/* * Open the tray, need to stop the motor first if it is playing */int SERVO_close(){    unsigned int timeout;    int tray_closed = 0;    Start_Close_Tray();    timeout = glbTimer + FIVE_SECOND;    while(1) {        GDT_SERVO_process();        if (SERVO_STATUS == SERVO_RET_trayinok) {            tray_closed = 1; break;        }        if (SERVO_STATUS == SERVO_RET_int ) break;        if (glbTimer > timeout || SERVO_check_key_new()) break;    };    if (tray_closed) cd_tray_closed();    return (1);}void SERVO_service(){    int var;    unsigned char status;    extern int FC_loop_counter;    status = Read_Servo_Register(STATUS1);#if 1     if ((SERVO_mode==Mode_Tracking) || (SERVO_mode==Mode_Monitor) || (SERVO_mode==Mode_Seek)){       if ((status & FOK) != FOK ){           OUTOSD(3, "ERROR", "ERROR", 0);           old_SERVO_mode = SERVO_mode;           Turn_Off_Servo();           FC_loop_counter++;           if (FC_loop_counter <= 4) {              SERVO_STATUS = SERVO_RET_fng;          /* Default loss */              SERVO_mode = Mode_Focusing;     /* Try to recover it */              SERVO_state = Focus_recover;           } else {              SERVO_STATUS = Mode_Stopping;              SERVO_state = STOP_start;              SERVO_STATUS = SERVO_RET_loss;              FC_loop_counter = 0;           }        }    }#endif    GDT_SERVO_process();    Read_Servo_Qcode();    return;    var = SERVO_STATUS;    if(var == SERVO_RET_Qcode) {      if(search_flag_FALSE) {}    } else if (var == SERVO_RET_stopok) { /* Stop Completed */    } else if (var == SERVO_RET_fng) { /*loss focus*/      /*Done in GDT_SERVO_process*/    } else if ((var==SERVO_RET_loss) || (var==SERVO_RET_int)                || (var==SERVO_RET_clvng)) {        SERVO_off();        /*Add codes to clear all VCD state machine*/        /* .....*/    }}

⌨️ 快捷键说明

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