📄 drv_sony.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 + -