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

📄 drv_jvc.c

📁 刻录光盘的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/* ----------------------------------------------------------------- * Set subcode for Teac Drives.----------------------------------------------------------------- */LOCAL intset_subcode(scgp, subcode_data, length)	SCSI	*scgp;	u_char	*subcode_data;	int	length;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)subcode_data;	scmd->size = length;	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 = SC_SET_SUBCODE;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdblen(&scmd->cdb.g1_cdb, length);	scgp->cmdname = "set subcode";	return (scsicmd(scgp));}LOCAL intread_disk_info_teac(scgp, data, length, type)	SCSI	*scgp;	u_char	*data;	int	length;	int	type;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)data;	scmd->size = length;	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 = SC_READ_DISK_INFO;	scmd->cdb.g1_cdb.lun = scgp->lun;	scmd->cdb.g1_cdb.reladr = type & 1;	scmd->cdb.g1_cdb.res    = (type & 2) >> 1;	scgp->cmdname = "read disk info teac";	return (scsicmd(scgp));}/* ----------------------------------------------------------------- * Perform the freeze command for Teac Drives.----------------------------------------------------------------- */LOCAL intteac_freeze(scgp, bp_flag)	SCSI	*scgp;	int	bp_flag;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)0;	scmd->size = 0;	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 8 * 60;		/* Needs up to 4 minutes */	scmd->cdb.g5_cdb.cmd = SC_FREEZE;	scmd->cdb.g5_cdb.lun = scgp->lun;	scmd->cdb.g5_cdb.addr[3] = bp_flag ? 0x80 : 0;	scgp->cmdname = "teac_freeze";	return (scsicmd(scgp));}LOCAL intteac_wr_pma(scgp)	SCSI	*scgp;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)0;	scmd->size = 0;	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g5_cdb.cmd = SC_WRITE_PMA;	scmd->cdb.g5_cdb.lun = scgp->lun;	scgp->cmdname = "teac_write_pma";	return (scsicmd(scgp));}/* ----------------------------------------------------------------- * Read PMA for Teac Drives.----------------------------------------------------------------- */LOCAL intteac_rd_pma(scgp)	SCSI	*scgp;{	unsigned char	xx[256];	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)xx, sizeof(xx), '\0');	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)xx;	scmd->size = sizeof(xx);	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 = SC_READ_PMA;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdblen(&scmd->cdb.g1_cdb, sizeof(xx));	scgp->cmdname = "teac_read_pma";/*	return (scsicmd(scgp));*/	if (scsicmd(scgp) < 0)		return (-1);	if (scgp->verbose) {		scsiprbytes("PMA Data", xx, sizeof(xx) - scsigetresid(scgp));	}	if (lverbose) {		unsigned i;		Uchar	*p;		scsiprbytes("PMA Header: ", xx, 4);		i = xx[2];		p = &xx[4];		for (; i <= xx[3]; i++) {			scsiprbytes("PMA: ", p, 10);			p += 10;		}	}	return (0);}/* ----------------------------------------------------------------- * Next writable address for Teac Drives.----------------------------------------------------------------- */LOCAL intnext_wr_addr_teac(scgp, start_lba, last_lba)	SCSI	*scgp;	long	start_lba;	long	last_lba;{	unsigned char	xx[256];	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)xx, sizeof(xx), '\0');	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)xx;	scmd->size = sizeof(xx);	scmd->flags = SCG_RECV_DATA |SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g5_cdb.cmd = SC_NEXT_WR_ADDRESS;	scmd->cdb.g5_cdb.lun = scgp->lun;	i_to_4_byte(&scmd->cdb.g5_cdb.addr[0], start_lba);	i_to_4_byte(&scmd->cdb.g5_cdb.count[0], last_lba);	if (scgp->verbose)		printf("start lba: %ld last lba: %ld\n",					start_lba, last_lba);	scgp->cmdname = "next writable address";/*	return (scsicmd(scgp));*/	if (scsicmd(scgp) < 0)		return (-1);	if (scgp->verbose) {		scsiprbytes("WRa Data", xx, sizeof(xx) - scsigetresid(scgp));		printf("NWA: %ld\n", a_to_4_byte(xx));	}	return (0);}LOCAL intblank_jvc(scgp, addr, blanktype)	SCSI	*scgp;	long	addr;	int	blanktype;{	extern	char	*blank_types[];	if (lverbose) {		printf("Blanking %s\n", blank_types[blanktype & 0x07]);		flush();	}	return (scsi_blank(scgp, addr, blanktype));}LOCAL intbuf_cap_teac(scgp, sp, fp)	SCSI	*scgp;	long	*sp;	/* Size pointer */	long	*fp;	/* Free pointer */{	Ulong	freespace;	Ulong	bufsize;	long	ret;	int	per;	ret = read_peak_buffer_cap_teac(scgp);	if (ret < 0)		return (-1);	bufsize = ret;	freespace = 0;	if (sp)		*sp = bufsize;	if (fp)		*fp = freespace;		if (scgp->verbose || (sp == 0 && fp == 0))		printf("BFree: %ld K BSize: %ld K\n", freespace >> 10, bufsize >> 10);	if (bufsize == 0)		return (0);	per = (100 * (bufsize - freespace)) / bufsize;	if (per < 0)		return (0);	if (per > 100)		return (100);	return (per);}LOCAL longread_peak_buffer_cap_teac(scgp)	SCSI	*scgp;{	Uchar	xx[4];	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)xx, sizeof(xx), '\0');	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)xx;	scmd->size = sizeof(xx);	scmd->flags = SCG_RECV_DATA |SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g5_cdb.cmd = SC_READ_PEAK_BUF_CAP;	scmd->cdb.g5_cdb.lun = scgp->lun;	scgp->cmdname = "read peak buffer capacity";#define	BDEBUG#ifndef	BDEBUG	return (scsicmd(scgp));#else	if (scsicmd(scgp) < 0)		return (-1);/*	if (scgp->verbose) {*/		scsiprbytes("WRa Data", xx, sizeof(xx) - scsigetresid(scgp));		printf("Buffer cap: %ld\n", a_to_u_3_byte(&xx[1]));/*	}*/	return (a_to_u_3_byte(&xx[1]));/*	return (0);*/#endif}#define	BI_ONE_BYTE	0xC0#define	BI_448_BYTE	0x40#define	BI_APP_CODE	0x10LOCAL intbuffer_inquiry_teac(scgp, fmt)	SCSI	*scgp;	int	fmt;{	Uchar	xx[448];	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)xx, sizeof(xx), '\0');	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)xx;	scmd->size = sizeof(xx);	scmd->size = 448;	scmd->flags = SCG_RECV_DATA |SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g5_cdb.cmd = SC_BUFFER_INQUIRY;	scmd->cdb.g5_cdb.lun = scgp->lun;	if (fmt > 0) {		scmd->cdb.g5_cdb.addr[3] = fmt;		if (fmt == BI_ONE_BYTE)			scmd->size = 1;	} else {		scmd->cdb.g5_cdb.addr[3] = BI_448_BYTE;/*		scmd->cdb.g5_cdb.addr[3] = BI_APP_CODE;*/	}	scgp->cmdname = "buffer inquiry";#define	BDEBUG#ifndef	BDEBUG	return (scsicmd(scgp));#else	if (scsicmd(scgp) < 0)		return (-1);/*	if (scgp->verbose) {*//*		scsiprbytes("WRa Data", xx, sizeof(xx) - scsigetresid(scgp));*//*		scsiprbytes("WRa Data", xx, 1);*/		if (fmt > 0) printf("fmt: %X ", fmt);		scsiprbytes("WRa Data", xx, 9);		printf("%d\n", xx[8] - xx[1]);/*		printf("Buffer cap: %ld\n", a_to_u_3_byte(&xx[1]));*//*	}*/	return (0);#endif}#ifdef	XXBUFFERLOCAL voidcheck_buffer_teac(scgp)	SCSI	*scgp;{	printf("-------\n");	buffer_inquiry_teac(scgp, 0);#ifdef	SL	usleep(40000);	buffer_inquiry_teac(scgp, 0);#endif	read_peak_buffer_cap_teac(scgp);}#endif/*--------------------------------------------------------------------------*/#ifdef	XXDEBUG#include "scsimmc.h"LOCAL	int	g7_teac			__PR((SCSI *scgp));LOCAL	int	g6_teac			__PR((SCSI *scgp));LOCAL intg7_teac(scgp)	SCSI	*scgp;{	Uchar	xx[2048];	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)xx, sizeof(xx), '\0');	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)xx;	scmd->size = sizeof(xx);	scmd->flags = SCG_RECV_DATA |SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g5_cdb.cmd = 0xDf;/*	scmd->cdb.g5_cdb.cmd = 0xE5;*/	scmd->cdb.g5_cdb.lun = scgp->lun;/*	scmd->cdb.g5_cdb.addr[3] = BI_ONE_BYTE;*//*	scmd->size = 1;*//*	scmd->cdb.g5_cdb.addr[3] = BI_448_BYTE;*//*	scmd->cdb.g5_cdb.addr[3] = BI_APP_CODE;*/	scgp->cmdname = "g7 teac";/*	return (scsicmd(scgp));*/	if (scsicmd(scgp) < 0)		return (-1);/*	if (scgp->verbose) {*/		scsiprbytes("WRa Data", xx, sizeof(xx) - scsigetresid(scgp));/*		scsiprbytes("WRa Data", xx, 1);*//*		scsiprbytes("WRa Data", xx, 9);*//*printf("%d\n", xx[8] - xx[1]);*//*		printf("Buffer cap: %ld\n", a_to_u_3_byte(&xx[1]));*//*	}*/	return (0);}LOCAL intg6_teac(scgp)	SCSI	*scgp;{	Uchar	xx[2048];	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)xx, sizeof(xx), '\0');	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)xx;	scmd->size = sizeof(xx);	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 = 0xC1;	scmd->cdb.g1_cdb.cmd = 0xC3;	scmd->cdb.g1_cdb.cmd = 0xC6;	scmd->cdb.g1_cdb.cmd = 0xC7;	/* Read TOC */	scmd->cdb.g1_cdb.cmd = 0xCe;	scmd->cdb.g1_cdb.cmd = 0xCF;	scmd->cdb.g1_cdb.cmd = 0xC7;	/* Read TOC */	scmd->cdb.g1_cdb.lun = scgp->lun;	scgp->cmdname = "g6 teac";/*	return (scsicmd(scgp));*/	if (scsicmd(scgp) < 0)		return (-1);/*	if (scgp->verbose) {*/		scsiprbytes("WRa Data", xx, sizeof(xx) - scsigetresid(scgp));/*		scsiprbytes("WRa Data", xx, 1);*//*		scsiprbytes("WRa Data", xx, 9);*//*printf("%d\n", xx[8] - xx[1]);*//*		printf("Buffer cap: %ld\n", a_to_u_3_byte(&xx[1]));*//*	}*/	return (0);}LOCAL voidxxtest_teac(scgp)	SCSI	*scgp;{	read_peak_buffer_cap_teac(scgp);/*#define	XDI*/#ifdef	XDI	{		u_char cbuf[512];/*		read_disk_info_teac(scgp, data, length, type)*//*		read_disk_info_teac(scgp, cbuf, 512, 2);*//*		read_disk_info_teac(scgp, cbuf, 512, 2);*/		read_disk_info_teac(scgp, cbuf, 512, 3);		scsiprbytes("DI Data", cbuf, sizeof(cbuf) - scsigetresid(scgp));	}#endif	/* XDI */	buffer_inquiry_teac(scgp, -1);/*#define	XBU*/#ifdef	XBU	{		int i;		for (i = 0; i < 63; i++) {			scgp->silent++;			buffer_inquiry_teac(scgp, i<<2);			scgp->silent--;		}	}#endif	/* XBU *//*	printf("LLLL\n");*//*	g7_teac(scgp);*//*	g6_teac(scgp);*/}#endif	/* XXDEBUG */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -