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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)cdr_drv.c 1.19 00/01/07 Copyright 1997 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)cdr_drv.c 1.19 00/01/07 Copyright 1997 J. Schilling";
  5. #endif
  6. /*
  7.  * CDR device abstraction layer
  8.  *
  9.  * Copyright (c) 1997 J. Schilling
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; see the file COPYING.  If not, write to
  24.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  */
  26. #include <stdxlib.h>
  27. #include <standard.h>
  28. #include <scg/scsidefs.h>
  29. #include <scg/scsireg.h>
  30. #include <scg/scsitransp.h>
  31. #include "cdrecord.h"
  32. extern cdr_t cdr_oldcd;
  33. extern cdr_t cdr_cd;
  34. extern cdr_t cdr_mmc;
  35. extern cdr_t cdr_mmc_sony;
  36. #ifdef DRV_DVD
  37. extern cdr_t cdr_dvd;
  38. #endif
  39. extern cdr_t cdr_philips_cdd521O;
  40. extern cdr_t cdr_philips_dumb;
  41. extern cdr_t cdr_philips_cdd521;
  42. extern cdr_t cdr_philips_cdd522;
  43. extern cdr_t cdr_kodak_pcd600;
  44. extern cdr_t cdr_pioneer_dw_s114x;
  45. extern cdr_t cdr_plasmon_rf4100;
  46. extern cdr_t cdr_yamaha_cdr100;
  47. extern cdr_t cdr_sony_cdu924;
  48. extern cdr_t cdr_ricoh_ro1060;
  49. extern cdr_t cdr_ricoh_ro1420;
  50. extern cdr_t cdr_teac_cdr50;
  51. extern cdr_t cdr_cdr_simul;
  52. extern cdr_t cdr_dvd_simul;
  53. EXPORT cdr_t  *drive_identify __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *ip));
  54. EXPORT int drive_attach __PR((SCSI *scgp, cdr_t *));
  55. EXPORT int attach_unknown __PR((void));
  56. EXPORT int blank_dummy __PR((SCSI *scgp, long addr, int blanktype));
  57. EXPORT int drive_getdisktype __PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));
  58. EXPORT int cmd_ill __PR((SCSI *scgp));
  59. EXPORT int cmd_dummy __PR((SCSI *scgp));
  60. EXPORT int buf_dummy __PR((SCSI *scgp, long *sp, long *fp));
  61. EXPORT BOOL set_cdrcmds __PR((char *name, cdr_t **dpp));
  62. EXPORT cdr_t *get_cdrcmds __PR((SCSI *scgp));
  63. /*
  64.  * List of CD-R drivers
  65.  */
  66. cdr_t *drivers[] = {
  67. #ifdef DRV_DVD
  68. &cdr_dvd,
  69. #endif
  70. &cdr_mmc,
  71. &cdr_mmc_sony,
  72. &cdr_cd,
  73. &cdr_oldcd,
  74. &cdr_philips_cdd521O,
  75. &cdr_philips_dumb,
  76. &cdr_philips_cdd521,
  77. &cdr_philips_cdd522,
  78. &cdr_kodak_pcd600,
  79. &cdr_pioneer_dw_s114x,
  80. &cdr_plasmon_rf4100,
  81. &cdr_yamaha_cdr100,
  82. &cdr_ricoh_ro1060,
  83. &cdr_ricoh_ro1420,
  84. &cdr_sony_cdu924,
  85. &cdr_teac_cdr50,
  86. &cdr_cdr_simul,
  87. &cdr_dvd_simul,
  88. (cdr_t *)NULL,
  89. };
  90. EXPORT cdr_t *
  91. drive_identify(scgp, dp, ip)
  92. SCSI *scgp;
  93. cdr_t *dp;
  94. struct scsi_inquiry *ip;
  95. {
  96. return (dp);
  97. }
  98. EXPORT int
  99. drive_attach(scgp, dp)
  100. SCSI *scgp;
  101. cdr_t *dp;
  102. {
  103. return (0);
  104. }
  105. EXPORT int
  106. attach_unknown()
  107. {
  108. errmsgno(EX_BAD, "Unsupported drive typen");
  109. return (-1);
  110. }
  111. EXPORT int
  112. blank_dummy(scgp, addr, blanktype)
  113. SCSI *scgp;
  114. long addr;
  115. int blanktype;
  116. {
  117. printf("This drive or media does not support the BLANK commandn");
  118. return (-1);
  119. }
  120. EXPORT int
  121. drive_getdisktype(scgp, dp, dsp)
  122. SCSI *scgp;
  123. cdr_t *dp;
  124. dstat_t *dsp;
  125. {
  126. return (0);
  127. }
  128. EXPORT int
  129. cmd_ill(scgp)
  130. SCSI *scgp;
  131. {
  132. errmsgno(EX_BAD, "Unspecified command not implemented for this drive.n");
  133. return (-1);
  134. }
  135. EXPORT int
  136. cmd_dummy(scgp)
  137. SCSI *scgp;
  138. {
  139. return (0);
  140. }
  141. EXPORT int
  142. no_sendcue(scgp, tracks, trackp)
  143. SCSI *scgp;
  144. int tracks;
  145. track_t *trackp;
  146. {
  147. errmsgno(EX_BAD, "SAO writing not available or not implemented for this drive.n");
  148. return (-1);
  149. }
  150. EXPORT int
  151. buf_dummy(scgp, sp, fp)
  152. SCSI *scgp;
  153. long *sp;
  154. long *fp;
  155. {
  156. return (-1);
  157. }
  158. EXPORT BOOL
  159. set_cdrcmds(name, dpp)
  160. char *name;
  161. cdr_t **dpp;
  162. {
  163. cdr_t **d;
  164. int n;
  165. for (d = drivers; *d != (cdr_t *)NULL; d++) {
  166. if (streql((*d)->cdr_drname, name)) {
  167. if (dpp != NULL)
  168. *dpp = *d;
  169. return (TRUE);
  170. }
  171. }
  172. if (dpp == NULL)
  173. return (FALSE);
  174. if (!streql("help", name))
  175. error("Illegal driver type '%s'.n", name);
  176. error("Driver types:n");
  177. for (d = drivers; *d != (cdr_t *)NULL; d++) {
  178. error("%s%n",
  179. (*d)->cdr_drname, &n);
  180. error("%*s%sn",
  181. 20-n, "",
  182. (*d)->cdr_drtext);
  183. }
  184. if (streql("help", name))
  185. exit(0);
  186. exit(EX_BAD);
  187. return (FALSE); /* Make lint happy */
  188. }
  189. EXPORT cdr_t *
  190. get_cdrcmds(scgp)
  191. SCSI *scgp;
  192. {
  193. cdr_t *dp = (cdr_t *)0;
  194. BOOL is_dvd = FALSE;
  195. /*
  196.  * First check for SCSI-3/mmc drives.
  197.  */
  198. if (is_mmc(scgp, &is_dvd)) {
  199. #ifdef DRV_DVD
  200. if (is_dvd)
  201. dp = &cdr_dvd;
  202. else
  203. #endif
  204. dp = &cdr_mmc;
  205. } else switch (scgp->dev) {
  206. case DEV_CDROM: dp = &cdr_oldcd; break;
  207. case DEV_MMC_CDROM: dp = &cdr_cd; break;
  208. case DEV_MMC_CDR: dp = &cdr_mmc; break;
  209. case DEV_MMC_CDRW: dp = &cdr_mmc; break;
  210. case DEV_CDD_521_OLD: dp = &cdr_philips_cdd521O; break;
  211. case DEV_CDD_521: dp = &cdr_philips_cdd521; break;
  212. case DEV_CDD_522:
  213. case DEV_CDD_2000:
  214. case DEV_CDD_2600: dp = &cdr_philips_cdd522; break;
  215. case DEV_PCD_600: dp = &cdr_kodak_pcd600; break;
  216. case DEV_YAMAHA_CDR_100:dp = &cdr_yamaha_cdr100; break;
  217. case DEV_MATSUSHITA_7502:
  218. case DEV_YAMAHA_CDR_400:dp = &cdr_mmc; break;
  219. case DEV_PLASMON_RF_4100:dp = &cdr_plasmon_rf4100; break;
  220. case DEV_SONY_CDU_924: dp = &cdr_sony_cdu924; break;
  221. case DEV_RICOH_RO_1060C:dp = &cdr_ricoh_ro1060; break;
  222. case DEV_RICOH_RO_1420C:dp = &cdr_ricoh_ro1420; break;
  223. case DEV_TEAC_CD_R50S: dp = &cdr_teac_cdr50; break;
  224. case DEV_PIONEER_DW_S114X: dp = &cdr_pioneer_dw_s114x; break;
  225. #ifdef DRV_DVD
  226. case DEV_PIONEER_DVDR_S101:dp = &cdr_dvd; break;
  227. #endif
  228. default: dp = &cdr_mmc;
  229. }
  230. if (dp != (cdr_t *)0)
  231. dp = dp->cdr_identify(scgp, dp, scgp->inq);
  232. return (dp);
  233. }