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

📄 scsi_cdr.c

📁 另一种方法编辑刻录程序的代码!要的与偶联系呀
💻 C
📖 第 1 页 / 共 4 页
字号:
			}		}	} 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 + -