📄 sbpcd.c
字号:
if (famT_drive) return; SBPCD_CLI; if (fam0LV_drive) OUT(CDo_command,CMD0_STATUS); else if (fam1_drive) OUT(CDo_command,CMD1_STATUS); else if (fam2_drive) OUT(CDo_command,CMD2_STATUS); if (!fam0LV_drive) for (i=0;i<6;i++) OUT(CDo_command,0); SBPCD_STI;}/*==========================================================================*/static int cc_ReadError(void){ int i; clr_cmdbuf(); msg(DBG_ERR,"giving cc_ReadError command.\n"); if (fam1_drive) { drvcmd[0]=CMD1_READ_ERR; response_count=8; flags_cmd_out=f_putcmd|f_ResponseStatus; } else if (fam0LV_drive) { drvcmd[0]=CMD0_READ_ERR; response_count=6; if (famLV_drive) flags_cmd_out=f_putcmd; else flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus; } else if (fam2_drive) { drvcmd[0]=CMD2_READ_ERR; response_count=6; flags_cmd_out=f_putcmd; } else if (famT_drive) { response_count=5; drvcmd[0]=CMDT_READ_ERR; } i=cmd_out(); D_S[d].error_byte=0; msg(DBG_ERR,"cc_ReadError: cmd_out(CMDx_READ_ERR) returns %d (%02X)\n",i,i); if (i<0) return (i); if (fam0V_drive) i=1; else i=2; D_S[d].error_byte=infobuf[i]; msg(DBG_ERR,"cc_ReadError: infobuf[%d] is %d (%02X)\n",i,D_S[d].error_byte,D_S[d].error_byte); i=sta2err(infobuf[i]); if (i==-ERR_DISKCHANGE) { D_S[d].CD_changed=0xFF; D_S[d].diskstate_flags &= ~toc_bit; } return (i);}/*==========================================================================*/static int cmd_out_T(void){#undef CMDT_TRIES#define CMDT_TRIES 1000#define TEST_FALSE_FF 1 static int cc_DriveReset(void); int i, j, l=0, m, ntries; long flags; D_S[d].error_state=0; D_S[d].b3=0; D_S[d].b4=0; D_S[d].f_drv_error=0; for (i=0;i<10;i++) sprintf(&msgbuf[i*3]," %02X",drvcmd[i]); msgbuf[i*3]=0; msg(DBG_CMD,"cmd_out_T:%s\n",msgbuf); OUT(CDo_sel_i_d,0); OUT(CDo_enable,D_S[d].drv_sel); i=inb(CDi_status); do_16bit=0; if ((f_16bit)&&(!(i&0x80))) { do_16bit=1; msg(DBG_TEA,"cmd_out_T: do_16bit set.\n"); } if (!(i&s_not_result_ready)) do { j=inb(CDi_info); i=inb(CDi_status); sbp_sleep(0); msg(DBG_TEA,"cmd_out_T: spurious !s_not_result_ready. (%02X)\n", j); } while (!(i&s_not_result_ready)); save_flags(flags); cli(); for (i=0;i<10;i++) OUT(CDo_command,drvcmd[i]); restore_flags(flags); for (ntries=CMDT_TRIES;ntries>0;ntries--) { if (drvcmd[0]==CMDT_READ_VER) sbp_sleep(HZ); /* fixme */#if 01 OUT(CDo_sel_i_d,1);#endif 01 if (teac==2) { if ((i=CDi_stat_loop_T()) == -1) break; } else {#if 0 OUT(CDo_sel_i_d,1);#endif 0 i=inb(CDi_status); } if (!(i&s_not_data_ready)) /* f.e. CMDT_DISKINFO */ { OUT(CDo_sel_i_d,1); if (drvcmd[0]==CMDT_READ) return (0); /* handled elsewhere */ if (drvcmd[0]==CMDT_DISKINFO) { l=0; do { if (do_16bit) { i=inw(CDi_data); infobuf[l++]=i&0x0ff; infobuf[l++]=i>>8;#if TEST_FALSE_FF if ((l==2)&&(infobuf[0]==0x0ff)) { infobuf[0]=infobuf[1]; l=1; msg(DBG_TEA,"cmd_out_T: do_16bit: false first byte!\n"); }#endif TEST_FALSE_FF } else infobuf[l++]=inb(CDi_data); i=inb(CDi_status); } while (!(i&s_not_data_ready)); for (j=0;j<l;j++) sprintf(&msgbuf[j*3]," %02X",infobuf[j]); msgbuf[j*3]=0; msg(DBG_CMD,"cmd_out_T data response:%s\n", msgbuf); } else { msg(DBG_TEA,"cmd_out_T: data response with cmd_%02X!\n", drvcmd[0]); j=0; do { if (do_16bit) i=inw(CDi_data); else i=inb(CDi_data); j++; i=inb(CDi_status); } while (!(i&s_not_data_ready)); msg(DBG_TEA,"cmd_out_T: data response: discarded %d bytes/words.\n", j); fatal_err++; } } i=inb(CDi_status); if (!(i&s_not_result_ready)) { OUT(CDo_sel_i_d,0); if (drvcmd[0]==CMDT_DISKINFO) m=l; else m=0; do { infobuf[m++]=inb(CDi_info); i=inb(CDi_status); } while (!(i&s_not_result_ready)); for (j=0;j<m;j++) sprintf(&msgbuf[j*3]," %02X",infobuf[j]); msgbuf[j*3]=0; msg(DBG_CMD,"cmd_out_T info response:%s\n", msgbuf); if (drvcmd[0]==CMDT_DISKINFO) { infobuf[0]=infobuf[l]; if (infobuf[0]!=0x02) return (l); /* data length */ } else if (infobuf[0]!=0x02) return (m); /* info length */ do { ++recursion; if (recursion>1) msg(DBG_TEA,"cmd_out_T READ_ERR recursion (%02X): %d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", drvcmd[0], recursion); clr_cmdbuf(); drvcmd[0]=CMDT_READ_ERR; j=cmd_out_T(); /* !!! recursive here !!! */ --recursion; sbp_sleep(1); } while (j<0); D_S[d].error_state=infobuf[2]; D_S[d].b3=infobuf[3]; D_S[d].b4=infobuf[4]; if (D_S[d].f_drv_error) { D_S[d].f_drv_error=0; cc_DriveReset(); D_S[d].error_state=2; } return (-D_S[d].error_state-400); } if (drvcmd[0]==CMDT_READ) return (0); /* handled elsewhere */ if ((teac==0)||(ntries<(CMDT_TRIES-5))) sbp_sleep(HZ/10); else sbp_sleep(HZ/100); if (ntries>(CMDT_TRIES-50)) continue; msg(DBG_TEA,"cmd_out_T: next CMDT_TRIES (%02X): %d.\n", drvcmd[0], ntries-1); } D_S[d].f_drv_error=1; cc_DriveReset(); D_S[d].error_state=2; return (-99);}/*==========================================================================*/static int cmd_out(void){ int i=0; if (famT_drive) return(cmd_out_T()); if (flags_cmd_out&f_putcmd) { unsigned long flags; for (i=0;i<7;i++) sprintf(&msgbuf[i*3], " %02X", drvcmd[i]); msgbuf[i*3]=0; msg(DBG_CMD,"cmd_out:%s\n", msgbuf); save_flags(flags); cli(); for (i=0;i<7;i++) OUT(CDo_command,drvcmd[i]); restore_flags(flags); } if (response_count!=0) { if (cmd_type!=0) { if (sbpro_type==1) OUT(CDo_sel_i_d,1); msg(DBG_INF,"misleaded to try ResponseData.\n"); if (sbpro_type==1) OUT(CDo_sel_i_d,0); return (-22); } else i=ResponseInfo(); if (i<0) return (i); } if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to CDi_stat_loop.\n"); if (flags_cmd_out&f_lopsta) { i=CDi_stat_loop(); if ((i<0)||!(i&s_attention)) return (-8); } if (!(flags_cmd_out&f_getsta)) goto LOC_229; LOC_228: if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cc_ReadStatus.\n"); cc_ReadStatus(); LOC_229: if (flags_cmd_out&f_ResponseStatus) { if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to ResponseStatus.\n"); i=ResponseStatus(); /* builds status_bits, returns orig. status or p_busy_new */ if (i<0) return (i); if (flags_cmd_out&(f_bit1|f_wait_if_busy)) { if (!st_check) { if ((flags_cmd_out&f_bit1)&&(i&p_success)) goto LOC_232; if ((!(flags_cmd_out&f_wait_if_busy))||(!st_busy)) goto LOC_228; } } } LOC_232: if (!(flags_cmd_out&f_obey_p_check)) return (0); if (!st_check) return (0); if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cc_ReadError.\n"); i=cc_ReadError(); if (D_S[d].in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cmd_out OK.\n"); msg(DBG_000,"cmd_out: cc_ReadError=%d\n", i); return (i);}/*==========================================================================*/static int cc_Seek(u_int pos, char f_blk_msf){ int i; clr_cmdbuf(); if (f_blk_msf>1) return (-3); if (fam0V_drive) { drvcmd[0]=CMD0_SEEK; if (f_blk_msf==1) pos=msf2blk(pos); drvcmd[2]=(pos>>16)&0x00FF; drvcmd[3]=(pos>>8)&0x00FF; drvcmd[4]=pos&0x00FF; if (fam0_drive) flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta | f_ResponseStatus | f_obey_p_check | f_bit1; else flags_cmd_out = f_putcmd; } else if (fam1L_drive) { drvcmd[0]=CMD1_SEEK; /* same as CMD1_ and CMDL_ */ if (f_blk_msf==0) pos=blk2msf(pos); drvcmd[1]=(pos>>16)&0x00FF; drvcmd[2]=(pos>>8)&0x00FF; drvcmd[3]=pos&0x00FF; if (famL_drive) flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1; else flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check; } else if (fam2_drive) { drvcmd[0]=CMD2_SEEK; if (f_blk_msf==0) pos=blk2msf(pos); drvcmd[2]=(pos>>24)&0x00FF; drvcmd[3]=(pos>>16)&0x00FF; drvcmd[4]=(pos>>8)&0x00FF; drvcmd[5]=pos&0x00FF; flags_cmd_out=f_putcmd|f_ResponseStatus; } else if (famT_drive) { drvcmd[0]=CMDT_SEEK; if (f_blk_msf==1) pos=msf2blk(pos); drvcmd[2]=(pos>>24)&0x00FF; drvcmd[3]=(pos>>16)&0x00FF; drvcmd[4]=(pos>>8)&0x00FF; drvcmd[5]=pos&0x00FF; D_S[d].n_bytes=1; } response_count=0; i=cmd_out(); return (i);}/*==========================================================================*/static int cc_SpinUp(void){ int i; msg(DBG_SPI,"SpinUp.\n"); D_S[d].in_SpinUp = 1; clr_cmdbuf(); if (fam0LV_drive) { drvcmd[0]=CMD0_SPINUP; if (fam0L_drive) flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta| f_ResponseStatus|f_obey_p_check|f_bit1; else flags_cmd_out=f_putcmd; } else if (fam1_drive) { drvcmd[0]=CMD1_SPINUP; flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check; } else if (fam2_drive) { drvcmd[0]=CMD2_TRAY_CTL; drvcmd[4]=0x01; /* "spinup" */ flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check; } else if (famT_drive) { drvcmd[0]=CMDT_TRAY_CTL; drvcmd[4]=0x03; /* "insert", it hopefully spins the drive up */ } response_count=0; i=cmd_out(); D_S[d].in_SpinUp = 0; return (i);}/*==========================================================================*/static int cc_SpinDown(void){ int i; if (fam0_drive) return (0); clr_cmdbuf(); response_count=0; if (fam1_drive) { drvcmd[0]=CMD1_SPINDOWN; flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check; } else if (fam2_drive) { drvcmd[0]=CMD2_TRAY_CTL; drvcmd[4]=0x02; /* "eject" */ flags_cmd_out=f_putcmd|f_ResponseStatus; } else if (famL_drive) { drvcmd[0]=CMDL_SPINDOWN; drvcmd[1]=1; flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1; } else if (famV_drive) { drvcmd[0]=CMDV_SPINDOWN; flags_cmd_out=f_putcmd; } else if (famT_drive) { drvcmd[0]=CMDT_TRAY_CTL; drvcmd[4]=0x02; /* "eject" */ } i=cmd_out(); return (i);}/*==========================================================================*/static int cc_get_mode_T(void){ int i; clr_cmdbuf(); response_count=10; drvcmd[0]=CMDT_GETMODE; drvcmd[4]=response_count; i=cmd_out_T(); return (i);}/*==========================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -