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

📄 drv_sony.c

📁 另一种方法编辑刻录程序的代码!要的与偶联系呀
💻 C
字号:
/* @(#)drv_sony.c	1.20 98/09/15 Copyright 1997 J. Schilling */#ifndef lintstatic	char sccsid[] =	"@(#)drv_sony.c	1.20 98/09/15 Copyright 1997 J. Schilling";#endif/* *	CDR device implementation for *	Sony * *	Copyright (c) 1997 J. Schilling *//* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING.  If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. *//*#define	SONY_DEBUG*/#include <mconfig.h>#include <stdio.h>#include <standard.h>#include <fcntl.h>#include <errno.h>#include <string.h>#include <utypes.h>#include <btorder.h>#include <scgio.h>#include <scsidefs.h>#include <scsireg.h>#include "cdrecord.h"#include "scsitransp.h"#ifdef	SONY_DEBUG#	define		inc_verbose()	verbose++#	define		dec_verbose()	verbose--#else#	define		inc_verbose()#	define		dec_verbose()#endifstruct	scg_cmd		scmd;struct	scsi_inquiry	inq;extern	int	scsibus;extern	int	target;extern	int	lun;extern	int	silent;extern	int	verbose;#if defined(_BIT_FIELDS_LTOH)	/* Intel byteorder */struct sony_924_mode_page_20 {	/* mastering information */		MP_P_CODE;		/* parsave & pagecode */	u_char	p_len;			/* 0x06 = 6 Bytes */	u_char	subcode_header_off;	Ucbit	res3_0		: 1;	Ucbit	speudo		: 1;	Ucbit	res3_2		: 1;	Ucbit	c2po		: 1;	Ucbit	subcode_ecc	: 1;	Ucbit	res3_567	: 3;	u_char	res_4;	u_char	cue_sheet_opt;	u_char	res[2];};#else				/* Motorola byteorder */struct sony_924_mode_page_20 {	/* mastering information */		MP_P_CODE;		/* parsave & pagecode */	u_char	p_len;			/* 0x06 = 6 Bytes */	u_char	subcode_header_off;	Ucbit	res3_567	: 3;	Ucbit	subcode_ecc	: 1;	Ucbit	c2po		: 1;	Ucbit	res3_2		: 1;	Ucbit	speudo		: 1;	Ucbit	res3_0		: 1;	u_char	res_4;	u_char	cue_sheet_opt;	u_char	res[2];};#endifstruct sony_924_mode_page_22 {	/* disk information */		MP_P_CODE;		/* parsave & pagecode */	u_char	p_len;			/* 0x1E = 30 Bytes */	u_char	disk_style;	u_char	disk_type;	u_char	first_track;	u_char	last_track;	u_char	numsess;	u_char	res_7;	u_char	disk_appl_code[4];	u_char	last_start_time[4];	u_char	disk_status;	u_char	num_valid_nra;	u_char	track_info_track;	u_char	post_gap;	u_char	disk_id_code[4];	u_char	lead_in_start[4];	u_char	res[4];};struct sony_924_mode_page_23 {	/* track information */		MP_P_CODE;		/* parsave & pagecode */	u_char	p_len;			/* 0x22 = 34 Bytes */	u_char	res_2;	u_char	track_num;	u_char	data_form;	u_char	write_method;	u_char	session;	u_char	track_status;	u_char	start_lba[4];	u_char	next_recordable_addr[4];	u_char	blank_area_cap[4];	u_char	fixed_packet_size[4];	u_char	res_24;	u_char	starting_msf[3];	u_char	res_28;	u_char	ending_msf[3];	u_char	res_32;	u_char	next_rec_time[3];};struct sony_924_mode_page_31 {	/* drive speed */		MP_P_CODE;		/* parsave & pagecode */	u_char	p_len;			/* 0x02 = 2 Bytes */	u_char	speed;	u_char	res;};struct cdd_52x_mode_data {	struct scsi_mode_header	header;	union cdd_pagex	{		struct sony_924_mode_page_20	page_s20;		struct sony_924_mode_page_22	page_s22;		struct sony_924_mode_page_23	page_s23;		struct sony_924_mode_page_31	page_s31;	} pagex;};LOCAL	int	write_continue_sony	__PR((caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));LOCAL	int	write_track_sony	__PR((long track, int sectype));LOCAL	int	close_track_sony	__PR((int track, track_t *trackp));LOCAL	int	finalize_sony		__PR((int onp, int dummy, int type, int tracks, track_t *trackp));LOCAL	int	recover_sony		__PR((int track));LOCAL	int	next_wr_addr_sony	__PR((int track, track_t *trackp, long *ap));LOCAL	int	reserve_track_sony	__PR((unsigned long len));LOCAL	int	reserve_track_sony	__PR((unsigned long len));LOCAL	int	speed_select_sony	__PR((int speed, int dummy));LOCAL	int	next_writable_address_sony __PR((long *ap, int track, int sectype, int tracktype));LOCAL	int	new_track_sony		__PR((int track, int sectype, int tracktype));LOCAL	int	open_track_sony		__PR((cdr_t *dp, int track, track_t *track_info));LOCAL	int	open_session_sony	__PR((int tracks, track_t *trackp, int toctype, int multi));LOCAL	int	sony_attach		__PR((cdr_t *dp));#ifdef	SONY_DEBUGLOCAL	void	print_sony_mp22		__PR((struct sony_924_mode_page_22 *xp, int len));LOCAL	void	print_sony_mp23		__PR((struct sony_924_mode_page_23 *xp, int len));#endifcdr_t	cdr_sony_cdu924 = {	0,	CDR_TAO|CDR_DAO|CDR_CADDYLOAD|CDR_SWABAUDIO,	"sony_cdu924",	"driver for Sony CDU-924",	0,	drive_identify,	sony_attach,	drive_getdisktype,	scsi_load,	scsi_unload,	recovery_needed,	recover,	speed_select_sony,	select_secsize,	next_wr_addr_sony,	reserve_track_sony,	write_continue_sony,	open_track_sony,	close_track_sony,	open_session_sony,	cmd_dummy,	read_session_offset_philips,	finalize_sony,	blank_dummy,};LOCAL intwrite_continue_sony(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 */{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.addr = bp;	scmd.size = size;	scmd.flags = SCG_DISRE_ENA|SCG_CMD_RETRY;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xE1;	scmd.cdb.g1_cdb.lun = lun;	g0_cdbaddr(&scmd.cdb.g0_cdb, size); /* Hack, but Sony is silly */		if (scsicmd("write_continue") < 0)		return (-1);	return (size - scmd.resid);}LOCAL intwrite_track_sony(track, sectype)	long	track;		/* track number 0 == new track */	int	sectype;	/* no sectype for Sony write track */{	fillbytes((caddr_t)&scmd, sizeof(scmd), '\0');	scmd.flags = SCG_DISRE_ENA|SCG_CMD_RETRY;	scmd.cdb_len = SC_G1_CDBLEN;	scmd.sense_len = CCS_SENSE_LEN;	scmd.target = target;	scmd.cdb.g1_cdb.cmd = 0xF5;	scmd.cdb.g1_cdb.lun = lun;	g1_cdbaddr(&scmd.cdb.g1_cdb, track);		if (scsicmd("write_track") < 0)		return (-1);	return (0);}/* XXX NOCH NICHT FERTIG */LOCAL intclose_track_sony(track, trackp)	int	track;	track_t	*trackp;{	track = 0;	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 = 0xF0;	scmd.cdb.g1_cdb.lun = lun;	g1_cdbaddr(&scmd.cdb.g1_cdb, track);/* XXX Padding ??? (bit 0 in addr[0]) */		if (scsicmd("close_track") < 0)		return (-1);	/*	 * Clear the silly "error situation" from Sony

⌨️ 快捷键说明

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