📄 sbpcd.c
字号:
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 + -