📄 drv_philips.c
字号:
/* @(#)drv_philips.c 1.34 00/01/28 Copyright 1997 J. Schilling */#ifndef lintstatic char sccsid[] = "@(#)drv_philips.c 1.34 00/01/28 Copyright 1997 J. Schilling";#endif/* * CDR device implementation for * Philips/Yamaha/Ricoh/Plasmon * * 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. */#include <mconfig.h>#include <stdio.h>#include <standard.h>#include <intcvt.h>#include <scg/scsireg.h>#include <scg/scsitransp.h>#include <scg/scgcmd.h>#include <scg/scsidefs.h> /* XXX Only for DEV_RICOH_RO_1060C */#include "cdrecord.h"extern int debug;extern int lverbose;LOCAL int load_unload_philips __PR((SCSI *scgp, int));LOCAL int philips_load __PR((SCSI *scgp));LOCAL int philips_unload __PR((SCSI *scgp));LOCAL int philips_dumbload __PR((SCSI *scgp));LOCAL int philips_dumbunload __PR((SCSI *scgp));LOCAL int recover_philips __PR((SCSI *scgp, int));LOCAL int speed_select_yamaha __PR((SCSI *scgp, int *speedp, int dummy));LOCAL int speed_select_philips __PR((SCSI *scgp, int *speedp, int dummy));LOCAL int speed_select_oldphilips __PR((SCSI *scgp, int *speedp, int dummy));LOCAL int speed_select_dumbphilips __PR((SCSI *scgp, int *speedp, int dummy));LOCAL int speed_select_pioneer __PR((SCSI *scgp, int *speedp, int dummy));LOCAL int philips_getdisktype __PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));LOCAL BOOL capacity_philips __PR((SCSI *scgp, long *lp));LOCAL int first_writable_addr_philips __PR((SCSI *scgp, long *, int, int, int, int));LOCAL int next_wr_addr_philips __PR((SCSI *scgp, int track, track_t *trackp, long *ap));LOCAL int reserve_track_philips __PR((SCSI *scgp, unsigned long));LOCAL int scsi_cdr_write_philips __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));LOCAL int write_track_info_philips __PR((SCSI *scgp, int));LOCAL int write_track_philips __PR((SCSI *scgp, long, int));LOCAL int open_track_philips __PR((SCSI *scgp, cdr_t *dp, int track, track_t *track_info));LOCAL int open_track_oldphilips __PR((SCSI *scgp, cdr_t *dp, int track, track_t *track_info));LOCAL int open_track_yamaha __PR((SCSI *scgp, cdr_t *dp, int track, track_t *track_info));LOCAL int close_track_philips __PR((SCSI *scgp, int track, track_t *trackp));LOCAL int fixation_philips __PR((SCSI *scgp, int, int, int, int tracks, track_t *trackp));LOCAL int philips_attach __PR((SCSI *scgp, cdr_t *));LOCAL int plasmon_attach __PR((SCSI *scgp, cdr_t *));LOCAL int ricoh_attach __PR((SCSI *scgp, cdr_t *));LOCAL int philips_getlilo __PR((SCSI *scgp, long *lilenp, long *lolenp));struct cdd_52x_mode_page_21 { /* write track information */ MP_P_CODE; /* parsave & pagecode */ Uchar p_len; /* 0x0E = 14 Bytes */ Uchar res_2; Uchar sectype; Uchar track; Uchar ISRC[9]; Uchar res[2];};struct cdd_52x_mode_page_23 { /* speed selection */ MP_P_CODE; /* parsave & pagecode */ Uchar p_len; /* 0x06 = 6 Bytes */ Uchar speed; Uchar dummy; Uchar res[4];};#if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */struct yamaha_mode_page_31 { /* drive configuration */ MP_P_CODE; /* parsave & pagecode */ Uchar p_len; /* 0x02 = 2 Bytes */ Uchar res; Ucbit dummy : 4; Ucbit speed : 4;};#else /* Motorola byteorder */struct yamaha_mode_page_31 { /* drive configuration */ MP_P_CODE; /* parsave & pagecode */ Uchar p_len; /* 0x02 = 2 Bytes */ Uchar res; Ucbit speed : 4; Ucbit dummy : 4;};#endifstruct cdd_52x_mode_data { struct scsi_mode_header header; union cdd_pagex { struct cdd_52x_mode_page_21 page21; struct cdd_52x_mode_page_23 page23; struct yamaha_mode_page_31 page31; } pagex;};cdr_t cdr_philips_cdd521O = { 0, CDR_TAO|CDR_TRAYLOAD, "philips_cdd521_old", "driver for Philips old CDD-521", 0, drive_identify, philips_attach, philips_getdisktype, philips_load, philips_unload, buf_dummy, recovery_needed, recover_philips, speed_select_oldphilips, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_oldphilips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_philips_dumb = { 0, CDR_TAO|CDR_TRAYLOAD, "philips_dumb", "driver for Philips CDD-521 with pessimistic assumptions", 0, drive_identify, philips_attach, philips_getdisktype, philips_dumbload, philips_dumbunload, buf_dummy, recovery_needed, recover_philips, speed_select_dumbphilips, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_oldphilips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_philips_cdd521 = { 0, CDR_TAO|CDR_TRAYLOAD, "philips_cdd521", "driver for Philips CDD-521", 0, drive_identify, philips_attach, philips_getdisktype, philips_load, philips_unload, buf_dummy, recovery_needed, recover_philips, speed_select_philips, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_philips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_philips_cdd522 = { 0, CDR_TAO|CDR_DAO|CDR_TRAYLOAD, "philips_cdd522", "driver for Philips CDD-522", 0, drive_identify, philips_attach, philips_getdisktype, philips_load, philips_unload, buf_dummy, recovery_needed, recover_philips, speed_select_philips, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_philips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_kodak_pcd600 = { 0, CDR_TAO|CDR_TRAYLOAD, "kodak_pcd_600", "driver for Kodak PCD-600", 0, drive_identify, philips_attach, philips_getdisktype, philips_load, philips_unload, buf_dummy, recovery_needed, recover_philips, speed_select_philips, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_oldphilips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_plasmon_rf4100 = { 0, CDR_TAO|CDR_TRAYLOAD, "plasmon_rf4100", "driver for Plasmon RF 4100", 0, drive_identify, plasmon_attach, philips_getdisktype, philips_load, philips_unload, buf_dummy, recovery_needed, recover_philips, speed_select_philips, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_philips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_pioneer_dw_s114x = { 0, CDR_TAO|CDR_TRAYLOAD|CDR_SWABAUDIO, "pioneer_dws114x", "driver for Pioneer DW-S114X", 0, drive_identify, philips_attach, philips_getdisktype, scsi_load, scsi_unload, buf_dummy, recovery_needed, recover_philips, speed_select_pioneer, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue,/* open_track_yamaha,*//*???*/ open_track_oldphilips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_yamaha_cdr100 = { 0, CDR_TAO|CDR_DAO|CDR_CADDYLOAD|CDR_SWABAUDIO, "yamaha_cdr100", "driver for Yamaha CDR-100 / CDR-102", 0, drive_identify, philips_attach, drive_getdisktype, (int(*)__PR((SCSI *)))cmd_dummy, philips_unload, buf_dummy, recovery_needed, recover_philips, speed_select_yamaha, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_yamaha, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_ricoh_ro1060 = { 0, CDR_TAO|CDR_DAO|CDR_CADDYLOAD, "ricoh_ro1060c", "driver for Ricoh RO-1060C", 0, drive_identify, ricoh_attach, philips_getdisktype, scsi_load, scsi_unload, buf_dummy, recovery_needed, recover_philips, speed_select_yamaha, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_philips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};cdr_t cdr_ricoh_ro1420 = { 0, CDR_TAO|CDR_DAO|CDR_CADDYLOAD, "ricoh_ro1420c", "driver for Ricoh RO-1420C", 0, drive_identify, ricoh_attach, philips_getdisktype, scsi_load, scsi_unload, buf_dummy, recovery_needed, recover_philips, speed_select_yamaha, select_secsize, next_wr_addr_philips, reserve_track_philips, scsi_cdr_write_philips, no_sendcue, open_track_philips, close_track_philips, (int(*)__PR((SCSI *, int, track_t *, int, int)))cmd_dummy, cmd_dummy, read_session_offset_philips, fixation_philips, blank_dummy,};LOCAL intload_unload_philips(scgp, load) SCSI *scgp; int load;{ register struct scg_cmd *scmd = scgp->scmd; 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 = 0xE7; scmd->cdb.g1_cdb.lun = scgp->lun; scmd->cdb.g1_cdb.count[1] = !load; scgp->cmdname = "philips medium load/unload"; if (scsicmd(scgp) < 0) return (-1); return (0);}LOCAL intphilips_load(scgp) SCSI *scgp;{ return (load_unload_philips(scgp, 1));}LOCAL intphilips_unload(scgp) SCSI *scgp;{ return (load_unload_philips(scgp, 0));}LOCAL intphilips_dumbload(scgp) SCSI *scgp;{ int ret; scgp->silent++; ret = load_unload_philips(scgp, 1); scgp->silent--; if (ret < 0) return (scsi_load(scgp)); return (0);}LOCAL intphilips_dumbunload(scgp) SCSI *scgp;{ int ret; scgp->silent++; ret = load_unload_philips(scgp, 0); scgp->silent--; if (ret < 0) return (scsi_unload(scgp)); return (0);}LOCAL intrecover_philips(scgp, track) SCSI *scgp; int track;{ register struct scg_cmd *scmd = scgp->scmd; 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 = 0xEC; scmd->cdb.g1_cdb.lun = scgp->lun; scgp->cmdname = "philips recover"; if (scsicmd(scgp) < 0) return (-1); return (0);}LOCAL intspeed_select_yamaha(scgp, speedp, dummy) SCSI *scgp; int *speedp; int dummy;{ struct scsi_mode_page_header *mp; char mode[256]; int len = 16; int page = 0x31; struct yamaha_mode_page_31 *xp; struct cdd_52x_mode_data md; int count; int speed = 1; if (speedp) { speed = *speedp; } else { fillbytes((caddr_t)mode, sizeof(mode), '\0'); if (!get_mode_params(scgp, page, "Speed/Dummy information", (u_char *)mode, (u_char *)0, (u_char *)0, (u_char *)0, &len)) { return (-1); } if (len == 0) return (-1); mp = (struct scsi_mode_page_header *) (mode + sizeof(struct scsi_mode_header) + ((struct scsi_mode_header *)mode)->blockdesc_len); xp = (struct yamaha_mode_page_31 *)mp; speed = xp->speed; } fillbytes((caddr_t)&md, sizeof(md), '\0'); count = sizeof(struct scsi_mode_header) + sizeof(struct yamaha_mode_page_31); speed >>= 1; md.pagex.page31.p_code = 0x31; md.pagex.page31.p_len = 0x02; md.pagex.page31.speed = speed; md.pagex.page31.dummy = dummy?1:0; return (mode_select(scgp, (Uchar *)&md, count, 0, scgp->inq->data_format >= 2));}LOCAL intspeed_select_philips(scgp, speedp, dummy) SCSI *scgp; int *speedp; int dummy;{ struct scsi_mode_page_header *mp; char mode[256]; int len = 20; int page = 0x23; struct cdd_52x_mode_page_23 *xp; struct cdd_52x_mode_data md; int count; int speed = 1; if (speedp) { speed = *speedp; } else { fillbytes((caddr_t)mode, sizeof(mode), '\0'); if (!get_mode_params(scgp, page, "Speed/Dummy information", (u_char *)mode, (u_char *)0, (u_char *)0, (u_char *)0, &len)) { return (-1); } if (len == 0) return (-1); mp = (struct scsi_mode_page_header *) (mode + sizeof(struct scsi_mode_header) + ((struct scsi_mode_header *)mode)->blockdesc_len); xp = (struct cdd_52x_mode_page_23 *)mp; speed = xp->speed; } fillbytes((caddr_t)&md, sizeof(md), '\0'); count = sizeof(struct scsi_mode_header) + sizeof(struct cdd_52x_mode_page_23); md.pagex.page23.p_code = 0x23; md.pagex.page23.p_len = 0x06; md.pagex.page23.speed = speed; md.pagex.page23.dummy = dummy?1:0; return (mode_select(scgp, (Uchar *)&md, count, 0, scgp->inq->data_format >= 2));}LOCAL intspeed_select_pioneer(scgp, speedp, dummy)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -