Preserving an immature sketch of media quality scanning
This commit is contained in:
parent
0fe94fbf69
commit
a34e8752b0
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2012.10.25.173408"
|
#define Cdrskin_timestamP "2012.11.18.184006"
|
||||||
|
@ -3996,4 +3996,19 @@ BURN_END_DECLS
|
|||||||
#define Libburn_dummy_probe_write_modeS 1
|
#define Libburn_dummy_probe_write_modeS 1
|
||||||
|
|
||||||
|
|
||||||
|
/* Early experimental:
|
||||||
|
Do not define Libburn_develop_quality_scaN unless you want to work
|
||||||
|
towards a usable implementation.
|
||||||
|
If it gets enabled, then the call must be published in libburn/libburn.ver
|
||||||
|
*/
|
||||||
|
#ifdef Libburn_develop_quality_scaN
|
||||||
|
|
||||||
|
/* B21108 ts */
|
||||||
|
/* Experiments mit quality scan command F3 on Optiarc drive */
|
||||||
|
int burn_nec_optiarc_rep_err_rate(struct burn_drive *d,
|
||||||
|
int start_lba, int rate_period, int flag);
|
||||||
|
|
||||||
|
#endif /* Libburn_develop_quality_scaN */
|
||||||
|
|
||||||
|
|
||||||
#endif /*LIBBURN_H*/
|
#endif /*LIBBURN_H*/
|
||||||
|
@ -4243,6 +4243,77 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef Libburn_develop_quality_scaN
|
||||||
|
|
||||||
|
/* B21108 ts : Vendor specific command REPORT ERROR RATE, see
|
||||||
|
http://liggydee.cdfreaks.com/ddl/errorcheck.pdf
|
||||||
|
*/
|
||||||
|
int mmc_nec_optiarc_f3(struct burn_drive *d, int sub_op,
|
||||||
|
int start_lba, int rate_period,
|
||||||
|
int *ret_lba, int *error_rate1, int *error_rate2)
|
||||||
|
{
|
||||||
|
struct buffer *buf = NULL;
|
||||||
|
struct command *c;
|
||||||
|
char *msg = NULL;
|
||||||
|
int key, asc, ascq, ret;
|
||||||
|
static unsigned char MMC_NEC_OPTIARC_F3[] =
|
||||||
|
{ 0xF3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
|
BURN_ALLOC_MEM(buf, struct buffer, 1);
|
||||||
|
BURN_ALLOC_MEM(c, struct command, 1);
|
||||||
|
mmc_start_if_needed(d, 0);
|
||||||
|
if (mmc_function_spy(d, "mmc_nec_optiarc_f3") <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
scsi_init_command(c, MMC_NEC_OPTIARC_F3, sizeof(MMC_NEC_OPTIARC_F3));
|
||||||
|
if (sub_op == 3) {
|
||||||
|
c->dxfer_len = 8;
|
||||||
|
c->dir = FROM_DRIVE;
|
||||||
|
} else {
|
||||||
|
c->dxfer_len = 0;
|
||||||
|
c->dir = NO_TRANSFER;
|
||||||
|
}
|
||||||
|
c->retry = 0;
|
||||||
|
c->opcode[1] = sub_op;
|
||||||
|
mmc_int_to_four_char(c->opcode + 2, start_lba);
|
||||||
|
c->opcode[8] = rate_period;
|
||||||
|
c->page = buf;
|
||||||
|
c->page->bytes = 0;
|
||||||
|
c->page->sectors = 0;
|
||||||
|
d->issue_command(d, c);
|
||||||
|
if (c->error) {
|
||||||
|
msg = calloc(1, 256);
|
||||||
|
if (msg != NULL) {
|
||||||
|
sprintf(msg,
|
||||||
|
"SCSI error on nec_optiarc_f3(%d, %d, %d): ",
|
||||||
|
sub_op, start_lba, rate_period);
|
||||||
|
scsi_error_msg(d, c->sense, 14, msg + strlen(msg),
|
||||||
|
&key, &asc, &ascq);
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x00020144,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
free(msg);
|
||||||
|
}
|
||||||
|
return BE_CANCELLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sub_op == 3) {
|
||||||
|
*ret_lba = mmc_four_char_to_int(c->page->data);
|
||||||
|
*error_rate1 = c->page->data[4] * 256 + c->page->data[5];
|
||||||
|
*error_rate2 = c->page->data[6] * 256 + c->page->data[7];
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 1;
|
||||||
|
ex:;
|
||||||
|
BURN_FREE_MEM(c);
|
||||||
|
BURN_FREE_MEM(buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Libburn_develop_quality_scaN */
|
||||||
|
|
||||||
|
|
||||||
/* ts A81210 : Determine the upper limit of readable data size */
|
/* ts A81210 : Determine the upper limit of readable data size */
|
||||||
int mmc_read_capacity(struct burn_drive *d)
|
int mmc_read_capacity(struct burn_drive *d)
|
||||||
{
|
{
|
||||||
|
@ -128,4 +128,11 @@ int mmc_get_leadin_text(struct burn_drive *d,
|
|||||||
unsigned char **text_packs, int *num_packs, int flag);
|
unsigned char **text_packs, int *num_packs, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef Libburn_develop_quality_scaN
|
||||||
|
/* B21108 ts */
|
||||||
|
int mmc_nec_optiarc_f3(struct burn_drive *d, int sub_op,
|
||||||
|
int start_lba, int rate_period,
|
||||||
|
int *eba, int *error_rate1, int *error_rate2);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /*__MMC*/
|
#endif /*__MMC*/
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "toc.h"
|
#include "toc.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "mmc.h"
|
||||||
#include "sg.h"
|
#include "sg.h"
|
||||||
#include "read.h"
|
#include "read.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
@ -535,3 +536,42 @@ ex:;
|
|||||||
d->busy = BURN_DRIVE_IDLE;
|
d->busy = BURN_DRIVE_IDLE;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef Libburn_develop_quality_scaN
|
||||||
|
|
||||||
|
/* B21108 ts */
|
||||||
|
int burn_nec_optiarc_rep_err_rate(struct burn_drive *d,
|
||||||
|
int start_lba, int rate_period, int flag)
|
||||||
|
{
|
||||||
|
int ret, lba = 0, error_rate1 = 0, error_rate2 = 0, enabled = 0, dret;
|
||||||
|
|
||||||
|
/* Sub Operation Code 1 : Enable Error Rate reporting function */
|
||||||
|
ret = mmc_nec_optiarc_f3(d, 1, start_lba, rate_period,
|
||||||
|
&lba, &error_rate1, &error_rate2);
|
||||||
|
if (ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
enabled = 1;
|
||||||
|
|
||||||
|
/* >>> Sub Operation Code 2 : Seek to starting address
|
||||||
|
start_lba , rate_period
|
||||||
|
*/;
|
||||||
|
|
||||||
|
/* >>> Loop with Sub Operation Code 3 : Send Error Rate information
|
||||||
|
reply: 4-byte LBA , 2-byte C1/PIE , 2-byte C2/PIF
|
||||||
|
*/;
|
||||||
|
|
||||||
|
ret = 1;
|
||||||
|
ex:;
|
||||||
|
if (enabled) {
|
||||||
|
/* Code F : Disable Error Rate reporting function */
|
||||||
|
dret = mmc_nec_optiarc_f3(d, 0xf, 0, 0,
|
||||||
|
&lba, &error_rate1, &error_rate2);
|
||||||
|
if (dret < ret)
|
||||||
|
ret = dret;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Libburn_develop_quality_scaN */
|
||||||
|
|
||||||
|
@ -1466,6 +1466,14 @@ static char *scsi_command_name(unsigned int c, int flag)
|
|||||||
return "SET CD SPEED";
|
return "SET CD SPEED";
|
||||||
case 0xbe:
|
case 0xbe:
|
||||||
return "READ CD";
|
return "READ CD";
|
||||||
|
|
||||||
|
#ifdef Libburn_develop_quality_scaN
|
||||||
|
|
||||||
|
case 0xf3:
|
||||||
|
return "NEC/OPTIARC REPORT ERROR RATE";
|
||||||
|
|
||||||
|
#endif /* Libburn_develop_quality_scaN */
|
||||||
|
|
||||||
}
|
}
|
||||||
return "(NOT IN LIBBURN COMMAND LIST)";
|
return "(NOT IN LIBBURN COMMAND LIST)";
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user