kopia lustrzana https://gitlab.com/sane-project/backends
* updated umax backend to version 1.0 build 26
Oliver Rauch <Oliver.Rauch@rauch-domain.de>DEVEL_2_0_BRANCH-1
rodzic
b959f2bc20
commit
0239ab00e5
|
@ -101,7 +101,7 @@ static char *scanner_str[] =
|
||||||
"UMAX ", "Astra 2200 ",
|
"UMAX ", "Astra 2200 ",
|
||||||
"UMAX ", "Astra 2400S ",
|
"UMAX ", "Astra 2400S ",
|
||||||
"UMAX ", "Mirage D-16L ",
|
"UMAX ", "Mirage D-16L ",
|
||||||
/* "UMAX ", "Mirage II ", */
|
"UMAX ", "Mirage II ",
|
||||||
"UMAX ", "Mirage IIse ",
|
"UMAX ", "Mirage IIse ",
|
||||||
/* "UMAX ", "PL-II ", */
|
/* "UMAX ", "PL-II ", */
|
||||||
/* "UMAX ", "PowerLook 2000 ", */
|
/* "UMAX ", "PowerLook 2000 ", */
|
||||||
|
@ -118,6 +118,7 @@ static char *scanner_str[] =
|
||||||
"Nikon ", "AX-210 ",
|
"Nikon ", "AX-210 ",
|
||||||
"KYE ", "ColorPage-HR5 ",
|
"KYE ", "ColorPage-HR5 ",
|
||||||
"EPSON ", "Perfection600 ",
|
"EPSON ", "Perfection600 ",
|
||||||
|
"ESCORT ", "Galleria 600S ", /* is an Astra 600S */
|
||||||
"END_OF_LIST"
|
"END_OF_LIST"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
229
backend/umax.c
229
backend/umax.c
|
@ -49,7 +49,7 @@
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
#define BUILD 25
|
#define BUILD 26
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
. - sane_open() : open a particular scanner-device and attach_scanner(devicename,&dev)
|
. - sane_open() : open a particular scanner-device and attach_scanner(devicename,&dev)
|
||||||
. . - sane_set_io_mode : set blocking-mode
|
. . - sane_set_io_mode : set blocking-mode
|
||||||
. . - sane_get_select_fd : get scanner-fd
|
. . - sane_get_select_fd : get scanner-fd
|
||||||
. . - sane_get_option_descriptor() : get option informations
|
. . - sane_get_option_descriptor() : get option information
|
||||||
. . - sane_control_option() : change option values
|
. . - sane_control_option() : change option values
|
||||||
. .
|
. .
|
||||||
. . - sane_start() : start image aquisition
|
. . - sane_start() : start image aquisition
|
||||||
|
@ -178,23 +178,24 @@ static SANE_String_Const source_list[4];
|
||||||
static SANE_Int bit_depth_list[9];
|
static SANE_Int bit_depth_list[9];
|
||||||
static SANE_Auth_Callback frontend_authorize_callback;
|
static SANE_Auth_Callback frontend_authorize_callback;
|
||||||
|
|
||||||
static unsigned int umax_scsi_buffer_size_min = 65536; /* default: minimum scsi buffer size: 64 KB */
|
static int umax_scsi_buffer_size_min = 65536; /* default: minimum scsi buffer size: 64 KB */
|
||||||
static unsigned int umax_scsi_buffer_size_max = 131072; /* default: maximum scsi buffer size: 128 KB */
|
static int umax_scsi_buffer_size_max = 131072; /* default: maximum scsi buffer size: 128 KB */
|
||||||
|
|
||||||
/* number of lines that shall be scanned in one buffer for preview if possible */
|
/* number of lines that shall be scanned in one buffer for preview if possible */
|
||||||
/* this value should not be too large because it defines the step size in which */
|
/* this value should not be too large because it defines the step size in which */
|
||||||
/* the scanned parts are displayed while preview scan is in progress */
|
/* the scanned parts are displayed while preview scan is in progress */
|
||||||
static unsigned int umax_preview_lines = 10; /* default: 10 preview lines */
|
static int umax_preview_lines = 10; /* default: 10 preview lines */
|
||||||
|
|
||||||
/* number of lines that shall be scanned in one buffer for scan if possible */
|
/* number of lines that shall be scanned in one buffer for scan if possible */
|
||||||
static unsigned int umax_scan_lines = 40; /* default: 40 scan lines */
|
static int umax_scan_lines = 40; /* default: 40 scan lines */
|
||||||
|
|
||||||
static unsigned int umax_scsi_maxqueue = 2; /* use command queueing depth 2 as default */
|
static int umax_scsi_maxqueue = 2; /* use command queueing depth 2 as default */
|
||||||
static unsigned int umax_execute_request_sense = 0; /* default: do not use request sense in do_calibration */
|
static int umax_handle_bad_sense_error = 0; /* default: handle bad sense error code as device busy */
|
||||||
static unsigned int umax_force_preview_bit_rgb = 0; /* default: do not force preview bit in real color scan */
|
static int umax_execute_request_sense = 0; /* default: do not use request sense in do_calibration */
|
||||||
|
static int umax_force_preview_bit_rgb = 0; /* default: do not force preview bit in real color scan */
|
||||||
|
|
||||||
/* predefine fast scan, used by most scanners */
|
/* predefine fast scan, used by most scanners */
|
||||||
static int umax_slow = -1; /* use slow scanning speed */
|
static int umax_slow = -1; /* don`t use slow scanning speed */
|
||||||
static int umax_smear = -1; /* don`t care about image smearing problem */
|
static int umax_smear = -1; /* don`t care about image smearing problem */
|
||||||
|
|
||||||
static int umax_calibration_area = -1; /* -1=auto, 0=calibration on image, 1=calibration for full ccd */
|
static int umax_calibration_area = -1; /* -1=auto, 0=calibration on image, 1=calibration for full ccd */
|
||||||
|
@ -743,8 +744,26 @@ static SANE_Status sense_handler(int scsi_fd, unsigned char *result, void *arg)
|
||||||
|
|
||||||
if ( get_RS_error_code(result) != 0x70 )
|
if ( get_RS_error_code(result) != 0x70 )
|
||||||
{
|
{
|
||||||
DBG(DBG_proc, "invalid sense key => handled as DEVICE BUSY!\n");
|
DBG(DBG_error, "invalid sense key error code (%d)\n", get_RS_error_code(result));
|
||||||
return SANE_STATUS_DEVICE_BUSY; /* sense key invalid */
|
|
||||||
|
switch (dev->handle_bad_sense_error)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case 0:
|
||||||
|
DBG(DBG_error, "=> handled as DEVICE BUSY!\n");
|
||||||
|
return SANE_STATUS_DEVICE_BUSY;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
DBG(DBG_error, "=> handled as ok!\n");
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
DBG(DBG_error, "=> handled as i/o error!\n");
|
||||||
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
DBG(DBG_error, "=> ignored, sense handler does continue\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG(DBG_sense, "check condition sense: %s\n", sense_str[sensekey]);
|
DBG(DBG_sense, "check condition sense: %s\n", sense_str[sensekey]);
|
||||||
|
@ -2156,7 +2175,7 @@ static SANE_Status umax_do_calibration(Umax_Device *dev)
|
||||||
|
|
||||||
if (get_RS_SCC_condition_code(dev->buffer[0]) != 1)
|
if (get_RS_SCC_condition_code(dev->buffer[0]) != 1)
|
||||||
{
|
{
|
||||||
DBG(DBG_warning,"WARNING: missing informations about shading-data\n");
|
DBG(DBG_warning,"WARNING: missing information about shading-data\n");
|
||||||
DBG(DBG_warning," driver tries to guess missing values!\n");
|
DBG(DBG_warning," driver tries to guess missing values!\n");
|
||||||
|
|
||||||
if (dev->calibration_area != UMAX_CALIBRATION_AREA_CCD) /* calibration is done with image geometry and depth */
|
if (dev->calibration_area != UMAX_CALIBRATION_AREA_CCD) /* calibration is done with image geometry and depth */
|
||||||
|
@ -2164,7 +2183,11 @@ static SANE_Status umax_do_calibration(Umax_Device *dev)
|
||||||
DBG(DBG_warning," Calibration is done with selected image geometry and depth!\n");
|
DBG(DBG_warning," Calibration is done with selected image geometry and depth!\n");
|
||||||
|
|
||||||
width = dev->scanwidth * dev->relevant_optical_res / dev->x_coordinate_base;
|
width = dev->scanwidth * dev->relevant_optical_res / dev->x_coordinate_base;
|
||||||
|
if (dev->calibration_width_offset > 0) /* driver or user (umax.conf) define an offset */
|
||||||
|
{
|
||||||
width = width + dev->calibration_width_offset;
|
width = width + dev->calibration_width_offset;
|
||||||
|
DBG(DBG_warning," Using calibration width offset of %d\n", dev->calibration_width_offset);
|
||||||
|
}
|
||||||
|
|
||||||
if (dev->colormode == RGB)
|
if (dev->colormode == RGB)
|
||||||
{
|
{
|
||||||
|
@ -2194,6 +2217,7 @@ static SANE_Status umax_do_calibration(Umax_Device *dev)
|
||||||
if (dev->calibration_width_offset > 0) /* driver or user (umax.conf) define an offset */
|
if (dev->calibration_width_offset > 0) /* driver or user (umax.conf) define an offset */
|
||||||
{
|
{
|
||||||
width = width + dev->calibration_width_offset;
|
width = width + dev->calibration_width_offset;
|
||||||
|
DBG(DBG_warning," Using calibration width offset of %d\n", dev->calibration_width_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->colormode == RGB)
|
if (dev->colormode == RGB)
|
||||||
|
@ -2534,8 +2558,8 @@ static void umax_correct_inquiry(Umax_Device *dev, char *vendor, char *product,
|
||||||
|
|
||||||
if (dev->calibration_width_offset == -1) /* no calibration-width-offset defined in umax.conf */
|
if (dev->calibration_width_offset == -1) /* no calibration-width-offset defined in umax.conf */
|
||||||
{
|
{
|
||||||
DBG(DBG_warning," - adding calibration width offset of 308 pixels\n");
|
|
||||||
dev->calibration_width_offset = 308;
|
dev->calibration_width_offset = 308;
|
||||||
|
DBG(DBG_warning," - adding calibration width offset of %d pixels\n", dev->calibration_width_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!strncmp(product, "PowerLook III ", 14))
|
else if (!strncmp(product, "PowerLook III ", 14))
|
||||||
|
@ -2544,8 +2568,8 @@ static void umax_correct_inquiry(Umax_Device *dev, char *vendor, char *product,
|
||||||
|
|
||||||
if (dev->calibration_width_offset == -1) /* no calibration-width-offset defined in umax.conf */
|
if (dev->calibration_width_offset == -1) /* no calibration-width-offset defined in umax.conf */
|
||||||
{
|
{
|
||||||
DBG(DBG_warning," - adding calibration width offset of 28 pixels\n");
|
|
||||||
dev->calibration_width_offset = 28;
|
dev->calibration_width_offset = 28;
|
||||||
|
DBG(DBG_warning," - adding calibration width offset of %d pixels\n", dev->calibration_width_offset);
|
||||||
}
|
}
|
||||||
/* calibration_area = image */
|
/* calibration_area = image */
|
||||||
}
|
}
|
||||||
|
@ -2553,16 +2577,10 @@ static void umax_correct_inquiry(Umax_Device *dev, char *vendor, char *product,
|
||||||
{
|
{
|
||||||
DBG(DBG_warning,"setting up special options for %s\n", product);
|
DBG(DBG_warning,"setting up special options for %s\n", product);
|
||||||
|
|
||||||
if (dev->calibration_area == -1) /* no calibration area defined in umax.conf */
|
if (dev->calibration_width_offset == -1) /* no calibration-width-offset defined in umax.conf */
|
||||||
{
|
{
|
||||||
DBG(DBG_warning," - calibration by driver is done for each CCD pixel\n");
|
dev->calibration_width_offset = 52;
|
||||||
dev->calibration_area = UMAX_CALIBRATION_AREA_CCD;
|
DBG(DBG_warning," - adding calibration width offset of %d pixels\n", dev->calibration_width_offset);
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->calibration_bytespp == -1) /* no calibration-bytespp defined in umax.conf */
|
|
||||||
{
|
|
||||||
DBG(DBG_warning,"- setting calibration_bytespp = 1\n");
|
|
||||||
dev->calibration_bytespp = 1; /* scanner says 2 bytespp for calibration but 1 bytepp is correct */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2570,20 +2588,32 @@ static void umax_correct_inquiry(Umax_Device *dev, char *vendor, char *product,
|
||||||
DBG(DBG_warning,"using standard options for %s\n", product);
|
DBG(DBG_warning,"using standard options for %s\n", product);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!strncmp(vendor, "ESCORT ", 7))
|
||||||
if (dev->slow == -1) /* option is not predefined in umax.conf */
|
|
||||||
{
|
{
|
||||||
dev->slow = 0;
|
if (!strncmp(product, "Galleria 600S ", 14)) /* this is an Astra 600S */
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->smear == -1) /* option is not predefined in umax.conf */
|
|
||||||
{
|
{
|
||||||
dev->smear = 0;
|
int add_len = get_inquiry_additional_length(dev->buffer[0]);
|
||||||
}
|
|
||||||
|
DBG(DBG_warning,"setting up special options for %s\n", product);
|
||||||
|
|
||||||
|
if (add_len == 0x8f)
|
||||||
|
{
|
||||||
|
DBG(DBG_warning," - correcting wrong inquiry data\n");
|
||||||
|
umax_do_new_inquiry(dev, 0x9b); /* get inquiry with correct length */
|
||||||
|
set_inquiry_length(dev->buffer[0], 0x9e); /* correct inquiry len */
|
||||||
|
/* correct color-ordering from pixel to line_with_ccd_distance */
|
||||||
|
set_inquiry_color_order(dev->buffer[0], IN_color_ordering_line_w_ccd);
|
||||||
|
set_inquiry_fb_uta_line_arrangement_mode(dev->buffer[0], 32);
|
||||||
|
set_inquiry_CCD_line_distance(dev->buffer[0], 8);
|
||||||
|
/* we should reset ADF-bit here too */
|
||||||
|
|
||||||
if (dev->invert_shading_data == -1) /* nothing defined in umax.conf */
|
if (dev->invert_shading_data == -1) /* nothing defined in umax.conf */
|
||||||
{
|
{
|
||||||
dev->invert_shading_data = 0;
|
DBG(DBG_warning," - activating inversion of shading data\n");
|
||||||
|
dev->invert_shading_data = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2629,7 +2659,7 @@ static int umax_identify_scanner(Umax_Device *dev)
|
||||||
|
|
||||||
DBG(DBG_info, "Found %s scanner %sversion %s on device %s\n", vendor, product, version, dev->devicename);
|
DBG(DBG_info, "Found %s scanner %sversion %s on device %s\n", vendor, product, version, dev->devicename);
|
||||||
|
|
||||||
/* look for scanners that do not give all inquiry-informations */
|
/* look for scanners that do not give all inquiry-information */
|
||||||
/* and if possible use driver-known inquiry-data */
|
/* and if possible use driver-known inquiry-data */
|
||||||
|
|
||||||
if (get_inquiry_additional_length(dev->buffer[0])>=0x8f)
|
if (get_inquiry_additional_length(dev->buffer[0])>=0x8f)
|
||||||
|
@ -2651,11 +2681,16 @@ static int umax_identify_scanner(Umax_Device *dev)
|
||||||
if (strncmp(vendor, "UMAX ", 5)) { return 1; } /* not UMAX then abort */
|
if (strncmp(vendor, "UMAX ", 5)) { return 1; } /* not UMAX then abort */
|
||||||
|
|
||||||
DBG(DBG_error0, "WARNING: %s scanner %s version %s on device %s\n"
|
DBG(DBG_error0, "WARNING: %s scanner %s version %s on device %s\n"
|
||||||
"is currently an unrecognized device, but inquiry seems to be ok.\n"
|
"is currently an unrecognized device for this backend version.\n"
|
||||||
|
"Please make sure you use the most recent version of the umax backend.\n"
|
||||||
|
"You can download new umax-backend versions from:\n"
|
||||||
|
"http://www.rauch-domain.de/sane-umax\n"
|
||||||
|
"Inquiry seems to be ok.\n"
|
||||||
"******************************************************************\n"
|
"******************************************************************\n"
|
||||||
"*** !!!! CONTINUE AT YOUR OWN RISK !!!! ***\n"
|
"*** !!!! CONTINUE AT YOUR OWN RISK !!!! ***\n"
|
||||||
"******************************************************************\n"
|
"******************************************************************\n"
|
||||||
"Please contact Oliver.Rauch@rauch-domain.de\n",
|
"You already use the most recent umax-backend version:\n"
|
||||||
|
"Please contact me: Oliver.Rauch@rauch-domain.de\n",
|
||||||
vendor, product, version, dev->devicename);
|
vendor, product, version, dev->devicename);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2690,7 +2725,11 @@ static int umax_identify_scanner(Umax_Device *dev)
|
||||||
DBG(DBG_error0, "ERROR: %s scanner %s version %s on device %s\n"
|
DBG(DBG_error0, "ERROR: %s scanner %s version %s on device %s\n"
|
||||||
"is currently an unrecognized device, and inquiry is too short,\n"
|
"is currently an unrecognized device, and inquiry is too short,\n"
|
||||||
"so we are not able to continue!\n"
|
"so we are not able to continue!\n"
|
||||||
"Please contact Oliver.Rauch@rauch-domain.de\n",
|
"Please make sure you use the most recent version of the umax backend.\n"
|
||||||
|
"You can download new umax-backend versions from:\n"
|
||||||
|
"http://www.rauch-domain.de/sane-umax\n"
|
||||||
|
"You already use the most recent umax-backend version:\n"
|
||||||
|
"Please contact me: Oliver.Rauch@rauch-domain.de\n",
|
||||||
vendor, product, version, dev->devicename);
|
vendor, product, version, dev->devicename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3922,6 +3961,7 @@ static void umax_init(Umax_Device *dev) /* umax_init is called once while
|
||||||
dev->request_scsi_maxqueue = umax_scsi_maxqueue;
|
dev->request_scsi_maxqueue = umax_scsi_maxqueue;
|
||||||
dev->request_preview_lines = umax_preview_lines;
|
dev->request_preview_lines = umax_preview_lines;
|
||||||
dev->request_scan_lines = umax_scan_lines;
|
dev->request_scan_lines = umax_scan_lines;
|
||||||
|
dev->handle_bad_sense_error = umax_handle_bad_sense_error;
|
||||||
dev->execute_request_sense = umax_execute_request_sense;
|
dev->execute_request_sense = umax_execute_request_sense;
|
||||||
dev->scsi_buffer_size_min = umax_scsi_buffer_size_min;
|
dev->scsi_buffer_size_min = umax_scsi_buffer_size_min;
|
||||||
dev->scsi_buffer_size_max = umax_scsi_buffer_size_max;
|
dev->scsi_buffer_size_max = umax_scsi_buffer_size_max;
|
||||||
|
@ -3937,6 +3977,7 @@ static void umax_init(Umax_Device *dev) /* umax_init is called once while
|
||||||
DBG(DBG_info, "request_scsi_maxqueue = %d\n", dev->request_scsi_maxqueue);
|
DBG(DBG_info, "request_scsi_maxqueue = %d\n", dev->request_scsi_maxqueue);
|
||||||
DBG(DBG_info, "request_preview_lines = %d\n", dev->request_preview_lines);
|
DBG(DBG_info, "request_preview_lines = %d\n", dev->request_preview_lines);
|
||||||
DBG(DBG_info, "request_scan_lines = %d\n", dev->request_scan_lines);
|
DBG(DBG_info, "request_scan_lines = %d\n", dev->request_scan_lines);
|
||||||
|
DBG(DBG_info, "handle_bad_sense_error = %d\n", dev->handle_bad_sense_error);
|
||||||
DBG(DBG_info, "execute_request_sense = %d\n", dev->execute_request_sense);
|
DBG(DBG_info, "execute_request_sense = %d\n", dev->execute_request_sense);
|
||||||
DBG(DBG_info, "scsi_buffer_size_min = %d\n", dev->scsi_buffer_size_min);
|
DBG(DBG_info, "scsi_buffer_size_min = %d\n", dev->scsi_buffer_size_min);
|
||||||
DBG(DBG_info, "scsi_buffer_size_max = %d\n", dev->scsi_buffer_size_max);
|
DBG(DBG_info, "scsi_buffer_size_max = %d\n", dev->scsi_buffer_size_max);
|
||||||
|
@ -4122,7 +4163,10 @@ static SANE_Status attach_scanner(const char *devicename, Umax_Device **devp)
|
||||||
{
|
{
|
||||||
if (strcmp(dev->sane.name, devicename) == 0)
|
if (strcmp(dev->sane.name, devicename) == 0)
|
||||||
{
|
{
|
||||||
if (devp) { *devp = dev; }
|
if (devp)
|
||||||
|
{
|
||||||
|
*devp = dev;
|
||||||
|
}
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4200,6 +4244,21 @@ static SANE_Status attach_scanner(const char *devicename, Umax_Device **devp)
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->slow == -1) /* option is not predefined in umax.conf and not by backend */
|
||||||
|
{
|
||||||
|
dev->slow = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->smear == -1) /* option is not predefined in umax.conf and not by backend */
|
||||||
|
{
|
||||||
|
dev->smear = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->invert_shading_data == -1) /* nothing defined in umax.conf and not by backend */
|
||||||
|
{
|
||||||
|
dev->invert_shading_data = 0;
|
||||||
|
}
|
||||||
|
|
||||||
umax_get_inquiry_values(dev);
|
umax_get_inquiry_values(dev);
|
||||||
umax_print_inquiry(dev);
|
umax_print_inquiry(dev);
|
||||||
DBG(DBG_inquiry,"\n");
|
DBG(DBG_inquiry,"\n");
|
||||||
|
@ -5317,6 +5376,7 @@ SANE_Status sane_init(SANE_Int *version_code, SANE_Auth_Callback authorize)
|
||||||
else if (umax_test_configure_option(option_str, "scsi-buffer-size-max", &umax_scsi_buffer_size_max, 4096, 1048576));
|
else if (umax_test_configure_option(option_str, "scsi-buffer-size-max", &umax_scsi_buffer_size_max, 4096, 1048576));
|
||||||
else if (umax_test_configure_option(option_str, "preview-lines", &umax_preview_lines, 1, 65535));
|
else if (umax_test_configure_option(option_str, "preview-lines", &umax_preview_lines, 1, 65535));
|
||||||
else if (umax_test_configure_option(option_str, "scan-lines", &umax_scan_lines, 1, 65535));
|
else if (umax_test_configure_option(option_str, "scan-lines", &umax_scan_lines, 1, 65535));
|
||||||
|
else if (umax_test_configure_option(option_str, "handle-bad-sense-error", &umax_handle_bad_sense_error, 0, 3));
|
||||||
else if (umax_test_configure_option(option_str, "execute-request-sense", &umax_execute_request_sense, 0, 1));
|
else if (umax_test_configure_option(option_str, "execute-request-sense", &umax_execute_request_sense, 0, 1));
|
||||||
else if (umax_test_configure_option(option_str, "force-preview-bit-rgb", &umax_force_preview_bit_rgb, 0, 1));
|
else if (umax_test_configure_option(option_str, "force-preview-bit-rgb", &umax_force_preview_bit_rgb, 0, 1));
|
||||||
else if (umax_test_configure_option(option_str, "slow-speed", &umax_slow, -1, 1));
|
else if (umax_test_configure_option(option_str, "slow-speed", &umax_slow, -1, 1));
|
||||||
|
@ -5334,10 +5394,6 @@ SANE_Status sane_init(SANE_Int *version_code, SANE_Auth_Callback authorize)
|
||||||
}
|
}
|
||||||
|
|
||||||
len = strlen (config_line);
|
len = strlen (config_line);
|
||||||
if (config_line[len - 1] == '\n')
|
|
||||||
{
|
|
||||||
config_line[--len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!len) /* ignore empty lines */
|
if (!len) /* ignore empty lines */
|
||||||
{
|
{
|
||||||
|
@ -5370,6 +5426,9 @@ void sane_exit(void)
|
||||||
{
|
{
|
||||||
next = dev->next;
|
next = dev->next;
|
||||||
free(dev->devicename);
|
free(dev->devicename);
|
||||||
|
free(dev->vendor);
|
||||||
|
free(dev->product);
|
||||||
|
free(dev->version);
|
||||||
free(dev);
|
free(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5622,6 +5681,42 @@ const SANE_Option_Descriptor *sane_get_option_descriptor(SANE_Handle handle, SAN
|
||||||
return scanner->opt + option;
|
return scanner->opt + option;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ UMAX SET MAX GEOMETRY ---------------------- */
|
||||||
|
|
||||||
|
static void umax_set_max_geometry(Umax_Scanner *scanner)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (scanner->val[OPT_DOR].w)
|
||||||
|
{
|
||||||
|
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_dor_width * MM_PER_INCH);
|
||||||
|
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_dor_length * MM_PER_INCH);
|
||||||
|
|
||||||
|
scanner->device->x_dpi_range.max = SANE_FIX(scanner->device->inquiry_dor_x_res);
|
||||||
|
scanner->device->y_dpi_range.max = SANE_FIX(scanner->device->inquiry_dor_y_res);
|
||||||
|
}
|
||||||
|
else if ( (strcmp(scanner->val[OPT_SOURCE].s, FLB_STR) == 0) || (strcmp(scanner->val[OPT_SOURCE].s, ADF_STR) == 0) )
|
||||||
|
{
|
||||||
|
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_fb_width * MM_PER_INCH);
|
||||||
|
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_fb_length * MM_PER_INCH);
|
||||||
|
|
||||||
|
scanner->device->x_dpi_range.max = SANE_FIX(scanner->device->inquiry_x_res);
|
||||||
|
scanner->device->y_dpi_range.max = SANE_FIX(scanner->device->inquiry_y_res);
|
||||||
|
}
|
||||||
|
else if (strcmp(scanner->val[OPT_SOURCE].s, UTA_STR) == 0)
|
||||||
|
{
|
||||||
|
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_uta_width * MM_PER_INCH);
|
||||||
|
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_uta_length * MM_PER_INCH);
|
||||||
|
|
||||||
|
scanner->device->x_dpi_range.max = SANE_FIX(scanner->device->inquiry_x_res);
|
||||||
|
scanner->device->y_dpi_range.max = SANE_FIX(scanner->device->inquiry_y_res);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG(DBG_info,"x_range.max = %f\n", SANE_UNFIX(scanner->device->x_range.max));
|
||||||
|
DBG(DBG_info,"y_range.max = %f\n", SANE_UNFIX(scanner->device->y_range.max));
|
||||||
|
DBG(DBG_info,"x_dpi_range.max = %f\n", SANE_UNFIX(scanner->device->x_dpi_range.max));
|
||||||
|
DBG(DBG_info,"y_dpi_range.max = %f\n", SANE_UNFIX(scanner->device->y_dpi_range.max));
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ SANE CONTROL OPTION ------------------------ */
|
/* ------------------------------------------------------------ SANE CONTROL OPTION ------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
@ -5836,7 +5931,7 @@ SANE_Status sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action
|
||||||
{
|
{
|
||||||
if (scanner->val[option].w != *(SANE_Word *) val)
|
if (scanner->val[option].w != *(SANE_Word *) val)
|
||||||
{
|
{
|
||||||
scanner->val[option].w = *(SANE_Word *) val;
|
scanner->val[option].w = *(SANE_Word *) val; /* update valure for umax_set_max_geometry */
|
||||||
|
|
||||||
if (info)
|
if (info)
|
||||||
{
|
{
|
||||||
|
@ -5844,26 +5939,8 @@ SANE_Status sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action
|
||||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scanner->val[option].w)
|
|
||||||
{
|
|
||||||
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_dor_width * MM_PER_INCH);
|
|
||||||
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_dor_length * MM_PER_INCH);
|
|
||||||
|
|
||||||
scanner->device->x_dpi_range.max = SANE_FIX(scanner->device->inquiry_dor_x_res);
|
|
||||||
scanner->device->y_dpi_range.max = SANE_FIX(scanner->device->inquiry_dor_y_res);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_fb_width * MM_PER_INCH);
|
|
||||||
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_fb_length * MM_PER_INCH);
|
|
||||||
|
|
||||||
scanner->device->x_dpi_range.max = SANE_FIX(scanner->device->inquiry_x_res);
|
|
||||||
scanner->device->y_dpi_range.max = SANE_FIX(scanner->device->inquiry_y_res);
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG(DBG_info,"sane_control_option: set DOR = %d\n", scanner->val[option].w);
|
DBG(DBG_info,"sane_control_option: set DOR = %d\n", scanner->val[option].w);
|
||||||
DBG(DBG_info,"x_range.max = %f\n", SANE_UNFIX(scanner->device->x_range.max));
|
umax_set_max_geometry(scanner);
|
||||||
DBG(DBG_info,"y_range.max = %f\n", SANE_UNFIX(scanner->device->y_range.max));
|
|
||||||
|
|
||||||
scanner->val[OPT_BR_X].w = scanner->device->x_range.max;
|
scanner->val[OPT_BR_X].w = scanner->device->x_range.max;
|
||||||
scanner->val[OPT_BR_Y].w = scanner->device->y_range.max;
|
scanner->val[OPT_BR_Y].w = scanner->device->y_range.max;
|
||||||
|
@ -6029,20 +6106,14 @@ SANE_Status sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action
|
||||||
/* single string-option with side-effect: */
|
/* single string-option with side-effect: */
|
||||||
case OPT_SOURCE:
|
case OPT_SOURCE:
|
||||||
{
|
{
|
||||||
if ( (strcmp(val, FLB_STR) == 0) || (strcmp(val, ADF_STR) == 0) )
|
if (scanner->val[option].s)
|
||||||
{
|
{
|
||||||
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_fb_width * MM_PER_INCH);
|
free (scanner->val[option].s);
|
||||||
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_fb_length * MM_PER_INCH);
|
|
||||||
}
|
|
||||||
else if (strcmp(val, UTA_STR) == 0)
|
|
||||||
{
|
|
||||||
scanner->device->x_range.max = SANE_FIX(scanner->device->inquiry_uta_width * MM_PER_INCH);
|
|
||||||
scanner->device->y_range.max = SANE_FIX(scanner->device->inquiry_uta_length * MM_PER_INCH);
|
|
||||||
}
|
}
|
||||||
|
scanner->val[option].s = (SANE_Char*)strdup(val); /* update string for umax_set_max_geometry */
|
||||||
|
|
||||||
DBG(DBG_info,"sane_control_option: set SOURCE = %s\n", val);
|
DBG(DBG_info,"sane_control_option: set SOURCE = %s\n", val);
|
||||||
DBG(DBG_info,"x_range.max = %f\n", SANE_UNFIX(scanner->device->x_range.max));
|
umax_set_max_geometry(scanner);
|
||||||
DBG(DBG_info,"y_range.max = %f\n", SANE_UNFIX(scanner->device->y_range.max));
|
|
||||||
|
|
||||||
scanner->val[OPT_BR_X].w = scanner->device->x_range.max;
|
scanner->val[OPT_BR_X].w = scanner->device->x_range.max;
|
||||||
scanner->val[OPT_BR_Y].w = scanner->device->y_range.max;
|
scanner->val[OPT_BR_Y].w = scanner->device->y_range.max;
|
||||||
|
@ -6052,8 +6123,10 @@ SANE_Status sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action
|
||||||
*info |= SANE_INFO_RELOAD_PARAMS;
|
*info |= SANE_INFO_RELOAD_PARAMS;
|
||||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||||
}
|
}
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
/* fall through */
|
break;
|
||||||
|
|
||||||
/* side-effect-free single-string options: */
|
/* side-effect-free single-string options: */
|
||||||
#ifdef UMAX_CALIBRATION_MODE_SELECTABLE
|
#ifdef UMAX_CALIBRATION_MODE_SELECTABLE
|
||||||
case OPT_CALIB_MODE:
|
case OPT_CALIB_MODE:
|
||||||
|
@ -6809,18 +6882,12 @@ SANE_Status sane_start(SANE_Handle handle)
|
||||||
DBG(DBG_sane_info,"fast preview function = %d\n", scanner->device->preview);
|
DBG(DBG_sane_info,"fast preview function = %d\n", scanner->device->preview);
|
||||||
DBG(DBG_sane_info,"DOR = %d\n", scanner->device->dor);
|
DBG(DBG_sane_info,"DOR = %d\n", scanner->device->dor);
|
||||||
DBG(DBG_sane_info,"ADF = %d\n", scanner->device->adf);
|
DBG(DBG_sane_info,"ADF = %d\n", scanner->device->adf);
|
||||||
DBG(DBG_sane_info,"slow scan speed = %d\n", scanner->device->slow);
|
|
||||||
DBG(DBG_sane_info,"smear = %d\n", scanner->device->smear);
|
|
||||||
DBG(DBG_sane_info,"manual focus = %d\n", scanner->device->manual_focus);
|
DBG(DBG_sane_info,"manual focus = %d\n", scanner->device->manual_focus);
|
||||||
DBG(DBG_sane_info,"fix focus position = %d\n", scanner->device->fix_focus_position);
|
DBG(DBG_sane_info,"fix focus position = %d\n", scanner->device->fix_focus_position);
|
||||||
DBG(DBG_sane_info,"disable pre focus = %d\n", scanner->device->disable_pre_focus);
|
DBG(DBG_sane_info,"disable pre focus = %d\n", scanner->device->disable_pre_focus);
|
||||||
DBG(DBG_sane_info,"lens cal in doc pos = %d\n", scanner->device->lens_cal_in_doc_pos);
|
DBG(DBG_sane_info,"lens cal in doc pos = %d\n", scanner->device->lens_cal_in_doc_pos);
|
||||||
DBG(DBG_sane_info,"holder focus pos 0mm = %d\n", scanner->device->holder_focus_pos_0mm);
|
DBG(DBG_sane_info,"holder focus pos 0mm = %d\n", scanner->device->holder_focus_pos_0mm);
|
||||||
|
|
||||||
#ifdef HAVE_SANEI_SCSI_OPEN_EXTENDED
|
|
||||||
{
|
|
||||||
unsigned int scsi_bufsize = 0;
|
|
||||||
|
|
||||||
if (scanner->val[OPT_PREVIEW].w) /* preview mode */
|
if (scanner->val[OPT_PREVIEW].w) /* preview mode */
|
||||||
{
|
{
|
||||||
scanner->device->lines_max = scanner->device->request_preview_lines;
|
scanner->device->lines_max = scanner->device->request_preview_lines;
|
||||||
|
@ -6830,6 +6897,10 @@ SANE_Status sane_start(SANE_Handle handle)
|
||||||
scanner->device->lines_max = scanner->device->request_scan_lines;
|
scanner->device->lines_max = scanner->device->request_scan_lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SANEI_SCSI_OPEN_EXTENDED
|
||||||
|
{
|
||||||
|
unsigned int scsi_bufsize = 0;
|
||||||
|
|
||||||
scsi_bufsize = scanner->device->width_in_pixels * scanner->device->lines_max;
|
scsi_bufsize = scanner->device->width_in_pixels * scanner->device->lines_max;
|
||||||
|
|
||||||
if (scsi_bufsize == 0) /* no scsi buffer size, take scanner buffer size */
|
if (scsi_bufsize == 0) /* no scsi buffer size, take scanner buffer size */
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
#
|
#
|
||||||
# Options for the umax backend
|
# Options for the umax backend
|
||||||
option scsi-maxqueue 2
|
#option scsi-maxqueue 2
|
||||||
option scsi-buffer-size-min 65536
|
#option scsi-buffer-size-min 65536
|
||||||
option scsi-buffer-size-max 262144
|
#option scsi-buffer-size-max 262144
|
||||||
option scan-lines 100
|
#option scan-lines 100
|
||||||
option preview-lines 20
|
#option preview-lines 20
|
||||||
option execute-request-sense 0
|
#option handle-bad-sense-error 0
|
||||||
option force-preview-bit-rgb 0
|
#option execute-request-sense 0
|
||||||
option lamp-control-available 0
|
#option force-preview-bit-rgb 0
|
||||||
|
#option lamp-control-available 0
|
||||||
#
|
#
|
||||||
# linux device identification:
|
# linux device identification:
|
||||||
#scsi vendor model type bus channel id lun
|
#scsi vendor model type bus channel id lun
|
||||||
|
@ -19,6 +20,7 @@ scsi LinoHell SAPHIR2
|
||||||
scsi Nikon AX-210
|
scsi Nikon AX-210
|
||||||
scsi KYE ColorPage-HR5
|
scsi KYE ColorPage-HR5
|
||||||
scsi EPSON Perfection600
|
scsi EPSON Perfection600
|
||||||
|
scsi ESCORT "Galleria 600S"
|
||||||
|
|
||||||
#
|
#
|
||||||
# device list for non-linux-systems:
|
# device list for non-linux-systems:
|
||||||
|
|
|
@ -212,6 +212,7 @@ typedef struct Umax_Device
|
||||||
unsigned int request_scsi_maxqueue;
|
unsigned int request_scsi_maxqueue;
|
||||||
unsigned int request_preview_lines;
|
unsigned int request_preview_lines;
|
||||||
unsigned int request_scan_lines;
|
unsigned int request_scan_lines;
|
||||||
|
unsigned int handle_bad_sense_error;
|
||||||
unsigned int execute_request_sense;
|
unsigned int execute_request_sense;
|
||||||
unsigned int force_preview_bit_rgb;
|
unsigned int force_preview_bit_rgb;
|
||||||
unsigned int scsi_buffer_size_min;
|
unsigned int scsi_buffer_size_min;
|
||||||
|
|
Ładowanie…
Reference in New Issue