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

📄 sbpcd.c

📁 LINUX1.0内核源代码,学习LINUX编程的一定要看。
💻 C
📖 第 1 页 / 共 5 页
字号:
		  channel0=i;		  i=volume1;		  volume1=volume0;		  volume0=i;		}	      if (channel0==channel1)		{		  if (channel0==0)		    {		      channel1=1;		      volume1=0;		      volume0=value0;		    }		  else		    {		      channel0=0;		      volume0=0;		      volume1=value0;		    }		}	    }	  if ((volume0!=0)&&(volume1!=0))	    {	      if (volume0==0xFF) volume1=0xFF;	      else if (volume1==0xFF) volume0=0xFF;	    }	  else if (DS[d].drv_type<drv_201) volume0=volume1=value0;	  if (DS[d].drv_type>=drv_201)	    {	      if (volume0==0) control0 |= 0x80;	      if (volume1==0) control0 |= 0x40;	    }	  if (DS[d].drv_type>=drv_211)	    {	      if (channel0!=0) control0 |= 0x20;	      if (channel1!=1) control0 |= 0x10;	    }	}      drvcmd[0]=0x84;      drvcmd[1]=0x83;      drvcmd[4]=control0;      drvcmd[5]=value0;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;    }  response_count=0;  i=cmd_out();  if (i>0) return (i);  DS[d].diskstate_flags |= volume_bit;  return (0);}/*==========================================================================*/static int GetStatus(void){  int i;  flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;  response_count=0;  cmd_type=0;  i=cmd_out();  return (i);}/*==========================================================================*/static int xy_DriveReset(void){  int i;  DPRINTF((DBG_RES,"SBPCD: xy_DriveReset called.\n"));  if (!new_drive) OUT(CDo_reset,0x00);  else    {      clr_cmdbuf();      drvcmd[0]=0x0A;      flags_cmd_out=f_putcmd;      response_count=0;      i=cmd_out();    }  flush_status();  i=GetStatus();  if (i>=0) return -1;  if (DS[d].error_byte!=aud_12) return -1;  return (0);}/*==========================================================================*/static int SetSpeed(void){  int i, speed;  if (!(DS[d].drv_options&(speed_auto|speed_300|speed_150))) return (0);  speed=0x80;  if (!(DS[d].drv_options&speed_auto))    {      speed |= 0x40;      if (!(DS[d].drv_options&speed_300)) speed=0;    }  i=yy_SetSpeed(speed,0,0);  return (i);}/*==========================================================================*/static int DriveReset(void){  int i;  i=xy_DriveReset();  if (i<0) return (-2);  do    {      i=GetStatus();      if ((i<0)&&(i!=-15)) return (-2); /* i!=-15 is from sta2err */      if (!st_caddy_in) break;    }  while (!st_diskok);  DS[d].CD_changed=1;  i=SetSpeed();  if (i<0) return (-2);  return (0);}/*==========================================================================*/static int xx_Pause_Resume(int pau_res){  int i;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x0D;      flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;    }  else    {      drvcmd[0]=0x8D;      flags_cmd_out=f_putcmd|f_respo2|f_getsta|f_ResponseStatus|f_obey_p_check;    }  if (pau_res!=1) drvcmd[1]=0x80;  response_count=0;  i=cmd_out();  return (i);}/*==========================================================================*/#if 000static int yy_LockDoor(char lock){  int i;  if (!new_drive) return (-3);  clr_cmdbuf();  drvcmd[0]=0x0C;  if (lock==1) drvcmd[1]=0x01;  flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;  response_count=0;  i=cmd_out();  return (i);}#endif 000/*==========================================================================*/static int xx_ReadSubQ(void){  int i,j;  DS[d].diskstate_flags &= ~subq_bit;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x87;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;      response_count=11;    }  else    {      drvcmd[0]=0x89;      drvcmd[1]=0x02;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;      response_count=13;    }  for (j=0;j<255;j++)    {      i=cmd_out();      if (i<0) return (i);      if (infobuf[0]!=0) break;      if (!st_spinning)	{	  DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0;	  DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0;	  return (0);	}    }  DS[d].SubQ_audio=infobuf[0];  DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]);  DS[d].SubQ_trk=byt2bcd(infobuf[2]);  DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]);  i=4;  if (!new_drive) i=5;  DS[d].SubQ_run_tot=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */  i=7;  if (!new_drive) i=9;  DS[d].SubQ_run_trk=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */  DS[d].SubQ_whatisthis=infobuf[i+3];  DS[d].diskstate_flags |= subq_bit;  return (0);}/*==========================================================================*/static int xx_ModeSense(void){  int i;  DS[d].diskstate_flags &= ~frame_size_bit;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x84;      drvcmd[1]=0x00;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;      response_count=5;    }  else    {      drvcmd[0]=0x85;      drvcmd[1]=0x00;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;      response_count=2;    }  i=cmd_out();  if (i<0) return (i);  i=0;  if (new_drive) DS[d].sense_byte=infobuf[i++];  DS[d].frame_size=make16(infobuf[i],infobuf[i+1]);  DS[d].diskstate_flags |= frame_size_bit;  return (0);}/*==========================================================================*/#if 0000static int xx_TellVolume(void){  int i;  u_char switches;  u_char chan0,vol0,chan1,vol1;  DS[d].diskstate_flags &= ~volume_bit;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x84;      drvcmd[1]=0x05;      response_count=5;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;    }  else    {      drvcmd[0]=0x85;      drvcmd[1]=0x03;      response_count=2;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;    }  i=cmd_out();  if (i<0) return (i);  if (new_drive)    {      chan0=infobuf[1]&0x0F;      vol0=infobuf[2];      chan1=infobuf[3]&0x0F;      vol1=infobuf[4];      if (chan0==0)	{	  chan0=1;	  vol0=0;	}      if (chan1==0)	{	  chan1=2;	  vol1=0;	}      chan0 >>= 1;      chan1 >>= 1;    }  else    {      chan0=0;      chan1=1;      vol0=vol1=infobuf[1];      if (DS[d].drv_type>=drv_201)	{	  if (DS[d].drv_type<drv_300)	    {	      switches=infobuf[0];	      if ((switches&0x80)!=0) vol0=0;	      if ((switches&0x40)!=0) vol1=0;	      if (DS[d].drv_type>=drv_211)		{		  if ((switches&0x20)!=0) chan0=1;		  if ((switches&0x10)!=0) chan1=0;		}	    }	  else	    {	      vol0=infobuf[0];	      if ((vol0&0x01)!=0) chan0=1;	      if ((vol1&0x01)==0) chan1=0;	      vol0 &= 0xFC;	      vol1 &= 0xFC;	      if (vol0!=0) vol0 += 3;	      if (vol1!=0) vol1 += 3;	    }	}    }  DS[d].vol_chan0=chan0;  DS[d].vol_ctrl0=vol0;  DS[d].vol_chan1=chan1;  DS[d].vol_ctrl1=vol1;  DS[d].vol_chan2=2;  DS[d].vol_ctrl2=0xFF;  DS[d].vol_chan3=3;  DS[d].vol_ctrl3=0xFF;  DS[d].diskstate_flags |= volume_bit;  return (0);}#endif/*==========================================================================*/static int xx_ReadCapacity(void){  int i;  DS[d].diskstate_flags &= ~cd_size_bit;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x85;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;    }  else    {      drvcmd[0]=0x88;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;    }  response_count=5;  i=cmd_out();  if (i<0) return (i);  DS[d].CDsize_blk=make32(make16(0,infobuf[0]),make16(infobuf[1],infobuf[2]));  if (new_drive) DS[d].CDsize_blk=msf2blk(DS[d].CDsize_blk);  DS[d].CDsize_frm = (DS[d].CDsize_blk * make16(infobuf[3],infobuf[4])) / CD_FRAMESIZE;  DS[d].CDsize_blk += 151;  DS[d].diskstate_flags |= cd_size_bit;  return (0);}/*==========================================================================*/static int xx_ReadTocDescr(void){  int i;  DS[d].diskstate_flags &= ~toc_bit;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x8B;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;    }  else    {      drvcmd[0]=0x8B;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;    }  response_count=6;  i=cmd_out();  if (i<0) return (i);  DS[d].xa_byte=infobuf[0];  DS[d].n_first_track=infobuf[1];  DS[d].n_last_track=infobuf[2];  DS[d].size_msf=make32(make16(0,infobuf[3]),make16(infobuf[4],infobuf[5]));  DS[d].size_blk=msf2blk(DS[d].size_msf);  DS[d].diskstate_flags |= toc_bit;  DPRINTF((DBG_TOC,"SBPCD: TocDesc: %02X %02X %02X %08X\n",	 DS[d].xa_byte,DS[d].n_first_track,DS[d].n_last_track,DS[d].size_msf));  return (0);}/*==========================================================================*/static int xx_ReadTocEntry(int num){  int i;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x8C;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;    }  else    {      drvcmd[0]=0x8C;      drvcmd[1]=0x02;      flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;    }  drvcmd[2]=num;  response_count=8;  i=cmd_out();  if (i<0) return (i);  DS[d].TocEnt_nixbyte=infobuf[0];  DS[d].TocEnt_ctl_adr=swap_nibbles(infobuf[1]);  DS[d].TocEnt_number=infobuf[2];  DS[d].TocEnt_format=infobuf[3];  if (new_drive) i=4;  else i=5;  DS[d].TocEnt_address=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2]));  DPRINTF((DBG_TOC,"SBPCD: TocEntry: %02X %02X %02X %02X %08X\n",	   DS[d].TocEnt_nixbyte,DS[d].TocEnt_ctl_adr,DS[d].TocEnt_number,	   DS[d].TocEnt_format,DS[d].TocEnt_address));  return (0);}/*==========================================================================*/static int xx_ReadPacket(void){  int i;  clr_cmdbuf();  drvcmd[0]=0x8E;  drvcmd[1]=response_count;  flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;  i=cmd_out();  return (i);}/*==========================================================================*/static int convert_UPC(u_char *p){  int i;  p++;  if (!new_drive) p[13]=0;  for (i=0;i<7;i++)    {      if (new_drive) DS[d].UPC_buf[i]=swap_nibbles(*p++);      else	{	  DS[d].UPC_buf[i]=((*p++)<<4)&0xFF;	  DS[d].UPC_buf[i] |= *p++;	}    }  DS[d].UPC_buf[6] &= 0xF0;  return (0);}/*==========================================================================*/static int xx_ReadUPC(void){  int i;  DS[d].diskstate_flags &= ~upc_bit;  clr_cmdbuf();  if (new_drive)    {      drvcmd[0]=0x88;      response_count=8;      flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;    }  else    {      drvcmd[0]=0x08;      response_count=0;      flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;    }  i=cmd_out();  if (i<0) return (i);  if (!new_drive)    {      response_count=16;      i=xx_ReadPacket();      if (i<0) return (i);    }  DS[d].UPC_ctl_adr=0;  if (new_drive) i=0;  else i=2;  if ((infobuf[i]&0x80)!=0)    {      convert_UPC(&infobuf[i]);      DS[d].UPC_ctl_adr &= 0xF0;      DS[d].UPC_ctl_adr |= 0x02;    }  DS[d].diskstate_flags |= upc_bit;  return (0);}/*==========================================================================*/static int yy_CheckMultiSession(void){  int i;

⌨️ 快捷键说明

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