📄 scsi_cdr.c
字号:
else if (strbeg("CDD521", prod_ident)) scgp->dev = DEV_CDD_521; if (strbeg("CDD522", prod_ident)) scgp->dev = DEV_CDD_522; if (strbeg("PCD225", prod_ident)) scgp->dev = DEV_CDD_522; if (strbeg("KHSW/OB", prod_ident)) /* PCD600 */ scgp->dev = DEV_PCD_600; if (strbeg("CDR-240", prod_ident)) scgp->dev = DEV_CDD_2000; if (strbeg("CDD20", prod_ident)) scgp->dev = DEV_CDD_2000; if (strbeg("CDD26", prod_ident)) scgp->dev = DEV_CDD_2600; if (strbeg("C4324/C4325", prod_ident)) scgp->dev = DEV_CDD_2000; if (strbeg("CD-Writer 6020", prod_ident)) scgp->dev = DEV_CDD_2600; } else if (strbeg("PINNACLE", vendor_info)) { if (strbeg("RCD-1000", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; if (strbeg("RCD5020", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; if (strbeg("RCD5040", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; if (strbeg("RCD 4X4", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; } else if (strbeg("PIONEER", vendor_info)) { if (strbeg("CD-WO DW-S114X", prod_ident)) scgp->dev = DEV_PIONEER_DW_S114X; else if (strbeg("DVD-R DVR-S101", prod_ident)) scgp->dev = DEV_PIONEER_DVDR_S101; } else if (strbeg("PLASMON", vendor_info)) { if (strbeg("RF4100", prod_ident)) scgp->dev = DEV_PLASMON_RF_4100; else if (strbeg("CDR4220", prod_ident)) scgp->dev = DEV_CDD_2000; } else if (strbeg("PLEXTOR", vendor_info)) { if (strbeg("CD-R PX-R24CS", prod_ident)) scgp->dev = DEV_RICOH_RO_1420C; } else if (strbeg("RICOH", vendor_info)) { if (strbeg("RO-1420C", prod_ident)) scgp->dev = DEV_RICOH_RO_1420C; if (strbeg("RO1060C", prod_ident)) scgp->dev = DEV_RICOH_RO_1060C; } else if (strbeg("SAF", vendor_info)) { /* Smart & Friendly */ if (strbeg("CD-R2004", prod_ident) || strbeg("CD-R2006 ", prod_ident)) scgp->dev = DEV_SONY_CDU_924; else if (strbeg("CD-R2006PLUS", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; else if (strbeg("CD-RW226", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; else if (strbeg("CD-R4012", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; } else if (strbeg("SANYO", vendor_info)) { if (strbeg("CD-WO CRD-R24S", prod_ident)) scgp->dev = DEV_CDD_521; } else if (strbeg("SONY", vendor_info)) { if (strbeg("CD-R CDU92", prod_ident) || strbeg("CD-R CDU94", prod_ident)) scgp->dev = DEV_SONY_CDU_924; } else if (strbeg("TEAC", vendor_info)) { if (strbeg("CD-R50S", prod_ident) || strbeg("CD-R55S", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; } else if (strbeg("TRAXDATA", vendor_info) || strbeg("Traxdata", vendor_info)) { if (strbeg("CDR4120", prod_ident)) scgp->dev = DEV_TEAC_CD_R50S; } else if (strbeg("T.YUDEN", vendor_info)) { if (strbeg("CD-WO EW-50", prod_ident)) scgp->dev = DEV_CDD_521; } else if (strbeg("WPI", vendor_info)) { /* Wearnes */ if (strbeg("CDR-632P", prod_ident)) scgp->dev = DEV_CDD_2600; } else if (strbeg("YAMAHA", vendor_info)) { if (strbeg("CDR10", prod_ident)) scgp->dev = DEV_YAMAHA_CDR_100; if (strbeg("CDR200", prod_ident)) scgp->dev = DEV_YAMAHA_CDR_400; if (strbeg("CDR400", prod_ident)) scgp->dev = DEV_YAMAHA_CDR_400; } else if (strbeg("MATSHITA", vendor_info)) { if (strbeg("CD-R CW-7501", prod_ident)) scgp->dev = DEV_MATSUSHITA_7501; if (strbeg("CD-R CW-7502", prod_ident)) scgp->dev = DEV_MATSUSHITA_7502; } if (scgp->dev == DEV_UNKNOWN) { /* * We do not have Manufacturer strings for * the following drives. */ if (strbeg("CDS615E", prod_ident)) /* Olympus */ scgp->dev = DEV_SONY_CDU_924; } if (scgp->dev == DEV_UNKNOWN && inq->type == INQ_ROMD) { BOOL cdrr = FALSE; BOOL cdwr = FALSE; BOOL cdrrw = FALSE; BOOL cdwrw = FALSE; BOOL dvd = FALSE; scgp->dev = DEV_CDROM; if (mmc_check(scgp, &cdrr, &cdwr, &cdrrw, &cdwrw, &dvd)) scgp->dev = DEV_MMC_CDROM; if (cdwr) scgp->dev = DEV_MMC_CDR; if (cdwrw) scgp->dev = DEV_MMC_CDRW; if (dvd) scgp->dev = DEV_MMC_DVD; } case INQ_PROCD: if (strbeg("BERTHOLD", vendor_info)) { if (strbeg("", prod_ident)) scgp->dev = DEV_HRSCAN; } break; case INQ_SCAN: scgp->dev = DEV_MS300A; break; } scgp->silent--; if (!print) return (TRUE); if (scgp->dev == DEV_UNKNOWN && !got_inquiry) {#ifdef PRINT_INQ_ERR scsiprinterr(scgp);#endif return (FALSE); } printf("Device type : "); scsiprintdev(inq); printf("Version : %d\n", inq->ansi_version); printf("Response Format: %d\n", inq->data_format); if (inq->data_format >= 2) { printf("Capabilities : "); if (inq->aenc) printf("AENC "); if (inq->termiop) printf("TERMIOP "); if (inq->reladr) printf("RELADR "); if (inq->wbus32) printf("WBUS32 "); if (inq->wbus16) printf("WBUS16 "); if (inq->sync) printf("SYNC "); if (inq->linked) printf("LINKED "); if (inq->cmdque) printf("CMDQUE "); if (inq->softreset) printf("SOFTRESET "); printf("\n"); } if (inq->add_len >= 31 || inq->info[0] || inq->ident[0] || inq->revision[0]) { printf("Vendor_info : '%.8s'\n", inq->info); printf("Identifikation : '%.16s'\n", inq->ident); printf("Revision : '%.4s'\n", inq->revision); } return (TRUE);}EXPORT voidprintdev(scgp) SCSI *scgp;{ printf("Device seems to be: "); switch (scgp->dev) { case DEV_UNKNOWN: printf("unknown"); break; case DEV_ACB40X0: printf("Adaptec 4000/4010/4070");break; case DEV_ACB4000: printf("Adaptec 4000"); break; case DEV_ACB4010: printf("Adaptec 4010"); break; case DEV_ACB4070: printf("Adaptec 4070"); break; case DEV_ACB5500: printf("Adaptec 5500"); break; case DEV_ACB4520A: printf("Adaptec 4520A"); break; case DEV_ACB4525: printf("Adaptec 4525"); break; case DEV_MD21: printf("Emulex MD21"); break; case DEV_MD23: printf("Emulex MD23"); break; case DEV_NON_CCS_DSK: printf("Generic NON CCS Disk"); break; case DEV_CCS_GENDISK: printf("Generic CCS Disk"); break; case DEV_SONY_SMO: printf("Sony SMO-C501"); break; case DEV_MT02: printf("Emulex MT02"); break; case DEV_SC4000: printf("Sysgen SC4000"); break; case DEV_RXT800S: printf("Maxtor RXT800S"); break; case DEV_HRSCAN: printf("Berthold HR-Scanner"); break; case DEV_MS300A: printf("Microtek MS300A"); break; case DEV_CDROM: printf("Generic CD-ROM"); break; case DEV_MMC_CDROM: printf("Generic mmc CD-ROM"); break; case DEV_MMC_CDR: printf("Generic mmc CD-R"); break; case DEV_MMC_CDRW: printf("Generic mmc CD-RW"); break; case DEV_MMC_DVD: printf("Generic mmc2 DVD"); break; case DEV_CDD_521_OLD: printf("Philips old CDD-521"); break; case DEV_CDD_521: printf("Philips CDD-521"); break; case DEV_CDD_522: printf("Philips CDD-522"); break; case DEV_PCD_600: printf("Kodak PCD-600"); break; case DEV_CDD_2000: printf("Philips CDD-2000"); break; case DEV_CDD_2600: printf("Philips CDD-2600"); break; case DEV_YAMAHA_CDR_100:printf("Yamaha CDR-100"); break; case DEV_YAMAHA_CDR_400:printf("Yamaha CDR-400"); break; case DEV_PLASMON_RF_4100:printf("Plasmon RF-4100"); break; case DEV_SONY_CDU_924: printf("Sony CDU-924S"); break; case DEV_RICOH_RO_1060C:printf("Ricoh RO-1060C"); break; case DEV_RICOH_RO_1420C:printf("Ricoh RO-1420C"); break; case DEV_TEAC_CD_R50S: printf("Teac CD-R50S"); break; case DEV_MATSUSHITA_7501:printf("Matsushita CW-7501"); break; case DEV_MATSUSHITA_7502:printf("Matsushita CW-7502"); break; case DEV_PIONEER_DW_S114X: printf("Pioneer DW-S114X"); break; case DEV_PIONEER_DVDR_S101:printf("Pioneer DVD-R S101");break; default: printf("Missing Entry for dev %d", scgp->dev); break; } printf(".\n");}EXPORT BOOLdo_inquiry(scgp, print) SCSI *scgp; int print;{ if (getdev(scgp, print)) { if (print) printdev(scgp); return (TRUE); } else { return (FALSE); }}EXPORT BOOLrecovery_needed(scgp) SCSI *scgp;{ int err; register struct scg_cmd *scmd = scgp->scmd; scgp->silent++; err = test_unit_ready(scgp); scgp->silent--; if (err >= 0) return (FALSE); else if (scmd->error >= SCG_FATAL) /* nicht selektierbar */ return (FALSE); if (scmd->sense.code < 0x70) /* non extended Sense */ return (FALSE); /* XXX Old Philips code */ return (((struct scsi_ext_sense *)&scmd->sense)->sense_code == 0xD0);}EXPORT intscsi_load(scgp) SCSI *scgp;{ return (scsi_start_stop_unit(scgp, 1, 1));}EXPORT intscsi_unload(scgp) SCSI *scgp;{ return (scsi_start_stop_unit(scgp, 0, 1));}EXPORT intscsi_cdr_write(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_xg1(scgp, bp, sectaddr, size, blocks));}EXPORT struct cd_mode_page_2A *mmc_cap(scgp, modep) SCSI *scgp; Uchar *modep;{ int len; int val; Uchar mode[0x100]; struct cd_mode_page_2A *mp; struct cd_mode_page_2A *mp2;retry: fillbytes((caddr_t)mode, sizeof(mode), '\0'); if (!get_mode_params(scgp, 0x2A, "CD capabilities", mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { if (scsi_sense_key(scgp) == SC_NOT_READY) { if (wait_unit_ready(scgp, 60)) goto retry; } return (NULL); /* Pre SCSI-3/mmc drive */ } if (len == 0) /* Pre SCSI-3/mmc drive */ return (NULL); mp = (struct cd_mode_page_2A *) (mode + sizeof(struct scsi_mode_header) + ((struct scsi_mode_header *)mode)->blockdesc_len); /* * Do some heuristics against pre SCSI-3/mmc VU page 2A * We should test for a minimum p_len of 0x14, but some * buggy CD-ROM readers ommit the write speed values. */ if (mp->p_len < 0x10) return (NULL); val = a_to_u_2_byte(mp->max_read_speed); if (val != 0 && val < 176) return (NULL); val = a_to_u_2_byte(mp->cur_read_speed); if (val != 0 && val < 176) return (NULL); len -= sizeof(struct scsi_mode_header) + ((struct scsi_mode_header *)mode)->blockdesc_len; if (modep) mp2 = (struct cd_mode_page_2A *)modep; else mp2 = (struct cd_mode_page_2A *)malloc(len); if (mp2) movebytes(mp, mp2, len); return (mp2);}EXPORT voidmmc_getval(mp, cdrrp, cdwrp, cdrrwp, cdwrwp, dvdp) struct cd_mode_page_2A *mp; BOOL *cdrrp; BOOL *cdwrp; BOOL *cdrrwp; BOOL *cdwrwp; BOOL *dvdp;{ BOOL isdvd; /* Any DVD drive */ BOOL isdvd_wr; /* DVD writer (R / RAM) */ BOOL iscd_wr; /* CD writer */ iscd_wr = (mp->cd_r_write != 0) || /* SCSI-3/mmc CD-R */ (mp->cd_rw_write != 0); /* SCSI-3/mmc CD-RW */ if (cdrrp) *cdrrp = (mp->cd_r_read != 0); /* SCSI-3/mmc CD */ if (cdwrp) *cdwrp = (mp->cd_r_write != 0); /* SCSI-3/mmc CD-R */ if (cdrrwp) *cdrrwp = (mp->cd_rw_read != 0);/* SCSI-3/mmc CD */ if (cdwrwp) *cdwrwp = (mp->cd_rw_write != 0);/* SCSI-3/mmc CD-RW */ isdvd = /* SCSI-3/mmc2 DVD */ (mp->dvd_ram_read + mp->dvd_r_read + mp->dvd_rom_read + mp->dvd_ram_write + mp->dvd_r_write) != 0; isdvd_wr = /* SCSI-3/mmc2 DVD */ (mp->dvd_ram_write + mp->dvd_r_write) != 0; if (dvdp) { *dvdp = FALSE; if (isdvd) *dvdp = TRUE; if (!isdvd_wr) *dvdp = FALSE; }}EXPORT BOOLis_mmc(scgp, dvdp) SCSI *scgp; BOOL *dvdp;{ return (mmc_check(scgp, NULL, NULL, NULL, NULL, dvdp));}EXPORT BOOLmmc_check(scgp, cdrrp, cdwrp, cdrrwp, cdwrwp, dvdp) SCSI *scgp; BOOL *cdrrp; BOOL *cdwrp; BOOL *cdrrwp; BOOL *cdwrwp; BOOL *dvdp;{ Uchar mode[0x100]; BOOL was_atapi; struct cd_mode_page_2A *mp; if (scgp->inq->type != INQ_ROMD) return (FALSE); fillbytes((caddr_t)mode, sizeof(mode), '\0'); was_atapi = allow_atapi(scgp, TRUE); scgp->silent++; mp = mmc_cap(scgp, mode); scgp->silent--; allow_atapi(scgp, was_atapi); if (mp == NULL) return (FALSE); mmc_getval(mp, cdrrp, cdwrp, cdrrwp, cdwrwp, dvdp); return (TRUE); /* Generic SCSI-3/mmc CD */}#define DOES(what,flag) printf(" Does %s%s\n", flag?"":"not ",what);#define IS(what,flag) printf(" Is %s%s\n", flag?"":"not ",what);#define VAL(what,val) printf(" %s: %d\n", what, val[0]*256 + val[1]);#define SVAL(what,val) printf(" %s: %s\n", what, val);EXPORT voidprint_capabilities(scgp) SCSI *scgp;{ BOOL was_atapi; Uchar mode[0x100]; struct cd_mode_page_2A *mp;static const char *bclk[4] = {"32", "16", "24", "24 (I2S)"};static const char *load[8] = {"caddy", "tray", "pop-up", "reserved(3)", "disc changer", "cartridge changer", "reserved(6)", "reserved(7)" }; if (scgp->inq->type != INQ_ROMD) return; fillbytes((caddr_t)mode, sizeof(mode), '\0'); was_atapi = allow_atapi(scgp, TRUE); /* Try to switch to 10 byte mode cmds */ scgp->silent++; mp = mmc_cap(scgp, mode); scgp->silent--; allow_atapi(scgp, was_atapi); if (mp == NULL) return; printf ("\nDrive capabilities, per page 2A:\n\n"); DOES("read CD-R media", mp->cd_r_read); DOES("write CD-R media", mp->cd_r_write); DOES("read CD-RW media", mp->cd_rw_read); DOES("write CD-RW media", mp->cd_rw_write); DOES("read DVD-ROM media", mp->dvd_rom_read); DOES("read DVD-R media", mp->dvd_r_read); DOES("write DVD-R media", mp->dvd_r_write); DOES("read DVD-RAM media", mp->dvd_ram_read); DOES("write DVD-RAM media", mp->dvd_ram_write); DOES("support test writing", mp->test_write); printf("\n"); DOES("read Mode 2 Form 1 blocks", mp->mode_2_form_1); DOES("read Mode 2 Form 2 blocks", mp->mode_2_form_2); DOES("read digital audio blocks", mp->cd_da_supported); if (mp->cd_da_supported) DOES("restart non-streamed digital audio reads accurately", mp->cd_da_accurate); DOES("support BURN-Proof (Sanyo)", mp->res_4); DOES("read multi-session CDs", mp->multi_session); DOES("read fixed-packet CD media using Method 2", mp->method2); DOES("read CD bar code", mp->read_bar_code); DOES("read R-W subcode information", mp->rw_supported); if (mp->rw_supported) DOES("return R-W subcode de-interleaved and error-corrected", mp->rw_deint_corr); DOES("read raw P-W subcode data from lead in", mp->pw_in_lead_in); DOES("return CD media catalog number", mp->UPC); DOES("return CD ISRC information", mp->ISRC); DOES("support C2 error pointers", mp->c2_pointers); DOES("deliver composite A/V data", mp->composite); printf("\n"); DOES("play audio CDs", mp->audio_play); if (mp->audio_play) { VAL("Number of volume control levels", mp->num_vol_levels); DOES("support individual volume control setting for each channel", mp->sep_chan_vol); DOES("support independent mute setting for each channel", mp->sep_chan_mute); DOES("support digital output on port 1", mp->digital_port_1); DOES("support digital output on port 2", mp->digital_port_2); if (mp->digital_port_1 || mp->digital_port_2) { DOES("send digital data LSB-first", mp->LSBF); DOES("set LRCK high for left-channel data", mp->RCK); DOES("have valid data on falling edge of clock", mp->BCK); SVAL("Length of data in BCLKs", bclk[mp->length]); } } printf("\n"); SVAL("Loading mechanism type", load[mp->loading_type]); DOES("support ejection of CD via START/STOP command", mp->eject); DOES("lock media on power up via prevent jumper", mp->prevent_jumper); DOES("allow media to be locked in the drive via PREVENT/ALLOW command", mp->lock); IS("currently in a media-locked state", mp->lock_state); DOES("support changing side of disk", mp->side_change); DOES("have load-empty-slot-in-changer feature", mp->sw_slot_sel); DOES("support Individual Disk Present feature", mp->disk_present_rep); printf("\n"); VAL("Maximum read speed in kB/s", mp->max_read_speed);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -