Enabled quick formatting with DVD-RAM, made slow formatting default with BD-RE

This commit is contained in:
Thomas Schmitt 2008-04-26 15:07:39 +00:00
parent 5e4da147a5
commit f006ee5436
5 changed files with 67 additions and 24 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2008.04.25.132353" #define Cdrskin_timestamP "2008.04.26.150646"

View File

@ -695,7 +695,7 @@ managment. There is no way to increase payload capacity by format 01h.
With BD-RE there are three format types : 00h, 30h and 31h. With BD-RE there are three format types : 00h, 30h and 31h.
00h offers the default size format. 00h offers the default size format.
30h offers several sizes with defect management. Usually there are three 30h offers several sizes with defect management. Usually there are three
size th choose: #1: default size, #2: maximum spare area, #3: minimal spare. size to choose: #1: default size, #2: maximum spare area, #3: minimal spare.
31h offers a single size and disables defect management. This has the side 31h offers a single size and disables defect management. This has the side
effect to speed up writing to nominal speed. effect to speed up writing to nominal speed.
(mmc5r03c.pdf 6.5.4.2.15, 6.24.3.3, Table 472) (mmc5r03c.pdf 6.5.4.2.15, 6.24.3.3, Table 472)
@ -716,6 +716,18 @@ Usable with 30h seem 10b Full Certification and 11b Quick Certification.
Usable with 31h seem also 00b Quick Reformat and 01b No Certification. Usable with 31h seem also 00b Quick Reformat and 01b No Certification.
(mmc5r03c.pdf 6.5.4.2.15.1) (mmc5r03c.pdf 6.5.4.2.15.1)
Other format types have their certification intensity controlled by
a pair of bits: CmpList and DCRT.
CmpList resides in CDB byte 1 as bit 3. DCRT resides in the payload byte 1
as bit 5. Both together should request a quick size change without lengthy
certification but maintaining the list of known defects.
(mmc5r03c.pdf 6.5, table 249, 6.5.3.2)
With DVD-RAM on my PHILIPS SPD3300L drive they prevent any format size
change though. The TSSTcorp SH-S203B works properly.
With BD-RE format 00h, the default is specified to be Quick Reformat,
and with 00h in general certification can only be disabled not enabled.
(mmc5r03c.pdf 6.5.4.2.1.7)
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
DVD-RAM and BD-RE tuning : DVD-RAM and BD-RE tuning :

View File

@ -615,7 +615,7 @@ void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
d->cancel = 0; d->cancel = 0;
d->busy = BURN_DRIVE_FORMATTING; d->busy = BURN_DRIVE_FORMATTING;
ret = d->format_unit(d, size, flag & 0xffb6); /* forward bits */ ret = d->format_unit(d, size, flag & 0xfff6); /* forward bits */
if (ret <= 0) if (ret <= 0)
d->cancel = 1; d->cancel = 1;

View File

@ -1185,7 +1185,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast);
bit1+2: size mode bit1+2: size mode
0 = use parameter size as far as it makes sense 0 = use parameter size as far as it makes sense
1 = insist in size 0 even if there is a better default known 1 = insist in size 0 even if there is a better default known
(has no effect on DVD-RAM or BD-RE) (on DVD-RAM or BD-RE identical to size mode 0)
2 = without bit7: format to maximum available size 2 = without bit7: format to maximum available size
with bit7 : take size from indexed format descriptor with bit7 : take size from indexed format descriptor
3 = without bit7: format to default size 3 = without bit7: format to default size
@ -1193,6 +1193,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast);
bit3= -reserved- bit3= -reserved-
bit4= enforce re-format of (partly) formatted media bit4= enforce re-format of (partly) formatted media
bit5= try to disable eventual defect management bit5= try to disable eventual defect management
bit6= try to avoid lengthy media certification
bit7= MMC expert application mode (else libburn tries to bit7= MMC expert application mode (else libburn tries to
choose a suitable format type): choose a suitable format type):
bit8 to bit15 contain the index of the format to use. See bit8 to bit15 contain the index of the format to use. See

View File

@ -57,6 +57,7 @@ extern struct libdax_msgs *libdax_messenger;
/* ts A80410 : <<< Dangerous experiment: Pretend that DVD-RAM is BD-RE /* ts A80410 : <<< Dangerous experiment: Pretend that DVD-RAM is BD-RE
# define Libburn_dvd_ram_as_bd_rE yes # define Libburn_dvd_ram_as_bd_rE yes
*/ */
/* ts A80425 : Prevents command FORMAT UNIT for DVD-RAM or BD-RE. /* ts A80425 : Prevents command FORMAT UNIT for DVD-RAM or BD-RE.
Useful only to test the selection of format descriptors without Useful only to test the selection of format descriptors without
actually formatting the media. actually formatting the media.
@ -2374,8 +2375,8 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
#ifdef Libburn_dvd_ram_as_bd_rE #ifdef Libburn_dvd_ram_as_bd_rE
/* <<< dummy format descriptor list as obtained from dvd+rw-mediainfo /* <<< dummy format descriptor list as obtained from
by Giulio Orsero in April 2008 dvd+rw-mediainfo by Giulio Orsero in April 2008
*/ */
d->num_format_descr = 5; d->num_format_descr = 5;
d->format_descriptors[0].type = 0x00; d->format_descriptors[0].type = 0x00;
@ -2399,7 +2400,11 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
/* silencing compiler warnings about unused variables */ /* silencing compiler warnings about unused variables */
num_blocks = size = sign = i = max_score = num_descr = score = type = 0; num_blocks = size = sign = i = max_score = num_descr = score = type = 0;
#else /* Libburn_dvd_ram_as_bd_rE */ if (d->current_profile == 0x12 || d->current_profile == 0x43)
return 1;
d->num_format_descr = 0;
#endif /* Libburn_dvd_ram_as_bd_rE */
if (top_wanted == 0x00 || top_wanted == 0x10) if (top_wanted == 0x00 || top_wanted == 0x10)
sign = -1; /* the caller clearly desires full format */ sign = -1; /* the caller clearly desires full format */
@ -2459,9 +2464,6 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
} }
} }
#endif /* ! Libburn_dvd_ram_as_bd_rE */
/* <<< /* <<<
sprintf(msg, sprintf(msg,
"best_format_type = %2.2Xh , best_format_size = %.f", "best_format_type = %2.2Xh , best_format_size = %.f",
@ -2613,6 +2615,7 @@ int mmc_read_buffer_capacity(struct burn_drive *d)
bit3= expand format up to at least size bit3= expand format up to at least size
bit4= enforce re-format of (partly) formatted media bit4= enforce re-format of (partly) formatted media
bit5= try to disable eventual defect management bit5= try to disable eventual defect management
bit6= try to avoid lengthy media certification
bit7= bit8 to bit15 contain the index of the format to use bit7= bit8 to bit15 contain the index of the format to use
bit8-bit15 = see bit7 bit8-bit15 = see bit7
*/ */
@ -2622,6 +2625,7 @@ int mmc_format_unit(struct burn_drive *d, off_t size, int flag)
struct command c; struct command c;
int ret, tolerate_failure = 0, return_immediately = 0, i, format_type; int ret, tolerate_failure = 0, return_immediately = 0, i, format_type;
int index, format_sub_type = 0, format_00_index, size_mode; int index, format_sub_type = 0, format_00_index, size_mode;
int accept_count = 0;
off_t num_of_blocks = 0, diff, format_size, i_size, format_00_max_size; off_t num_of_blocks = 0, diff, format_size, i_size, format_00_max_size;
char msg[160],descr[80]; char msg[160],descr[80];
int full_format_type = 0x00; /* Full Format (or 0x10 for DVD-RW ?) */ int full_format_type = 0x00; /* Full Format (or 0x10 for DVD-RW ?) */
@ -2688,8 +2692,19 @@ selected_not_suitable:;
c.page->data[9 + i] = c.page->data[9 + i] =
( d->format_descriptors[index].tdp >> ( d->format_descriptors[index].tdp >>
(16 - 8 * i)) & 0xff; (16 - 8 * i)) & 0xff;
if (format_type == 0x30) if (format_type == 0x30 || format_type == 0x31) {
format_sub_type = 3; /* Quick certification */ if (flag & 64)
format_sub_type = 3; /* Quick certification */
else
format_sub_type = 2; /* Full certification */
}
if (d->current_profile == 0x12 && format_type !=0x01 &&
(flag & 64)) {
/* DCRT and CmpList, see below */
c.page->data[1] |= 0x20;
c.opcode[1] |= 0x08;
}
c.page->data[1] |= 0x80; /* FOV = this flag vector is valid */
sprintf(descr, "%s (descr %d)", d->current_profile_text,index); sprintf(descr, "%s (descr %d)", d->current_profile_text,index);
return_immediately = 1; /* caller must do the waiting */ return_immediately = 1; /* caller must do the waiting */
@ -2878,14 +2893,20 @@ no_suitable_formatting_type:;
return_immediately = 1; /* caller must do the waiting */ return_immediately = 1; /* caller must do the waiting */
c.page->data[1] |= 0x80; /* FOV = this flag vector is valid */ c.page->data[1] |= 0x80; /* FOV = this flag vector is valid */
/* <<< ts A80418 : experiment: MMC-5 6.5.3.2 , 6.5.4.2.1.2 if ((flag & 64) && format_type != 0x01) {
DCRT: Disable Certification and maintain number of blocks /* MMC-5 6.5.3.2 , 6.5.4.2.1.2
c.page->data[1] |= 0x20; DCRT: Disable Certification and maintain number
*/ of blocks
/* <<< ts A80418 : experiment: MMC-5 6.5.4.2.1.2 CmpList: Override maintaining of number of blocks
Override maintaining of number of blocks with DCRT with DCRT
c.opcode[1] |= 0x08; */
*/ /* ts A80426 : prevents change of formatted size
with PHILIPS SPD3300L and Verbatim 3x DVD-RAM
and format_type 0x00. Works on TSSTcorp SH-S203B
*/
c.page->data[1] |= 0x20;
c.opcode[1] |= 0x08;
}
} else if (d->current_profile == 0x43 && } else if (d->current_profile == 0x43 &&
burn_support_untested_profiles) { burn_support_untested_profiles) {
@ -2906,14 +2927,18 @@ no_suitable_formatting_type:;
/* search largest format 0x31 */ /* search largest format 0x31 */
if(format_type != 0x31) if(format_type != 0x31)
continue; continue;
format_sub_type = 3; /* Quick certification */
} else if(size_mode == 2) { /* max payload size */ } else if(size_mode == 2) { /* max payload size */
/* search largest 0x30 format descriptor */ /* search largest 0x30 format descriptor */
if(format_type != 0x30) if(format_type != 0x30)
continue; continue;
format_sub_type = 3; /* Quick certification */
} else if(size_mode == 3) { /* default payload size */ } else if(size_mode == 3) { /* default payload size */
index = 0; if (accept_count < 1)
index = 0; /* this cannot certify */
if(format_type != 0x30)
continue;
accept_count++;
if (accept_count == 1)
index = i;
continue; continue;
} else { /* defect managed format with size wish */ } else { /* defect managed format with size wish */
/* search for smallest 0x30 >= size */ /* search for smallest 0x30 >= size */
@ -2925,7 +2950,6 @@ no_suitable_formatting_type:;
continue; continue;
index = i; index = i;
format_size = i_size; format_size = i_size;
format_sub_type = 3; /* Quick certification */
continue; continue;
} }
/* common for all cases which search largest /* common for all cases which search largest
@ -2940,6 +2964,12 @@ no_suitable_formatting_type:;
if (index < 0) if (index < 0)
goto no_suitable_formatting_type; goto no_suitable_formatting_type;
format_type = d->format_descriptors[index].type; format_type = d->format_descriptors[index].type;
if (format_type == 0x30 || format_type == 0x31) {
if (flag & 64)
format_sub_type = 3; /* Quick certification */
else
format_sub_type = 2; /* Full certification */
}
num_of_blocks = d->format_descriptors[index].size / 2048; num_of_blocks = d->format_descriptors[index].size / 2048;
mmc_int_to_four_char(c.page->data + 4, num_of_blocks); mmc_int_to_four_char(c.page->data + 4, num_of_blocks);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)