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

📄 sony_servo.c

📁 索尼CX3068VCD伺服的随身听
💻 C
📖 第 1 页 / 共 5 页
字号:
//#include "enable_debug.h"#include "debug.h"#include "hst.h"#include "dbgio.h"#if (SONY_SERVO == 1)#include "sony_servo.h"#elif (PANA_SERVO == 1)#endif#include "hst_dsa.h"#include "hst_cdm.h"#ifdef ENABLE_MP3#include "mp3_mainloop.h"#endif#ifdef SLAVE_MODE#include "hst_slave.h"#endif/************************************************************************ * Local defines.                                                       * ************************************************************************/#define SERVO_QCODENUM  80	/* Number of bits for each Q-code */#define OPEN_M		0x00#define STOP_M		0x01#define CUE_M		0x02(FF/REV)#define PLAY_M 		0x03#define OPEN_00		0x00#define OPEN_10		1#define UNLD_10		2#define LOAD_10		3#define SLED_10		4#define STOP_10		5#define STOP_20		6#define STOP_30		7#define STOP_40		8#define STOP_100	9#define STOP_110	10 #define STOP_120	11 #define STOP_200	12 #define STOP_210	13 #define STOP_220	14 #define STOP_230	15 #define FOCUS_10	16 #define FOCUS_20	17#define FOCUS_30	18#define FOCUS_40	19#define FOCUS_50	20#define FOCUS_60	21#define EFV_10		22#define FBIAS_10	23  #define FBIAS_20	24#define AGC_10		25#define AGC_20		26  #define TOC_10		27#define ACES_10		28 #define ACES_20		29#define ACES_30		30#define ACES_40		31#define CUE_10		32#define CUE_20		33 #define CUE_30		34#define CUE_40		35#define PLAY_10		36#define RUN_10		37#define EMR_10		38#define EMR_20		39#define FB_SPL		60#define FB_STP		0x20#define FB_R_LIMIT	0x60#define FB_L_LIMIT	(-0x60)#define FB_ABT		03#define F_OFF		0x00#define FCSDWN		0x02#define AS_OFF		0x11#define TG_NOR		0x19#define TG_UP		0x17#define TOFF_SOFF	0x20#define TOFF_SFWD	0x22#define TOFF_SREV	0x23#define TON_SOFF	0x24#define TON_SON		0x25#define A_CANCEL	0x4000#define AGC_CANCEL	0x38148e#define A_FOCUS		0x4700#define A_1TJF		0x48#define A_1TJR		0x49#define A_10TJF		0x4A#define A_10TJR		0x4B#define A_2NTJF		0x4C#define A_2NTJR		0x4D#define A_NTMF		0x4E#define A_NTMR		0x4F#define SET_B1		0x59#define B_1TJF		0x53#define B_1TJR		0x53#define B_10TJF		0x58#define B_10TJR		0x58#define B_30TJF		0x5B#define B_30TJR		0x5B#define B_100TJF	0x5B#define B_100TJR	0x5B#define B_NTMF		0x5B#define B_NTMR		0x5B#define D_30TJF		0x62#define D_30TJR		0x62#define D_100TJF	0x62#define D_100TJR	0x62#define CLV_STOP	0xE0#define CLV_KICK	0xE8#define CLV_BRK		0xEA#define CLV_A		0xE6#define T2WMAX		0x01#define dsc_subq_ctl            0x20	/* 3217 family			*/#define dsc_subq_ctlm           0x21#define dsc_subq_bcnt           0x22	/* 3217 family			*/#define dsc_subq_bcntm          0x23#define dsc_subq_data           0x24	/* 3217 family			*/#define dsc_subq_datam          0x25#define dsc_sys_status          0x2c	/* 3217 family			*/#define dsc_sys_statusm         0x2d#define dsc_aux_mode		0x00	/* 3217 family			*/#define dsc_aux_modem		0x01#define TIMER1_INTERVAL	10	/* 10ms */#define T15SECOND	(15000/TIMER1_INTERVAL)#define T12SECOND	(12000/TIMER1_INTERVAL)#define T10SECOND	(10000/TIMER1_INTERVAL)#define T4SECOND	(4000/TIMER1_INTERVAL)#define T3SECOND	(3000/TIMER1_INTERVAL)#define T2SECOND	(2000/TIMER1_INTERVAL)#define T1SECOND	(1000/TIMER1_INTERVAL)#define T500MS		(500/TIMER1_INTERVAL)#define T300MS		(300/TIMER1_INTERVAL)#define T250MS		(250/TIMER1_INTERVAL)#define T200MS		(200/TIMER1_INTERVAL)#define T150MS		(150/TIMER1_INTERVAL)#define T100MS		(100/TIMER1_INTERVAL)#define T80MS		(80/TIMER1_INTERVAL)#define T30MS		(30/TIMER1_INTERVAL)#define T10MS		(10/TIMER1_INTERVAL)		// sz 8/18#define T32MS		(32/TIMER1_INTERVAL)#define T460MS		(460/TIMER1_INTERVAL)#define FOK_TIMEOUT	T100MS#define GFSMUTE_TIMEOUT T30MS#define GFS_TIMEOUT	T4SECOND#define SUBQ_TIMEOUT	T4SECOND#define SERVO_TRK_SLD_OFF	SERVO_send_command(2, TOFF_SOFF)#ifdef	USE_SONY_3068  			// sz 8/18#define SERVO_TRK_SLD_ON { SERVO_send_command(6,0x38140e);SERVO_delay_n_ms(2);SERVO_send_command(2, TON_SON);}#else#define SERVO_TRK_SLD_ON	SERVO_send_command(2, TON_SON)#endif#define SERVO_FOCUS_OFF		SERVO_send_command(2, F_OFF)#define SERVO_FOCUS_DOWN	SERVO_send_command(2, FCSDWN)#define SERVO_AGC_CANCEL	SERVO_send_command(6, AGC_CANCEL)#define SERVO_AUTOSEQ_CANCEL	{ SERVO_send_command(4, A_CANCEL); \				  SERVO_short_delay(20); }#define SERVO_ANTISHOCK_OFF	SERVO_send_command(2, AS_OFF)#ifdef	USE_SONY_3068  			// sz 8/18#define SERVO_AUTO_FOCUS { SERVO_send_command(6,0x38148a); SERVO_delay_n_ms(2); SERVO_send_command(4, A_FOCUS); }#else#define SERVO_AUTO_FOCUS	SERVO_send_command(4, A_FOCUS)#endif#define SERVO_CLV_KICK	{ SERVO_send_command(6, 0xe80000); }#define SERVO_CLV_STOP	{ SERVO_send_command(6, 0xe00000); }#define SERVO_CLV_BRK	{ SERVO_send_command(6, 0xea0000); }#define SERVO_CLV_A	{ SERVO_send_command(6, 0xe60000); kickfg = 1; }/************************************************************************ * semi local variables * NOTE: due to interrupt, keep most globals as volatile ************************************************************************/unsigned int	SERVO_cdtime;	/* Absolute CD time */unsigned char	SERVO_Qarray_new[SUBQ_LEN]; 	/* Q subcode array */unsigned char	SERVO_Qarray_current[SUBQ_LEN]; /* Q subcode array */volatile char	SERVO_new_Qcode = 0; /* Indicating s0s1 interrupt */volatile char 	servo_focus_on;volatile int	target_min, target_sec, target_frame;extern  volatile char pause_min,pause_sec,pause_frame; extern  unsigned char   qcode_ir_state;//henrywo12/3extern  unsigned char	ir_count;//henrywo12/3volatile int	open_delay;volatile char	SERVO_mode = 0xff;volatile char	SERVO_update_track;volatile char	SERVO_update_second;volatile char	kickfg;volatile int 	enable_interrupt = 0;volatile int 	glbTimer;		/* NOW IN 10ms, was about 6 ms */unsigned int	servo_info;unsigned int	track_ready;unsigned int	good_subq;int focus_flag;bit	cd_ab_flag=0;	/* Wenxin -- indicate CD in AB mode */CDINFO CDinfo;extern void handle_open();int focus_ready=0;/************************************************************************ * Local variables                                                      * ************************************************************************/unsigned char 	SERVO_Qarray[SUBQ_LEN];	 	/* Q subcode array */volatile char 		focus_retry, check_focus_fail, search_flag;  volatile char 		servo_focus_drop, servo_gfs_drop, servo_subq_drop;volatile short	servo_gfs_timer, servo_gfsmute_timer, 			servo_fok_timer, servo_sys_timer, servo_subq_timer;volatile short 		servo_fbias;volatile unsigned char 	servo_mute_on;volatile unsigned char 	servo_pres_m, servo_next_m = STOP_M;volatile unsigned int  	servo_per_ave;volatile char 		servo_fb_ok, servo_EF_balance_ok, servo_AGF_ok, servo_AGT_ok;volatile unsigned char 	servo_sbqemr, mutecmd;int stop_flag;#ifdef USE_SONY_3068			// sz 8/18volatile int shutter_flag = 0;#endifconst unsigned short abs2trk[] = {         0,    452,    891,   1319,   1737,      2145,   2543,   2933,   3315,   3690,      4057,   4418,   4772,   5120,   5462,      5799,   6131,   6458,   6780,   7097,      7410,   7719,   8024,   8325,   8622,      8916,   9206,   9492,   9776,  10056,     10334,  10608,  10880,  11149,  11415,     11678,  11940,  12198,  12454,  12708,     12960,  13209,  13457,  13702,  13945,     14186,  14426,  14663,  14899,  15132,     15364,  15595,  15823,  16050,  16275,     16499,  16721,  16942,  17161,  17379,      17595,  17810,  18024,  18236,  18447,     18656,  18864,  19071,  19277,  19482,     19685,  19888,  20089,  20289,  20487,     20685,  20882,  21078,  21272,  21466,     21658};/* Lookup table to convert HEX to BCD */const unsigned short CVhex2bcd[] = {    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,	/* 00-09 */    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,	/* 10-19 */    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,	/* 20-29 */    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,	/* 30-39 */    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,	/* 40-49 */    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,	/* 50-59 */    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,	/* 60-69 */    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,	/* 70-79 */    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,	/* 80-89 */    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,	/* 90-99 */};/* Lookup table to convert BCD to HEX */const unsigned short CVbcd2hex[] = {     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 0, 0, 0, 0, 0, 0,	/* 00-09 */    10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0,	/* 10-19 */    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0,	/* 20-29 */    30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0,	/* 30-39 */    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0,	/* 40-49 */    50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0,	/* 50-59 */    60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0,	/* 60-69 */    70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0,	/* 70-79 */    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0,	/* 80-89 */    90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0,	/* 90-99 */};/************************************************************************ * EXTERNAL FUNCTIONS                                                   * ************************************************************************/extern void SERVO_delay_n_ms(int n_ms);extern void SERVO_short_delay(int delay);extern volatile int ms_timer;	/* 100 ms timer */extern void SERVO_start_timer(int ms_delay);extern int SERVO_check_timer(void);extern int SERVO_Check_SCOR(void);extern void FIX_KYstdby();void (*servo_task)();#ifdef ENABLE_MP3      extern void Mp3_DoMute();extern void Mp3_UnMute();#endifvoid null_func(){}/************************************************************************ * INTERNAL FUNCTIONS                                                   * ************************************************************************/void SERVO_emrchk(void);void SERVO_emr_10(void);void SERVO_emr_20(void);void SERVO_emcsbq(void);void SERVO_trackjump_1(int);void SERVO_trackjump_3(int);void SERVO_trackjump_10(int);void SERVO_M_trackmove(int qdirection, int track_diff);void SERVO_avrg_ctl(void);void SERVO_filter_setting(void);void SERVO_EF_balance(void);void SERVO_fb_dtr(void);void SERVO_agc(void);void SERVO_ag_trk(void);void SERVO_fbias(void);void SERVO_rfjsmp(void);void SERVO_efv_10(void);void SERVO_fbias_10(void);void SERVO_fbias_20(void);void SERVO_fbc(void);void SERVO_agc_10(void);void SERVO_agc_20(void);void SERVO_fcson(void);void SERVO_fcstry(void);void SERVO_fcserr(void);void SERVO_focsok(void);void SERVO_emrchk(void);int  check_focus_ok(void);unsigned int udiv(unsigned int, unsigned int);void SERVO_processQcode(void);void SERVO_send_command_no_latch(int, unsigned int);void SERVO_send_one_command(unsigned char);void SERVO_focus_10(void);void SERVO_focus_20(void);void SERVO_focus_30(void);void SERVO_focus_40(void);void SERVO_focus_50(void);void SERVO_focus_60(void);void SERVO_fcsext(void);void SERVO_fcsdwn(void);int  SERVO_match(void);void SERVO_trackjump_1(int);void trackjump_monitor(int);void long_trackjump_monitor(void);void clear_emergency_flag(void);unsigned int adjCDtime(unsigned int time, unsigned int amount, 			      unsigned int direction);void SERVO_schedule(void);void Do_mute(void);void Undo_mute(void);int SERVO_search(void);int SERVO_stop(void);void SERVO_send_command(int num, unsigned int data);void SERVO_2N_trackjump(int qdirection, int track_diff);void SERVO_all_servo_off(void);void reset_emergency_flag(void);void SERVO_ReadQCode(void);/* make sure this is at least 750 ns, but not much more *//* 1 clock = 15ns@66mhz or 20ns@50Mhz *//* each pass of loop = at least 4 clocks, but leave a bit extra */void SERVO_Wait750(){	volatile unsigned int i;	// 	for (i=0; i<(750/60); i++); 	for (i=0; i<3; i++);//	for (i=0; i<20; i++);}/************************************************************************ * Q CODES ************************************************************************/ extern unsigned char jump_flag; void SERVO_processQcode(){    int num;	SERVO_ReadQCode();		if ((SERVO_Qarray[0]&0x0f)!=0x01)    		return;    if (!SERVO_Qarray[SERVO_QZERO]) {    		for (num = 0; num < SUBQ_LEN; num++)		{	    	SERVO_Qarray_new[num] = SERVO_Qarray[num];	#ifdef SLAVE_MODE   ///Adam add for slave mode..			Slv_SendSubCodeQ(num,SERVO_Qarray_new[num]);	#endif	    		    }	    		    if (SUBQ_READY==1)	    	SERVO_new_Qcode = 0;	    else			SERVO_new_Qcode = 1;	    	/*		SERVO_new_Qcode = 1; */		/* Get absolute CD time */		SERVO_cdtime = (SERVO_Qarray[SERVO_QPMIN] << 16) | 	       (SERVO_Qarray[SERVO_QPSEC] << 8) | 			SERVO_Qarray[SERVO_QPFRAME];    	}}#ifdef ENABLE_MP3      extern void mp3_servo_emrchk( void );void mp3_servo_service(){   if (mutecmd == 1)		Do_mute();     else if (mutecmd == 2)		Undo_mute();     mutecmd = 0;    if (servo_focus_drop || servo_gfs_drop)	mp3_servo_emrchk();    SERVO_schedule();}#endif  // ENABLE_MP3      /* * Get subQ code and check emergency situations */void SERVO_service(){	/* first check edge detector on SCOR */	if(SUBQ_READY){	        RESET_SUBQ;		/*YES, now check for CRC*/		if(SERVO_SQSO_HIGH){ 			/*YES, get subq data*/			SERVO_processQcode();			/*reset subQ emergency variables*/			servo_subq_timer=SUBQ_TIMEOUT;			servo_subq_drop=0;			servo_sbqemr=0;			}		/* else //hide by ding *//*    		zputs("NO CRC\n"); */		} #if 1    /* mutecmd maybe set in timer interrupt */    if (mutecmd == 1)		Do_mute();    else if (mutecmd == 2)		Undo_mute();    mutecmd = 0;    /* Emergency checking */    if (/*(CDinfo.type != CD_NODISC) &&*/		(servo_focus_drop || servo_gfs_drop || servo_subq_drop))			SERVO_emrchk();    SERVO_schedule();#endif    }void SERVO_service1(){        if (SUBQ_READY) {	/* first check edge detector on SCOR */	        RESET_SUBQ;		if(SERVO_SQSO_HIGH){			/*YES, get subq data*/			SERVO_processQcode();			/*reset subQ emergency variables*/			servo_subq_timer=SUBQ_TIMEOUT;			servo_subq_drop=0;			servo_sbqemr=0;			}		/* else //hide by ding *//*    		zputs("NO CRC1\n"); */        }}extern unsigned char fg_mode;extern TMSF cdm; extern bit cd_pause, ls_pause;extern unsigned char VCD_ver;extern void CDU_CDactTit();extern void CDU_CDabsMin();extern void CDU_CDabsSec();extern void CDU_CDfound();#ifdef USE_OSD_FUNC	//chuextern char slow_state;#endifextern void FIX_KYopcl();	//chuextern int SERVO_open();#ifdef ENABLE_ESP extern void esp_track_change();#endifvoid SERVO_mode_handle(){	int num;	int flag;	unsigned int r_tmp;	disable_reset_timer();	switch (SERVO_mode) {		case SERVO_IDLE:		     break;		case SERVO_STOP:			SERVO_stop();			SERVO_mode=SERVO_IDLE;			break;		case SERVO_OPEN:			SERVO_open();			break;		case SERVO_CLOSE:			SERVO_close();			SERVO_mode = SERVO_IDLE;			break;		case SERVO_PLAY:			if (search_flag) {				int found;				search_flag = 0;

⌨️ 快捷键说明

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