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

📄 sbpcd.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 5 页
字号:
static int cc_set_mode_T(void){	int i;		clr_cmdbuf();	response_count=1;	drvcmd[0]=CMDT_SETMODE;	drvcmd[1]=D_S[d].speed_byte;	drvcmd[2]=D_S[d].frmsiz>>8;	drvcmd[3]=D_S[d].frmsiz&0x0FF;	drvcmd[4]=D_S[d].f_XA; /* 1: XA */	drvcmd[5]=D_S[d].type_byte; /* 0, 1, 3 */	drvcmd[6]=D_S[d].mode_xb_6;	drvcmd[7]=D_S[d].mode_yb_7|D_S[d].volume_control;	drvcmd[8]=D_S[d].mode_xb_8;	drvcmd[9]=D_S[d].delay;	i=cmd_out_T();	return (i);}/*==========================================================================*/static int cc_prep_mode_T(void){	int i, j;		i=cc_get_mode_T();	if (i<0) return (i);	for (i=0;i<10;i++)		sprintf(&msgbuf[i*3], " %02X", infobuf[i]);	msgbuf[i*3]=0;	msg(DBG_TEA,"CMDT_GETMODE:%s\n", msgbuf);	D_S[d].speed_byte=0x02; /* 0x02: auto quad, 0x82: quad, 0x81: double, 0x80: single */	D_S[d].frmsiz=make16(infobuf[2],infobuf[3]);	D_S[d].f_XA=infobuf[4];	if (D_S[d].f_XA==0) D_S[d].type_byte=0;	else D_S[d].type_byte=1;	D_S[d].mode_xb_6=infobuf[6];	D_S[d].mode_yb_7=1;	D_S[d].mode_xb_8=infobuf[8];	D_S[d].delay=0; /* 0, 1, 2, 3 */	j=cc_set_mode_T();	i=cc_get_mode_T();	for (i=0;i<10;i++)		sprintf(&msgbuf[i*3], " %02X", infobuf[i]);	msgbuf[i*3]=0;	msg(DBG_TEA,"CMDT_GETMODE:%s\n", msgbuf);	return (j);}/*==========================================================================*/static int cc_SetSpeed(u_char speed, u_char x1, u_char x2){	int i;		if (fam0LV_drive) return (0);	clr_cmdbuf();	response_count=0;	if (fam1_drive)	{		drvcmd[0]=CMD1_SETMODE;		drvcmd[1]=0x03;		drvcmd[2]=speed;		drvcmd[3]=x1;		drvcmd[4]=x2;		flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;	}	else if (fam2_drive)	{		drvcmd[0]=CMD2_SETSPEED;		if (speed&speed_auto)		{			drvcmd[2]=0xFF;			drvcmd[3]=0xFF;		}		else		{			drvcmd[2]=0;			drvcmd[3]=150;		}		flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;	}	else if (famT_drive)	{		return (0);	}	i=cmd_out();	return (i);}/*==========================================================================*/static int cc_SetVolume(void){	int i;	u_char channel0,channel1,volume0,volume1;	u_char control0,value0,control1,value1;		D_S[d].diskstate_flags &= ~volume_bit;	clr_cmdbuf();	channel0=D_S[d].vol_chan0;	volume0=D_S[d].vol_ctrl0;	channel1=control1=D_S[d].vol_chan1;	volume1=value1=D_S[d].vol_ctrl1;	control0=value0=0;		if (famV_drive) return (0);	if (((D_S[d].drv_options&audio_mono)!=0)&&(D_S[d].drv_type>=drv_211))	{		if ((volume0!=0)&&(volume1==0))		{			volume1=volume0;			channel1=channel0;		}		else if ((volume0==0)&&(volume1!=0))		{			volume0=volume1;			channel0=channel1;		}	}	if (channel0>1)	{		channel0=0;		volume0=0;	}	if (channel1>1)	{		channel1=1;		volume1=0;	}		if (fam1_drive)	{		control0=channel0+1;		control1=channel1+1;		value0=(volume0>volume1)?volume0:volume1;		value1=value0;		if (volume0==0) control0=0;		if (volume1==0) control1=0;		drvcmd[0]=CMD1_SETMODE;		drvcmd[1]=0x05;		drvcmd[3]=control0;		drvcmd[4]=value0;		drvcmd[5]=control1;		drvcmd[6]=value1;		flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;	}	else if (fam2_drive)	{		control0=channel0+1;		control1=channel1+1;		value0=(volume0>volume1)?volume0:volume1;		value1=value0;		if (volume0==0) control0=0;		if (volume1==0) control1=0;		drvcmd[0]=CMD2_SETMODE;		drvcmd[1]=0x0E;		drvcmd[3]=control0;		drvcmd[4]=value0;		drvcmd[5]=control1;		drvcmd[6]=value1;		flags_cmd_out=f_putcmd|f_ResponseStatus;	}	else if (famL_drive)	{		if ((volume0==0)||(channel0!=0)) control0 |= 0x80;		if ((volume1==0)||(channel1!=1)) control0 |= 0x40;		if (volume0|volume1) value0=0x80;		drvcmd[0]=CMDL_SETMODE;		drvcmd[1]=0x03;		drvcmd[4]=control0;		drvcmd[5]=value0;		flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;	}	else if (fam0_drive) /* different firmware levels */	{		if (D_S[d].drv_type>=drv_300)		{			control0=volume0&0xFC;			value0=volume1&0xFC;			if ((volume0!=0)&&(volume0<4)) control0 |= 0x04;			if ((volume1!=0)&&(volume1<4)) value0 |= 0x04;			if (channel0!=0) control0 |= 0x01;			if (channel1==1) value0 |= 0x01;		}		else		{			value0=(volume0>volume1)?volume0:volume1;			if (D_S[d].drv_type<drv_211)			{				if (channel0!=0)				{					i=channel1;					channel1=channel0;					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 (D_S[d].drv_type<drv_201) volume0=volume1=value0;						if (D_S[d].drv_type>=drv_201)			{				if (volume0==0) control0 |= 0x80;				if (volume1==0) control0 |= 0x40;			}			if (D_S[d].drv_type>=drv_211)			{				if (channel0!=0) control0 |= 0x20;				if (channel1!=1) control0 |= 0x10;			}		}		drvcmd[0]=CMD0_SETMODE;		drvcmd[1]=0x83;		drvcmd[4]=control0;		drvcmd[5]=value0;		flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;	}	else if (famT_drive)	{		D_S[d].volume_control=0;		if (!volume0) D_S[d].volume_control|=0x10;		if (!volume1) D_S[d].volume_control|=0x20;		i=cc_prep_mode_T();		if (i<0) return (i);	}	if (!famT_drive)	{		response_count=0;		i=cmd_out();		if (i<0) return (i);	}	D_S[d].diskstate_flags |= volume_bit;	return (0);}/*==========================================================================*/static int GetStatus(void){	int i;		if (famT_drive) return (0);	flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;	response_count=0;	cmd_type=0;	i=cmd_out();	return (i);}/*==========================================================================*/static int cc_DriveReset(void){	int i;		msg(DBG_RES,"cc_DriveReset called.\n");	clr_cmdbuf();	response_count=0;	if (fam0LV_drive) OUT(CDo_reset,0x00);	else if (fam1_drive)	{		drvcmd[0]=CMD1_RESET;		flags_cmd_out=f_putcmd;		i=cmd_out();	}	else if (fam2_drive)	{		drvcmd[0]=CMD2_RESET;		flags_cmd_out=f_putcmd;		i=cmd_out();		OUT(CDo_reset,0x00);	}	else if (famT_drive)	{		OUT(CDo_sel_i_d,0);		OUT(CDo_enable,D_S[d].drv_sel);		OUT(CDo_command,CMDT_RESET);		for (i=1;i<10;i++) OUT(CDo_command,0);	}	if (fam0LV_drive) sbp_sleep(5*HZ); /* wait 5 seconds */	else sbp_sleep(1*HZ); /* wait a second */#if 1	if (famT_drive)	{		msg(DBG_TEA, "================CMDT_RESET given=================.\n");		sbp_sleep(3*HZ);	}#endif 1	flush_status();	i=GetStatus();	if (i<0) return i;	if (!famT_drive)		if (D_S[d].error_byte!=aud_12) return -501;	return (0);}/*==========================================================================*/static int SetSpeed(void){	int i, speed;		if (!(D_S[d].drv_options&(speed_auto|speed_300|speed_150))) return (0);	speed=speed_auto;	if (!(D_S[d].drv_options&speed_auto))	{		speed |= speed_300;		if (!(D_S[d].drv_options&speed_300)) speed=0;	}	i=cc_SetSpeed(speed,0,0);	return (i);}static void switch_drive(int i);static int sbpcd_select_speed(struct cdrom_device_info *cdi, int speed){  int i = MINOR(cdi->dev);  if (i != d)    switch_drive(i);  return cc_SetSpeed(speed == 2 ? speed_300 : speed_150, 0, 0);}/*==========================================================================*/static int DriveReset(void){	int i;		i=cc_DriveReset();	if (i<0) return (-22);	do	{		i=GetStatus();		if ((i<0)&&(i!=-ERR_DISKCHANGE)) {			return (-2); /* from sta2err */		}		if (!st_caddy_in) break;		sbp_sleep(1);	}	while (!st_diskok);#if 000	D_S[d].CD_changed=1;#endif	if ((st_door_closed) && (st_caddy_in))	{		i=DiskInfo();		if (i<0) return (-23);	}	return (0);}static int sbpcd_reset(struct cdrom_device_info *cdi){  int i = MINOR(cdi->dev);  if (i != d)    switch_drive(i);  return DriveReset();}/*==========================================================================*/static int cc_PlayAudio(int pos_audio_start,int pos_audio_end){	int i, j, n;		if (D_S[d].audio_state==audio_playing) return (-EINVAL);	clr_cmdbuf();	response_count=0;	if (famLV_drive)	{		drvcmd[0]=CMDL_PLAY;		i=msf2blk(pos_audio_start);		n=msf2blk(pos_audio_end)+1-i;		drvcmd[1]=(i>>16)&0x00FF;		drvcmd[2]=(i>>8)&0x00FF;		drvcmd[3]=i&0x00FF;		drvcmd[4]=(n>>16)&0x00FF;		drvcmd[5]=(n>>8)&0x00FF;		drvcmd[6]=n&0x00FF;		if (famL_drive)		flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |			f_ResponseStatus | f_obey_p_check | f_wait_if_busy;		else		  flags_cmd_out = f_putcmd;	}	else	{		j=1;		if (fam1_drive)		{			drvcmd[0]=CMD1_PLAY_MSF;			flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus |				f_obey_p_check | f_wait_if_busy;		}		else if (fam2_drive)		{			drvcmd[0]=CMD2_PLAY_MSF;			flags_cmd_out = f_putcmd | f_ResponseStatus | f_obey_p_check;		}		else if (famT_drive)		{			drvcmd[0]=CMDT_PLAY_MSF;			j=3;			response_count=1;		}		else if (fam0_drive)		{			drvcmd[0]=CMD0_PLAY_MSF;			flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |				f_ResponseStatus | f_obey_p_check |

⌨️ 快捷键说明

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