📄 sony_servo.lst
字号:
898
899 void Undo_mute()
900 {
901 servo_mute_on = 0;
902 SERVO_send_command(6, 0xA00000);
903 }
904
905
906
907
908 /************************************************************************
909 * AVERAGING *
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 16
910 ************************************************************************/
911 void SERVO_avrg_ctl(void)
912 {
913 SERVO_send_command(6, 0x380800);
914 SERVO_delay_n_ms(8);
915 SERVO_send_command(6, 0x382000);
916 SERVO_delay_n_ms(8);
917 SERVO_send_command(6, 0x380010);
918 SERVO_delay_n_ms(8);
919 SERVO_send_command(6, 0x388000);
920 SERVO_delay_n_ms(8);
921 SERVO_send_command(6, 0x38148a);
922 SERVO_delay_n_ms(8);
923 SERVO_send_command(2, F_OFF);
924 SERVO_delay_n_ms(5);
925 }
926
927
928
929
930 /*
931 * Return 1 if FOK is HIGH for most of the 10ms period
932 * Otherwise return 0
933 */
934 int check_focus_ok()
935 {
936 int high_count = 0, low_count = 0;
937
938 /* For the next 10 ms, sample FOK and record number of HIGHs and LOWs */
939 SERVO_start_timer(10);
940 while (SERVO_check_timer()) {
941 SERVO_Wait750();
942 if (SERVO_FOK_HIGH)
943 high_count++;
944 else
945 low_count++;
946 SERVO_Idle(); // add for esp seed6
947 }
948 if ((high_count >> 4) > low_count)
949 return(1);
950 else {
951 /* IoPrint2("BAD check_focus_ok %d %d\n",high_count,low_count); */
952 return(0);
953 }
954 }
955
956
957
958
959 /************************************************************************
960 * SLED IN/OUT *
961 ************************************************************************/
962 /*
963 * Pulling in SLED head to roughly around the TOC region.
964 */
965 extern void Dsa_Idle();
966 extern void SERVO_close_shutter();
967 void SERVO_sledin()
968 {
969 int timeout;
970 IoPrint1("SERVO_sledin %d\n",glbTimer);
971 servo_pres_m = SLED_10;
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 17
972 #ifdef USE_SONY_3068 // sz 8/18
SERVO_send_command(2, 0x33);
#endif
975 SERVO_send_command(2, TOFF_SREV); /* sled rev */
976 timeout = glbTimer + T12SECOND;
977 while (glbTimer < timeout) {
978 SERVO_delay_n_ms(2);
979 enable_interrupt = 0;
980 SERVO_send_command_no_latch(2, 0x30); /* read SENS for SSTP */
981 /* --white
982 #ifdef MALATA_ALL_IN_ONE_BOARD
983 if (!SERVO_SENS_HIGH)
984 #endif
985 #ifdef LS188_PUBLIC_BOARD_A1
986 if (SERVO_SENS_HIGH)
987 #endif
988 */
989 #ifdef ENABLE_STD_SOL
if (!SERVO_SENS_HIGH)
#else
992 if (SERVO_SENS_HIGH)
993 #endif
994 break;
995 if ( SERVO_SENS_LOW ) break ; // sz 8/22
996 enable_interrupt = 1;
997 SERVO_Idle();
998 }
999 enable_interrupt = 1;
1000 #ifdef USE_SONY_3068 // sz 8/18
SERVO_send_command(2, 0x30);
#endif
1003 SERVO_TRK_SLD_OFF;
1004 zputs("SLEDIN DONE\n");
1005 #ifdef USE_SONY_3068_WITH_SHUTTER // sz 8/18
SERVO_close_shutter();
#endif
1008 }
1009
1010 /*
1011 * subroutine to stop the servo, & move the SLED to the normal position
1012 */
1013 int SERVO_stop(void)
1014 {
1015 int brake_start_time, brake_time;
1016
1017 IoPrint1("SERVO_stop %d\n",glbTimer);
1018 debugprint("SERVO_stop\n",glbTimer);
1019 Do_mute();
1020 // SERVO_mode = SERVO_STOP;
1021 SERVO_mode=SERVO_IDLE;
1022 /* In case we quit during focusing */
1023 SERVO_AUTOSEQ_CANCEL;
1024
1025 if (servo_focus_on) {
1026 IoPrint1("SERVO_stop servo_focus_on %d\n",glbTimer);
1027 debugprint("SERVO_stop servo_focus_on \n",glbTimer);
1028 servo_focus_on = 0;
1029 servo_sys_timer = T2SECOND;
1030 SERVO_CLV_BRK;
1031 brake_start_time = glbTimer;
1032 while (servo_sys_timer) {
1033 if (!check_focus_ok()) {
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 18
1034 /* All servo off */
1035 SERVO_all_servo_off();
1036 SERVO_delay_n_ms(2000);
1037 goto brake_done;
1038 }
1039 SERVO_send_command_no_latch(2, 0xe0);
1040 if (SERVO_SENS_LOW) {
1041 break;
1042 }
1043 SERVO_Idle();
1044 }
1045 /* Set a minimum braking time to brake on bad disc */
1046 IoPrint1("SERVO_stop end systimer disk %d\n",servo_sys_timer);
1047 debugprint("SERVO_stop end systimer disk \n",servo_sys_timer);
1048 if (glbTimer < brake_start_time + T80MS) {
1049 while (glbTimer < brake_start_time + T200MS)
1050 {
1051 SERVO_Idle();
1052 };
1053 }
1054 /* brake_time = (glbTimer - brake_start_time)*10; */
1055 brake_time = (glbTimer - brake_start_time)*5;
1056 SERVO_TRK_SLD_OFF;
1057 SERVO_FOCUS_OFF;
1058 SERVO_delay_n_ms(brake_time);
1059 SERVO_all_servo_off();
1060 SERVO_delay_n_ms(500); //chu some more delay.
1061 }
1062 else if (kickfg) {
1063 IoPrint1("SERVO_stop kickfg %d\n",glbTimer);
1064 /* All servo off */
1065 SERVO_all_servo_off();
1066 SERVO_delay_n_ms(2000);
1067 }else SERVO_all_servo_off(); // sz 8/29
1068
1069 brake_done:
1070 IoPrint1("SERVO_stop brake_done %d\n",glbTimer);
1071 #ifdef USE_SONY_3068 // sz 8/18
SET_SERVO_LDON; /* turn on the laser diode */
SET_SERVO_AGC;
#else
1075 CLEAR_SERVO_LDON;
1076 CLEAR_SERVO_AGC;
1077 #endif
1078
1079 SERVO_delay_n_ms(20);
1080 mutecmd = 0;
1081
1082 SERVO_sledin();
1083
1084 servo_pres_m = STOP_10;
1085 SERVO_mode = SERVO_STOP;
1086 dsa_recv.word=DSR_STOP;
1087 kickfg = 0;
1088 stop_flag=1;
1089 IoPrint1("SERVO_stop %d\n",glbTimer);
1090
1091
1092 return (1);
1093 }
1094
1095
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 19
1096 /************************************************************************
1097 * OPEN/CLOSE TRAY
1098 ************************************************************************/
1099 /*
1100 * subroutine to close the tray, even if the tray in any position
1101 */
1102 int SERVO_close()
1103 {
1104 int timeout, tray_closed = 0;
1105 servo_next_m = STOP_M;
1106
1107 CLEAR_SERVO_FWD;
1108 SET_SERVO_REV;
1109 SERVO_delay_n_ms(150);
1110 timeout = glbTimer + T10SECOND;
1111
1112 if (SERVO_CLOSE_HIGH) {
1113 do {
1114 if (SERVO_CLOSE_LOW) {
1115 tray_closed = 1;
1116 break;
1117 }
1118 if (glbTimer > timeout)
1119 break;
1120 Dsa_Idle();
1121 } while (!tray_closed);
1122 }
1123 else
1124 tray_closed = 1;
1125
1126 CLEAR_SERVO_REV;
1127 // SERVO_mode = SERVO_CLOSE;
1128 SERVO_mode=SERVO_IDLE; //kzy add 5/23
1129 if (tray_closed) {
1130 dsa_recv.word=DSR_TRAYCLOSE;
1131 return (1);
1132 } else
1133 return (0);
1134 }
1135
1136 /*
1137 * Open the tray, need to stop the motor first if it is playing
1138 */
1139 int SERVO_open()
1140 {
1141 unsigned int timeout, flag = 0;
1142
1143 servo_pres_m = OPEN_10;
1144 CLEAR_SERVO_REV;
1145 SET_SERVO_FWD;
1146 SERVO_delay_n_ms(150);
1147 timeout = glbTimer + T10SECOND;
1148
1149 if (SERVO_OPEN_HIGH) {
1150 do {
1151 if (SERVO_OPEN_LOW)
1152 flag = 1;
1153 if (glbTimer > timeout)
1154 break;
1155 // Dsa_Idle();
1156 } while (!flag);
1157 } else
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 20
1158 flag = 1;
1159
1160 CLEAR_SERVO_FWD;
1161
1162 if (flag) {
1163 // SERVO_mode = SERVO_OPEN;
1164 SERVO_mode=SERVO_TRAY;
1165 dsa_recv.word=DSR_TRAYOPEN;//kzy add
1166 open_delay = glbTimer;
1167 return (1);
1168 }
1169 return (0);
1170 }
1171
1172
1173
1174
1175
1176 void SERVO_all_servo_off(void)
1177 {
1178 zputs("SERVO_all_servo_off\n");
1179 /* All servo off */
1180 SERVO_TRK_SLD_OFF;
1181 SERVO_FOCUS_OFF;
1182 SERVO_CLV_STOP;
1183
1184 return;
1185 }
1186
1187 /************************************************************************
1188 * FOCUS STUFF *
1189 ************************************************************************/
1190
1191 /*
1192 * Step 1 for turning on the focus and getting the disk spinning
1193 * with CLV (Constant Linear Velocity)
1194 */
1195 extern void SERVO_open_shutter(void);
1196 void SERVO_focus()
1197 {
1198 zputs("SERVO_focus\n");
1199
1200 focus_flag = 1;
1201 #ifdef USE_SONY_3068_WITH_SHUTTER // sz 8/18
if(shutter_flag) SERVO_open_shutter();
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -