📄 drv_philips.c
字号:
SCSI *scgp; int *speedp; int dummy;{ if (speedp != 0 && *speedp < 2) { *speedp = 2; if (lverbose) printf("WARNING: setting to minimum speed (2).\n"); } return (speed_select_philips(scgp, speedp, dummy));}LOCAL intspeed_select_oldphilips(scgp, speedp, dummy) SCSI *scgp; int *speedp; int dummy;{ if (lverbose) printf("WARNING: ignoring selected speed.\n"); if (dummy) { errmsgno(EX_BAD, "Cannot set dummy writing for this device.\n"); return (-1); } return (0);}LOCAL intspeed_select_dumbphilips(scgp, speedp, dummy) SCSI *scgp; int *speedp; int dummy;{ if (speed_select_philips(scgp, speedp, dummy) < 0) return (speed_select_oldphilips(scgp, speedp, dummy)); return (0);}#define IS(what,flag) printf(" Is %s%s\n", flag?"":"not ",what);LOCAL intphilips_getdisktype(scgp, dp, dsp) SCSI *scgp; cdr_t *dp; dstat_t *dsp;{ char sbuf[16]; long dummy; long lilen; long lolen; msf_t msf; int audio = -1; scgp->silent++; dummy = (*dp->cdr_next_wr_address)(scgp, 0, (track_t *)0, &lilen); scgp->silent--; /* * Check for "Command sequence error" first. */ if ((dsp->ds_cdrflags & RF_WRITE) != 0 && dummy < 0 && (scsi_sense_key(scgp) != SC_ILLEGAL_REQUEST || scsi_sense_code(scgp) != 0x2C)) { errmsgno(EX_BAD, "Drive needs to reload the media to return to proper status.\n"); unload_media(scgp, dp, F_EJECT); load_media(scgp, dp, TRUE); } scgp->silent++; if (read_subchannel(scgp, sbuf, 0, 12, 0, 1, 0xf0) >= 0) { if (sbuf[2] ==0 && sbuf[3] == 8) audio = (sbuf[7] & 0x40) != 0; } scgp->silent--; if (lverbose && dummy >= 0 && lilen == 0) { scgp->silent++; dummy = philips_getlilo(scgp, &lilen, &lolen); scgp->silent--; if (dummy >= 0) {/* printf("lead-in len: %d lead-out len: %d\n", lilen, lolen);*/ lba_to_msf(-150 - lilen, &msf); printf("ATIP info from disk:\n"); if (audio >= 0) IS("unrestricted", audio); if (audio == 1 || (audio == 0 && (sbuf[7] & 0x3F) != 0x3F)) printf(" Disk application code: %d\n", sbuf[7] & 0x3F); printf(" ATIP start of lead in: %ld (%02d:%02d/%02d)\n", -150 - lilen, msf.msf_min, msf.msf_sec, msf.msf_frame); if (capacity_philips(scgp, &lolen)) { lba_to_msf(lolen, &msf); printf( " ATIP start of lead out: %ld (%02d:%02d/%02d)\n", lolen, msf.msf_min, msf.msf_sec, msf.msf_frame); } lba_to_msf(-150 - lilen, &msf); pr_manufacturer(&msf, FALSE, /* Always not erasable */ audio>0); /* Audio from read subcode */ } } if (capacity_philips(scgp, &lolen)) { dsp->ds_maxblocks = lolen; dsp->ds_maxrblocks = disk_rcap(&msf, dsp->ds_maxblocks, FALSE, /* Always not erasable */ audio>0); /* Audio from read subcode */ } scgp->silent++; /*read_subchannel(scgp, bp, track, cnt, msf, subq, fmt); */ if (read_subchannel(scgp, sbuf, 0, 14, 0, 0, 0xf1) >= 0) scsiprbytes("Disk bar code:", (Uchar *)sbuf, 14 - scsigetresid(scgp)); scgp->silent--; return (drive_getdisktype(scgp, dp, dsp));}LOCAL BOOLcapacity_philips(scgp, lp) SCSI *scgp; long *lp;{ long l = 0L; BOOL succeed = TRUE; scgp->silent++; if (read_B0(scgp, FALSE, NULL, &l) >= 0) { if (debug) printf("lead out B0: %ld\n", l); *lp = l; } else if (read_trackinfo(scgp, 0xAA, &l, NULL, NULL, NULL, NULL) >= 0) { if (debug) printf("lead out AA: %ld\n", l); *lp = l; } if (read_capacity(scgp) >= 0) { l = scgp->cap->c_baddr + 1; if (debug) printf("lead out capacity: %ld\n", l); } else { succeed = FALSE; } *lp = l; scgp->silent--; return (succeed);}struct fwa { char len; char addr[4]; char res;};LOCAL intfirst_writable_addr_philips(scgp, ap, track, isaudio, preemp, npa) SCSI *scgp; long *ap; int track; int isaudio; int preemp; int npa;{ struct fwa fwa; register struct scg_cmd *scmd = scgp->scmd; 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 = scgp->target; scmd->cdb.g1_cdb.cmd = 0xE2; scmd->cdb.g1_cdb.lun = scgp->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); scgp->cmdname = "first writeable address philips"; if (scsicmd(scgp) < 0) return (-1); if (ap) *ap = a_to_4_byte(fwa.addr); return (0);}LOCAL intnext_wr_addr_philips(scgp, track, trackp, ap) SCSI *scgp; int track; track_t *trackp; long *ap;{/* if (first_writable_addr_philips(scgp, ap, 0, 0, 0, 1) < 0)*/ if (first_writable_addr_philips(scgp, ap, 0, 0, 0, 0) < 0) return (-1); return (0);}LOCAL intreserve_track_philips(scgp, len) SCSI *scgp; unsigned long len;{ 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->cdb.g1_cdb.cmd = 0xE4; scmd->cdb.g1_cdb.lun = scgp->lun; i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], len); scgp->cmdname = "philips reserve_track"; if (scsicmd(scgp) < 0) return (-1); return (0);}LOCAL intscsi_cdr_write_philips(scgp, bp, sectaddr, size, blocks, islast) SCSI *scgp; caddr_t bp; /* address of buffer */ long sectaddr; /* disk address (sector) to put */ long size; /* number of bytes to transfer */ int blocks; /* sector count */ BOOL islast; /* last write for track */{ return (write_xg0(scgp, bp, 0, size, blocks));}LOCAL intwrite_track_info_philips(scgp, sectype) SCSI *scgp; int sectype;{ struct cdd_52x_mode_data md; int count = sizeof(struct scsi_mode_header) + sizeof(struct cdd_52x_mode_page_21); fillbytes((caddr_t)&md, sizeof(md), '\0'); md.pagex.page21.p_code = 0x21; md.pagex.page21.p_len = 0x0E; /* is sectype ok ??? */ md.pagex.page21.sectype = sectype; md.pagex.page21.track = 0; /* 0 : create new track */ return (mode_select(scgp, (Uchar *)&md, count, 0, scgp->inq->data_format >= 2));}LOCAL intwrite_track_philips(scgp, track, sectype) SCSI *scgp; long track; /* track number 0 == new track */ int sectype;{ register struct scg_cmd *scmd = scgp->scmd; 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 = scgp->target; scmd->cdb.g1_cdb.cmd = 0xE6; scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdbaddr(&scmd->cdb.g1_cdb, track); scmd->cdb.g1_cdb.res6 = sectype; scgp->cmdname = "philips write_track"; if (scsicmd(scgp) < 0) return (-1); return (0);}LOCAL intopen_track_philips(scgp, dp, track, track_info) SCSI *scgp; cdr_t *dp; int track; track_t *track_info;{ if (select_secsize(scgp, track_info->secsize) < 0) return (-1); if (write_track_info_philips(scgp, track_info->sectype) < 0) return (-1); if (write_track_philips(scgp, 0, track_info->sectype) < 0) return (-1); return (0);}LOCAL intopen_track_oldphilips(scgp, dp, track, track_info) SCSI *scgp; cdr_t *dp; int track; track_t *track_info;{ if (write_track_philips(scgp, 0, track_info->sectype) < 0) return (-1); return (0);}LOCAL intopen_track_yamaha(scgp, dp, track, track_info) SCSI *scgp; cdr_t *dp; int track; track_t *track_info;{ if (select_secsize(scgp, track_info->secsize) < 0) return (-1); if (write_track_philips(scgp, 0, track_info->sectype) < 0) return (-1); return (0);}LOCAL intclose_track_philips(scgp, track, trackp) SCSI *scgp; int track; track_t *trackp;{ return (scsi_flush_cache(scgp));}LOCAL intfixation_philips(scgp, onp, dummy, type, tracks, trackp) SCSI *scgp; 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;{ 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 = 0xE9; scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.g1_cdb.count[1] = (onp ? 8 : 0) | type; scgp->cmdname = "philips fixation"; if (scsicmd(scgp) < 0) return (-1); return (0);}static const char *sd_cdd_521_error_str[] = { "\003\000tray out", /* 0x03 */ "\062\000write data error with CU", /* 0x32 */ /* Yamaha */ "\063\000monitor atip error", /* 0x33 */ "\064\000absorbtion control error", /* 0x34 */#ifdef YAMAHA_CDR_100 /* Is this the same ??? */ "\120\000write operation in progress", /* 0x50 */#endif "\127\000unable to read TOC/PMA/Subcode/ATIP", /* 0x57 */ "\132\000operator medium removal request", /* 0x5a */ "\145\000verify failed", /* 0x65 */ "\201\000illegal track number", /* 0x81 */ "\202\000command now not valid", /* 0x82 */ "\203\000medium removal is prevented", /* 0x83 */ "\204\000tray out", /* 0x84 */ "\205\000track at one not in PMA", /* 0x85 */ "\240\000stopped on non data block", /* 0xa0 */ "\241\000invalid start adress", /* 0xa1 */ "\242\000attampt to cross track-boundary", /* 0xa2 */ "\243\000illegal medium", /* 0xa3 */ "\244\000disk write protected", /* 0xa4 */ "\245\000application code conflict", /* 0xa5 */ "\246\000illegal blocksize for command", /* 0xa6 */ "\247\000blocksize conflict", /* 0xa7 */ "\250\000illegal transfer length", /* 0xa8 */ "\251\000request for fixation failed", /* 0xa9 */ "\252\000end of medium reached", /* 0xaa */#ifdef REAL_CDD_521 "\253\000non reserved reserved track", /* 0xab */#else "\253\000illegal track number", /* 0xab */#endif "\254\000data track length error", /* 0xac */ "\255\000buffer under run", /* 0xad */ "\256\000illegal track mode", /* 0xae */ "\257\000optical power calibration error", /* 0xaf */ "\260\000calibration area almost full", /* 0xb0 */ "\261\000current program area empty", /* 0xb1 */ "\262\000no efm at search address", /* 0xb2 */ "\263\000link area encountered", /* 0xb3 */ "\264\000calibration area full", /* 0xb4 */ "\265\000dummy data blocks added", /* 0xb5 */ "\266\000block size format conflict", /* 0xb6 */ "\267\000current command aborted", /* 0xb7 */ "\270\000program area not empty", /* 0xb8 */#ifdef YAMAHA_CDR_100 /* Used while writing lead in in DAO */ "\270\000write leadin in progress", /* 0xb8 */#endif "\271\000parameter list too large", /* 0xb9 */ "\277\000buffer overflow", /* 0xbf */ /* Yamaha */ "\300\000no barcode available", /* 0xc0 */ "\301\000barcode reading error", /* 0xc1 */ "\320\000recovery needed", /* 0xd0 */ "\321\000cannot recover track", /* 0xd1 */ "\322\000cannot recover pma", /* 0xd2 */ "\323\000cannot recover leadin", /* 0xd3 */ "\324\000cannot recover leadout", /* 0xd4 */ "\325\000cannot recover opc", /* 0xd5 */ "\326\000eeprom failure", /* 0xd6 */ "\340\000laser current over", /* 0xe0 */ /* Yamaha */ "\341\000servo adjustment over", /* 0xe0 */ /* Yamaha */ NULL};static const char *sd_ro1420_error_str[] = { "\004\000logical unit is in process of becoming ready", /* 04 00 */ "\011\200radial skating error", /* 09 80 */ "\011\201sledge servo failure", /* 09 81 */ "\011\202pll no lock", /* 09 82 */ "\011\203servo off track", /* 09 83 */ "\011\204atip sync error", /* 09 84 */ "\011\205atip/subcode jumped error", /* 09 85 */ "\127\300subcode not found", /* 57 C0 */ "\127\301atip not found", /* 57 C1 */ "\127\302no atip or subcode", /* 57 C2 */ "\127\303pma error", /* 57 C3 */ "\127\304toc read error", /* 57 C4 */ "\127\305disk informatoion error", /* 57 C5 */ "\144\200read in leadin", /* 64 80 */ "\144\201read in leadout", /* 64 81 */ "\201\000illegal track", /* 81 00 */ "\202\000command not now valid", /* 82 00 */ "\220\000reserve track check error", /* 90 00 */ "\220\001verify blank error", /* 90 01 */ "\221\001mode of last track error", /* 91 01 */ "\222\000header search error", /* 92 00 */ "\230\001header monitor error", /* 98 01 */ "\230\002edc error", /* 98 02 */ "\230\003read link, run-in run-out", /* 98 03 */ "\230\004last one block error", /* 98 04 */ "\230\005illegal blocksize", /* 98 05 */ "\230\006not all data transferred", /* 98 06 */ "\230\007cdbd over run error", /* 98 07 */ "\240\000stopped on non_data block", /* A0 00 */ "\241\000invalid start address", /* A1 00 */ "\243\000illegal medium", /* A3 00 */ "\246\000illegal blocksize for command", /* A6 00 */ "\251\000request for fixation failed", /* A9 00 */ "\252\000end of medium reached", /* AA 00 */ "\253\000illegal track number", /* AB 00 */ "\255\000buffer underrun", /* AD 00 */ "\256\000illegal track mode", /* AE 00 */ "\257\200power range error", /* AF 80 */ "\257\201moderation error", /* AF 81 */ "\257\202beta upper range error", /* AF 82 */ "\257\203beta lower range error", /* AF 83 */ "\257\204alpha upper range error", /* AF 84 */ "\257\205alpha lower range error", /* AF 85 */ "\257\206alpha and power range error", /* AF 86 */ "\260\000calibration area almost full", /* B0 00 */ "\261\000current program area empty", /* B1 00 */ "\262\000no efm at search address", /* B2 00 */ "\264\000calibration area full", /* B4 00 */ "\265\000dummy blocks added", /* B5 00 */ "\272\000write audio on reserved track", /* BA 00 */ "\302\200syscon rom error", /* C2 80 */ "\302\201syscon ram error", /* C2 81 */ "\302\220efm encoder error", /* C2 90 */ "\302\221efm decoder error", /* C2 91 */ "\302\222servo ic error", /* C2 92 */ "\302\223motor controller error", /* C2 93 */ "\302\224dac error", /* C2 94 */ "\302\225syscon eeprom error", /* C2 95 */ "\302\240block decoder communication error", /* C2 A0 */ "\302\241block encoder communication error", /* C2 A1 */ "\302\242block encoder/decoder path error", /* C2 A2 */ "\303\000CD-R engine selftest error", /* C3 xx */ "\304\000buffer parity error", /* C4 00 */ "\305\000data transfer error", /* C5 00 */ "\340\00012V failure", /* E0 00 */ "\341\000undefined syscon error", /* E1 00 */ "\341\001syscon communication error", /* E1 01 */ "\341\002unknown syscon error", /* E1 02 */ "\342\000syscon not ready", /* E2 00 */ "\343\000command rejected", /* E3 00 */ "\344\000command not accepted", /* E4 00 */ "\345\000verify error at beginning of track", /* E5 00 */ "\345\001verify error at ending of track", /* E5 01 */ "\345\002verify error at beginning of lead-in", /* E5 02 */ "\345\003verify error at ending of lead-in", /* E5 03 */ "\345\004verify error at beginning of lead-out", /* E5 04 */ "\345\005verify error at ending of lead-out", /* E5 05 */ "\377\000command phase timeout error", /* FF 00 */ "\377\001data in phase timeout error", /* FF 01 */ "\377\002data out phase timeout error", /* FF 02 */ "\377\003status phase timeout error", /* FF 03 */ "\377\004message in phase timeout error", /* FF 04 */ "\377\005message out phase timeout error", /* FF 05 */ NULL};LOCAL intphilips_attach(scgp, dp) SCSI *scgp; cdr_t *dp;{ scsi_setnonstderrs(scgp, sd_cdd_521_error_str); return (0);}LOCAL intplasmon_attach(scgp, dp) SCSI *scgp; cdr_t *dp;{ scgp->inq->data_format = 1; /* Correct the ly */ scsi_setnonstderrs(scgp, sd_cdd_521_error_str); return (0);}LOCAL intricoh_attach(scgp, dp) SCSI *scgp; cdr_t *dp;{ if (dp == &cdr_ricoh_ro1060) { errmsgno(EX_BAD, "No support for Ricoh RO-1060C\n"); return (-1); } scsi_setnonstderrs(scgp, sd_ro1420_error_str); return (0);}LOCAL intphilips_getlilo(scgp, lilenp, lolenp) SCSI *scgp; long *lilenp; long *lolenp;{ char buf[4]; long li, lo; register struct scg_cmd *scmd = scgp->scmd; fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); scmd->addr = buf; scmd->size = sizeof(buf);; 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 = 0xEE; /* Read session info */ scmd->cdb.g1_cdb.lun = scgp->lun; g1_cdblen(&scmd->cdb.g1_cdb, sizeof(buf)); scgp->cmdname = "philips read session info"; if (scsicmd(scgp) < 0) return (-1); if (scgp->verbose) scsiprbytes("Session info data: ", (u_char *)buf, sizeof(buf) - scsigetresid(scgp)); li = a_to_u_2_byte(buf); lo = a_to_u_2_byte(&buf[2]); if (lilenp) *lilenp = li; if (lolenp) *lolenp = lo; return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -