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

📄 scsi_cdr.c

📁 另一种方法编辑刻录程序的代码!要的与偶联系呀
💻 C
📖 第 1 页 / 共 4 页
字号:
		if (scsicmd("write_g1") < 0)		return (-1);	return (size - scmd.resid);}EXPORT intwrite_xg5(bp, addr, size, cnt)	caddr_t	bp;		/* address of buffer */	long	addr;		/* disk address (sector) to put */	long	size;		/* number of bytes to transfer */	int	cnt;		/* sectorcount */{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = size;	scmd.flags = SCG_DISRE_ENA|SCG_CMD_RETRY;/*	scmd.flags = SCG_DISRE_ENA;*/	scmd.cdb_len = SC_G5_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g5_cdb.cmd = 0xAA;	scmd.cdb.g5_cdb.lun = lun;	g5_cdbaddr(&scmd.cdb.g5_cdb, addr);	g5_cdblen(&scmd.cdb.g5_cdb, cnt);		if (scsicmd("write_g5") < 0)		return (-1);	return (size - scmd.resid);}EXPORT intwrite_track(track, sectype)	long	track;		/* track number 0 == new track */	int	sectype;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA|SCG_CMD_RETRY;/*	scmd.flags = SCG_DISRE_ENA;*/	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xE6;	scmd.cdb.g1_cdb.lun = lun;	g1_cdbaddr(&scmd.cdb.g1_cdb, track);	scmd.cdb.g1_cdb.res6 = sectype;		if (scsicmd("write_track") < 0)		return (-1);	return (0);}EXPORT intscsi_flush_cache(){	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.timeout = 2 * 60;		/* Max: sizeof(CDR-cache)/150KB/s */	scmd.cdb.g1_cdb.cmd = 0x35;	scmd.cdb.g1_cdb.lun = lun;		if (scsicmd("flush cache") < 0)		return (-1);	return (0);}EXPORT intread_toc(bp, track, cnt, msf, fmt)	caddr_t	bp;	int	track;	int	cnt;	int	msf;	int	fmt;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0x43;	scmd.cdb.g1_cdb.lun = lun;	if (msf)		scmd.cdb.g1_cdb.res = 1;	scmd.cdb.g1_cdb.addr[0] = fmt & 0x0F;	scmd.cdb.g1_cdb.res6 = track;	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (scsicmd("read toc") < 0)		return (-1);	return (0);}EXPORT intread_toc_philips(bp, track, cnt, msf, fmt)	caddr_t	bp;	int	track;	int	cnt;	int	msf;	int	fmt;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0x43;	scmd.cdb.g1_cdb.lun = lun;	if (msf)		scmd.cdb.g1_cdb.res = 1;	scmd.cdb.g1_cdb.res6 = track;	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (fmt & 1)		scmd.cdb.g1_cdb.vu_96 = 1;	if (fmt & 2)		scmd.cdb.g1_cdb.vu_97 = 1;	if (scsicmd("read toc") < 0)		return (-1);	return (0);}EXPORT intread_header(bp, addr, cnt, msf)	caddr_t	bp;	long	addr;	int	cnt;	int	msf;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0x44;	scmd.cdb.g1_cdb.lun = lun;	if (msf)		scmd.cdb.g1_cdb.res = 1;	g1_cdbaddr(&scmd.cdb.g1_cdb, addr);	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (scsicmd("read header") < 0)		return (-1);	return (0);}EXPORT intread_disk_info(bp, cnt)	caddr_t	bp;	int	cnt;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.timeout = 4 * 60;		/* Needs up to 2 minutes */	scmd.cdb.g1_cdb.cmd = 0x51;	scmd.cdb.g1_cdb.lun = lun;	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (scsicmd("read disk info") < 0)		return (-1);	return (0);}EXPORT intread_track_info(bp, track, cnt)	caddr_t	bp;	int	track;	int	cnt;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.timeout = 4 * 60;		/* Needs up to 2 minutes */	scmd.cdb.g1_cdb.cmd = 0x52;	scmd.cdb.g1_cdb.lun = lun;	scmd.cdb.g1_cdb.reladr = 1;	/* Track */	g1_cdbaddr(&scmd.cdb.g1_cdb, track);	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (scsicmd("read track info") < 0)		return (-1);	return (0);}EXPORT intread_track_info_philips(bp, track, cnt)	caddr_t	bp;	int	track;	int	cnt;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xE5;	scmd.cdb.g1_cdb.lun = lun;	g1_cdbaddr(&scmd.cdb.g1_cdb, track);	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (scsicmd("read track info") < 0)		return (-1);	return (0);}/* * Needed for JVC too. */EXPORT intclose_track_philips(track, trackp)	int	track;	track_t	*trackp;{	return (scsi_flush_cache());}EXPORT intfixation(onp, dummy, type, tracks, trackp)	int	onp;	/* open next program area */	int	dummy;	int	type;	/* TOC type 0: CD-DA, 1: CD-ROM, 2: CD-ROM/XA1, 3: CD-ROM/XA2, 4: CDI */	int	tracks;	track_t	*trackp;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.timeout = 8 * 60;		/* Needs up to 4 minutes */	scmd.cdb.g1_cdb.cmd = 0xE9;	scmd.cdb.g1_cdb.lun = lun;	scmd.cdb.g1_cdb.count[1] = (onp ? 8 : 0) | type;		if (scsicmd("fixation") < 0)		return (-1);	return (0);}EXPORT intscsi_close_tr_session(type, track)	int	type;	int	track;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.timeout = 8 * 60;		/* Needs up to 4 minutes */	scmd.cdb.g1_cdb.cmd = 0x5B;	scmd.cdb.g1_cdb.lun = lun;	scmd.cdb.g1_cdb.addr[0] = type;	scmd.cdb.g1_cdb.addr[3] = track;#ifdef	nono	scmd.cdb.g1_cdb.reladr = 1;	/* IMM hack to test Mitsumi behaviour*/#endif		if (scsicmd("close track/session") < 0)		return (-1);	return (0);}EXPORT intscsi_blank(addr, blanktype)	long	addr;	int	blanktype;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G5_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.timeout = 160 * 60; /* full blank at 1x could take 80 minutes */	scmd.cdb.g5_cdb.cmd = 0xA1;	/* Blank */	scmd.cdb.g0_cdb.high_addr = blanktype;	g1_cdbaddr(&scmd.cdb.g5_cdb, addr);	return (scsicmd("blank unit"));}EXPORT intrecover(track)	int	track;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xEC;	scmd.cdb.g1_cdb.lun = lun;		if (scsicmd("recover") < 0)		return (-1);	return (0);}struct	fwa {	char	len;	char	addr[4];	char	res;};EXPORT intfirst_writable_addr(ap, track, isaudio, preemp, npa)	long	*ap;	int	track;	int	isaudio;	int	preemp;	int	npa;{	struct	fwa	fwa;	fillbytes((caddr_t)&fwa, sizeof(fwa), '\0');	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = (caddr_t)&fwa;	scmd.size = sizeof(fwa);	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xE2;	scmd.cdb.g1_cdb.lun = lun;	scmd.cdb.g1_cdb.addr[0] = track;	scmd.cdb.g1_cdb.addr[1] = isaudio ? (preemp ? 5 : 4) : 1;	scmd.cdb.g1_cdb.count[0] = npa?1:0;	scmd.cdb.g1_cdb.count[1] = sizeof(fwa);		if (scsicmd("first writeable address") < 0)		return (-1);	if (ap)		*ap = a_to_u_long(fwa.addr);	return (0);}EXPORT intreserve_track(len)	unsigned long len;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xE4;	scmd.cdb.g1_cdb.lun = lun;	i_to_long(&scmd.cdb.g1_cdb.addr[3], len);		if (scsicmd("reserve_track") < 0)		return (-1);	return (0);}/* * XXX First try to handle ATAPI: * XXX ATAPI cannot handle SCSI 6 byte commands. * XXX We try to simulate 6 byte mode sense/select. */LOCAL BOOL	is_atapi;EXPORT BOOLallow_atapi(new)	BOOL	new;{	BOOL	old = is_atapi;	u_char	mode[256];	if (new == old)		return (old);	silent++;	if (new &&	    mode_sense_g1(mode, 8, 0x3F, 0) < 0) {	/* All pages current */		new = FALSE;	}	silent--;	is_atapi = new;	return (old);}EXPORT intmode_select(dp, cnt, smp, pf)	u_char	*dp;	int	cnt;	int	smp;	int	pf;{	if (is_atapi)		return (mode_select_sg0(dp, cnt, smp, pf));	return (mode_select_g0(dp, cnt, smp, pf));}EXPORT intmode_sense(dp, cnt, page, pcf)	u_char	*dp;	int	cnt;	int	page;	int	pcf;{	if (is_atapi)		return (mode_sense_sg0(dp, cnt, page, pcf));	return (mode_sense_g0(dp, cnt, page, pcf));}/* * Simulate mode select g0 with mode select g1. */EXPORT intmode_select_sg0(dp, cnt, smp, pf)	u_char	*dp;	int	cnt;	int	smp;	int	pf;{	u_char	xmode[256+4];	int	amt = cnt;	if (amt < 1 || amt > 255) {		/* XXX clear SCSI error codes ??? */		return (-1);	}	if (amt < 4) {		/* Data length. medium type & VU */		amt += 1;	} else {		amt += 4;		movebytes(&dp[4], &xmode[8], cnt-4);	}	xmode[0] = 0;	xmode[1] = 0;	xmode[2] = dp[1];	xmode[3] = dp[2];	xmode[4] = 0;	xmode[5] = 0;	i_to_short(&xmode[6], dp[3]);	if (verbose) scsiprbytes("Mode Parameters (un-converted)", dp, cnt);	return (mode_select_g1(xmode, amt, smp, pf));}/* * Simulate mode sense g0 with mode sense g1. */EXPORT intmode_sense_sg0(dp, cnt, page, pcf)	u_char	*dp;	int	cnt;	int	page;	int	pcf;{	u_char	xmode[256+4];	int	amt = cnt;	int	len;	if (amt < 1 || amt > 255) {		/* XXX clear SCSI error codes ??? */		return (-1);	}	fillbytes((caddr_t)xmode, sizeof(scmd), '\0');	if (amt < 4) {		/* Data length. medium type & VU */		amt += 1;	} else {		amt += 4;	}	if (mode_sense_g1(xmode, amt, page, pcf) < 0)		return (-1);	amt = cnt - scsigetresid();	if (amt > 4)		movebytes(&xmode[8], &dp[4], amt-4);	len = a_to_u_short(xmode);	if (len == 0) {		dp[0] = 0;	} else if (len < 6) {		if (len > 2)			len = 2;		dp[0] = len;	} else {		dp[0] = len - 3;	}	dp[1] = xmode[2];	dp[2] = xmode[3];	len = a_to_u_short(&xmode[6]);	dp[3] = len;	if (verbose) scsiprbytes("Mode Sense Data (converted)", dp, amt);	return (0);}EXPORT intmode_select_g0(dp, cnt, smp, pf)	u_char	*dp;	int	cnt;	int	smp;	int	pf;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = (caddr_t)dp;	scmd.size = cnt;	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G0_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g0_cdb.cmd = SC_MODE_SELECT;	scmd.cdb.g0_cdb.lun = lun;	scmd.cdb.g0_cdb.high_addr = smp ? 1 : 0 | pf ? 0x10 : 0;	scmd.cdb.g0_cdb.count = cnt;	if (verbose) {		printf("%s ", smp?"Save":"Set ");		scsiprbytes("Mode Parameters", dp, cnt);	}	return (scsicmd("mode select g0"));}EXPORT intmode_select_g1(dp, cnt, smp, pf)	u_char	*dp;	int	cnt;	int	smp;	int	pf;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = (caddr_t)dp;	scmd.size = cnt;	scmd.flags = SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0x55;	scmd.cdb.g1_cdb.lun = lun;	scmd.cdb.g0_cdb.high_addr = smp ? 1 : 0 | pf ? 0x10 : 0;	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (verbose) {		printf("%s ", smp?"Save":"Set ");		scsiprbytes("Mode Parameters", dp, cnt);	}	return (scsicmd("mode select g1"));}EXPORT intmode_sense_g0(dp, cnt, page, pcf)	u_char	*dp;	int	cnt;	int	page;	int	pcf;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = (caddr_t)dp;	scmd.size = 0xFF;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G0_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g0_cdb.cmd = SC_MODE_SENSE;	scmd.cdb.g0_cdb.lun = lun;#ifdef	nonono	scmd.cdb.g0_cdb.high_addr = 1<<4;	/* DBD Disable Block desc. */#endif	scmd.cdb.g0_cdb.mid_addr = (page&0x3F) | ((pcf<<6)&0xC0);	scmd.cdb.g0_cdb.count = page ? 0xFF : 24;	scmd.cdb.g0_cdb.count = cnt;	if (scsicmd("mode sense g0") < 0)		return (-1);	if (verbose) scsiprbytes("Mode Sense Data", dp, cnt - scmd.resid);	return (0);}EXPORT intmode_sense_g1(dp, cnt, page, pcf)	u_char	*dp;	int	cnt;	int	page;	int	pcf;{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = (caddr_t)dp;	scmd.size = cnt;	scmd.flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0x5A;	scmd.cdb.g1_cdb.lun = lun;#ifdef	nonono	scmd.cdb.g0_cdb.high_addr = 1<<4;	/* DBD Disable Block desc. */#endif	scmd.cdb.g1_cdb.addr[0] = (page&0x3F) | ((pcf<<6)&0xC0);	g1_cdblen(&scmd.cdb.g1_cdb, cnt);	if (scsicmd("mode sense g1") < 0)		return (-1);	if (verbose) scsiprbytes("Mode Sense Data", dp, cnt - scmd.resid);	return (0);}struct cdd_52x_mode_page_21 {	/* write track information */		MP_P_CODE;		/* parsave & pagecode */	u_char	p_len;			/* 0x0E = 14 Bytes */	u_char	res_2;	u_char	sectype;	u_char	track;	u_char	ISRC[9];

⌨️ 快捷键说明

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