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

📄 sbpcd.c.txt

📁 Linux块设备驱动分析与模拟实现
💻 TXT
📖 第 1 页 / 共 5 页
字号:
803   if (!(flags_cmd_out&f_obey_p_check)) return (0);
804   if (!st_check) return (0);
805   if (DS[d].in_SpinUp != 0) DPRINTF((DBG_SPI,"SBPCD: to xx_ReadError.\n"));
806   i=xx_ReadError();
807   if (DS[d].in_SpinUp != 0) DPRINTF((DBG_SPI,"SBPCD: to cmd_out OK.\n"));
808   return (i);
809 }
810 /*==========================================================================*/
811 static int xx_Seek(u_int pos, char f_blk_msf)
812 {
813   int i;
814 
815   clr_cmdbuf();
816   if (f_blk_msf>1) return (-3);
817   if (!new_drive)
818     {
819       if (f_blk_msf==1) pos=msf2blk(pos);
820       drvcmd[2]=(pos>>16)&0x00FF;
821       drvcmd[3]=(pos>>8)&0x00FF;
822       drvcmd[4]=pos&0x00FF;
823       flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
824                        f_ResponseStatus | f_obey_p_check | f_bit1;
825     }
826   else
827     {
828       if (f_blk_msf==0) pos=blk2msf(pos);
829       drvcmd[1]=(pos>>16)&0x00FF;
830       drvcmd[2]=(pos>>8)&0x00FF;
831       drvcmd[3]=pos&0x00FF;
832       flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
833     }
834   drvcmd[0]=0x01;
835   response_count=0;
836   i=cmd_out();
837   return (i);
838 }
839 /*==========================================================================*/
840 static int xx_SpinUp(void)
841 {
842   int i;
843 
844   DPRINTF((DBG_SPI,"SBPCD: SpinUp.\n"));
845   DS[d].in_SpinUp = 1;
846   clr_cmdbuf();
847   if (!new_drive)
848     {
849       drvcmd[0]=0x05;
850       flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
851     }
852   else
853     {
854       drvcmd[0]=0x02;
855       flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
856     }
857   response_count=0;
858   i=cmd_out();
859   DS[d].in_SpinUp = 0;
860   return (i);
861 }
862 /*==========================================================================*/
863 static int yy_SpinDown(void)
864 {
865   int i;
866 
867   if (!new_drive) return (-3);
868   clr_cmdbuf();
869   drvcmd[0]=0x06;
870   flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
871   response_count=0;
872   i=cmd_out();
873   return (i);
874 }
875 /*==========================================================================*/
876 static int yy_SetSpeed(u_char speed, u_char x1, u_char x2)
877 {
878   int i;
879 
880   if (!new_drive) return (-3);
881   clr_cmdbuf();
882   drvcmd[0]=0x09;
883   drvcmd[1]=0x03;
884   drvcmd[2]=speed;
885   drvcmd[3]=x1;
886   drvcmd[4]=x2;
887   flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
888   response_count=0;
889   i=cmd_out();
890   return (i);
891 }
892 /*==========================================================================*/
893 static int xx_SetVolume(void)
894 {
895   int i;
896   u_char channel0,channel1,volume0,volume1;
897   u_char control0,value0,control1,value1;
898 
899   DS[d].diskstate_flags &= ~volume_bit;
900   clr_cmdbuf();
901   channel0=DS[d].vol_chan0;
902   volume0=DS[d].vol_ctrl0;
903   channel1=control1=DS[d].vol_chan1;
904   volume1=value1=DS[d].vol_ctrl1;
905   control0=value0=0;
906 
907   if (((DS[d].drv_options&sax_a)!=0)&&(DS[d].drv_type>=drv_211))
908     {
909       if ((volume0!=0)&&(volume1==0))
910         {
911           volume1=volume0;
912           channel1=channel0;
913         }
914       else if ((volume0==0)&&(volume1!=0))
915         {
916           volume0=volume1;
917           channel0=channel1;
918         }
919     }
920   if (channel0>1)
921     {
922       channel0=0;
923       volume0=0;
924     }
925   if (channel1>1)
926     {
927       channel1=1;
928       volume1=0;
929     }
930   
931   if (new_drive)
932     {
933       control0=channel0+1;
934       control1=channel1+1;
935       value0=(volume0>volume1)?volume0:volume1;
936       value1=value0;
937       if (volume0==0) control0=0;
938       if (volume1==0) control1=0;
939       drvcmd[0]=0x09;
940       drvcmd[1]=0x05;
941       drvcmd[3]=control0;
942       drvcmd[4]=value0;
943       drvcmd[5]=control1;
944       drvcmd[6]=value1;
945       flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
946     }
947   else 
948     {
949       if (DS[d].drv_type>=drv_300)
950         {
951           control0=volume0&0xFC;
952           value0=volume1&0xFC;
953           if ((volume0!=0)&&(volume0<4)) control0 |= 0x04;
954           if ((volume1!=0)&&(volume1<4)) value0 |= 0x04;
955           if (channel0!=0) control0 |= 0x01;
956           if (channel1==1) value0 |= 0x01;
957         }
958       else
959         {
960           value0=(volume0>volume1)?volume0:volume1;
961           if (DS[d].drv_type<drv_211)
962             {
963               if (channel0!=0)
964                 {
965                   i=channel1;
966                   channel1=channel0;
967                   channel0=i;
968                   i=volume1;
969                   volume1=volume0;
970                   volume0=i;
971                 }
972               if (channel0==channel1)
973                 {
974                   if (channel0==0)
975                     {
976                       channel1=1;
977                       volume1=0;
978                       volume0=value0;
979                     }
980                   else
981                     {
982                       channel0=0;
983                       volume0=0;
984                       volume1=value0;
985                     }
986                 }
987             }
988 
989           if ((volume0!=0)&&(volume1!=0))
990             {
991               if (volume0==0xFF) volume1=0xFF;
992               else if (volume1==0xFF) volume0=0xFF;
993             }
994           else if (DS[d].drv_type<drv_201) volume0=volume1=value0;
995 
996           if (DS[d].drv_type>=drv_201)
997             {
998               if (volume0==0) control0 |= 0x80;
999               if (volume1==0) control0 |= 0x40;
1000             }
1001           if (DS[d].drv_type>=drv_211)
1002             {
1003               if (channel0!=0) control0 |= 0x20;
1004               if (channel1!=1) control0 |= 0x10;
1005             }
1006         }
1007       drvcmd[0]=0x84;
1008       drvcmd[1]=0x83;
1009       drvcmd[4]=control0;
1010       drvcmd[5]=value0;
1011       flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1012     }
1013 
1014   response_count=0;
1015   i=cmd_out();
1016   if (i>0) return (i);
1017   DS[d].diskstate_flags |= volume_bit;
1018   return (0);
1019 }
1020 /*==========================================================================*/
1021 static int GetStatus(void)
1022 {
1023   int i;
1024 
1025   flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;
1026   response_count=0;
1027   cmd_type=0;
1028   i=cmd_out();
1029   return (i);
1030 }
1031 /*==========================================================================*/
1032 static int xy_DriveReset(void)
1033 {
1034   int i;
1035 
1036   DPRINTF((DBG_RES,"SBPCD: xy_DriveReset called.\n"));
1037   if (!new_drive) OUT(CDo_reset,0x00);
1038   else
1039     {
1040       clr_cmdbuf();
1041       drvcmd[0]=0x0A;
1042       flags_cmd_out=f_putcmd;
1043       response_count=0;
1044       i=cmd_out();
1045     }
1046   flush_status();
1047   i=GetStatus();
1048   if (i>=0) return -1;
1049   if (DS[d].error_byte!=aud_12) return -1;
1050   return (0);
1051 }
1052 /*==========================================================================*/
1053 static int SetSpeed(void)
1054 {
1055   int i, speed;
1056 
1057   if (!(DS[d].drv_options&(speed_auto|speed_300|speed_150))) return (0);
1058   speed=0x80;
1059   if (!(DS[d].drv_options&speed_auto))
1060     {
1061       speed |= 0x40;
1062       if (!(DS[d].drv_options&speed_300)) speed=0;
1063     }
1064   i=yy_SetSpeed(speed,0,0);
1065   return (i);
1066 }
1067 /*==========================================================================*/
1068 static int DriveReset(void)
1069 {
1070   int i;
1071 
1072   i=xy_DriveReset();
1073   if (i<0) return (-2);
1074   do
1075     {
1076       i=GetStatus();
1077       if ((i<0)&&(i!=-15)) return (-2); /* i!=-15 is from sta2err */
1078       if (!st_caddy_in) break;
1079     }
1080   while (!st_diskok);
1081   DS[d].CD_changed=1;
1082   i=SetSpeed();
1083   if (i<0) return (-2);
1084   return (0);
1085 }
1086 /*==========================================================================*/
1087 static int xx_Pause_Resume(int pau_res)
1088 {
1089   int i;
1090 
1091   clr_cmdbuf();
1092   if (new_drive)
1093     {
1094       drvcmd[0]=0x0D;
1095       flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
1096     }
1097   else
1098     {
1099       drvcmd[0]=0x8D;
1100       flags_cmd_out=f_putcmd|f_respo2|f_getsta|f_ResponseStatus|f_obey_p_check;
1101     }
1102   if (pau_res!=1) drvcmd[1]=0x80;
1103   response_count=0;
1104   i=cmd_out();
1105   return (i);
1106 }
1107 /*==========================================================================*/
1108 #if 000
1109 static int yy_LockDoor(char lock)
1110 {
1111   int i;
1112 
1113   if (!new_drive) return (-3);
1114   clr_cmdbuf();
1115   drvcmd[0]=0x0C;
1116   if (lock==1) drvcmd[1]=0x01;
1117   flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1118   response_count=0;
1119   i=cmd_out();
1120   return (i);
1121 }
1122 #endif 000
1123 /*==========================================================================*/
1124 static int xx_ReadSubQ(void)
1125 {
1126   int i,j;
1127 
1128   DS[d].diskstate_flags &= ~subq_bit;
1129   clr_cmdbuf();
1130   if (new_drive)
1131     {
1132       drvcmd[0]=0x87;
1133       flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1134       response_count=11;
1135     }
1136   else
1137     {
1138       drvcmd[0]=0x89;
1139       drvcmd[1]=0x02;
1140       flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1141       response_count=13;
1142     }
1143   for (j=0;j<255;j++)
1144     {
1145       i=cmd_out();
1146       if (i<0) return (i);
1147       if (infobuf[0]!=0) break;
1148       if (!st_spinning)
1149         {
1150           DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0;
1151           DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0;
1152           return (0);
1153         }
1154     }
1155   DS[d].SubQ_audio=infobuf[0];
1156   DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]);
1157   DS[d].SubQ_trk=byt2bcd(infobuf[2]);
1158   DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]);
1159   i=4;
1160   if (!new_drive) i=5;
1161   DS[d].SubQ_run_tot=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */
1162   i=7;
1163   if (!new_drive) i=9;
1164   DS[d].SubQ_run_trk=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */
1165   DS[d].SubQ_whatisthis=infobuf[i+3];
1166   DS[d].diskstate_flags |= subq_bit;
1167   return (0);
1168 }
1169 /*==========================================================================*/
1170 static int xx_ModeSense(void)
1171 {
1172   int i;
1173 
1174   DS[d].diskstate_flags &= ~frame_size_bit;
1175   clr_cmdbuf();
1176   if (new_drive)
1177     {
1178       drvcmd[0]=0x84;
1179       drvcmd[1]=0x00;
1180       flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1181       response_count=5;
1182     }
1183   else
1184     {
1185       drvcmd[0]=0x85;
1186       drvcmd[1]=0x00;
1187       flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1188       response_count=2;
1189     }
1190   i=cmd_out();
1191   if (i<0) return (i);
1192   i=0;
1193   if (new_drive) DS[d].sense_byte=infobuf[i++];
1194   DS[d].frame_size=make16(infobuf[i],infobuf[i+1]);
1195   DS[d].diskstate_flags |= frame_size_bit;
1196   return (0);
1197 }
1198 /*==========================================================================*/
1199 #if 0000
1200 static int xx_TellVolume(void)
1201 {
1202   int i;
1203   u_char switches;

⌨️ 快捷键说明

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