⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi_cdr.c

📁 创建一个符合iso-9660标准的iso文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -