📄 scsi_cdr.c
字号:
g0_cdbaddr(&scmd->cdb.g0_cdb, addr); scmd->cdb.g0_cdb.count = cnt; scgp->cmdname = "write_g0"; if (scsicmd(scgp) < 0) return (-1); return (size - scsigetresid(scgp));}EXPORT intwrite_xg1(scgp, bp, addr, size, cnt) SCSI *scgp; caddr_t bp; /* address of buffer */ long addr; /* disk address (sector) to put */ long size; /* number of bytes to transfer */ int cnt; /* sectorcount */{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = size; scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;/* scmd->flags = SCG_DISRE_ENA;*/ scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = SC_EWRITE; scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdbaddr(&scmd->cdb.g1_cdb, addr); g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "write_g1"; if (scsicmd(scgp) < 0) return (-1); return (size - scsigetresid(scgp));}EXPORT intwrite_xg5(scgp, bp, addr, size, cnt) SCSI *scgp; caddr_t bp; /* address of buffer */ long addr; /* disk address (sector) to put */ long size; /* number of bytes to transfer */ int cnt; /* sectorcount */{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = size; scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;/* scmd->flags = SCG_DISRE_ENA;*/ scmd->cdb_len = SC_G5_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g5_cdb.cmd = 0xAA; scmd->cdb.g5_cdb.lun = scgp->lun; g5_cdbaddr(&scmd->cdb.g5_cdb, addr); g5_cdblen(&scmd->cdb.g5_cdb, cnt); scgp->cmdname = "write_g5"; if (scsicmd(scgp) < 0) return (-1); return (size - scsigetresid(scgp));}EXPORT intscsi_flush_cache(scgp) SCSI *scgp;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->flags = SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 2 * 60; /* Max: sizeof(CDR-cache)/150KB/s */ scmd->cdb.g1_cdb.cmd = 0x35; scmd->cdb.g1_cdb.lun = scgp->lun; scgp->cmdname = "flush cache"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_buffer(scgp, bp, cnt, mode) SCSI *scgp; caddr_t bp; int cnt; int mode;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->dma_read = 1; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x3C; /* Read Buffer */ scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.cmd_cdb[1] |= (mode & 7); g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read buffer"; return (scsicmd(scgp));}EXPORT intread_subchannel(scgp, bp, track, cnt, msf, subq, fmt) SCSI *scgp; caddr_t bp; int track; int cnt; int msf; int subq; int fmt;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x42; scmd->cdb.g1_cdb.lun = scgp->lun; if (msf) scmd->cdb.g1_cdb.res = 1; if (subq) scmd->cdb.g1_cdb.addr[0] = 0x40; scmd->cdb.g1_cdb.addr[1] = fmt; scmd->cdb.g1_cdb.res6 = track; g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read subchannel"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_toc(scgp, bp, track, cnt, msf, fmt) SCSI *scgp; caddr_t bp; int track; int cnt; int msf; int fmt;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x43; scmd->cdb.g1_cdb.lun = scgp->lun; if (msf) scmd->cdb.g1_cdb.res = 1; scmd->cdb.g1_cdb.addr[0] = fmt & 0x0F; scmd->cdb.g1_cdb.res6 = track; g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read toc"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_toc_philips(scgp, bp, track, cnt, msf, fmt) SCSI *scgp; caddr_t bp; int track; int cnt; int msf; int fmt;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 4 * 60; /* May last 174s on a TEAC CD-R55S */ scmd->cdb.g1_cdb.cmd = 0x43; scmd->cdb.g1_cdb.lun = scgp->lun; if (msf) scmd->cdb.g1_cdb.res = 1; scmd->cdb.g1_cdb.res6 = track; g1_cdblen(&scmd->cdb.g1_cdb, cnt); if (fmt & 1) scmd->cdb.g1_cdb.vu_96 = 1; if (fmt & 2) scmd->cdb.g1_cdb.vu_97 = 1; scgp->cmdname = "read toc"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_header(scgp, bp, addr, cnt, msf) SCSI *scgp; caddr_t bp; long addr; int cnt; int msf;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x44; scmd->cdb.g1_cdb.lun = scgp->lun; if (msf) scmd->cdb.g1_cdb.res = 1; g1_cdbaddr(&scmd->cdb.g1_cdb, addr); g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read header"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_disk_info(scgp, bp, cnt) SCSI *scgp; caddr_t bp; int cnt;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 4 * 60; /* Needs up to 2 minutes */ scmd->cdb.g1_cdb.cmd = 0x51; scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read disk info"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_track_info(scgp, bp, track, cnt) SCSI *scgp; caddr_t bp; int track; int cnt;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 4 * 60; /* Needs up to 2 minutes */ scmd->cdb.g1_cdb.cmd = 0x52; scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.g1_cdb.reladr = 1; /* Track */ g1_cdbaddr(&scmd->cdb.g1_cdb, track); g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read track info"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intsend_opc(scgp, bp, cnt, doopc) SCSI *scgp; caddr_t bp; int cnt; int doopc;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 60; scmd->cdb.g1_cdb.cmd = 0x54; scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.g1_cdb.reladr = doopc?1:0; g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "send opc"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_track_info_philips(scgp, bp, track, cnt) SCSI *scgp; caddr_t bp; int track; int cnt;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0xE5; scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdbaddr(&scmd->cdb.g1_cdb, track); g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read track info"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intscsi_close_tr_session(scgp, type, track, immed) SCSI *scgp; int type; int track; BOOL immed;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->flags = SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 8 * 60; /* Needs up to 4 minutes */ scmd->cdb.g1_cdb.cmd = 0x5B; scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.g1_cdb.addr[0] = type; scmd->cdb.g1_cdb.addr[3] = track; if (immed) scmd->cdb.g1_cdb.reladr = 1;#ifdef nono scmd->cdb.g1_cdb.reladr = 1; /* IMM hack to test Mitsumi behaviour*/#endif scgp->cmdname = "close track/session"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intread_master_cue(scgp, bp, sheet, cnt) SCSI *scgp; caddr_t bp; /* address of master cue sheet */ int sheet; /* Sheet number */ int cnt; /* Transfer count */{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = cnt; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x59; /* Read master cue */ scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.g1_cdb.addr[2] = sheet; g1_cdblen(&scmd->cdb.g1_cdb, cnt); scgp->cmdname = "read master cue"; if (scsicmd(scgp) < 0) return (-1); return (0);}EXPORT intsend_cue_sheet(scgp, bp, size) SCSI *scgp; caddr_t bp; /* address of cue sheet buffer */ long size; /* number of bytes to transfer */{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = bp; scmd->size = size; scmd->flags = SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x5D; /* Send CUE sheet */ scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdblen(&scmd->cdb.g1_cdb, size); scgp->cmdname = "send_cue_sheet"; if (scsicmd(scgp) < 0) return (-1); return (size - scmd->resid);}EXPORT intread_buff_cap(scgp, sp, fp) SCSI *scgp; long *sp; /* Size pointer */ long *fp; /* Free pointer */{ char resp[12]; Ulong freespace; Ulong bufsize; int per; register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = (caddr_t)resp; scmd->size = sizeof(resp); scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G1_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->cdb.g1_cdb.cmd = 0x5C; /* Read buffer cap */ scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdblen(&scmd->cdb.g1_cdb, sizeof(resp)); scgp->cmdname = "read buffer cap"; if (scsicmd(scgp) < 0) return (-1); bufsize = a_to_u_4_byte(&resp[4]); freespace = a_to_u_4_byte(&resp[8]); if (sp) *sp = bufsize; if (fp) *fp = freespace; if (scgp->verbose || (sp == 0 && fp == 0)) printf("BFree: %ld K BSize: %ld K\n", freespace >> 10, bufsize >> 10); if (bufsize == 0) return (0); per = (100 * (bufsize - freespace)) / bufsize; if (per < 0) return (0); if (per > 100) return (100); return (per);}EXPORT intscsi_blank(scgp, addr, blanktype, immed) SCSI *scgp; long addr; int blanktype; BOOL immed;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->flags = SCG_DISRE_ENA; scmd->cdb_len = SC_G5_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 160 * 60; /* full blank at 1x could take 80 minutes */ scmd->cdb.g5_cdb.cmd = 0xA1; /* Blank */ scmd->cdb.g0_cdb.high_addr = blanktype; g1_cdbaddr(&scmd->cdb.g5_cdb, addr); if (immed) scmd->cdb.g5_cdb.res |= 8;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -