]> git.pld-linux.org Git - packages/cdrtools.git/blame - cdrtools-dvd-2.patch
- up to 2.01.01a03; added dvd support
[packages/cdrtools.git] / cdrtools-dvd-2.patch
CommitLineData
b2f9b8e5
AM
1--- cdrtools-2.01/cdrecord/drv_mmc.c.dvd 2004-05-25 00:36:01.000000000 +0200
2+++ cdrtools-2.01/cdrecord/drv_mmc.c 2004-10-18 14:40:10.329455353 +0200
3@@ -84,8 +84,11 @@
4 EXPORT char *hasdrvopt __PR((char *optstr, char *optname));
5 LOCAL cdr_t *identify_mmc __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *));
6 LOCAL int attach_mmc __PR((SCSI *scgp, cdr_t *));
7+LOCAL int attach_mdvd __PR((SCSI *scgp, cdr_t *));
8 EXPORT int check_writemodes_mmc __PR((SCSI *scgp, cdr_t *dp));
9+LOCAL int check_writemodes_mdvd __PR((SCSI *scgp, cdr_t *dp));
10 LOCAL int deflt_writemodes_mmc __PR((SCSI *scgp, BOOL reset_dummy));
11+LOCAL int deflt_writemodes_mdvd __PR((SCSI *scgp, BOOL reset_dummy));
12 LOCAL int get_diskinfo __PR((SCSI *scgp, struct disk_info *dip));
13 LOCAL void di_to_dstat __PR((struct disk_info *dip, dstat_t *dsp));
14 LOCAL int get_atip __PR((SCSI *scgp, struct atipinfo *atp));
15@@ -94,18 +97,27 @@
16 #endif
17 LOCAL int init_mmc __PR((SCSI *scgp, cdr_t *dp));
18 LOCAL int getdisktype_mmc __PR((SCSI *scgp, cdr_t *dp));
19+LOCAL int getdisktype_mdvd __PR((SCSI *scgp, cdr_t *dp));
20 LOCAL int speed_select_mmc __PR((SCSI *scgp, cdr_t *dp, int *speedp));
21+LOCAL int speed_select_mdvd __PR((SCSI *scgp, cdr_t *dp, int *speedp));
22 LOCAL int mmc_set_speed __PR((SCSI *scgp, int readspeed, int writespeed, int rotctl));
23 LOCAL int next_wr_addr_mmc __PR((SCSI *scgp, track_t *trackp, long *ap));
24+LOCAL int next_wr_addr_mdvd __PR((SCSI *scgp, track_t *trackp, long *ap));
25 LOCAL int write_leadin_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
26 LOCAL int open_track_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
27+LOCAL int open_track_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
28 LOCAL int close_track_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
29+LOCAL int close_track_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
30 LOCAL int open_session_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
31+LOCAL int open_session_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
32 LOCAL int waitfix_mmc __PR((SCSI *scgp, int secs));
33 LOCAL int fixate_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
34+LOCAL int fixate_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
35 LOCAL int blank_mmc __PR((SCSI *scgp, cdr_t *dp, long addr, int blanktype));
36+LOCAL int format_mdvd __PR((SCSI *scgp, cdr_t *dp, int formattype));
37 LOCAL int send_opc_mmc __PR((SCSI *scgp, caddr_t, int cnt, int doopc));
38 LOCAL int opt1_mmc __PR((SCSI *scgp, cdr_t *dp));
39+LOCAL int opt1_mdvd __PR((SCSI *scgp, cdr_t *dp));
40 LOCAL int opt2_mmc __PR((SCSI *scgp, cdr_t *dp));
41 LOCAL int scsi_sony_write __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));
42 LOCAL int gen_cue_mmc __PR((track_t *trackp, void *vcuep, BOOL needgap));
515b0c3b 43@@ -197,6 +209,47 @@
b2f9b8e5
AM
44 opt2_mmc,
45 };
46
47+cdr_t cdr_mdvd = {
48+ 0, 0,
49+ CDR_SWABAUDIO,
515b0c3b 50+ CDR_CDRW_ALL,
b2f9b8e5
AM
51+ 370,370,
52+ "mmc_mdvd",
53+ "generic SCSI-3/mmc DVD-R(W) driver",
54+ 0,
55+ (dstat_t *)0,
56+ identify_mmc,
57+ attach_mdvd,
58+ init_mmc,
59+ getdisktype_mdvd,
60+ scsi_load,
61+ scsi_unload,
62+ read_buff_cap,
63+ cmd_dummy, /* recovery_needed */
64+ (int(*)__PR((SCSI *, int)))cmd_dummy, /* recover */
65+ speed_select_mdvd,
66+ select_secsize,
67+ next_wr_addr_mdvd,
68+ (int(*)__PR((SCSI *, Ulong)))cmd_ill, /* reserve_track */
69+ scsi_cdr_write,
70+ (int(*)__PR((SCSI *scgp, int, track_t *)))cmd_dummy, /* gen_cue */
71+ (int(*)__PR((SCSI *scgp, cdr_t *, track_t *)))cmd_dummy, /* send_cue */
72+ write_leadin_mmc,
73+ open_track_mdvd,
74+ close_track_mdvd,
75+ open_session_mdvd,
76+ cmd_dummy,
77+ cmd_dummy, /* abort */
78+ read_session_offset,
79+ fixate_mdvd,
80+ stats_mmc,
81+ blank_mmc,
82+ format_mdvd,
83+ send_opc_mmc,
84+ opt1_mdvd,
85+ opt2_mmc,
86+};
87+
88 /*
89 * Sony MMC CD-writer
90 */
91@@ -556,7 +608,21 @@
92 if (profile >= 0) {
93 if (lverbose)
94 print_profiles(scgp);
95- if (profile == 0 || profile == 0x12 || profile > 0x19) {
96+ if (profile == 0 || profile >= 0x10 && profile <= 0x15 || profile > 0x19) {
97+ /*
98+ * 10h DVD-ROM
99+ * 11h DVD-R
100+ * 12h DVD-RAM
101+ * 13h DVD-RW (Restricted overwrite)
102+ * 14h DVD-RW (Sequential recording)
103+ * 1Ah DVD+RW
104+ * 1Bh DVD+R
105+ *
106+ */
107+ if (profile == 0x11 || profile == 0x13 || profile == 0x14 || profile == 0x1A || profile == 0x1B) {
108+ is_dvd = TRUE;
109+ dp = &cdr_mdvd;
110+ } else {
111 is_dvd = FALSE;
112 dp = &cdr_cd;
113
114@@ -578,23 +644,8 @@
115 errmsgno(EX_BAD,
116 "Found unsupported DVD-RAM media.\n");
117 return (dp);
118- } else { /* DVD+RW DVD+R */
119- errmsgno(EX_BAD,
120- "Found DVD+ media but DVD+R/DVD+RW support code is missing.\n");
121- errmsgno(EX_BAD,
122- "If you need DVD+R/DVD+RW support, ask the Author for cdrecord-ProDVD.\n");
123- errmsgno(EX_BAD,
124- "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
125- return (dp);
126 }
127- } else if (profile >= 0x10 && profile < 0x18) {
128- errmsgno(EX_BAD,
129- "Found DVD media but DVD-R/DVD-RW support code is missing.\n");
130- errmsgno(EX_BAD,
131- "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n");
132- errmsgno(EX_BAD,
133- "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
134- return (dp);
135+ }
136 }
137 } else {
138 if (xdebug)
139@@ -661,13 +712,12 @@
140 #endif
141 }
142 if (is_dvd) {
143- errmsgno(EX_BAD,
144- "Found DVD media but DVD-R/DVD-RW support code is missing.\n");
145- errmsgno(EX_BAD,
146- "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n");
147- errmsgno(EX_BAD,
148- "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
149+ errmsgno(EX_BAD,
150+ "Found DVD media: using cdr_mdvd.\n");
151+ dp = &cdr_mdvd;
152 }
153+ dp->profile = profile;
154+ dp->is_dvd = is_dvd;
155 return (dp);
156 }
157
158@@ -856,6 +906,42 @@
159 return (0);
160 }
161
162+LOCAL int
163+attach_mdvd(scgp, dp)
164+ SCSI *scgp;
165+ cdr_t *dp;
166+{
167+ struct cd_mode_page_2A *mp;
168+
169+
170+ allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */
171+
172+ scgp->silent++;
173+ mp = mmc_cap(scgp, NULL);/* Get MMC capabilities in allocated mp */
174+ scgp->silent--;
175+ if (mp == NULL)
176+ return (-1); /* Pre SCSI-3/mmc drive */
177+
178+ dp->cdr_cdcap = mp; /* Store MMC cap pointer */
179+
180+ if (mp->loading_type == LT_TRAY)
181+ dp->cdr_flags |= CDR_TRAYLOAD;
182+ else if (mp->loading_type == LT_CADDY)
183+ dp->cdr_flags |= CDR_CADDYLOAD;
184+
185+ if (mp->BUF != 0)
186+ dp->cdr_flags |= CDR_BURNFREE;
187+
188+ check_writemodes_mdvd(scgp, dp);
189+
190+ if (driveropts != NULL) {
191+ if (strcmp(driveropts, "help") == 0) {
192+ mmc_opthelp(dp, 0);
193+ }
194+ }
195+
196+ return (0);
197+}
198
199 EXPORT int
200 check_writemodes_mmc(scgp, dp)
201@@ -1007,6 +1093,77 @@
202 }
203
204 LOCAL int
205+check_writemodes_mdvd(scgp, dp)
206+ SCSI *scgp;
207+ cdr_t *dp;
208+{
209+ Uchar mode[0x100];
210+ int len;
211+ struct cd_mode_page_05 *mp;
212+
213+ if (xdebug)
214+ printf("Checking possible write modes: ");
215+
216+ deflt_writemodes_mdvd(scgp, FALSE);
217+
218+ fillbytes((caddr_t)mode, sizeof(mode), '\0');
219+
220+ scgp->silent++;
221+ if (!get_mode_params(scgp, 0x05, "CD write parameter",
222+ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
223+ scgp->silent--;
224+ return (-1);
225+ }
226+ if (len == 0) {
227+ scgp->silent--;
228+ return (-1);
229+ }
230+
231+ mp = (struct cd_mode_page_05 *)
232+ (mode + sizeof(struct scsi_mode_header) +
233+ ((struct scsi_mode_header *)mode)->blockdesc_len);
234+
235+ mp->test_write = 0;
236+
237+ /*We only check for PACKET and SAO since these are the only supported modes for DVD */
238+ /*XXX these checks are irrelevant because they are not medium sensitive. ie the device returns
239+ error only when it does not support a given mode for ALL mediums. It should check using
240+ GET CONFIGURATION command.*/
241+
242+ mp->write_type = WT_PACKET;
243+ mp->fp = 0;
244+ i_to_4_byte(mp->packet_size, 0);
245+
246+ if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) {
247+ dp->cdr_flags |= CDR_PACKET;
248+ if (xdebug)
249+ printf("PACKET ");
250+ } else
251+ dp->cdr_flags &= ~CDR_PACKET;
252+ mp->fp = 0;
253+ i_to_4_byte(mp->packet_size, 0);
254+ mp->track_mode = TM_DATA;
255+
256+
257+ mp->write_type = WT_SAO;
258+
259+ if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) {
260+ dp->cdr_flags |= CDR_SAO;
261+ if (xdebug)
262+ printf("SAO ");
263+ } else
264+ dp->cdr_flags &= ~CDR_SAO;
265+
266+
267+ if (xdebug)
268+ printf("\n");
269+
270+ deflt_writemodes_mdvd(scgp, TRUE);
271+ scgp->silent--;
272+ return (0);
273+}
274+
275+LOCAL int
276 deflt_writemodes_mmc(scgp, reset_dummy)
277 SCSI *scgp;
278 BOOL reset_dummy;
279@@ -1080,6 +1237,61 @@
280 return (0);
281 }
282
283+LOCAL int
284+deflt_writemodes_mdvd(scgp, reset_dummy)
285+ SCSI *scgp;
286+ BOOL reset_dummy;
287+{
288+ Uchar mode[0x100];
289+ int len;
290+ struct cd_mode_page_05 *mp;
291+
292+ fillbytes((caddr_t)mode, sizeof(mode), '\0');
293+
294+ scgp->silent++;
295+ if (!get_mode_params(scgp, 0x05, "DVD write parameter",
296+ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
297+ scgp->silent--;
298+ return (-1);
299+ }
300+ if (len == 0) {
301+ scgp->silent--;
302+ return (-1);
303+ }
304+
305+ mp = (struct cd_mode_page_05 *)
306+ (mode + sizeof(struct scsi_mode_header) +
307+ ((struct scsi_mode_header *)mode)->blockdesc_len);
308+
309+ mp->test_write = 0;
310+ /*
311+ * This is the only place where we reset mp->test_write (-dummy)
312+ */
313+ if (reset_dummy)
314+ mp->test_write = 0;
315+
316+
317+ /*
318+ * Set default values:
319+ * Write type = 02 (session at once)
320+ *
321+ * XXX Note: the same code appears in check_writemodes_mmc() and
322+ * XXX in speed_select_mmc().
323+ */
324+ mp->write_type = WT_SAO;
325+ mp->track_mode = TM_DATA;
326+ mp->dbtype = DB_ROM_MODE1;
327+ mp->session_format = SES_DA_ROM;
328+
329+
330+ if (set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1) < 0) {
331+ scgp->silent--;
332+ return (-1);
333+ }
334+ scgp->silent--;
335+ return (0);
336+}
337+
338 #ifdef PRINT_ATIP
339 LOCAL void print_di __PR((struct disk_info *dip));
340 LOCAL void atip_printspeed __PR((char *fmt, int speedindex, char speedtab[]));
341@@ -1149,6 +1361,9 @@
342
343 if (dsp->ds_last_leadout == 0 && dsp->ds_maxblocks >= 0)
344 dsp->ds_last_leadout = dsp->ds_maxblocks;
345+ dsp->ds_trfirst=dip->first_track;
346+ dsp->ds_trlast=dip->last_track_ls;
347+ dsp->ds_trfirst_ls=dip->first_track_ls;
348 }
349
350 LOCAL int
351@@ -1259,6 +1474,30 @@
352 }
353
354 LOCAL int
355+getdisktype_mdvd(scgp, dp)
356+ SCSI *scgp;
357+ cdr_t *dp;
358+{
359+ int ret=0;
360+ dstat_t *dsp = dp->cdr_dstat;
361+
362+ struct track_info track_info;
363+ if(getdisktype_mmc(scgp, dp)<0)
364+ return -1;
365+
366+ /* read rzone info to get the space left on disk */
367+ /*ds_trlast is the last rzone on disk, can be invisible */
368+ if(read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info))>=0)
369+ dsp->ds_maxblocks=a_to_u_4_byte(track_info.free_blocks)+a_to_4_byte(track_info.next_writable_addr);
370+
371+ dsp->ds_disktype&= ~DT_CD;
372+ dsp->ds_disktype|= DT_DVD;
373+
374+ return (ret);
375+
376+}
377+
378+LOCAL int
379 getdisktype_mmc(scgp, dp)
380 SCSI *scgp;
381 cdr_t *dp;
382@@ -1688,6 +1927,7 @@
383 * But the standard is rounding the wrong way.
384 * Furtunately rounding down is guaranteed.
385 */
386+ //val = curspeed*177;
387 val = curspeed*177;
388 if (val > 0xFFFF)
389 val = 0xFFFF;
390@@ -1700,6 +1940,7 @@
391
392 if (scsi_get_speed(scgp, 0, &val) >= 0) {
393 if (val > 0) {
394+ printf("Speed set to %d KB/s\n", val);
395 curspeed = val / 176;
396 *speedp = curspeed;
397 }
398@@ -1762,6 +2003,68 @@
399 }
400
401 LOCAL int
402+speed_select_mdvd(scgp, dp, speedp)
403+ SCSI *scgp;
404+ cdr_t *dp;
405+ int *speedp;
406+{
407+ int retcode;
408+ unsigned char perf_desc[28];
409+ int write_speed = *speedp * 1385;
410+ int val = 0, val2 = 0;
411+ int i;
412+
413+ /* For the moment we just divide the CD speed by 7*/
414+
415+ if(speedp!=NULL)
416+ (*speedp)=(*speedp)*8;
417+
418+ memset(perf_desc, 0, sizeof(perf_desc));
419+
420+ /* Write Rotation Control = ROTCTL_CLV
421+ * | Restore Logical Unit Defaults = 0
422+ * | Exact = 0
423+ * | Random Access = 0)
424+ */
425+ perf_desc[0]= ROTCTL_CLV << 3 | 0 << 2 | 0 << 1 | 0;
426+ /* Start LBA to 0 */
427+ perf_desc[4] = 0;
428+ perf_desc[5] = 0;
429+ perf_desc[6] = 0;
430+ perf_desc[7] = 0;
431+ /* End LBA set to 0 (setting to 0xffffffff failed on my LG burner
432+ */
433+ perf_desc[8] = 0;
434+ perf_desc[9] = 0;
435+ perf_desc[10] = 0;
436+ perf_desc[11] = 0;
437+ /* Read Speed = 0xFFFF */
438+ perf_desc[12] = 0;
439+ perf_desc[13] = 0;
440+ perf_desc[14] = 0xFF;
441+ perf_desc[15] = 0xFF;
442+ /* Read Time = 1s */
443+ perf_desc[18] = 1000 >> 8;
444+ perf_desc[19] = 1000 & 0xFF;
445+ /* Write Speed */
446+ perf_desc[20] = write_speed >> 24;
447+ perf_desc[21] = write_speed >> 16 & 0xFF;
448+ perf_desc[22] = write_speed >> 8 & 0xFF;
449+ perf_desc[23] = write_speed & 0xFF;
450+ /* Write Time = 1s */
451+ perf_desc[26] = 1000 >> 8;
452+ perf_desc[27] = 1000 & 0xFF;
453+
454+ //retcode = scsi_set_streaming(scgp, NULL, 0);
455+ retcode = scsi_set_streaming(scgp, &perf_desc, sizeof(perf_desc));
456+ if (retcode == -1) return retcode;
457+ retcode = speed_select_mmc(scgp, dp, speedp);
458+ if(speedp!=NULL)
459+ (*speedp)=(*speedp)/7;
460+ return retcode;
461+}
462+
463+LOCAL int
464 next_wr_addr_mmc(scgp, trackp, ap)
465 SCSI *scgp;
466 track_t *trackp;
467@@ -1898,6 +2201,48 @@
468 };
469
470 LOCAL int
471+next_wr_addr_mdvd(scgp, trackp, ap)
472+ SCSI *scgp;
473+ track_t *trackp;
474+ long *ap;
475+{
476+ int track;
477+ struct track_info track_info;
478+ long next_addr;
479+ int result = -1;
480+ struct disk_info disk_info;
481+ if (trackp){
482+ track = trackp->trackno;
483+ }
484+
485+ if (trackp != 0 && track > 0 && is_packet(trackp)) {
486+ scgp->silent++;
487+ result = read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info));
488+ scgp->silent--;
489+ if (scsi_in_progress(scgp)){
490+ return -1;
491+ }
492+
493+ }
494+
495+ if (result < 0) {
496+ /* Get the last rzone*/
497+ if(read_disk_info(scgp,(caddr_t)&disk_info,8)<0)
498+ return (-1);
499+
500+ if (read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)) < 0)
501+ return (-1);
502+ }
503+ if (scgp->verbose)
504+ scg_prbytes("track info:", (Uchar *)&track_info,
505+ sizeof(track_info)-scg_getresid(scgp));
506+ next_addr = a_to_4_byte(track_info.next_writable_addr);
507+ if (ap)
508+ *ap = next_addr;
509+ return (0);
510+}
511+
512+LOCAL int
513 open_track_mmc(scgp, dp, trackp)
514 SCSI *scgp;
515 cdr_t *dp;
516@@ -1978,6 +2323,45 @@
517 }
518
519 LOCAL int
520+open_track_mdvd(scgp, dp, trackp)
521+ SCSI *scgp;
522+ cdr_t *dp;
523+ track_t *trackp;
524+{
525+ Uchar mode[0x100];
526+ int len;
527+ struct cd_mode_page_05 *mp;
528+
529+ if (is_packet(trackp)) {
530+ fillbytes((caddr_t)mode, sizeof(mode), '\0');
531+
532+ if (!get_mode_params(scgp, 0x05, "DVD write parameter",
533+ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len))
534+ return (-1);
535+ if (len == 0)
536+ return (-1);
537+
538+ mp = (struct cd_mode_page_05 *)
539+ (mode + sizeof(struct scsi_mode_header) +
540+ ((struct scsi_mode_header *)mode)->blockdesc_len);
541+
542+ mp->write_type = WT_PACKET;
543+ mp->LS_V = 1;
544+ /*For now we set the link size to 0x10(32k) because Pioneer-A03 only support this */
545+ mp->link_size=0x10;
546+ mp->fp = 1;
547+ i_to_4_byte(mp->packet_size, trackp->pktsize);
548+ } else {
549+ return 0;
550+ }
551+
552+ if (!set_mode_params(scgp, "CD write parameter", mode, len, 0, trackp->secsize))
553+ return (-1);
554+
555+ return (0);
556+}
557+
558+LOCAL int
559 close_track_mmc(scgp, dp, trackp)
560 SCSI *scgp;
561 cdr_t *dp;
562@@ -2003,6 +2387,30 @@
563 return (0);
564 }
565
566+LOCAL int
567+close_track_mdvd(scgp, dp, trackp)
568+ SCSI *scgp;
569+ cdr_t *dp;
570+ track_t *trackp;
571+{
572+ int ret;
573+ if (!is_packet(trackp))
574+ return (0);
575+
576+ if (scsi_flush_cache(scgp, (dp->cdr_cmdflags&F_IMMED) != 0) < 0) {
577+ printf("Trouble flushing the cache\n");
578+ return -1;
579+ }
580+ wait_unit_ready(scgp, 300); /* XXX Wait for ATAPI */
581+ if (is_packet(trackp) && !is_noclose(trackp)) {
582+ /* close the incomplete track */
583+ ret = scsi_close_tr_session(scgp, 1, 0xFF, (dp->cdr_cmdflags&F_IMMED) != 0);
584+ wait_unit_ready(scgp, 300); /* XXX Wait for ATAPI */
585+ return (ret);
586+ }
587+ return (0);
588+}
589+
590 int toc2sess[] = {
591 SES_DA_ROM, /* CD-DA */
592 SES_DA_ROM, /* CD-ROM */
593@@ -2086,6 +2494,82 @@
594 }
595
596 LOCAL int
597+open_session_mdvd(scgp, dp, trackp)
598+ SCSI *scgp;
599+ cdr_t *dp;
600+ track_t *trackp;
601+{
602+ Uchar mode[0x100];
603+ int tracks = trackp->tracks;
604+
605+ int len;
606+ struct cd_mode_page_05 *mp;
607+ Ulong totalsize;
608+ int i;
609+ struct track_info track_info;
610+ int profile;
611+
612+ fillbytes((caddr_t)mode, sizeof(mode), '\0');
613+
614+ if (!get_mode_params(scgp, 0x05, "DVD write parameter",
615+ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len))
616+ return (-1);
617+ if (len == 0)
618+ return (-1);
619+
620+ mp = (struct cd_mode_page_05 *)
621+ (mode + sizeof(struct scsi_mode_header) +
622+ ((struct scsi_mode_header *)mode)->blockdesc_len);
623+ if(is_packet(trackp)){
624+ mp->write_type=WT_PACKET;
625+ mp->multi_session = (track_base(trackp)->tracktype & TOCF_MULTI) ? MS_MULTI : MS_NONE;
626+ mp->fp=0;
627+ mp->BUFE=1;
628+ mp->track_mode=1;
629+ }else{
630+ mp->write_type = WT_SAO;
631+ }
632+
633+
634+ if (lverbose && dp->cdr_cdcap->BUF != 0)
635+ printf("BURN-Free is %s.\n", mp->BUFE?"ON":"OFF");
636+ if (driveropts != NULL) {
637+ if ((strcmp(driveropts, "burnproof") == 0 ||
638+ strcmp(driveropts, "burnfree") == 0) && dp->cdr_cdcap->BUF != 0) {
639+ errmsgno(EX_BAD, "Turning BURN-Free on\n");
640+ mp->BUFE = 1;
641+ } else if ((strcmp(driveropts, "noburnproof") == 0 ||
642+ strcmp(driveropts, "noburnfree") == 0)) {
643+ errmsgno(EX_BAD, "Turning BURN-Free off\n");
644+ mp->BUFE = 0;
645+ } else if (strcmp(driveropts, "help") == 0) {
646+ mmc_opthelp(dp, 0);
647+ } else {
648+ errmsgno(EX_BAD, "Bad driver opts '%s'.\n", driveropts);
649+ mmc_opthelp(dp, EX_BAD);
650+ }
651+ }
652+
653+
654+ if (!set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1))
655+ return (-1);
656+
657+
658+ totalsize=0;
659+ for(i=1;i<=tracks;i++) {
660+ totalsize+=trackp[i].tracksecs;
661+ }
662+
663+ profile = get_curprofile(scgp);
664+ if(!is_packet(trackp) && profile != 0x1A){
665+ /* in DAO mode we need to reserve space for the track*/
666+ if(reserve_track(scgp, totalsize)<0)
667+ return (-1);
668+ }
669+ return (0);
670+}
671+
672+LOCAL int
673 waitfix_mmc(scgp, secs)
674 SCSI *scgp;
675 int secs;
676@@ -2215,6 +2699,25 @@
677 return (ret);
678 }
679
680+LOCAL int
681+fixate_mdvd(scgp, dp, trackp)
682+ SCSI *scgp;
683+ cdr_t *dp;
684+ track_t *trackp;
685+{
686+ /*set a really BIG timeout and call fixate_mmc
687+ The BIG timeout is needed in case there was a very short rzone to write at the
688+ beginning of the disk, because lead-out needs to be at some distance.
689+ */
690+ scg_settimeout(scgp, 1000);
691+ if(is_packet(trackp)){
692+ scsi_close_tr_session(scgp, 2, 0, FALSE);
693+ }
694+ fixate_mmc(scgp, dp, trackp);
695+ scg_settimeout(scgp, 200);
696+
697+}
698+
699 char *blank_types[] = {
700 "entire disk",
701 "PMA, TOC, pregap",
702@@ -2226,6 +2729,12 @@
703 "reserved blanking type",
704 };
705
706+char *format_types[] = {
707+ "full format",
708+ "background format",
709+ "forced format",
710+};
711+
712 LOCAL int
713 blank_mmc(scgp, dp, addr, blanktype)
714 SCSI *scgp;
715@@ -2238,11 +2747,17 @@
716 BOOL cdrrw = FALSE; /* Read CD-RW */
717 BOOL cdwrw = FALSE; /* Write CD-RW */
718 int ret;
719+ int profile;
720
721 mmc_check(scgp, &cdrr, &cdwr, &cdrrw, &cdwrw, NULL, NULL);
722 if (!cdwrw)
723 return (blank_dummy(scgp, dp, addr, blanktype));
724
725+ profile = get_curprofile(scgp);
726+ if (profile == 0x1A) {
727+ printf("Error: this media does not support blanking, ignoring.\n");
728+ return (blank_dummy(scgp, dp, addr, blanktype));
729+ }
730 if (lverbose) {
731 printf("Blanking %s\n", blank_types[blanktype & 0x07]);
732 flush();
733@@ -2258,6 +2773,80 @@
734 }
735
736 LOCAL int
737+format_mdvd(scgp, dp, formattype)
738+ SCSI *scgp;
739+ cdr_t *dp;
740+ int formattype;
741+{
742+extern char *buf;
743+ BOOL dvdwr = FALSE; /* Write DVD */
744+ int ret;
745+ int profile;
746+ char addr[12];
747+ struct disk_info *dip;
748+
749+ printf("format_mdvd\n");
750+ mmc_check(scgp, NULL, NULL, NULL, NULL, NULL, &dvdwr);
751+ if (!dvdwr)
752+ return (format_dummy(scgp, dp, formattype));
753+
754+ printf("format_mdvd: drive is a dvd burner.\n");
755+ profile = get_curprofile(scgp);
756+ if (profile != 0x1A) {
757+ printf("Error: only support DVD+RW formating, ignoring.\n");
758+ return (format_dummy(scgp, dp, formattype));
759+ }
760+ printf("format_mdvd: media is a DVD+RW.\n");
761+ dip = (struct disk_info *)buf;
762+ if (get_diskinfo(scgp, dip) < 0)
763+ return ret;
764+
765+ if (dip->disk_status & 3 && formattype != FORCE_FORMAT) {
766+ printf("Error: disk already formated, ignoring.\n");
767+ return ret;
768+ }
769+ addr[0] = 0; // "Reserved"
770+ addr[1] = 2; // "IMMED" flag
771+ addr[2] = 0; // "Descriptor Length" (MSB)
772+ addr[3] = 8; // "Descriptor Length" (LSB)
773+ addr[4+0] = 0xff;
774+ addr[4+1] = 0xff;
775+ addr[4+2] = 0xff;
776+ addr[4+3] = 0xff;
777+ addr[4+4] = 0x26<<2;
778+ addr[4+5] = 0;
779+ addr[4+6] = 0;
780+ addr[4+7] = 0;
781+ if (formattype == FORCE_FORMAT) {
782+ printf("format_mdvd: forcing reformat.\n");
783+ formattype = FULL_FORMAT;
784+ addr[4+0] = 0;
785+ addr[4+1] = 0;
786+ addr[4+2] = 0;
787+ addr[4+3] = 0;
788+ addr[4+7] = 1;
789+ } else {
790+ printf("format_mdvd: media is unformated.\n");
791+ }
792+
793+ if (lverbose) {
794+ printf("Formating %s\n", format_types[formattype & 0x07]);
795+ flush();
796+ }
797+ if (formattype == FULL_FORMAT) {
798+ ret = scsi_format(scgp, &addr, sizeof(addr), FALSE);
799+ } else {
800+ ret = scsi_format(scgp, &addr, sizeof(addr), TRUE);
801+ }
802+ if (ret < 0)
803+ return (ret);
804+
805+ wait_unit_ready(scgp, 90*60/curspeed); /* XXX Wait for ATAPI */
806+ waitfix_mmc(scgp, 90*60/curspeed); /* XXX Wait for ATAPI */
807+ return (ret);
808+}
809+
810+LOCAL int
811 send_opc_mmc(scgp, bp, cnt, doopc)
812 SCSI *scgp;
813 caddr_t bp;
814@@ -2453,6 +3042,42 @@
815 }
816
817 LOCAL int
818+opt1_mdvd(scgp, dp)
819+ SCSI *scgp;
820+ cdr_t *dp;
821+{
822+ int oflags = dp->cdr_dstat->ds_cdrflags;
823+
824+ if ((dp->cdr_dstat->ds_cdrflags & RF_AUDIOMASTER) != 0) {
825+ printf("Turning Audio Master Q. R. on\n");
826+ if (set_audiomaster_yamaha(scgp, dp, TRUE) < 0)
827+ return (-1);
828+ if (!debug && lverbose <= 1)
829+ dp->cdr_dstat->ds_cdrflags &= ~RF_PRATIP;
830+ if (getdisktype_mdvd(scgp, dp) < 0) {
831+ dp->cdr_dstat->ds_cdrflags = oflags;
832+ return (-1);
833+ }
834+ dp->cdr_dstat->ds_cdrflags = oflags;
835+ if (oflags & RF_PRATIP) {
836+ msf_t msf;
837+ lba_to_msf(dp->cdr_dstat->ds_first_leadin, &msf);
838+ printf("New start of lead in: %ld (%02d:%02d/%02d)\n",
839+ (long)dp->cdr_dstat->ds_first_leadin,
840+ msf.msf_min,
841+ msf.msf_sec,
842+ msf.msf_frame);
843+ lba_to_msf(dp->cdr_dstat->ds_maxblocks, &msf);
844+ printf("New start of lead out: %ld (%02d:%02d/%02d)\n",
845+ (long)dp->cdr_dstat->ds_maxblocks,
846+ msf.msf_min,
847+ msf.msf_sec,
848+ msf.msf_frame);
849+ }
850+ }
851+ return (0);
852+}
853+LOCAL int
854 scsi_sony_write(scgp, bp, sectaddr, size, blocks, islast)
855 SCSI *scgp;
856 caddr_t bp; /* address of buffer */
857--- cdrtools-2.01/cdrecord/cdr_drv.c.dvd 2004-03-02 02:06:26.000000000 +0100
858+++ cdrtools-2.01/cdrecord/cdr_drv.c 2004-10-18 14:37:32.427251472 +0200
859@@ -42,6 +42,7 @@
860 extern cdr_t cdr_oldcd;
861 extern cdr_t cdr_cd;
862 extern cdr_t cdr_mmc;
863+extern cdr_t cdr_mdvd;
864 extern cdr_t cdr_mmc_sony;
865 extern cdr_t cdr_cd_dvd;
866 extern cdr_t cdr_philips_cdd521O;
867@@ -80,6 +81,7 @@
868 cdr_t *drivers[] = {
869 &cdr_cd_dvd,
870 &cdr_mmc,
871+ &cdr_mdvd,
872 &cdr_mmc_sony,
873 &cdr_cd,
874 &cdr_oldcd,
875--- cdrtools-2.01/cdrecord/cdrecord.h.dvd 2004-05-25 00:36:01.000000000 +0200
876+++ cdrtools-2.01/cdrecord/cdrecord.h 2004-10-18 14:37:32.428251328 +0200
877@@ -460,6 +460,13 @@
878 #define BLANK_SESSION 0x06 /* Erase the last session */
879
880 /*
881+ * Defines for formating DVD (custom values)
882+ */
883+#define FULL_FORMAT 0x00 /* Interactive format */
884+#define BACKGROUND_FORMAT 0x01 /* Background format */
885+#define FORCE_FORMAT 0x02 /* Force reformat */
886+
887+/*
888 * Useful definitions for audio tracks
889 */
890 #define msample (44100 * 2) /* one 16bit audio sample */
891@@ -570,6 +577,12 @@
892 #define DSF_NEED_FORMAT 0x0800 /* Disk needs to be formatted */
893
894 /*
895+ * Definitions for disktype flags
896+ */
897+#define DT_CD 0x001 /*is a CD */
898+#define DT_DVD 0x002 /*is a DVD */
899+
900+/*
901 * Definitions for disk_status disk type
902 * used in "ds_type".
903 */
904@@ -709,6 +722,8 @@
905 int (*cdr_opc) __PR((SCSI *scgp, caddr_t bp, int cnt, int doopc)); /* Do OPC */
906 int (*cdr_opt1) __PR((SCSI *scgp, cdr_t *)); /* do early option processing*/
907 int (*cdr_opt2) __PR((SCSI *scgp, cdr_t *)); /* do late option processing */
908+ int profile;
909+ BOOL is_dvd;
910 };
911 #endif
912
913--- cdrtools-2.01/cdrecord/cdrecord.c.dvd 2004-09-08 19:26:35.000000000 +0200
914+++ cdrtools-2.01/cdrecord/cdrecord.c 2004-10-18 14:37:32.436250174 +0200
915@@ -180,6 +180,7 @@
916 LOCAL void susage __PR((int));
917 LOCAL void usage __PR((int));
918 LOCAL void blusage __PR((int));
919+LOCAL void formattypeusage __PR((int));
920 LOCAL void intr __PR((int sig));
921 LOCAL void catchsig __PR((int sig));
922 LOCAL int scsi_cb __PR((void *arg));
923@@ -216,9 +217,9 @@
924 LOCAL BOOL checkdsize __PR((SCSI *scgp, cdr_t *dp,
925 long tsize, int flags));
926 LOCAL void raise_fdlim __PR((void));
927-LOCAL void gargs __PR((int, char **, int *, track_t *, char **,
928+LOCAL int gargs __PR((int, char **, int *, track_t *, char **,
929 int *, cdr_t **,
930- int *, long *, int *));
931+ int *, long *, int *, int *));
932 LOCAL void set_trsizes __PR((cdr_t *, int, track_t *));
933 EXPORT void load_media __PR((SCSI *scgp, cdr_t *, BOOL));
934 EXPORT void unload_media __PR((SCSI *scgp, cdr_t *, int));
935@@ -238,6 +239,7 @@
936 LOCAL void wait_input __PR((void));
937 LOCAL void checkgui __PR((void));
938 LOCAL int getbltype __PR((char *optstr, long *typep));
939+LOCAL int getformattype __PR((char *optstr, long *typep));
940 LOCAL void print_drflags __PR((cdr_t *dp));
941 LOCAL void print_wrmodes __PR((cdr_t *dp));
942 LOCAL BOOL check_wrmode __PR((cdr_t *dp, int wmode, int tflags));
943@@ -262,6 +264,7 @@
944 int speed = -1;
945 long flags = 0L;
946 int blanktype = 0;
947+ int formattype = 0;
948 int i;
949 int tracks = 0;
950 int trackno;
951@@ -273,6 +276,9 @@
952 SCSI *scgp = NULL;
953 char errstr[80];
954 BOOL gracedone = FALSE;
955+ int ispacket;
956+ BOOL is_cdwr = FALSE;
957+ BOOL is_dvdwr = FALSE;
958
959 #ifdef __EMX__
960 /* This gives wildcard expansion with Non-Posix shells with EMX */
961@@ -287,8 +293,8 @@
962 track[i].track = track[i].trackno = i;
963 track[0].tracktype = TOC_MASK;
964 raise_fdlim();
965- gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags,
966- &blanktype);
967+ ispacket = gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags,
968+ &blanktype, &formattype);
969 if ((track[0].tracktype & TOC_MASK) == TOC_MASK)
970 comerrno(EX_BAD, "Internal error: Bad TOC type.\n");
971
972@@ -349,11 +355,15 @@
973 # define CLONE_TITLE ""
974 #endif
975 if ((flags & F_MSINFO) == 0 || lverbose || flags & F_VERSION) {
0d6b8e98
AM
976