drv_sony.c

来自「刻录光盘的程序」· C语言 代码 · 共 282 行

C
282
字号
/* @(#)drv_sony.c	1.37 99/10/17 Copyright 1997 J. Schilling */#ifndef lintstatic	char sccsid[] =	"@(#)drv_sony.c	1.37 99/10/17 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 <fctldefs.h>#include <errno.h>#include <strdefs.h>#include <utypes.h>#include <btorder.h>#include <intcvt.h>#include <scg/scgcmd.h>#include <scg/scsidefs.h>#include <scg/scsireg.h>#include <scg/scsitransp.h>#include "cdrecord.h"#ifdef	SONY_DEBUG#	define		inc_verbose()	scgp->verbose++#	define		dec_verbose()	scgp->verbose--#else#	define		inc_verbose()#	define		dec_verbose()#endifextern	int	lverbose;#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((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));LOCAL	int	write_track_sony	__PR((SCSI *scgp, long track, int sectype));LOCAL	int	close_track_sony	__PR((SCSI *scgp, int track, track_t *trackp));LOCAL	int	finalize_sony		__PR((SCSI *scgp, int onp, int dummy, int type, int tracks, track_t *trackp));LOCAL	int	recover_sony		__PR((SCSI *scgp, int track));LOCAL	int	next_wr_addr_sony	__PR((SCSI *scgp, int track, track_t *trackp, long *ap));LOCAL	int	reserve_track_sony	__PR((SCSI *scgp, unsigned long len));LOCAL	int	getdisktype_sony	__PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));LOCAL	void	di_to_dstat_sony	__PR((struct sony_924_mode_page_22 *dip, dstat_t *dsp));LOCAL	int	speed_select_sony	__PR((SCSI *scgp, int *speedp, int dummy));LOCAL	int	next_writable_address_sony __PR((SCSI *scgp, long *ap, int track, int sectype, int tracktype));LOCAL	int	new_track_sony		__PR((SCSI *scgp, int track, int sectype, int tracktype));LOCAL	int	open_track_sony		__PR((SCSI *scgp, cdr_t *dp, int track, track_t *track_info));LOCAL	int	open_session_sony	__PR((SCSI *scgp, int tracks, track_t *trackp, int toctype, int multi));LOCAL	int	get_page22_sony		__PR((SCSI *scgp, char *mode));LOCAL	int	sony_attach		__PR((SCSI *scgp, 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));#endifLOCAL	int	buf_cap_sony		__PR((SCSI *scgp, long *, long *));cdr_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,	getdisktype_sony,	scsi_load,	scsi_unload,	buf_cap_sony,	(int(*)__PR((SCSI *)))cmd_dummy,	/* recovery_needed	*/	recover_sony,	speed_select_sony,	select_secsize,	next_wr_addr_sony,	reserve_track_sony,	write_continue_sony,	no_sendcue,	open_track_sony,	close_track_sony,	open_session_sony,	cmd_dummy,	read_session_offset_philips,	finalize_sony,	blank_dummy,};LOCAL intwrite_continue_sony(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 */{	register struct	scg_cmd	*scmd = scgp->scmd;	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 = scgp->target;	scmd->cdb.g1_cdb.cmd = 0xE1;	scmd->cdb.g1_cdb.lun = scgp->lun;	g0_cdbaddr(&scmd->cdb.g0_cdb, size); /* Hack, but Sony is silly */		scgp->cmdname = "write_continue";	if (scsicmd(scgp) < 0)		return (-1);	return (size - scsigetresid(scgp));}LOCAL intwrite_track_sony(scgp, track, sectype)	SCSI	*scgp;	long	track;		/* track number 0 == new track */	int	sectype;	/* no sectype for Sony write track */{	register struct	scg_cmd	*scmd = scgp->scmd;	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 = scgp->target;	scmd->cdb.g1_cdb.cmd = 0xF5;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdbaddr(&scmd->cdb.g1_cdb, track);		scgp->cmdname = "write_track";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}/* XXX NOCH NICHT FERTIG */LOCAL intclose_track_sony(scgp, track, trackp)	SCSI	*scgp;	int	track;	track_t	*trackp;{	register struct	scg_cmd	*scmd = scgp->scmd;	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 = scgp->target;	scmd->cdb.g1_cdb.cmd = 0xF0;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdbaddr(&scmd->cdb.g1_cdb, track);/* XXX Padding ??? (bit 0 in addr[0]) */		scgp->cmdname = "close_track";	if (scsicmd(scgp) < 0)		return (-1);	/*	 * Clear the silly "error situation" from Sony

⌨️ 快捷键说明

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