📄 drv_jvc.c
字号:
/* * Set pre-gap (pause - index 0) */ set_pgm_subcode(&sc, SC_P, st2mode[trackp->sectype&ST_MASK], ADR_POS, track, 0); if (lverbose > 1) scsiprbytes("Subcode:", (u_char *)&sc, sizeof(sc)); status = set_subcode(scgp, (u_char *)&sc, sizeof(sc)); if (status < 0) return (status); pregapsize = trackp->pregapsize; if (!is_audio(trackp)) { lba_addr += 5; /* link & run in blocks */ pregapsize -= 5; } if (lverbose > 1) { printf("pad_track(%ld, %ld)-> %ld\n", lba_addr, pregapsize, lba_addr + pregapsize); } if (pad_track(scgp, dp, track, trackp, lba_addr, pregapsize*trackp->secsize, FALSE, (long *)0) < 0) return (-1);} blocks = trackp->tracksize/trackp->secsize + (trackp->tracksize%trackp->secsize?1:0); blocks += trackp->padsize/trackp->secsize + (trackp->padsize%trackp->secsize?1:0); if (blocks < 300) blocks = 300; if (!is_audio(trackp)) blocks += 2;if (!is_last(trackp) && trackp[1].pregapsize == 0) blocks -= 150; /* * set the limits for the new subcode - seems to apply to all * of the data track. * Unknown tracksize is handled in open_session. * We definitely need to know the tracksize in this driver. */ if (lverbose > 1) { printf("set_limits(%ld, %ld)-> %ld\n", lba_addr, blocks, lba_addr + blocks); } status = set_limits(scgp, lba_addr, blocks); if (status < 0) return (status); /* * Set track start (index 1) */ set_pgm_subcode(&sc, SC_TR, st2mode[trackp->sectype&ST_MASK], ADR_POS, track, 1); if (lverbose > 1) scsiprbytes("Subcode:", (u_char *)&sc, sizeof(sc)); status = set_subcode(scgp, (u_char *)&sc, sizeof(sc)); if (status < 0) return (status);if (!is_last(trackp) && trackp[1].pregapsize == 0) { blocks += lba_addr; pregapsize = 150; if (lverbose > 1) { printf("set_limits(%ld, %ld)-> %ld\n", blocks, pregapsize, blocks + pregapsize); } status = set_limits(scgp, blocks, pregapsize); if (status < 0) return (status); /* * Set pre-gap (pause - index 0) */ track++; trackp++; set_pgm_subcode(&sc, SC_P, st2mode[trackp->sectype&ST_MASK], ADR_POS, track, 0); if (lverbose > 1) scsiprbytes("Subcode:", (u_char *)&sc, sizeof(sc)); status = set_subcode(scgp, (u_char *)&sc, sizeof(sc)); if (status < 0) return (status);} return (status);}LOCAL char sector[3000];LOCAL intclose_track_teac(scgp, track, trackp) SCSI *scgp; int track; track_t *trackp;{ int ret = 0; if (!last_done) { printf("WARNING: adding dummy block to close track.\n"); /* * need read sector size * XXX do we really need this ? * XXX if we need this can we set blocks to 0 ? */ ret = write_teac_xg1(scgp, sector, lba_addr, 2352, 1, FALSE); lba_addr++; } if (!is_audio(trackp)) lba_addr += 2; teac_wr_pma(scgp); return (ret);}static const char *sd_teac50_error_str[] = { "\100\200diagnostic failure on component parts", /* 40 80 */ "\100\201diagnostic failure on memories", /* 40 81 */ "\100\202diagnostic failure on cd-rom ecc circuit", /* 40 82 */ "\100\203diagnostic failure on gate array", /* 40 83 */ "\100\204diagnostic failure on internal SCSI controller", /* 40 84 */ "\100\205diagnostic failure on servo processor", /* 40 85 */ "\100\206diagnostic failure on program rom", /* 40 86 */ "\100\220thermal sensor failure", /* 40 90 */ "\200\000controller prom error", /* 80 00 */ /* JVC */ "\201\000no disk present - couldn't get focus", /* 81 00 */ /* JVC */ "\202\000no cartridge present", /* 82 00 */ /* JVC */ "\203\000unable to spin up", /* 83 00 */ /* JVC */ "\204\000addr exceeded the last valid block addr", /* 84 00 */ /* JVC */ "\205\000sync error", /* 85 00 */ /* JVC */ "\206\000address can't find or not data track", /* 86 00 */ /* JVC */ "\207\000missing track", /* 87 00 */ /* JVC */ "\213\000cartridge could not be ejected", /* 8B 00 */ /* JVC */ "\215\000audio not playing", /* 8D 00 */ /* JVC */ "\216\000read toc error", /* 8E 00 */ /* JVC */ "\217\000a blank disk is detected by read toc", /* 8F 00 */ "\220\000pma less disk - not a recordable disk", /* 90 00 */ "\223\000mount error", /* 93 00 */ /* JVC */ "\224\000toc less disk", /* 94 00 */ "\225\000disc information less disk", /* 95 00 */ /* JVC */ "\226\000disc information read error", /* 96 00 */ /* JVC */ "\227\000linear velocity measurement error", /* 97 00 */ /* JVC */ "\230\000drive sequence stop", /* 98 00 */ /* JVC */ "\231\000actuator velocity control error", /* 99 00 */ /* JVC */ "\232\000slider velocity control error", /* 9A 00 */ /* JVC */ "\233\000opc initialize error", /* 9B 00 */ "\233\001power calibration not executed", /* 9B 01 */ "\234\000opc execution eror", /* 9C 00 */ "\234\001alpc error - opc execution", /* 9C 01 */ "\234\002opc execution timeout", /* 9C 02 */ "\245\000disk application code does not match host application code", /* A5 00 */ "\255\000completed preview write", /* AD 00 */ "\256\000invalid B0 value", /* AE 00 */ /* JVC */ "\257\000pca area full", /* AF 00 */ "\260\000efm isn't detected", /* B0 00 */ /* JVC */ "\263\000no logical sector", /* B3 00 */ /* JVC */ "\264\000full pma area", /* B4 00 */ "\265\000read address is atip area - blank", /* B5 00 */ "\266\000write address is efm area - aleady written", /* B6 00 */ "\271\000abnormal spinning - servo irq", /* B9 00 */ /* JVC */ "\272\000no write data - buffer empty", /* BA 00 */ "\273\000write emergency occurred", /* BB 00 */ "\274\000read timeout", /* BC 00 */ /* JVC */ "\277\000abnormal spin - nmi", /* BF 00 */ /* JVC */ "\301\0004th run-in block detected", /* C1 00 */ "\302\0003rd run-in block detected", /* C2 00 */ "\303\0002nd run-in block detected", /* C3 00 */ "\304\0001st run-in block detected", /* C4 00 */ "\305\000link block detected", /* C5 00 */ "\306\0001st run-out block detected", /* C6 00 */ "\307\0002nd run-out block detected", /* C7 00 */ "\314\000write request means mixed data mode", /* CC 00 */ "\315\000unable to ensure reliable writing with the inserted disk - unsupported disk", /* CD 00 */ "\316\000unable to ensure reliable writing as the inserted disk does not support speed",/* CE 00 */ "\317\000unable to ensure reliable writing as the inserted disk has no char id code", /* CF 00 */ NULL};LOCAL intteac_attach(scgp, dp) SCSI *scgp; cdr_t *dp;{ scsi_setnonstderrs(scgp, sd_teac50_error_str);#ifdef XXDEBUG xxtest_teac(scgp); exit(0);#endif return (0);}LOCAL intteac_fixation(scgp, onp, dummy, toctype, tracks, trackp) SCSI *scgp; int onp; int dummy; int toctype; int tracks; track_t *trackp;{ long lba; int status; u_char *sp; int i;extern char *buf; if (tracks < 1) { /* * We come here if cdrecord isonly called with the -fix option. * As long as we cannot read and interpret the PMA, we must * abort here. */ teac_rd_pma(scgp);/* errmsgno(EX_BAD, "Cannot fixate zero track disk.\n");;*/ errmsgno(EX_BAD, "Cannot fixate without track list (not yet implemented).\n");; return (-1); } sp = (u_char *)buf; sleep(1); status = clear_subcode(scgp); sleep(1); if (status < 0) return (status); sp[0] = 0; /* reserved */ sp[1] = 0; /* reserved */ sp[2] = 0; /* Q TNO */ sp = &sp[3]; /* point past header */ /* * Set up TOC entries for all tracks */ for(i=1; i <= tracks; i++) { lba = trackp[i].trackstart+150; /* MSF=00:02:00 is LBA=0 */ sp = set_toc_subcode(sp, /* ctrl/adr for this track */ st2mode[trackp[i].sectype&ST_MASK], ADR_POS, trackp[i].trackno, lba); } /* * Set first track on disk * * XXX We set the track type for the lead-in to the track type * XXX of the first track. The TEAC manual states that we should use * XXX audio if the disk contains both, audio and data tracks. */ sp = set_lin_subcode(sp, /* ctrl/adr for first track */ st2mode[trackp[1].sectype&ST_MASK], ADR_POS, 0xA0, /* Point A0 */ trackp[1].trackno, /* first track # */ toc2sess[toctype & TOC_MASK], /* disk type */ 0); /* reserved */ /* * Set last track on disk */ sp = set_lin_subcode(sp, /* ctrl/adr for first track */ st2mode[trackp[1].sectype&ST_MASK], ADR_POS, 0xA1, /* Point A1 */ MSF_CONV(trackp[tracks].trackno),/* last track # */ 0, /* reserved */ 0); /* reserved */ /* * Set start of lead out area in MSF * MSF=00:02:00 is LBA=0 */ lba = lba_addr + 150; if (lverbose > 1) printf("lba: %ld lba_addr: %ld\n", lba, lba_addr); if (lverbose > 1) printf("Lead out start: (%02d:%02d/%02d)\n", minutes(lba*2352), seconds(lba*2352), frames(lba*2352)); sp = set_lin_subcode(sp, /* ctrl/adr for first track */ st2mode[trackp[1].sectype&ST_MASK], ADR_POS, 0xA2, /* Point A2 */ MSF_CONV(LBA_MIN(lba)), MSF_CONV(LBA_SEC(lba)), MSF_CONV(LBA_FRM(lba))); status = sp - ((u_char *)buf); if (lverbose > 1) { printf("Subcode len: %d\n", status); scsiprbytes("Subcode:", (u_char *)buf, status); } status = set_subcode(scgp, (u_char *)buf, status); sleep(1); if (status < 0) return (status); /* * now write the toc */ status = teac_freeze(scgp, !onp); return (status);}LOCAL intteac_open_session(scgp, tracks, trackp, toctype, multi) SCSI *scgp; int tracks; track_t *trackp; int toctype; int multi;{ int i; for (i = 1; i <= tracks; i++) { if (trackp[i].tracksize < 0) { /* * XXX How about setting the subcode range to infinity. * XXX and correct it in clode track before writing * XXX the PMA? */ errmsgno(EX_BAD, "Track %d has unknown length.\n", i); return (-1); } } return (teac_calibrate(scgp, toctype, multi));}LOCAL intteac_calibrate(scgp, toctype, multi) SCSI *scgp; int toctype; int multi;{ int status; scgp->silent++; if (read_B0(scgp, TRUE, &lba_addr, NULL) < 0) lba_addr = -150; scgp->silent--; status = clear_subcode(scgp); if (status < 0) return (status); if (lverbose) { fprintf(stdout, "Judging disk..."); flush(); } status = opt_power_judge(scgp, 1); if (status < 0) { printf("\n"); return (status); } if (lverbose) { fprintf(stdout, "done.\nCalibrating laser..."); flush(); } status = opt_power_judge(scgp, 0); if (lverbose) { fprintf(stdout, "done.\n"); } scgp->silent++; if (next_wr_addr_teac(scgp, -1, -1) < 0) { if (scgp->verbose == 0 && scsi_sense_key(scgp) != SC_ILLEGAL_REQUEST) scsiprinterr(scgp); } scgp->silent--; return (status);}/*--------------------------------------------------------------------------*/#define SC_SET_LIMITS 0xb3 /* teac 12 byte command */#define SC_SET_SUBCODE 0xc2 /* teac 10 byte command */#define SC_READ_PMA 0xc4 /* teac 10 byte command */#define SC_READ_DISK_INFO 0xc7 /* teac 10 byte command */#define SC_BUFFER_INQUIRY 0xe0 /* teac 12 byte command */#define SC_WRITE_PMA 0xe1 /* teac 12 byte command */#define SC_FREEZE 0xe3 /* teac 12 byte command */#define SC_OPC_EXECUTE 0xec /* teac 12 byte command */#define SC_CLEAR_SUBCODE 0xe4 /* teac 12 byte command */#define SC_NEXT_WR_ADDRESS 0xe6 /* teac 12 byte command */#define SC_READ_PEAK_BUF_CAP 0xef /* teac 12 byte command *//* ----------------------------------------------------------------- * Optimum power calibration for Teac Drives.----------------------------------------------------------------- */LOCAL intopt_power_judge(scgp, judge) SCSI *scgp; int judge;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = (caddr_t)0; scmd->size = 0; scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; scmd->cdb_len = SC_G5_CDBLEN; scmd->sense_len = CCS_SENSE_LEN; scmd->target = scgp->target; scmd->timeout = 60; scmd->cdb.g5_cdb.cmd = SC_OPC_EXECUTE; scmd->cdb.g5_cdb.lun = scgp->lun; scmd->cdb.g5_cdb.reladr = judge; /* Judge the Disc */ scgp->cmdname = "opt_power_judge"; return (scsicmd(scgp));}/* ----------------------------------------------------------------- * Clear subcodes for Teac Drives.----------------------------------------------------------------- */LOCAL intclear_subcode(scgp) SCSI *scgp;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = (caddr_t)0; scmd->size = 0; 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 = SC_CLEAR_SUBCODE; scmd->cdb.g5_cdb.lun = scgp->lun; scmd->cdb.g5_cdb.addr[3] = 0x80; scgp->cmdname = "clear subcode"; return (scsicmd(scgp));}/* ----------------------------------------------------------------- * Set limits for command linking for Teac Drives.----------------------------------------------------------------- */LOCAL intset_limits(scgp, lba, length) SCSI *scgp; long lba; long length;{ register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = (caddr_t)0; scmd->size = 0; 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 = SC_SET_LIMITS; scmd->cdb.g5_cdb.lun = scgp->lun; i_to_4_byte(&scmd->cdb.g5_cdb.addr[0], lba); i_to_4_byte(&scmd->cdb.g5_cdb.count[0], length); scgp->cmdname = "set limits"; return (scsicmd(scgp));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -