drv_sony.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:23k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)drv_sony.c 1.37 99/10/17 Copyright 1997 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)drv_sony.c 1.37 99/10/17 Copyright 1997 J. Schilling";
  5. #endif
  6. /*
  7.  * CDR device implementation for
  8.  * Sony
  9.  *
  10.  * Copyright (c) 1997 J. Schilling
  11.  */
  12. /*
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License as published by
  15.  * the Free Software Foundation; either version 2, or (at your option)
  16.  * any later version.
  17.  *
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  * GNU General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU General Public License
  24.  * along with this program; see the file COPYING.  If not, write to
  25.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  26.  */
  27. /*#define SONY_DEBUG*/
  28. #include <mconfig.h>
  29. #include <stdio.h>
  30. #include <standard.h>
  31. #include <fctldefs.h>
  32. #include <errno.h>
  33. #include <strdefs.h>
  34. #include <utypes.h>
  35. #include <btorder.h>
  36. #include <intcvt.h>
  37. #include <scg/scgcmd.h>
  38. #include <scg/scsidefs.h>
  39. #include <scg/scsireg.h>
  40. #include <scg/scsitransp.h>
  41. #include "cdrecord.h"
  42. #ifdef SONY_DEBUG
  43. # define inc_verbose() scgp->verbose++
  44. # define dec_verbose() scgp->verbose--
  45. #else
  46. # define inc_verbose()
  47. # define dec_verbose()
  48. #endif
  49. extern int lverbose;
  50. #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */
  51. struct sony_924_mode_page_20 { /* mastering information */
  52. MP_P_CODE; /* parsave & pagecode */
  53. u_char p_len; /* 0x06 = 6 Bytes */
  54. u_char subcode_header_off;
  55. Ucbit res3_0 : 1;
  56. Ucbit speudo : 1;
  57. Ucbit res3_2 : 1;
  58. Ucbit c2po : 1;
  59. Ucbit subcode_ecc : 1;
  60. Ucbit res3_567 : 3;
  61. u_char res_4;
  62. u_char cue_sheet_opt;
  63. u_char res[2];
  64. };
  65. #else /* Motorola byteorder */
  66. struct sony_924_mode_page_20 { /* mastering information */
  67. MP_P_CODE; /* parsave & pagecode */
  68. u_char p_len; /* 0x06 = 6 Bytes */
  69. u_char subcode_header_off;
  70. Ucbit res3_567 : 3;
  71. Ucbit subcode_ecc : 1;
  72. Ucbit c2po : 1;
  73. Ucbit res3_2 : 1;
  74. Ucbit speudo : 1;
  75. Ucbit res3_0 : 1;
  76. u_char res_4;
  77. u_char cue_sheet_opt;
  78. u_char res[2];
  79. };
  80. #endif
  81. struct sony_924_mode_page_22 { /* disk information */
  82. MP_P_CODE; /* parsave & pagecode */
  83. u_char p_len; /* 0x1E = 30 Bytes */
  84. u_char disk_style;
  85. u_char disk_type;
  86. u_char first_track;
  87. u_char last_track;
  88. u_char numsess;
  89. u_char res_7;
  90. u_char disk_appl_code[4];
  91. u_char last_start_time[4];
  92. u_char disk_status;
  93. u_char num_valid_nra;
  94. u_char track_info_track;
  95. u_char post_gap;
  96. u_char disk_id_code[4];
  97. u_char lead_in_start[4];
  98. u_char res[4];
  99. };
  100. struct sony_924_mode_page_23 { /* track information */
  101. MP_P_CODE; /* parsave & pagecode */
  102. u_char p_len; /* 0x22 = 34 Bytes */
  103. u_char res_2;
  104. u_char track_num;
  105. u_char data_form;
  106. u_char write_method;
  107. u_char session;
  108. u_char track_status;
  109. u_char start_lba[4];
  110. u_char next_recordable_addr[4];
  111. u_char blank_area_cap[4];
  112. u_char fixed_packet_size[4];
  113. u_char res_24;
  114. u_char starting_msf[3];
  115. u_char res_28;
  116. u_char ending_msf[3];
  117. u_char res_32;
  118. u_char next_rec_time[3];
  119. };
  120. struct sony_924_mode_page_31 { /* drive speed */
  121. MP_P_CODE; /* parsave & pagecode */
  122. u_char p_len; /* 0x02 = 2 Bytes */
  123. u_char speed;
  124. u_char res;
  125. };
  126. struct cdd_52x_mode_data {
  127. struct scsi_mode_header header;
  128. union cdd_pagex {
  129. struct sony_924_mode_page_20 page_s20;
  130. struct sony_924_mode_page_22 page_s22;
  131. struct sony_924_mode_page_23 page_s23;
  132. struct sony_924_mode_page_31 page_s31;
  133. } pagex;
  134. };
  135. LOCAL int write_continue_sony __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));
  136. LOCAL int write_track_sony __PR((SCSI *scgp, long track, int sectype));
  137. LOCAL int close_track_sony __PR((SCSI *scgp, int track, track_t *trackp));
  138. LOCAL int finalize_sony __PR((SCSI *scgp, int onp, int dummy, int type, int tracks, track_t *trackp));
  139. LOCAL int recover_sony __PR((SCSI *scgp, int track));
  140. LOCAL int next_wr_addr_sony __PR((SCSI *scgp, int track, track_t *trackp, long *ap));
  141. LOCAL int reserve_track_sony __PR((SCSI *scgp, unsigned long len));
  142. LOCAL int getdisktype_sony __PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));
  143. LOCAL void di_to_dstat_sony __PR((struct sony_924_mode_page_22 *dip, dstat_t *dsp));
  144. LOCAL int speed_select_sony __PR((SCSI *scgp, int *speedp, int dummy));
  145. LOCAL int next_writable_address_sony __PR((SCSI *scgp, long *ap, int track, int sectype, int tracktype));
  146. LOCAL int new_track_sony __PR((SCSI *scgp, int track, int sectype, int tracktype));
  147. LOCAL int open_track_sony __PR((SCSI *scgp, cdr_t *dp, int track, track_t *track_info));
  148. LOCAL int open_session_sony __PR((SCSI *scgp, int tracks, track_t *trackp, int toctype, int multi));
  149. LOCAL int get_page22_sony __PR((SCSI *scgp, char *mode));
  150. LOCAL int sony_attach __PR((SCSI *scgp, cdr_t *dp));
  151. #ifdef SONY_DEBUG
  152. LOCAL void print_sony_mp22 __PR((struct sony_924_mode_page_22 *xp, int len));
  153. LOCAL void print_sony_mp23 __PR((struct sony_924_mode_page_23 *xp, int len));
  154. #endif
  155. LOCAL int buf_cap_sony __PR((SCSI *scgp, long *, long *));
  156. cdr_t cdr_sony_cdu924 = {
  157. 0,
  158. CDR_TAO|CDR_DAO|CDR_CADDYLOAD|CDR_SWABAUDIO,
  159. "sony_cdu924",
  160. "driver for Sony CDU-924",
  161. 0,
  162. drive_identify,
  163. sony_attach,
  164. getdisktype_sony,
  165. scsi_load,
  166. scsi_unload,
  167. buf_cap_sony,
  168. (int(*)__PR((SCSI *)))cmd_dummy, /* recovery_needed */
  169. recover_sony,
  170. speed_select_sony,
  171. select_secsize,
  172. next_wr_addr_sony,
  173. reserve_track_sony,
  174. write_continue_sony,
  175. no_sendcue,
  176. open_track_sony,
  177. close_track_sony,
  178. open_session_sony,
  179. cmd_dummy,
  180. read_session_offset_philips,
  181. finalize_sony,
  182. blank_dummy,
  183. };
  184. LOCAL int
  185. write_continue_sony(scgp, bp, sectaddr, size, blocks, islast)
  186. SCSI *scgp;
  187. caddr_t bp; /* address of buffer */
  188. long sectaddr; /* disk address (sector) to put */
  189. long size; /* number of bytes to transfer */
  190. int blocks; /* sector count */
  191. BOOL islast; /* last write for track */
  192. {
  193. register struct scg_cmd *scmd = scgp->scmd;
  194. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  195. scmd->addr = bp;
  196. scmd->size = size;
  197. scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
  198. scmd->cdb_len = SC_G1_CDBLEN;
  199. scmd->sense_len = CCS_SENSE_LEN;
  200. scmd->target = scgp->target;
  201. scmd->cdb.g1_cdb.cmd = 0xE1;
  202. scmd->cdb.g1_cdb.lun = scgp->lun;
  203. g0_cdbaddr(&scmd->cdb.g0_cdb, size); /* Hack, but Sony is silly */
  204. scgp->cmdname = "write_continue";
  205. if (scsicmd(scgp) < 0)
  206. return (-1);
  207. return (size - scsigetresid(scgp));
  208. }
  209. LOCAL int
  210. write_track_sony(scgp, track, sectype)
  211. SCSI *scgp;
  212. long track; /* track number 0 == new track */
  213. int sectype; /* no sectype for Sony write track */
  214. {
  215. register struct scg_cmd *scmd = scgp->scmd;
  216. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  217. scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
  218. scmd->cdb_len = SC_G1_CDBLEN;
  219. scmd->sense_len = CCS_SENSE_LEN;
  220. scmd->target = scgp->target;
  221. scmd->cdb.g1_cdb.cmd = 0xF5;
  222. scmd->cdb.g1_cdb.lun = scgp->lun;
  223. g1_cdbaddr(&scmd->cdb.g1_cdb, track);
  224. scgp->cmdname = "write_track";
  225. if (scsicmd(scgp) < 0)
  226. return (-1);
  227. return (0);
  228. }
  229. /* XXX NOCH NICHT FERTIG */
  230. LOCAL int
  231. close_track_sony(scgp, track, trackp)
  232. SCSI *scgp;
  233. int track;
  234. track_t *trackp;
  235. {
  236. register struct scg_cmd *scmd = scgp->scmd;
  237. track = 0;
  238. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  239. scmd->flags = SCG_DISRE_ENA;
  240. scmd->cdb_len = SC_G1_CDBLEN;
  241. scmd->sense_len = CCS_SENSE_LEN;
  242. scmd->target = scgp->target;
  243. scmd->cdb.g1_cdb.cmd = 0xF0;
  244. scmd->cdb.g1_cdb.lun = scgp->lun;
  245. g1_cdbaddr(&scmd->cdb.g1_cdb, track);
  246. /* XXX Padding ??? (bit 0 in addr[0]) */
  247. scgp->cmdname = "close_track";
  248. if (scsicmd(scgp) < 0)
  249. return (-1);
  250. /*
  251.  * Clear the silly "error situation" from Sony