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
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));
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));
53 + "generic SCSI-3/mmc DVD-R(W) driver",
63 + cmd_dummy, /* recovery_needed */
64 + (int(*)__PR((SCSI *, int)))cmd_dummy, /* recover */
68 + (int(*)__PR((SCSI *, Ulong)))cmd_ill, /* reserve_track */
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 */
77 + cmd_dummy, /* abort */
78 + read_session_offset,
95 - if (profile == 0 || profile == 0x12 || profile > 0x19) {
96 + if (profile == 0 || profile >= 0x10 && profile <= 0x15 || profile > 0x19) {
101 + * 13h DVD-RW (Restricted overwrite)
102 + * 14h DVD-RW (Sequential recording)
107 + if (profile == 0x11 || profile == 0x13 || profile == 0x14 || profile == 0x1A || profile == 0x1B) {
116 "Found unsupported DVD-RAM media.\n");
118 - } else { /* DVD+RW DVD+R */
120 - "Found DVD+ media but DVD+R/DVD+RW support code is missing.\n");
122 - "If you need DVD+R/DVD+RW support, ask the Author for cdrecord-ProDVD.\n");
124 - "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
127 - } else if (profile >= 0x10 && profile < 0x18) {
129 - "Found DVD media but DVD-R/DVD-RW support code is missing.\n");
131 - "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n");
133 - "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
139 @@ -661,13 +712,12 @@
144 - "Found DVD media but DVD-R/DVD-RW support code is missing.\n");
146 - "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n");
148 - "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
150 + "Found DVD media: using cdr_mdvd.\n");
153 + dp->profile = profile;
154 + dp->is_dvd = is_dvd;
163 +attach_mdvd(scgp, dp)
167 + struct cd_mode_page_2A *mp;
170 + allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */
173 + mp = mmc_cap(scgp, NULL);/* Get MMC capabilities in allocated mp */
176 + return (-1); /* Pre SCSI-3/mmc drive */
178 + dp->cdr_cdcap = mp; /* Store MMC cap pointer */
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;
186 + dp->cdr_flags |= CDR_BURNFREE;
188 + check_writemodes_mdvd(scgp, dp);
190 + if (driveropts != NULL) {
191 + if (strcmp(driveropts, "help") == 0) {
192 + mmc_opthelp(dp, 0);
200 check_writemodes_mmc(scgp, dp)
201 @@ -1007,6 +1093,77 @@
205 +check_writemodes_mdvd(scgp, dp)
211 + struct cd_mode_page_05 *mp;
214 + printf("Checking possible write modes: ");
216 + deflt_writemodes_mdvd(scgp, FALSE);
218 + fillbytes((caddr_t)mode, sizeof(mode), '\0');
221 + if (!get_mode_params(scgp, 0x05, "CD write parameter",
222 + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
231 + mp = (struct cd_mode_page_05 *)
232 + (mode + sizeof(struct scsi_mode_header) +
233 + ((struct scsi_mode_header *)mode)->blockdesc_len);
235 + mp->test_write = 0;
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.*/
242 + mp->write_type = WT_PACKET;
244 + i_to_4_byte(mp->packet_size, 0);
246 + if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) {
247 + dp->cdr_flags |= CDR_PACKET;
251 + dp->cdr_flags &= ~CDR_PACKET;
253 + i_to_4_byte(mp->packet_size, 0);
254 + mp->track_mode = TM_DATA;
257 + mp->write_type = WT_SAO;
259 + if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) {
260 + dp->cdr_flags |= CDR_SAO;
264 + dp->cdr_flags &= ~CDR_SAO;
270 + deflt_writemodes_mdvd(scgp, TRUE);
276 deflt_writemodes_mmc(scgp, reset_dummy)
279 @@ -1080,6 +1237,61 @@
284 +deflt_writemodes_mdvd(scgp, reset_dummy)
290 + struct cd_mode_page_05 *mp;
292 + fillbytes((caddr_t)mode, sizeof(mode), '\0');
295 + if (!get_mode_params(scgp, 0x05, "DVD write parameter",
296 + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
305 + mp = (struct cd_mode_page_05 *)
306 + (mode + sizeof(struct scsi_mode_header) +
307 + ((struct scsi_mode_header *)mode)->blockdesc_len);
309 + mp->test_write = 0;
311 + * This is the only place where we reset mp->test_write (-dummy)
314 + mp->test_write = 0;
318 + * Set default values:
319 + * Write type = 02 (session at once)
321 + * XXX Note: the same code appears in check_writemodes_mmc() and
322 + * XXX in speed_select_mmc().
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;
330 + if (set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1) < 0) {
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 @@
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;
351 @@ -1259,6 +1474,30 @@
355 +getdisktype_mdvd(scgp, dp)
360 + dstat_t *dsp = dp->cdr_dstat;
362 + struct track_info track_info;
363 + if(getdisktype_mmc(scgp, dp)<0)
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);
371 + dsp->ds_disktype&= ~DT_CD;
372 + dsp->ds_disktype|= DT_DVD;
379 getdisktype_mmc(scgp, dp)
382 @@ -1688,6 +1927,7 @@
383 * But the standard is rounding the wrong way.
384 * Furtunately rounding down is guaranteed.
386 + //val = curspeed*177;
390 @@ -1700,6 +1940,7 @@
392 if (scsi_get_speed(scgp, 0, &val) >= 0) {
394 + printf("Speed set to %d KB/s\n", val);
395 curspeed = val / 176;
398 @@ -1762,6 +2003,68 @@
402 +speed_select_mdvd(scgp, dp, speedp)
408 + unsigned char perf_desc[28];
409 + int write_speed = *speedp * 1385;
410 + int val = 0, val2 = 0;
413 + /* For the moment we just divide the CD speed by 7*/
416 + (*speedp)=(*speedp)*8;
418 + memset(perf_desc, 0, sizeof(perf_desc));
420 + /* Write Rotation Control = ROTCTL_CLV
421 + * | Restore Logical Unit Defaults = 0
423 + * | Random Access = 0)
425 + perf_desc[0]= ROTCTL_CLV << 3 | 0 << 2 | 0 << 1 | 0;
426 + /* Start LBA to 0 */
431 + /* End LBA set to 0 (setting to 0xffffffff failed on my LG burner
437 + /* Read Speed = 0xFFFF */
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;
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;
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);
459 + (*speedp)=(*speedp)/7;
464 next_wr_addr_mmc(scgp, trackp, ap)
467 @@ -1898,6 +2201,48 @@
471 +next_wr_addr_mdvd(scgp, trackp, ap)
477 + struct track_info track_info;
480 + struct disk_info disk_info;
482 + track = trackp->trackno;
485 + if (trackp != 0 && track > 0 && is_packet(trackp)) {
487 + result = read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info));
489 + if (scsi_in_progress(scgp)){
496 + /* Get the last rzone*/
497 + if(read_disk_info(scgp,(caddr_t)&disk_info,8)<0)
500 + if (read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)) < 0)
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);
513 open_track_mmc(scgp, dp, trackp)
516 @@ -1978,6 +2323,45 @@
520 +open_track_mdvd(scgp, dp, trackp)
527 + struct cd_mode_page_05 *mp;
529 + if (is_packet(trackp)) {
530 + fillbytes((caddr_t)mode, sizeof(mode), '\0');
532 + if (!get_mode_params(scgp, 0x05, "DVD write parameter",
533 + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len))
538 + mp = (struct cd_mode_page_05 *)
539 + (mode + sizeof(struct scsi_mode_header) +
540 + ((struct scsi_mode_header *)mode)->blockdesc_len);
542 + mp->write_type = WT_PACKET;
544 + /*For now we set the link size to 0x10(32k) because Pioneer-A03 only support this */
545 + mp->link_size=0x10;
547 + i_to_4_byte(mp->packet_size, trackp->pktsize);
552 + if (!set_mode_params(scgp, "CD write parameter", mode, len, 0, trackp->secsize))
559 close_track_mmc(scgp, dp, trackp)
562 @@ -2003,6 +2387,30 @@
567 +close_track_mdvd(scgp, dp, trackp)
573 + if (!is_packet(trackp))
576 + if (scsi_flush_cache(scgp, (dp->cdr_cmdflags&F_IMMED) != 0) < 0) {
577 + printf("Trouble flushing the cache\n");
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 */
591 SES_DA_ROM, /* CD-DA */
592 SES_DA_ROM, /* CD-ROM */
593 @@ -2086,6 +2494,82 @@
597 +open_session_mdvd(scgp, dp, trackp)
603 + int tracks = trackp->tracks;
606 + struct cd_mode_page_05 *mp;
609 + struct track_info track_info;
612 + fillbytes((caddr_t)mode, sizeof(mode), '\0');
614 + if (!get_mode_params(scgp, 0x05, "DVD write parameter",
615 + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len))
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;
630 + mp->write_type = WT_SAO;
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");
641 + } else if ((strcmp(driveropts, "noburnproof") == 0 ||
642 + strcmp(driveropts, "noburnfree") == 0)) {
643 + errmsgno(EX_BAD, "Turning BURN-Free off\n");
645 + } else if (strcmp(driveropts, "help") == 0) {
646 + mmc_opthelp(dp, 0);
648 + errmsgno(EX_BAD, "Bad driver opts '%s'.\n", driveropts);
649 + mmc_opthelp(dp, EX_BAD);
654 + if (!set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1))
659 + for(i=1;i<=tracks;i++) {
660 + totalsize+=trackp[i].tracksecs;
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)
673 waitfix_mmc(scgp, secs)
676 @@ -2215,6 +2699,25 @@
681 +fixate_mdvd(scgp, dp, trackp)
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.
690 + scg_settimeout(scgp, 1000);
691 + if(is_packet(trackp)){
692 + scsi_close_tr_session(scgp, 2, 0, FALSE);
694 + fixate_mmc(scgp, dp, trackp);
695 + scg_settimeout(scgp, 200);
699 char *blank_types[] = {
702 @@ -2226,6 +2729,12 @@
703 "reserved blanking type",
706 +char *format_types[] = {
708 + "background format",
713 blank_mmc(scgp, dp, addr, blanktype)
715 @@ -2238,11 +2747,17 @@
716 BOOL cdrrw = FALSE; /* Read CD-RW */
717 BOOL cdwrw = FALSE; /* Write CD-RW */
721 mmc_check(scgp, &cdrr, &cdwr, &cdrrw, &cdwrw, NULL, NULL);
723 return (blank_dummy(scgp, dp, addr, blanktype));
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));
731 printf("Blanking %s\n", blank_types[blanktype & 0x07]);
733 @@ -2258,6 +2773,80 @@
737 +format_mdvd(scgp, dp, formattype)
743 + BOOL dvdwr = FALSE; /* Write DVD */
747 + struct disk_info *dip;
749 + printf("format_mdvd\n");
750 + mmc_check(scgp, NULL, NULL, NULL, NULL, NULL, &dvdwr);
752 + return (format_dummy(scgp, dp, formattype));
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));
760 + printf("format_mdvd: media is a DVD+RW.\n");
761 + dip = (struct disk_info *)buf;
762 + if (get_diskinfo(scgp, dip) < 0)
765 + if (dip->disk_status & 3 && formattype != FORCE_FORMAT) {
766 + printf("Error: disk already formated, ignoring.\n");
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)
777 + addr[4+4] = 0x26<<2;
781 + if (formattype == FORCE_FORMAT) {
782 + printf("format_mdvd: forcing reformat.\n");
783 + formattype = FULL_FORMAT;
790 + printf("format_mdvd: media is unformated.\n");
794 + printf("Formating %s\n", format_types[formattype & 0x07]);
797 + if (formattype == FULL_FORMAT) {
798 + ret = scsi_format(scgp, &addr, sizeof(addr), FALSE);
800 + ret = scsi_format(scgp, &addr, sizeof(addr), TRUE);
805 + wait_unit_ready(scgp, 90*60/curspeed); /* XXX Wait for ATAPI */
806 + waitfix_mmc(scgp, 90*60/curspeed); /* XXX Wait for ATAPI */
811 send_opc_mmc(scgp, bp, cnt, doopc)
814 @@ -2453,6 +3042,42 @@
822 + int oflags = dp->cdr_dstat->ds_cdrflags;
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)
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;
834 + dp->cdr_dstat->ds_cdrflags = oflags;
835 + if (oflags & RF_PRATIP) {
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,
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,
854 scsi_sony_write(scgp, bp, sectaddr, size, blocks, islast)
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
860 extern cdr_t cdr_oldcd;
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;
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
878 #define BLANK_SESSION 0x06 /* Erase the last session */
881 + * Defines for formating DVD (custom values)
883 +#define FULL_FORMAT 0x00 /* Interactive format */
884 +#define BACKGROUND_FORMAT 0x01 /* Background format */
885 +#define FORCE_FORMAT 0x02 /* Force reformat */
888 * Useful definitions for audio tracks
890 #define msample (44100 * 2) /* one 16bit audio sample */
892 #define DSF_NEED_FORMAT 0x0800 /* Disk needs to be formatted */
895 + * Definitions for disktype flags
897 +#define DT_CD 0x001 /*is a CD */
898 +#define DT_DVD 0x002 /*is a DVD */
901 * Definitions for disk_status disk type
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 */
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
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));
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 **,
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));
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));
947 + int formattype = 0;
954 BOOL gracedone = FALSE;
956 + BOOL is_cdwr = FALSE;
957 + BOOL is_dvdwr = FALSE;
960 /* This gives wildcard expansion with Non-Posix shells with EMX */
962 track[i].track = track[i].trackno = i;
963 track[0].tracktype = TOC_MASK;
965 - gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags,
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");
972 @@ -349,11 +355,15 @@
973 # define CLONE_TITLE ""
975 if ((flags & F_MSINFO) == 0 || lverbose || flags & F_VERSION) {
976 - printf("Cdrecord%s%s %s (%s-%s-%s) Copyright (C) 1995-2005 Jörg Schilling\n",
977 + printf("Cdrecord%s%s %s-dvd (%s-%s-%s) Copyright (C) 1995-2005 Jörg Schilling\n",
981 HOST_CPU, HOST_VENDOR, HOST_OS);
982 + printf("Note: This version is an unofficial (modified) version with DVD support\n");
983 + printf("Note: and therefore may have bugs that are not present in the original.\n");
984 + printf("Note: Please send bug reports or support requests to <warly@mandrakesoft.com>.\n");
985 + printf("Note: The author of cdrecord should not be bothered with problems in this version.\n");
987 #if defined(SOURCE_MODIFIED) || !defined(IS_SCHILY_XCONFIG)
988 #define INSERT_YOUR_EMAIL_ADDRESS_HERE
989 @@ -483,11 +493,16 @@
991 if ((scgp = scg_open(dev, errstr, sizeof (errstr),
992 debug, (flags & F_MSINFO) == 0 || lverbose)) == (SCSI *)0) {
993 + if (dev != NULL || (flags & F_SCANBUS) == 0 || (scgp = scg_open("ATA", errstr, sizeof (errstr),
994 + debug, (flags & F_MSINFO) == 0 || lverbose)) == (SCSI *)0) {
995 errmsg("%s%sCannot open SCSI driver.\n", errstr, errstr[0]?". ":"");
996 errmsgno(EX_BAD, "For possible targets try 'cdrecord -scanbus'.%s\n",
997 geteuid() ? " Make sure you are root.":"");
998 errmsgno(EX_BAD, "For possible transport specifiers try 'cdrecord dev=help'.\n");
1005 * XXX Below this point we do not need root privilleges anymore.
1006 @@ -619,6 +634,17 @@
1007 } else if (!is_unknown_dev(scgp) && dp != get_cdrcmds(scgp)) {
1008 errmsgno(EX_BAD, "WARNING: Trying to use other driver on known device.\n");
1010 + is_mmc(scgp, &is_cdwr, &is_dvdwr);
1013 + track[0].flags |= TI_PACKET;
1014 + /*XXX put here to only affect DVD writing, should be in gargs.
1015 + * however if set in args for all mode, packet writing is then
1016 + * broken for all disc as cdrecord assume that PACKET imply TAO which
1017 + * is not true at all???? */
1018 + track[0].flags &= ~TI_TAO;
1022 if (!is_cddrive(scgp))
1023 comerrno(EX_BAD, "Sorry, no CD/DVD-Drive found on this target.\n");
1026 cuefilename != NULL) {
1028 - BOOL is_cdwr = FALSE;
1029 - BOOL is_dvdwr = FALSE;
1031 if ((dp->cdr_flags & CDR_ISREADER) != 0) {
1034 if (!is_mmc(scgp, &is_cdwr, &is_dvdwr))
1035 is_cdwr = TRUE; /* If it is not MMC, it must be a CD writer */
1037 - if (is_dvdwr && !set_cdrcmds("mmc_dvd", (cdr_t **)NULL)) {
1038 + if (is_dvdwr && !set_cdrcmds("mmc_mdvd", (cdr_t **)NULL)) {
1040 "This version of cdrecord does not include DVD-R/DVD-RW support code.\n");
1042 @@ -965,11 +989,6 @@
1043 print_toc(scgp, dp);
1046 - if ((flags & F_FORMAT) != 0) {
1047 - errmsgno(EX_BAD, "Format option not implemented in this version.\n");
1052 if ((*dp->cdr_check_session)() < 0) {
1054 @@ -1181,7 +1200,39 @@
1055 if (gettimeofday(&starttime, (struct timezone *)0) < 0)
1056 errmsg("Cannot get start time\n");
1059 + if (flags & F_FORMAT) {
1060 + printf("cdrecord: media format asked\n");
1062 + * Do not abort if OPC failes. Just give it a chance
1063 + * for better laser power calibration than without OPC.
1065 + * Ricoh drives return with a vendor unique sense code.
1066 + * This is most likely because they refuse to do OPC
1067 + * on a non blank media.
1070 + do_opc(scgp, dp, flags);
1072 + wait_unit_ready(scgp, 120);
1073 + if (gettimeofday(&starttime, (struct timezone *)0) < 0)
1074 + errmsg("Cannot get start time\n");
1076 + if ((*dp->cdr_format)(scgp, dp, formattype) < 0) {
1077 + errmsgno(EX_BAD, "Cannot format disk, aborting.\n");
1080 + if (gettimeofday(&fixtime, (struct timezone *)0) < 0)
1081 + errmsg("Cannot get format time\n");
1083 + prtimediff("Formatting time: ", &starttime, &fixtime);
1085 + if (!wait_unit_ready(scgp, 240) || tracks == 0) {
1088 + if (gettimeofday(&starttime, (struct timezone *)0) < 0)
1089 + errmsg("Cannot get start time\n");
1092 * Blank the media if we were requested to do so
1094 if (flags & F_BLANK) {
1095 @@ -1238,6 +1289,14 @@
1100 + /* If it is DVD, the information in TOC is fabricated :)
1101 + The real information is from read disk info command*/
1102 + if((dp->cdr_dstat->ds_disktype&DT_DVD) && (dp->cdr_dstat->ds_trlast>0)){
1103 + trackno=dp->cdr_dstat->ds_trlast-1;
1104 + printf("trackno=%d\n",trackno);
1107 if ((tracks + trackno) > MAX_TRACK) {
1109 * XXX How many tracks are allowed on a DVD?
1110 @@ -1422,8 +1481,8 @@
1111 if (gracetime > 999)
1114 - printf("Starting to write CD/DVD at speed %d in %s%s %s mode for %s session.\n",
1115 - (int)dp->cdr_dstat->ds_wspeed,
1116 + printf("Starting to write CD/DVD at speed %5.1f in %s%s %s mode for %s session.\n",
1117 + (float)dp->cdr_dstat->ds_wspeed,
1118 (dp->cdr_cmdflags & F_DUMMY) ? "dummy" : "real",
1119 (dp->cdr_cmdflags & F_FORCE) ? " force" : "",
1120 wm2name[dp->cdr_dstat->ds_wrmode],
1121 @@ -1539,6 +1598,7 @@
1122 (tlast.tv_sec * 1.0 + tlast.tv_usec * 0.000001);
1125 + if (dp->is_dvd) fspeed /= 9;
1126 printf("Average write speed %5.1fx.\n", fspeed);
1129 @@ -1593,7 +1653,7 @@
1130 error("\t-checkdrive check if a driver for the drive is present\n");
1131 error("\t-prcap print drive capabilities for MMC compliant drives\n");
1132 error("\t-inq do an inquiry for the drive and exit\n");
1133 - error("\t-scanbus scan the SCSI bus and exit\n");
1134 + error("\t-scanbus scan the SCSI and IDE buses and exit\n");
1135 error("\t-reset reset the SCSI bus with the cdrecorder (if possible)\n");
1136 error("\t-abort send an abort sequence to the drive (may help if hung)\n");
1137 error("\t-overburn allow to write more than the official size of a medium\n");
1138 @@ -1601,7 +1661,8 @@
1139 error("\t-useinfo use *.inf files to overwrite audio options.\n");
1140 error("\tspeed=# set speed of drive\n");
1141 error("\tblank=type blank a CD-RW disc (see blank=help)\n");
1142 - error("\t-format format a CD-RW/DVD-RW/DVD+RW disc\n");
1143 + error("\tformat format a CD-RW/DVD-RW/DVD+RW disc\n");
1144 + error("\tformattype=# select the format method for DVD+RW disc\n");
1146 error("\tfs=# Set fifo size to # (0 to disable, default is %ld MB)\n",
1147 DEFAULT_FIFOSIZE/(1024L*1024L));
1148 @@ -1687,6 +1748,18 @@
1153 +formattypeusage(ret)
1156 + error("Formating options:\n");
1157 + error("\tfull\t\tstandard formating\n");
1158 + error("\tbackground\t\tbackground formating\n");
1159 + error("\tforce\t\tforce reformat\n");
1167 @@ -2156,6 +2229,7 @@
1171 + if (dp->is_dvd) fspeed /= 9;
1172 printf(" %5.1fx", fspeed);
1174 savbytes = (bytes >> 20) << 20;
1175 @@ -2969,10 +3043,13 @@
1177 * dsp->ds_maxblocks == 0 (disk capacity is unknown).
1179 - if (endsec >= (405000-300)) { /*<90 min disk*/
1181 - "Data will not fit on any disk.\n");
1183 + if (endsec >= (2300000)) {
1185 + "ERROR: Could not manage to find medium size, and more than 4.3 GB of data.\n");
1187 + } else if (endsec >= (405000-300)) { /*<90 min disk or DVD*/
1189 + "WARNING: Could not manage to find medium size, and more than 90 mins of data.\n");
1190 } else if (endsec >= (333000-150)) { /* 74 min disk*/
1192 "WARNING: Data may not fit on standard 74min disk.\n");
1193 @@ -3046,7 +3123,7 @@
1197 -"help,version,checkdrive,prcap,inq,scanbus,reset,abort,overburn,ignsize,useinfo,dev*,timeout#,driver*,driveropts*,setdropts,tsize&,padsize&,pregap&,defpregap&,speed#,load,lock,eject,dummy,msinfo,toc,atip,multi,fix,nofix,waiti,immed,debug#,d+,kdebug#,kd#,verbose+,v+,Verbose+,V+,x+,xd#,silent,s,audio,data,mode2,xa,xa1,xa2,xamix,cdi,isosize,nopreemp,preemp,nocopy,copy,nopad,pad,swab,fs&,ts&,blank&,format,pktsize#,packet,noclose,force,tao,dao,sao,raw,raw96r,raw96p,raw16,clone,scms,isrc*,mcn*,index*,cuefile*,textfile*,text,shorttrack,noshorttrack,gracetime#,minbuf#";
1198 +"help,version,checkdrive,prcap,inq,scanbus,reset,abort,overburn,ignsize,useinfo,dev*,timeout#,driver*,driveropts*,setdropts,tsize&,padsize&,pregap&,defpregap&,speed#,load,lock,eject,dummy,msinfo,toc,atip,multi,fix,nofix,waiti,immed,debug#,d+,kdebug#,kd#,verbose+,v+,Verbose+,V+,x+,xd#,silent,s,audio,data,mode2,xa,xa1,xa2,xamix,cdi,isosize,nopreemp,preemp,nocopy,copy,nopad,pad,swab,fs&,ts&,blank&,format,formattype&,pktsize#,packet,noclose,force,tao,dao,sao,raw,raw96r,raw96p,raw16,clone,scms,isrc*,mcn*,index*,cuefile*,textfile*,text,shorttrack,noshorttrack,gracetime#,minbuf#";
1201 * Defines used to find whether a write mode has been specified.
1202 @@ -3056,8 +3133,8 @@
1203 #define M_RAW 4 /* Raw mode */
1204 #define M_PACKET 8 /* Packed mode */
1207 -gargs(ac, av, tracksp, trackp, devp, timeoutp, dpp, speedp, flagsp, blankp)
1209 +gargs(ac, av, tracksp, trackp, devp, timeoutp, dpp, speedp, flagsp, blankp, formatp)
1213 @@ -3068,6 +3145,7 @@
1221 @@ -3080,6 +3158,7 @@
1222 char *textfile = NULL;
1225 + int formattype = -1;
1229 @@ -3195,7 +3274,7 @@
1232 &nopad, &pad, &bswab, getnum, &fs, getnum, &bufsize,
1233 - getbltype, &bltype, &doformat, &pktsize,
1234 + getbltype, &bltype, &doformat, getformattype, &formattype, &pktsize,
1235 &ispacket, &noclose, &force,
1236 &tao, &dao, &dao, &raw, &raw96r, &raw96p, &raw16,
1238 @@ -3276,8 +3355,14 @@
1243 - *flagsp |= F_FORMAT;
1244 + if (doformat > 0) {
1245 + *flagsp |= F_FORMAT;
1246 + *formatp |= FULL_FORMAT;
1248 + if (formattype >= 0) {
1249 + *flagsp |= F_FORMAT;
1250 + *formatp |= formattype;
1255 @@ -3724,14 +3809,14 @@
1256 ((strncmp(*devp, "HELP", 4) == 0) ||
1257 (strncmp(*devp, "help", 4) == 0))) {
1258 *flagsp |= F_CHECKDRIVE; /* Set this for not calling mlockall() */
1262 if (*flagsp & (F_LOAD|F_DLCK|F_SETDROPTS|F_MSINFO|F_TOC|F_PRATIP|F_FIX|F_VERSION|F_CHECKDRIVE|F_PRCAP|F_INQUIRY|F_SCANBUS|F_RESET|F_ABORT)) {
1264 errmsgno(EX_BAD, "No tracks allowed with this option\n");
1271 if (*flagsp & F_SAO) {
1272 @@ -3760,12 +3845,13 @@
1275 cuefilename = cuefile;
1279 if (tracks == 0 && (*flagsp & (F_LOAD|F_DLCK|F_EJECT|F_BLANK|F_FORMAT)) == 0) {
1280 errmsgno(EX_BAD, "No tracks specified. Need at least one.\n");
1287 @@ -4437,6 +4523,26 @@
1292 +getformattype(optstr, typep)
1296 + if (streql(optstr, "full")) {
1297 + *typep = FULL_FORMAT;
1298 + } else if (streql(optstr, "background")) {
1299 + *typep = BACKGROUND_FORMAT;
1300 + } else if (streql(optstr, "force")) {
1301 + *typep = FORCE_FORMAT;
1302 + } else if (streql(optstr, "help")) {
1303 + formattypeusage(0);
1305 + error("Illegal blanking type '%s'.\n", optstr);
1306 + formattypeusage(EX_BAD);
1314 --- cdrtools-2.01/cdrecord/scsi_cdr.c.dvd 2004-05-25 00:36:01.000000000 +0200
1315 +++ cdrtools-2.01/cdrecord/scsi_cdr.c 2004-10-18 14:37:32.439249741 +0200
1317 EXPORT int send_cue_sheet __PR((SCSI *scgp, caddr_t bp, long size));
1318 EXPORT int read_buff_cap __PR((SCSI *scgp, long *, long *));
1319 EXPORT int scsi_blank __PR((SCSI *scgp, long addr, int blanktype, BOOL immed));
1320 +EXPORT int scsi_format __PR((SCSI *scgp, caddr_t addr, int size, BOOL background));
1321 +EXPORT int scsi_set_streaming __PR((SCSI *scgp, caddr_t addr, int size));
1322 EXPORT BOOL allow_atapi __PR((SCSI *scgp, BOOL new));
1323 EXPORT int mode_select __PR((SCSI *scgp, Uchar *, int, int, int));
1324 EXPORT int mode_sense __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf));
1325 @@ -519,6 +521,32 @@
1329 +scsi_set_streaming(scgp, perf_desc, size)
1331 + caddr_t perf_desc;
1334 + register struct scg_cmd *scmd = scgp->scmd;
1336 + fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
1337 + scmd->addr = perf_desc;
1338 + scmd->size = size;
1339 + scmd->flags = SCG_DISRE_ENA;
1340 + scmd->cdb_len = SC_G5_CDBLEN;
1341 + scmd->sense_len = CCS_SENSE_LEN;
1342 + scmd->cdb.g5_cdb.cmd = 0xB6;
1343 + scmd->cdb.cmd_cdb[11] = 0;
1344 + scmd->cdb.cmd_cdb[10] = size;
1346 + scgp->cmdname = "set streaming";
1348 + printf("scsi_set_streaming\n");
1349 + if (scg_cmd(scgp) < 0)
1355 scsi_set_speed(scgp, readspeed, writespeed, rotctl)
1358 @@ -1042,6 +1070,32 @@
1364 +reserve_track(scgp, size)
1369 + register struct scg_cmd *scmd = scgp->scmd;
1371 + fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
1372 + scmd->flags = SCG_DISRE_ENA;
1373 + scmd->cdb_len = SC_G1_CDBLEN;
1374 + scmd->sense_len = CCS_SENSE_LEN;
1375 + scmd->cdb.g1_cdb.cmd = 0x53;
1376 + scmd->cdb.g1_cdb.lun = scg_lun(scgp);
1377 + i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], size);
1379 + scgp->cmdname = "reserve track";
1381 + if (scg_cmd(scgp) < 0)
1389 read_rzone_info(scgp, bp, cnt)
1391 @@ -1323,6 +1377,69 @@
1392 return (scg_cmd(scgp));
1396 +scsi_format(scgp, addr, size, background)
1402 + register struct scg_cmd *scmd = scgp->scmd;
1403 + int progress=0, ret=-1, pid=-1;
1404 + unsigned char sense_table[18];
1407 + printf("scsi_format: preparing\n");
1409 + fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
1410 + scmd->addr = addr;
1411 + scmd->size = size;
1412 + scmd->flags = SCG_DISRE_ENA;
1413 + scmd->cdb_len = SC_G5_CDBLEN;
1414 + scmd->sense_len = CCS_SENSE_LEN;
1415 + scmd->timeout = 160 * 60; /* Do not know what to set */
1416 + scmd->cdb.g5_cdb.cmd = 0x04; /* Format Unit */
1417 + scmd->cdb.cmd_cdb[1] = 0x11; /* "FmtData" and "Format Code" */
1418 + scmd->cdb.cmd_cdb[5] = 0;
1420 + scgp->cmdname = "format unit";
1422 + printf("scsi_format: running\n");
1423 + ret = (scg_cmd(scgp));
1424 + printf("scsi_format: post processing %d\n", ret);
1425 + if (ret == -1) return ret;
1427 + if ((pid=fork()) == (pid_t)-1)
1428 + perror ("- [unable to fork()]");
1432 + if (test_unit_ready(scgp) >= 0)
1440 + printf("Formating in progress: 0.00 %% done.");
1442 + while (progress < 0xfff0) {
1443 + test_unit_ready(scgp);
1444 + request_sense_b(scgp, (caddr_t)sense_table, 18);
1445 + progress = sense_table[16]<<8|sense_table[17];
1446 + printf("\rFormating in progress: %.2f %% done [%d]. ", (float)(progress*100)/0x10000,progress);
1448 + /*for (i=0; i < 18; i++) {
1449 + printf("%d ", sense_table[i]);
1453 + printf("\rFormating in progress: 100.00 %% done. \n");
1454 + if (pid) exit (0);
1459 * XXX First try to handle ATAPI:
1460 * XXX ATAPI cannot handle SCSI 6 byte commands.
1461 --- cdrtools-2.01/libscg/scsitransp.c.dvd 2004-06-17 22:20:27.000000000 +0200
1462 +++ cdrtools-2.01/libscg/scsitransp.c 2004-10-18 14:37:32.424251905 +0200
1464 EXPORT int scg_sense_key __PR((SCSI *scgp));
1465 EXPORT int scg_sense_code __PR((SCSI *scgp));
1466 EXPORT int scg_sense_qual __PR((SCSI *scgp));
1467 +EXPORT unsigned char *scg_sense_table __PR((SCSI *scgp));
1468 EXPORT void scg_fprintdev __PR((FILE *, struct scsi_inquiry *));
1469 EXPORT void scg_printdev __PR((struct scsi_inquiry *));
1470 EXPORT int scg_printf __PR((SCSI *scgp, const char *form, ...));
1471 @@ -1240,6 +1241,23 @@
1475 + * Return all the SCSI sense table last command.
1477 +EXPORT unsigned char *
1478 +scg_sense_table(scgp)
1481 + register struct scg_cmd *cp = scgp->scmd;
1483 + if(!scg_cmd_err(scgp))
1486 + if (cp->sense.code >= 0x70)
1487 + return &(cp->sense);
1492 * Return the SCSI sense code for last command.