📄 sony_servo.c
字号:
//#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 + -