📄 scsi_cdr.c
字号:
if (scsicmd("write_g1") < 0) return (-1); return (size - scmd.resid);}EXPORT intwrite_xg5(bp, addr, size, cnt) caddr_t bp; /* address of buffer */ long addr; /* disk address (sector) to put */ long size; /* number of bytes to transfer */ int cnt; /* sectorcount */{ 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 = target; scmd.cdb.g5_cdb.cmd = 0xAA; scmd.cdb.g5_cdb.lun = lun; g5_cdbaddr(&scmd.cdb.g5_cdb, addr); g5_cdblen(&scmd.cdb.g5_cdb, cnt); if (scsicmd("write_g5") < 0) return (-1); return (size - scmd.resid);}EXPORT intwrite_track(track, sectype) long track; /* track number 0 == new track */ int sectype;{ fillbytes((caddr_t)&scmd, sizeof(scmd), '\0'); 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 = target; scmd.cdb.g1_cdb.cmd = 0xE6; scmd.cdb.g1_cdb.lun = lun; g1_cdbaddr(&scmd.cdb.g1_cdb, track); scmd.cdb.g1_cdb.res6 = sectype; if (scsicmd("write_track") < 0) return (-1); return (0);}EXPORT intscsi_flush_cache(){ 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 = target; scmd.timeout = 2 * 60; /* Max: sizeof(CDR-cache)/150KB/s */ scmd.cdb.g1_cdb.cmd = 0x35; scmd.cdb.g1_cdb.lun = lun; if (scsicmd("flush cache") < 0) return (-1); return (0);}EXPORT intread_toc(bp, track, cnt, msf, fmt) caddr_t bp; int track; int cnt; int msf; int fmt;{ 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 = target; scmd.cdb.g1_cdb.cmd = 0x43; scmd.cdb.g1_cdb.lun = 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); if (scsicmd("read toc") < 0) return (-1); return (0);}EXPORT intread_toc_philips(bp, track, cnt, msf, fmt) caddr_t bp; int track; int cnt; int msf; int fmt;{ 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 = target; scmd.cdb.g1_cdb.cmd = 0x43; scmd.cdb.g1_cdb.lun = 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; if (scsicmd("read toc") < 0) return (-1); return (0);}EXPORT intread_header(bp, addr, cnt, msf) caddr_t bp; long addr; int cnt; int msf;{ 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 = target; scmd.cdb.g1_cdb.cmd = 0x44; scmd.cdb.g1_cdb.lun = lun; if (msf) scmd.cdb.g1_cdb.res = 1; g1_cdbaddr(&scmd.cdb.g1_cdb, addr); g1_cdblen(&scmd.cdb.g1_cdb, cnt); if (scsicmd("read header") < 0) return (-1); return (0);}EXPORT intread_disk_info(bp, cnt) caddr_t bp; int cnt;{ 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 = target; scmd.timeout = 4 * 60; /* Needs up to 2 minutes */ scmd.cdb.g1_cdb.cmd = 0x51; scmd.cdb.g1_cdb.lun = lun; g1_cdblen(&scmd.cdb.g1_cdb, cnt); if (scsicmd("read disk info") < 0) return (-1); return (0);}EXPORT intread_track_info(bp, track, cnt) caddr_t bp; int track; int cnt;{ 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 = target; scmd.timeout = 4 * 60; /* Needs up to 2 minutes */ scmd.cdb.g1_cdb.cmd = 0x52; scmd.cdb.g1_cdb.lun = lun; scmd.cdb.g1_cdb.reladr = 1; /* Track */ g1_cdbaddr(&scmd.cdb.g1_cdb, track); g1_cdblen(&scmd.cdb.g1_cdb, cnt); if (scsicmd("read track info") < 0) return (-1); return (0);}EXPORT intread_track_info_philips(bp, track, cnt) caddr_t bp; int track; int cnt;{ 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 = target; scmd.cdb.g1_cdb.cmd = 0xE5; scmd.cdb.g1_cdb.lun = lun; g1_cdbaddr(&scmd.cdb.g1_cdb, track); g1_cdblen(&scmd.cdb.g1_cdb, cnt); if (scsicmd("read track info") < 0) return (-1); return (0);}/* * Needed for JVC too. */EXPORT intclose_track_philips(track, trackp) int track; track_t *trackp;{ return (scsi_flush_cache());}EXPORT intfixation(onp, dummy, type, tracks, trackp) int onp; /* open next program area */ int dummy; int type; /* TOC type 0: CD-DA, 1: CD-ROM, 2: CD-ROM/XA1, 3: CD-ROM/XA2, 4: CDI */ int tracks; track_t *trackp;{ 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 = target; scmd.timeout = 8 * 60; /* Needs up to 4 minutes */ scmd.cdb.g1_cdb.cmd = 0xE9; scmd.cdb.g1_cdb.lun = lun; scmd.cdb.g1_cdb.count[1] = (onp ? 8 : 0) | type; if (scsicmd("fixation") < 0) return (-1); return (0);}EXPORT intscsi_close_tr_session(type, track) int type; int track;{ 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 = target; scmd.timeout = 8 * 60; /* Needs up to 4 minutes */ scmd.cdb.g1_cdb.cmd = 0x5B; scmd.cdb.g1_cdb.lun = lun; scmd.cdb.g1_cdb.addr[0] = type; scmd.cdb.g1_cdb.addr[3] = track;#ifdef nono scmd.cdb.g1_cdb.reladr = 1; /* IMM hack to test Mitsumi behaviour*/#endif if (scsicmd("close track/session") < 0) return (-1); return (0);}EXPORT intscsi_blank(addr, blanktype) long addr; int blanktype;{ 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 = 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); return (scsicmd("blank unit"));}EXPORT intrecover(track) int track;{ 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 = target; scmd.cdb.g1_cdb.cmd = 0xEC; scmd.cdb.g1_cdb.lun = lun; if (scsicmd("recover") < 0) return (-1); return (0);}struct fwa { char len; char addr[4]; char res;};EXPORT intfirst_writable_addr(ap, track, isaudio, preemp, npa) long *ap; int track; int isaudio; int preemp; int npa;{ struct fwa fwa; fillbytes((caddr_t)&fwa, sizeof(fwa), '\0'); fillbytes((caddr_t)&scmd, sizeof(scmd), '\0'); scmd.addr = (caddr_t)&fwa; scmd.size = sizeof(fwa); scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd.cdb_len = SC_G1_CDBLEN; scmd.sense_len = CCS_SENSE_LEN; scmd.target = target; scmd.cdb.g1_cdb.cmd = 0xE2; scmd.cdb.g1_cdb.lun = lun; scmd.cdb.g1_cdb.addr[0] = track; scmd.cdb.g1_cdb.addr[1] = isaudio ? (preemp ? 5 : 4) : 1; scmd.cdb.g1_cdb.count[0] = npa?1:0; scmd.cdb.g1_cdb.count[1] = sizeof(fwa); if (scsicmd("first writeable address") < 0) return (-1); if (ap) *ap = a_to_u_long(fwa.addr); return (0);}EXPORT intreserve_track(len) unsigned long len;{ 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 = target; scmd.cdb.g1_cdb.cmd = 0xE4; scmd.cdb.g1_cdb.lun = lun; i_to_long(&scmd.cdb.g1_cdb.addr[3], len); if (scsicmd("reserve_track") < 0) return (-1); return (0);}/* * XXX First try to handle ATAPI: * XXX ATAPI cannot handle SCSI 6 byte commands. * XXX We try to simulate 6 byte mode sense/select. */LOCAL BOOL is_atapi;EXPORT BOOLallow_atapi(new) BOOL new;{ BOOL old = is_atapi; u_char mode[256]; if (new == old) return (old); silent++; if (new && mode_sense_g1(mode, 8, 0x3F, 0) < 0) { /* All pages current */ new = FALSE; } silent--; is_atapi = new; return (old);}EXPORT intmode_select(dp, cnt, smp, pf) u_char *dp; int cnt; int smp; int pf;{ if (is_atapi) return (mode_select_sg0(dp, cnt, smp, pf)); return (mode_select_g0(dp, cnt, smp, pf));}EXPORT intmode_sense(dp, cnt, page, pcf) u_char *dp; int cnt; int page; int pcf;{ if (is_atapi) return (mode_sense_sg0(dp, cnt, page, pcf)); return (mode_sense_g0(dp, cnt, page, pcf));}/* * Simulate mode select g0 with mode select g1. */EXPORT intmode_select_sg0(dp, cnt, smp, pf) u_char *dp; int cnt; int smp; int pf;{ u_char xmode[256+4]; int amt = cnt; if (amt < 1 || amt > 255) { /* XXX clear SCSI error codes ??? */ return (-1); } if (amt < 4) { /* Data length. medium type & VU */ amt += 1; } else { amt += 4; movebytes(&dp[4], &xmode[8], cnt-4); } xmode[0] = 0; xmode[1] = 0; xmode[2] = dp[1]; xmode[3] = dp[2]; xmode[4] = 0; xmode[5] = 0; i_to_short(&xmode[6], dp[3]); if (verbose) scsiprbytes("Mode Parameters (un-converted)", dp, cnt); return (mode_select_g1(xmode, amt, smp, pf));}/* * Simulate mode sense g0 with mode sense g1. */EXPORT intmode_sense_sg0(dp, cnt, page, pcf) u_char *dp; int cnt; int page; int pcf;{ u_char xmode[256+4]; int amt = cnt; int len; if (amt < 1 || amt > 255) { /* XXX clear SCSI error codes ??? */ return (-1); } fillbytes((caddr_t)xmode, sizeof(scmd), '\0'); if (amt < 4) { /* Data length. medium type & VU */ amt += 1; } else { amt += 4; } if (mode_sense_g1(xmode, amt, page, pcf) < 0) return (-1); amt = cnt - scsigetresid(); if (amt > 4) movebytes(&xmode[8], &dp[4], amt-4); len = a_to_u_short(xmode); if (len == 0) { dp[0] = 0; } else if (len < 6) { if (len > 2) len = 2; dp[0] = len; } else { dp[0] = len - 3; } dp[1] = xmode[2]; dp[2] = xmode[3]; len = a_to_u_short(&xmode[6]); dp[3] = len; if (verbose) scsiprbytes("Mode Sense Data (converted)", dp, amt); return (0);}EXPORT intmode_select_g0(dp, cnt, smp, pf) u_char *dp; int cnt; int smp; int pf;{ fillbytes((caddr_t)&scmd, sizeof(scmd), '\0'); scmd.addr = (caddr_t)dp; scmd.size = cnt; scmd.flags = SCG_DISRE_ENA; scmd.cdb_len = SC_G0_CDBLEN; scmd.sense_len = CCS_SENSE_LEN; scmd.target = target; scmd.cdb.g0_cdb.cmd = SC_MODE_SELECT; scmd.cdb.g0_cdb.lun = lun; scmd.cdb.g0_cdb.high_addr = smp ? 1 : 0 | pf ? 0x10 : 0; scmd.cdb.g0_cdb.count = cnt; if (verbose) { printf("%s ", smp?"Save":"Set "); scsiprbytes("Mode Parameters", dp, cnt); } return (scsicmd("mode select g0"));}EXPORT intmode_select_g1(dp, cnt, smp, pf) u_char *dp; int cnt; int smp; int pf;{ fillbytes((caddr_t)&scmd, sizeof(scmd), '\0'); scmd.addr = (caddr_t)dp; scmd.size = cnt; scmd.flags = SCG_DISRE_ENA; scmd.cdb_len = SC_G1_CDBLEN; scmd.sense_len = CCS_SENSE_LEN; scmd.target = target; scmd.cdb.g1_cdb.cmd = 0x55; scmd.cdb.g1_cdb.lun = lun; scmd.cdb.g0_cdb.high_addr = smp ? 1 : 0 | pf ? 0x10 : 0; g1_cdblen(&scmd.cdb.g1_cdb, cnt); if (verbose) { printf("%s ", smp?"Save":"Set "); scsiprbytes("Mode Parameters", dp, cnt); } return (scsicmd("mode select g1"));}EXPORT intmode_sense_g0(dp, cnt, page, pcf) u_char *dp; int cnt; int page; int pcf;{ fillbytes((caddr_t)&scmd, sizeof(scmd), '\0'); scmd.addr = (caddr_t)dp; scmd.size = 0xFF; scmd.size = cnt; scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd.cdb_len = SC_G0_CDBLEN; scmd.sense_len = CCS_SENSE_LEN; scmd.target = target; scmd.cdb.g0_cdb.cmd = SC_MODE_SENSE; scmd.cdb.g0_cdb.lun = lun;#ifdef nonono scmd.cdb.g0_cdb.high_addr = 1<<4; /* DBD Disable Block desc. */#endif scmd.cdb.g0_cdb.mid_addr = (page&0x3F) | ((pcf<<6)&0xC0); scmd.cdb.g0_cdb.count = page ? 0xFF : 24; scmd.cdb.g0_cdb.count = cnt; if (scsicmd("mode sense g0") < 0) return (-1); if (verbose) scsiprbytes("Mode Sense Data", dp, cnt - scmd.resid); return (0);}EXPORT intmode_sense_g1(dp, cnt, page, pcf) u_char *dp; int cnt; int page; int pcf;{ fillbytes((caddr_t)&scmd, sizeof(scmd), '\0'); scmd.addr = (caddr_t)dp; 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 = target; scmd.cdb.g1_cdb.cmd = 0x5A; scmd.cdb.g1_cdb.lun = lun;#ifdef nonono scmd.cdb.g0_cdb.high_addr = 1<<4; /* DBD Disable Block desc. */#endif scmd.cdb.g1_cdb.addr[0] = (page&0x3F) | ((pcf<<6)&0xC0); g1_cdblen(&scmd.cdb.g1_cdb, cnt); if (scsicmd("mode sense g1") < 0) return (-1); if (verbose) scsiprbytes("Mode Sense Data", dp, cnt - scmd.resid); return (0);}struct cdd_52x_mode_page_21 { /* write track information */ MP_P_CODE; /* parsave & pagecode */ u_char p_len; /* 0x0E = 14 Bytes */ u_char res_2; u_char sectype; u_char track; u_char ISRC[9];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -