📄 scsi_cdr.c
字号:
} } } else if (verbose) { int i; int len = inq.add_len + 5; Uchar ibuf[256+5]; Uchar *ip = (Uchar *)&inq; Uchar c; if (len > sizeof (inq) && inquiry((caddr_t)ibuf, inq.add_len+5) >= 0) { len = inq.add_len+5 - scsigetresid(); ip = ibuf; } else { len = sizeof (inq); } printf("Inquiry Data : "); for (i = 0; i < len; i++) { c = ip[i]; if (c >= ' ' && c < 0177) printf("%c", c); else printf("."); } printf("\n"); } strncpy(vendor_info, inq.vendor_info, sizeof(inq.vendor_info)); strncpy(prod_ident, inq.prod_ident, sizeof(inq.prod_ident)); strncpy(prod_revision, inq.prod_revision, sizeof(inq.prod_revision)); vendor_info[sizeof(inq.vendor_info)] = '\0'; prod_ident[sizeof(inq.prod_ident)] = '\0'; prod_revision[sizeof(inq.prod_revision)] = '\0'; switch (inq.type) { case INQ_DASD: if (inq.add_len == 0) { if (dev == DEV_UNKNOWN && got_inquiry) { dev = DEV_ACB5500; strcpy(inq.vendor_info, "ADAPTEC ACB-5500 FAKE"); } else switch (dev) { case DEV_ACB40X0: strcpy(inq.vendor_info, "ADAPTEC ACB-40X0 FAKE"); break; case DEV_ACB4000: strcpy(inq.vendor_info, "ADAPTEC ACB-4000 FAKE"); break; case DEV_ACB4010: strcpy(inq.vendor_info, "ADAPTEC ACB-4010 FAKE"); break; case DEV_ACB4070: strcpy(inq.vendor_info, "ADAPTEC ACB-4070 FAKE"); break; } } else if (inq.add_len < 31) { dev = DEV_NON_CCS_DSK; } else if (strbeg("EMULEX", vendor_info)) { if (strbeg("MD21", prod_ident)) dev = DEV_MD21; if (strbeg("MD23", prod_ident)) dev = DEV_MD23; else dev = DEV_CCS_GENDISK; } else if (strbeg("ADAPTEC", vendor_info)) { if (strbeg("ACB-4520", prod_ident)) dev = DEV_ACB4520A; if (strbeg("ACB-4525", prod_ident)) dev = DEV_ACB4525; else dev = DEV_CCS_GENDISK; } else if (strbeg("SONY", vendor_info) && strbeg("SMO-C501", prod_ident)) { dev = DEV_SONY_SMO; } else { dev = DEV_CCS_GENDISK; } break; case INQ_SEQD: if (dev == DEV_SC4000) { strcpy(inq.vendor_info, "SYSGEN SC4000 FAKE"); } else if (inq.add_len == 0 && inq.removable && inq.ansi_version == 1) { dev = DEV_MT02; strcpy(inq.vendor_info, "EMULEX MT02 FAKE"); } break;/* case INQ_OPTD:*/ case INQ_ROMD: case INQ_WORM: if (strbeg("RXT-800S", prod_ident)) dev = DEV_RXT800S; /* * Start of CD-Recorders: */ if (strbeg("GRUNDIG", vendor_info)) { if (strbeg("CDR100IPW", prod_ident)) dev = DEV_CDD_2000; } else if (strbeg("JVC", vendor_info)) { if (strbeg("XR-W2001", prod_ident)) dev = DEV_TEAC_CD_R50S; else if (strbeg("XR-W2010", prod_ident)) dev = DEV_TEAC_CD_R50S; else if (strbeg("R2626", prod_ident)) dev = DEV_TEAC_CD_R50S; } else if (strbeg("MITSBISH", vendor_info)) {#ifdef XXXX_REALLY /* It's MMC compliant */ if (strbeg("CDRW226", prod_ident)) dev = DEV_MMC_CDRW;#endif } else if (strbeg("MITSUMI", vendor_info)) { /* Don't know any product string */ dev = DEV_CDD_522; } else if (strbeg("PHILIPS", vendor_info) || strbeg("IMS", vendor_info) || strbeg("KODAK", vendor_info) || strbeg("HP", vendor_info)) { if (strbeg("CDD521/00", prod_ident)) dev = DEV_CDD_521_OLD; else if (strbeg("CDD521", prod_ident)) dev = DEV_CDD_521; if (strbeg("CDD522", prod_ident)) dev = DEV_CDD_522; if (strbeg("PCD225", prod_ident)) dev = DEV_CDD_522; if (strbeg("KHSW/OB", prod_ident)) /* PCD600 */ dev = DEV_PCD_600; if (strbeg("CDR-240", prod_ident)) dev = DEV_CDD_2000; if (strbeg("CDD20", prod_ident)) dev = DEV_CDD_2000; if (strbeg("CDD26", prod_ident)) dev = DEV_CDD_2600; if (strbeg("C4324/C4325", prod_ident)) dev = DEV_CDD_2000; if (strbeg("CD-Writer 6020", prod_ident)) dev = DEV_CDD_2600; } else if (strbeg("PINNACLE", vendor_info)) { if (strbeg("RCD-1000", prod_ident)) dev = DEV_TEAC_CD_R50S; if (strbeg("RCD5020", prod_ident)) dev = DEV_TEAC_CD_R50S; if (strbeg("RCD5040", prod_ident)) dev = DEV_TEAC_CD_R50S; if (strbeg("RCD 4X4", prod_ident)) dev = DEV_TEAC_CD_R50S; } else if (strbeg("PIONEER", vendor_info)) { if (strbeg("CD-WO DW-S114X", prod_ident)) dev = DEV_PIONEER_DW_S114X; else if (strbeg("DVD-R DVR-S101", prod_ident)) dev = DEV_PIONEER_DVDR_S101; } else if (strbeg("PLASMON", vendor_info)) { if (strbeg("RF4100", prod_ident)) dev = DEV_PLASMON_RF_4100; else if (strbeg("CDR4220", prod_ident)) dev = DEV_CDD_2000; } else if (strbeg("PLEXTOR", vendor_info)) { if (strbeg("CD-R PX-R24CS", prod_ident)) dev = DEV_RICOH_RO_1420C; } else if (strbeg("RICOH", vendor_info)) { if (strbeg("RO-1420C", prod_ident)) dev = DEV_RICOH_RO_1420C; } else if (strbeg("SAF", vendor_info)) { /* Smart & Friendly */ if (strbeg("CD-R2004", prod_ident) || strbeg("CD-R2006 ", prod_ident)) dev = DEV_SONY_CDU_924; else if (strbeg("CD-R2006PLUS", prod_ident)) dev = DEV_TEAC_CD_R50S; else if (strbeg("CD-RW226", prod_ident)) dev = DEV_TEAC_CD_R50S; else if (strbeg("CD-R4012", prod_ident)) dev = DEV_TEAC_CD_R50S; } else if (strbeg("SONY", vendor_info)) { if (strbeg("CD-R CDU92", prod_ident) || strbeg("CD-R CDU94", prod_ident)) dev = DEV_SONY_CDU_924; } else if (strbeg("TEAC", vendor_info)) { if (strbeg("CD-R50S", prod_ident) || strbeg("CD-R55S", prod_ident)) dev = DEV_TEAC_CD_R50S; } else if (strbeg("TRAXDATA", vendor_info) || strbeg("Traxdata", vendor_info)) { if (strbeg("CDR4120", prod_ident)) dev = DEV_TEAC_CD_R50S; } else if (strbeg("T.YUDEN", vendor_info)) { if (strbeg("CD-WO EW-50", prod_ident)) dev = DEV_CDD_521; } else if (strbeg("WPI", vendor_info)) { /* Wearnes */ if (strbeg("CDR-632P", prod_ident)) dev = DEV_CDD_2600; } else if (strbeg("YAMAHA", vendor_info)) { if (strbeg("CDR10", prod_ident)) dev = DEV_YAMAHA_CDR_100; if (strbeg("CDR200", prod_ident)) dev = DEV_YAMAHA_CDR_400; if (strbeg("CDR400", prod_ident)) dev = DEV_YAMAHA_CDR_400; } else if (strbeg("MATSHITA", vendor_info)) { if (strbeg("CD-R CW-7501", prod_ident)) dev = DEV_MATSUSHITA_7501; if (strbeg("CD-R CW-7502", prod_ident)) dev = DEV_MATSUSHITA_7502; } if (dev == DEV_UNKNOWN) { /* * We do not have Manufacturer strings for * the following drives. */ if (strbeg("CDS615E", prod_ident)) /* Olympus */ dev = DEV_SONY_CDU_924; } if (dev == DEV_UNKNOWN && inq.type == INQ_ROMD) { BOOL cdrr = FALSE; BOOL cdwr = FALSE; BOOL cdrrw = FALSE; BOOL cdwrw = FALSE; BOOL dvd = FALSE; dev = DEV_CDROM; if (mmc_check(&cdrr, &cdwr, &cdrrw, &cdwrw, &dvd)) dev = DEV_MMC_CDROM; if (cdwr) dev = DEV_MMC_CDR; if (cdwrw) dev = DEV_MMC_CDRW; if (dvd) dev = DEV_MMC_DVD; } case INQ_PROCD: if (strbeg("BERTHOLD", vendor_info)) { if (strbeg("", prod_ident)) dev = DEV_HRSCAN; } break; case INQ_SCAN: dev = DEV_MS300A; break; } silent--; if (!print) return (TRUE); if (dev == DEV_UNKNOWN && !got_inquiry) {#ifdef PRINT_INQ_ERR /* * Der String 'inquiry" kann falsch sein! * Das ist dann, wenn ein Ger鋞 angeschlossen ist, * das nonextended sense liefert und mit dem * qic02() Kommando nicht identifiziert werden kann. */ scsiprinterr("inquiry");#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(){ printf("Device seems to be: "); switch (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_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", dev); break; } printf(".\n");}EXPORT BOOLdo_inquiry(print) int print;{ if (getdev(print)) { if (print) printdev(); return (TRUE); } else { return (FALSE); }}EXPORT BOOLrecovery_needed(){ int err; silent++; err = test_unit_ready(); 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); return (((struct scsi_ext_sense *)&scmd.sense)->sense_code == 0xD0);}EXPORT intscsi_load(){ return (scsi_start_stop_unit(1, 1));}EXPORT intscsi_unload(){ return (scsi_start_stop_unit(0, 1));}EXPORT intscsi_cdr_write(bp, sectaddr, size, blocks, islast) 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(bp, sectaddr, size, blocks));}EXPORT struct cd_mode_page_2A *mmc_cap(modep) u_char *modep;{ int len; int val; u_char mode[0x100]; struct cd_mode_page_2A *mp; struct cd_mode_page_2A *mp2; fillbytes((caddr_t)mode, sizeof(mode), '\0'); if (!get_mode_params(0x2A, "CD capabilities", mode, (u_char *)0, (u_char *)0, (u_char *)0, &len)) return (NULL); 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_short(mp->max_read_speed); if (val != 0 && val < 176) return (NULL); val = a_to_u_short(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;{ 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 */ if (dvdp) { *dvdp = /* 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; }}EXPORT BOOLis_mmc(dvdp) BOOL *dvdp;{ return (mmc_check(NULL, NULL, NULL, NULL, dvdp));}EXPORT BOOLmmc_check(cdrrp, cdwrp, cdrrwp, cdwrwp, dvdp) BOOL *cdrrp; BOOL *cdwrp; BOOL *cdrrwp; BOOL *cdwrwp; BOOL *dvdp;{ u_char mode[0x100]; BOOL was_atapi; struct cd_mode_page_2A *mp; if (inq.type != INQ_ROMD) return (FALSE); fillbytes((caddr_t)mode, sizeof(mode), '\0'); was_atapi = allow_atapi(TRUE); silent++; mp = mmc_cap(mode); silent--; allow_atapi(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(){ BOOL was_atapi; u_char 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 (inq.type != INQ_ROMD) return; fillbytes((caddr_t)mode, sizeof(mode), '\0'); was_atapi = allow_atapi(TRUE); /* Try to switch to 10 byte mode cmds */ silent++; mp = mmc_cap(mode); silent--; allow_atapi(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("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("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("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); VAL("Current read speed in kB/s", mp->cur_read_speed); VAL("Maximum write speed in kB/s", mp->max_write_speed); VAL("Current write speed in kB/s", mp->cur_write_speed); VAL("Buffer size in KB", mp->buffer_size); return; /* Generic SCSI-3/mmc CD */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -