improve below 600 dpi scan speed and quality for lide 210

- add half ccd mode for lide 210
merge-requests/1/head
Stphane Voltz 2013-07-17 21:24:57 +02:00
rodzic cece7fe945
commit 1c3ec28ab8
5 zmienionych plików z 163 dodań i 90 usunięć

Wyświetl plik

@ -3115,8 +3115,7 @@ genesys_restore_calibration (Genesys_Device * dev)
* matching one */ * matching one */
for (cache = dev->calibration_cache; cache; cache = cache->next) for (cache = dev->calibration_cache; cache; cache = cache->next)
{ {
status = dev->model->cmd_set->is_compatible_calibration (dev, cache, status = dev->model->cmd_set->is_compatible_calibration (dev, cache, SANE_FALSE);
SANE_FALSE);
/* SANE_STATUS_GOOD, a matching cache has been found /* SANE_STATUS_GOOD, a matching cache has been found
* so we use it to populate calibration data * so we use it to populate calibration data
*/ */
@ -7053,9 +7052,7 @@ get_option_value (Genesys_Scanner * s, int option, void *val)
for (cache = s->dev->calibration_cache; cache; cache = cache->next) for (cache = s->dev->calibration_cache; cache; cache = cache->next)
{ {
if (s->dev->model-> if (s->dev->model->
cmd_set->is_compatible_calibration (s->dev, cache, cmd_set->is_compatible_calibration (s->dev, cache, SANE_FALSE) == SANE_STATUS_GOOD)
SANE_FALSE) ==
SANE_STATUS_GOOD)
{ {
*(SANE_Bool *) val = SANE_FALSE; *(SANE_Bool *) val = SANE_FALSE;
} }

Wyświetl plik

@ -1826,9 +1826,9 @@ static Genesys_Model canon_lide_210_model = {
{16, 8, 0}, /* possible depths in color mode */ {16, 8, 0}, /* possible depths in color mode */
SANE_FIX (2.2), /* Start of scan area in mm (x) */ SANE_FIX (2.2), /* Start of scan area in mm (x) */
SANE_FIX (9.0), /* Start of scan area in mm (y) */ SANE_FIX (8.7), /* Start of scan area in mm (y) */
SANE_FIX (216.70), /* Size of scan area in mm (x) */ SANE_FIX (216.70), /* Size of scan area in mm (x) */
SANE_FIX (300.0), /* Size of scan area in mm (y) */ SANE_FIX (297.5), /* Size of scan area in mm (y) */
SANE_FIX (0.0), /* Start of white strip in mm (y) */ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */ SANE_FIX (0.0), /* Start of black mark in mm (x) */
@ -1858,9 +1858,11 @@ static Genesys_Model canon_lide_210_model = {
GENESYS_FLAG_SKIP_WARMUP GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION | GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_CALIBRATION | GENESYS_FLAG_DARK_CALIBRATION
| GENESYS_FLAG_HALF_CCD_MODE
| GENESYS_FLAG_SHADING_REPARK
| GENESYS_FLAG_CUSTOM_GAMMA, | GENESYS_FLAG_CUSTOM_GAMMA,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_EXTRA_SW, GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_EXTRA_SW,
50, 60,
400 400
}; };

Wyświetl plik

@ -251,9 +251,10 @@ gl124_test_motor_flag_bit (SANE_Byte val)
* profile is at a specific dpihw. Use LiDE 110 table by default. * profile is at a specific dpihw. Use LiDE 110 table by default.
* @param sensor_type sensor id * @param sensor_type sensor id
* @param dpi hardware dpi for the scan * @param dpi hardware dpi for the scan
* @param half_ccd flag to signal half ccd mode
* @return a pointer to a Sensor_Profile struct * @return a pointer to a Sensor_Profile struct
*/ */
static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi) static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi, int half_ccd)
{ {
unsigned int i; unsigned int i;
int idx; int idx;
@ -263,13 +264,16 @@ static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi)
while(i<sizeof(sensors)/sizeof(Sensor_Profile)) while(i<sizeof(sensors)/sizeof(Sensor_Profile))
{ {
/* exact match */ /* exact match */
if(sensors[i].sensor_type==sensor_type && sensors[i].dpi==dpi) if(sensors[i].sensor_type==sensor_type
&& sensors[i].dpi==dpi
&& sensors[i].half_ccd==half_ccd)
{ {
return &(sensors[i]); return &(sensors[i]);
} }
/* closest match */ /* closest match */
if(sensors[i].sensor_type==sensor_type) if(sensors[i].sensor_type==sensor_type
&& sensors[i].half_ccd==half_ccd)
{ {
if(idx<0) if(idx<0)
{ {
@ -434,6 +438,23 @@ SANE_Status status=SANE_STATUS_GOOD;
return status; return status;
} }
/**@brief compute half ccd mode
* Compute half CCD mode flag. Half CCD is on when dpiset it twice
* the actual scanning resolution. Used for fast scans.
* @param model pointer to device model
* @param xres required horizontal resolution
* @return SANE_TRUE if half CCD mode enabled
*/
static SANE_Bool compute_half_ccd(Genesys_Model *model, int xres)
{
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if (xres<=300 && (model->flags & GENESYS_FLAG_HALF_CCD_MODE))
{
return SANE_TRUE;
}
return SANE_FALSE;
}
/** @brief set all registers to default values . /** @brief set all registers to default values .
* This function is called only once at the beginning and * This function is called only once at the beginning and
* fills register startup values for registers reused across scans. * fills register startup values for registers reused across scans.
@ -862,6 +883,11 @@ gl124_set_fe (Genesys_Device * dev, uint8_t set)
RIE (sanei_genesys_read_register (dev, REG0A, &val)); RIE (sanei_genesys_read_register (dev, REG0A, &val));
if(dev->usb_mode<0)
{
val=3<<REG0AS_SIFSEL;
}
/* route to correct analog FE */ /* route to correct analog FE */
switch ((val & REG0A_SIFSEL)>>REG0AS_SIFSEL) switch ((val & REG0A_SIFSEL)>>REG0AS_SIFSEL)
{ {
@ -884,12 +910,15 @@ gl124_set_fe (Genesys_Device * dev, uint8_t set)
/**@brief compute exposure to use /**@brief compute exposure to use
* compute the sensor exposure based on target resolution * compute the sensor exposure based on target resolution
* @param dev pointer to device description
* @param xres sensor's required resolution
* @param half_ccd flag for half ccd mode
*/ */
static int gl124_compute_exposure(Genesys_Device *dev, int xres) static int gl124_compute_exposure(Genesys_Device *dev, int xres, int half_ccd)
{ {
Sensor_Profile *sensor; Sensor_Profile *sensor;
sensor=get_sensor_profile(dev->model->ccd_type, xres); sensor=get_sensor_profile(dev->model->ccd_type, xres, half_ccd);
return sensor->exposure; return sensor->exposure;
} }
@ -934,6 +963,7 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
Genesys_Register_Set *r; Genesys_Register_Set *r;
uint32_t z1, z2; uint32_t z1, z2;
float yres; float yres;
unsigned int linesel;
DBGSTART; DBGSTART;
DBG (DBG_info, "gl124_init_motor_regs_scan : scan_exposure_time=%d, " DBG (DBG_info, "gl124_init_motor_regs_scan : scan_exposure_time=%d, "
@ -967,8 +997,9 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
{ {
yres=300; yres=300;
} }
scan_dummy=dev->line_interp; linesel=dev->line_interp;
dev->line_interp=0; dev->line_interp=0;
DBG (DBG_io2, "%s: linesel=%d\n", __FUNCTION__, linesel);
sanei_genesys_set_triple(reg,REG_LINCNT,lincnt); sanei_genesys_set_triple(reg,REG_LINCNT,lincnt);
DBG (DBG_io, "%s: lincnt=%d\n", __FUNCTION__, lincnt); DBG (DBG_io, "%s: lincnt=%d\n", __FUNCTION__, lincnt);
@ -1074,7 +1105,7 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
/* LINESEL */ /* LINESEL */
r = sanei_genesys_get_address (reg, REG1D); r = sanei_genesys_get_address (reg, REG1D);
r->value = (r->value & ~REG1D_LINESEL) | scan_dummy; r->value = (r->value & ~REG1D_LINESEL) | linesel;
r = sanei_genesys_get_address (reg, REGA0); r = sanei_genesys_get_address (reg, REGA0);
r->value = (scan_step_type << REGA0S_STEPSEL) | (scan_step_type << REGA0S_FSTPSEL); r->value = (scan_step_type << REGA0S_STEPSEL) | (scan_step_type << REGA0S_FSTPSEL);
@ -1092,9 +1123,10 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
* @param dev device to set up * @param dev device to set up
* @param regs register set to modify * @param regs register set to modify
* @param dpi resolution of the sensor during scan * @param dpi resolution of the sensor during scan
* @param half_ccd flag for half ccd mode
* */ * */
static void static void
gl124_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs, int dpi) gl124_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs, int dpi, int half_ccd)
{ {
Genesys_Register_Set *r; Genesys_Register_Set *r;
int i; int i;
@ -1121,7 +1153,7 @@ gl124_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs, int dpi)
/* set EXPDUMMY and CKxMAP */ /* set EXPDUMMY and CKxMAP */
dpihw=sanei_genesys_compute_dpihw(dev,dpi); dpihw=sanei_genesys_compute_dpihw(dev,dpi);
sensor=get_sensor_profile(dev->model->ccd_type, dpihw); sensor=get_sensor_profile(dev->model->ccd_type, dpihw, half_ccd);
r = sanei_genesys_get_address (regs, 0x18); r = sanei_genesys_get_address (regs, 0x18);
if (r) if (r)
@ -1235,7 +1267,7 @@ gl124_init_optical_regs_scan (Genesys_Device * dev,
DBG (DBG_io2, "%s: dpihw=%d (factor=%d)\n", __FUNCTION__, dpihw, factor); DBG (DBG_io2, "%s: dpihw=%d (factor=%d)\n", __FUNCTION__, dpihw, factor);
/* sensor parameters */ /* sensor parameters */
gl124_setup_sensor (dev, reg, dpihw); gl124_setup_sensor (dev, reg, dpihw, half_ccd);
dpiset = used_res * cksel; dpiset = used_res * cksel;
/* start and end coordinate in optical dpi coordinates */ /* start and end coordinate in optical dpi coordinates */
@ -1344,8 +1376,16 @@ gl124_init_optical_regs_scan (Genesys_Device * dev,
else else
r->value |= REG05_GMMENB; r->value |= REG05_GMMENB;
if(half_ccd)
{
sanei_genesys_set_double(reg,REG_DPISET,dpiset*2);
DBG (DBG_io2, "%s: dpiset used=%d\n", __FUNCTION__, dpiset*2);
}
else
{
sanei_genesys_set_double(reg,REG_DPISET,dpiset); sanei_genesys_set_double(reg,REG_DPISET,dpiset);
DBG (DBG_io2, "%s: dpiset used=%d\n", __FUNCTION__, dpiset); DBG (DBG_io2, "%s: dpiset used=%d\n", __FUNCTION__, dpiset);
}
r = sanei_genesys_get_address (reg, REG06); r = sanei_genesys_get_address (reg, REG06);
r->value |= REG06_GAIN4; r->value |= REG06_GAIN4;
@ -1355,12 +1395,14 @@ gl124_init_optical_regs_scan (Genesys_Device * dev,
segnb = r->value & 0x0f; segnb = r->value & 0x0f;
sanei_genesys_set_triple(reg,REG_STRPIXEL,startx/segnb); sanei_genesys_set_triple(reg,REG_STRPIXEL,startx/segnb);
DBG (DBG_io2, "%s: strpixel used=%d\n", __FUNCTION__, startx/segnb);
sanei_genesys_get_triple(reg,REG_SEGCNT,&segcnt); sanei_genesys_get_triple(reg,REG_SEGCNT,&segcnt);
if(endx/segnb==segcnt) if(endx/segnb==segcnt)
{ {
endx=0; endx=0;
} }
sanei_genesys_set_triple(reg,REG_ENDPIXEL,endx/segnb); sanei_genesys_set_triple(reg,REG_ENDPIXEL,endx/segnb);
DBG (DBG_io2, "%s: endpixel used=%d\n", __FUNCTION__, endx/segnb);
/* words(16bit) before gamma, conversion to 8 bit or lineart */ /* words(16bit) before gamma, conversion to 8 bit or lineart */
words_per_line = (used_pixels * dpiset) / dpihw; words_per_line = (used_pixels * dpiset) / dpihw;
@ -1388,7 +1430,7 @@ gl124_init_optical_regs_scan (Genesys_Device * dev,
else else
{ {
/* line interpolation, we are scanning at higher /* line interpolation, we are scanning at higher
* motor dpi then discard lines to match taget * motor dpi then discard lines to match target
* resolution, so lincnt has to be updated * resolution, so lincnt has to be updated
*/ */
dev->line_interp = 300/dpiset-1; dev->line_interp = 300/dpiset-1;
@ -1400,7 +1442,7 @@ gl124_init_optical_regs_scan (Genesys_Device * dev,
DBG (DBG_io2, "%s: dev->bpl =%lu\n", __FUNCTION__, (unsigned long)dev->bpl); DBG (DBG_io2, "%s: dev->bpl =%lu\n", __FUNCTION__, (unsigned long)dev->bpl);
DBG (DBG_io2, "%s: dev->len =%lu\n", __FUNCTION__, (unsigned long)dev->len); DBG (DBG_io2, "%s: dev->len =%lu\n", __FUNCTION__, (unsigned long)dev->len);
DBG (DBG_io2, "%s: dev->dist =%lu\n", __FUNCTION__, (unsigned long)dev->dist); DBG (DBG_io2, "%s: dev->dist =%lu\n", __FUNCTION__, (unsigned long)dev->dist);
DBG (DBG_io2, "%s: dev->line_interp=%lu\n", __FUNCTION__, (unsigned long)dev->dist); DBG (DBG_io2, "%s: dev->line_interp=%lu\n", __FUNCTION__, (unsigned long)dev->line_interp);
words_per_line *= channels; words_per_line *= channels;
dev->wpl = words_per_line; dev->wpl = words_per_line;
@ -1475,21 +1517,13 @@ gl124_init_scan_regs (Genesys_Device * dev,
"Flags : %x\n\n", "Flags : %x\n\n",
xres, yres, lines, pixels, startx, starty, depth, channels, flags); xres, yres, lines, pixels, startx, starty, depth, channels, flags);
/* we have 2 domains for ccd: xres below or above half ccd max dpi */ half_ccd=compute_half_ccd(dev->model, xres);
if (dev->sensor.optical_res < 2 * xres ||
!(dev->model->flags & GENESYS_FLAG_HALF_CCD_MODE))
{
half_ccd = SANE_FALSE;
}
else
{
half_ccd = SANE_TRUE;
}
/* optical_res */ /* optical_res */
optical_res = dev->sensor.optical_res; optical_res = dev->sensor.optical_res;
if (half_ccd) if (half_ccd)
optical_res /= 2; optical_res /= 2;
DBG (DBG_info, "%s: optical_res=%d\n", __FUNCTION__, optical_res);
/* stagger */ /* stagger */
if ((!half_ccd) && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE)) if ((!half_ccd) && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE))
@ -1550,7 +1584,7 @@ gl124_init_scan_regs (Genesys_Device * dev,
} }
else else
{ {
exposure_time = gl124_compute_exposure (dev, used_res); exposure_time = gl124_compute_exposure (dev, used_res, half_ccd);
scan_step_type = gl124_compute_step_type(dev, exposure_time); scan_step_type = gl124_compute_step_type(dev, exposure_time);
} }
@ -1711,11 +1745,11 @@ gl124_calculate_current_setup (Genesys_Device * dev)
unsigned int lincnt; unsigned int lincnt;
int exposure_time; int exposure_time;
int stagger; int stagger;
SANE_Bool half_ccd;
int max_shift, dpihw; int max_shift, dpihw;
Sensor_Profile *sensor; Sensor_Profile *sensor;
SANE_Bool half_ccd; /* false: full CCD res is used, true, half max CCD res is used */
int optical_res; int optical_res;
DBG (DBG_info, DBG (DBG_info,
@ -1752,6 +1786,7 @@ gl124_calculate_current_setup (Genesys_Device * dev)
pixels = dev->settings.pixels; pixels = dev->settings.pixels;
lines = dev->settings.lines; lines = dev->settings.lines;
half_ccd=compute_half_ccd(dev->model, xres);
DBG (DBG_info, DBG (DBG_info,
"gl124_calculate_current_setup settings:\n" "gl124_calculate_current_setup settings:\n"
@ -1759,33 +1794,12 @@ gl124_calculate_current_setup (Genesys_Device * dev)
"Lines : %g\n" "Lines : %g\n"
"PPL : %g\n" "PPL : %g\n"
"Startpos : %g\n" "Startpos : %g\n"
"Half ccd : %d\n"
"Depth/Channels: %u/%u\n\n", "Depth/Channels: %u/%u\n\n",
xres, yres, lines, pixels, startx, depth, channels); xres, yres, lines, pixels, startx, depth, half_ccd, channels);
/* half_ccd */
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if ((dev->sensor.optical_res < 2 * xres) ||
!(dev->model->flags & GENESYS_FLAG_HALF_CCD_MODE))
{
half_ccd = SANE_FALSE;
}
else
{
half_ccd = SANE_TRUE;
}
/* optical_res */ /* optical_res */
optical_res = dev->sensor.optical_res; optical_res = dev->sensor.optical_res;
if (half_ccd)
optical_res /= 2;
/* stagger */
if ((!half_ccd) && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE))
stagger = (4 * yres) / dev->motor.base_ydpi;
else
stagger = 0;
DBG (DBG_info, "%s: stagger=%d lines\n", __FUNCTION__, stagger);
if(xres<=optical_res) if(xres<=optical_res)
used_res = xres; used_res = xres;
@ -1801,16 +1815,25 @@ gl124_calculate_current_setup (Genesys_Device * dev)
DBG (DBG_info, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels); DBG (DBG_info, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels);
/* exposure */ /* exposure */
exposure_time = gl124_compute_exposure (dev, xres); exposure_time = gl124_compute_exposure (dev, xres, half_ccd);
DBG (DBG_info, "%s : exposure_time=%d pixels\n", __FUNCTION__, exposure_time); DBG (DBG_info, "%s : exposure_time=%d pixels\n", __FUNCTION__, exposure_time);
/* max_shift */ /* max_shift */
max_shift=sanei_genesys_compute_max_shift(dev,channels,yres,0); max_shift=sanei_genesys_compute_max_shift(dev,channels,yres,0);
/* compute hw dpi for sensor */
dpihw=sanei_genesys_compute_dpihw(dev,used_res); dpihw=sanei_genesys_compute_dpihw(dev,used_res);
sensor=get_sensor_profile(dev->model->ccd_type, dpihw);
sensor=get_sensor_profile(dev->model->ccd_type, dpihw, half_ccd);
dev->segnb=sensor->reg98 & 0x0f; dev->segnb=sensor->reg98 & 0x0f;
/* stagger */
if ((!half_ccd) && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE))
stagger = (4 * yres) / dev->motor.base_ydpi;
else
stagger = 0;
DBG (DBG_info, "%s: stagger=%d lines\n", __FUNCTION__, stagger);
/* lincnt */ /* lincnt */
lincnt = lines + max_shift + stagger; lincnt = lines + max_shift + stagger;
@ -2131,6 +2154,12 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
DBG (DBG_proc, "gl124_slow_back_home (wait_until_home = %d)\n", DBG (DBG_proc, "gl124_slow_back_home (wait_until_home = %d)\n",
wait_until_home); wait_until_home);
if(dev->usb_mode<0)
{
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
/* post scan gpio : without that HOMSNR is unreliable */ /* post scan gpio : without that HOMSNR is unreliable */
gl124_homsnr_gpio(dev); gl124_homsnr_gpio(dev);
@ -2177,7 +2206,7 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
/* TODO add scan_mode to the API */ /* TODO add scan_mode to the API */
scan_mode= dev->settings.scan_mode; scan_mode= dev->settings.scan_mode;
dev->settings.scan_mode=SCAN_MODE_LINEART; dev->settings.scan_mode=SCAN_MODE_GRAY;
gl124_init_scan_regs (dev, gl124_init_scan_regs (dev,
local_reg, local_reg,
resolution, resolution,
@ -2538,9 +2567,16 @@ gl124_init_regs_for_shading (Genesys_Device * dev)
{ {
dev->calib_lines *= 2; dev->calib_lines *= 2;
} }
factor=dev->sensor.optical_res/dpihw;
resolution=dpihw; resolution=dpihw;
/* if half CCD mode, use half resolution */
if(compute_half_ccd(dev->model, dev->settings.xres)==SANE_TRUE)
{
resolution /= 2;
dev->calib_lines /= 2;
}
dev->calib_resolution = resolution; dev->calib_resolution = resolution;
factor=dev->sensor.optical_res/resolution;
dev->calib_pixels = dev->sensor.sensor_pixels/factor; dev->calib_pixels = dev->sensor.sensor_pixels/factor;
/* distance to move to reach white target at high resolution */ /* distance to move to reach white target at high resolution */
@ -2691,6 +2727,10 @@ gl124_init_regs_for_scan (Genesys_Device * dev)
/* start */ /* start */
start = SANE_UNFIX (dev->model->x_offset); start = SANE_UNFIX (dev->model->x_offset);
start += dev->settings.tl_x; start += dev->settings.tl_x;
if(compute_half_ccd(dev->model, dev->settings.xres)==SANE_TRUE)
{
start /=2;
}
start = (start * dev->sensor.optical_res) / MM_PER_INCH; start = (start * dev->sensor.optical_res) / MM_PER_INCH;
flags = 0; flags = 0;
@ -2933,7 +2973,8 @@ gl124_led_calibration (Genesys_Device * dev)
{ {
int num_pixels; int num_pixels;
int total_size; int total_size;
int used_res; int resolution;
int dpihw;
uint8_t *line; uint8_t *line;
int i, j; int i, j;
SANE_Status status = SANE_STATUS_GOOD; SANE_Status status = SANE_STATUS_GOOD;
@ -2945,6 +2986,7 @@ gl124_led_calibration (Genesys_Device * dev)
uint16_t exp[3],target; uint16_t exp[3],target;
Sensor_Profile *sensor; Sensor_Profile *sensor;
SANE_Bool acceptable; SANE_Bool acceptable;
SANE_Bool half_ccd;
DBGSTART; DBGSTART;
@ -2954,9 +2996,18 @@ gl124_led_calibration (Genesys_Device * dev)
/* offset calibration is always done in 16 bit depth color mode */ /* offset calibration is always done in 16 bit depth color mode */
channels = 3; channels = 3;
depth=16; depth=16;
used_res=sanei_genesys_compute_dpihw(dev,dev->settings.xres); dpihw=sanei_genesys_compute_dpihw(dev, dev->settings.xres);
sensor=get_sensor_profile(dev->model->ccd_type, used_res); half_ccd=compute_half_ccd(dev->model, dev->settings.xres);
num_pixels = (dev->sensor.sensor_pixels*used_res)/dev->sensor.optical_res; if(half_ccd==SANE_TRUE)
{
resolution = dpihw/2;
}
else
{
resolution = dpihw;
}
sensor=get_sensor_profile(dev->model->ccd_type, dpihw, half_ccd);
num_pixels = (dev->sensor.sensor_pixels*resolution)/dev->sensor.optical_res;
/* initial calibration reg values */ /* initial calibration reg values */
memcpy (dev->calib_reg, dev->reg, GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set)); memcpy (dev->calib_reg, dev->reg, GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set));
@ -2964,8 +3015,8 @@ gl124_led_calibration (Genesys_Device * dev)
/* set up for the calibration scan */ /* set up for the calibration scan */
status = gl124_init_scan_regs (dev, status = gl124_init_scan_regs (dev,
dev->calib_reg, dev->calib_reg,
used_res, resolution,
used_res, resolution,
0, 0,
0, 0,
num_pixels, num_pixels,

Wyświetl plik

@ -565,11 +565,15 @@ static Memory_layout layouts[]={
/** @brief structure for sensor settings /** @brief structure for sensor settings
* this structure describes the sensor settings to use for a given * this structure describes the sensor settings to use for a given
* exposure. * exposure. Data settings are identified by
* - sensor id
* - sensor hardware dpi
* - half ccd mode
*/ */
typedef struct { typedef struct {
int sensor_type; /**> sensor id */ int sensor_type; /**> sensor id */
int dpi; /**> maximum dpi for which data are valid */ int dpi; /**> maximum dpi for which data are valid */
int half_ccd; /**> half ccd mode */
int exposure; /**> exposure */ int exposure; /**> exposure */
int ck1map; /**> CK1MAP */ int ck1map; /**> CK1MAP */
int ck3map; /**> CK2MAP */ int ck3map; /**> CK2MAP */
@ -596,14 +600,14 @@ static size_t order_0213[]={0,2,1,3};
* database of sensor profiles * database of sensor profiles
*/ */
static Sensor_Profile sensors[]={ static Sensor_Profile sensors[]={
{CIS_CANONLIDE110, 300, 5359, 0x1e, 0x9f, 0x55, 5168, 154, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, {CIS_CANONLIDE110, 300, 0, 5359, 0x1e, 0x9f, 0x55, 5168, 154, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
{CIS_CANONLIDE110, 600, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, {CIS_CANONLIDE110, 600, 0, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
{CIS_CANONLIDE110, 1200, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22}, {CIS_CANONLIDE110, 1200, 0, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22},
{CIS_CANONLIDE110, 2400, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24}, {CIS_CANONLIDE110, 2400, 0, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24},
{CIS_CANONLIDE210, 300, 5359, 0x1e, 0x9f, 0x55, 5168, 154, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, {CIS_CANONLIDE210, 600, 1, 2768, 0x1e, 0x9f, 0x55, 2584, 154, 101, 388, 574, 393, NULL , 0x00, 0x0c, 0x20, 0x21},
{CIS_CANONLIDE210, 600, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, {CIS_CANONLIDE210, 600, 0, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
{CIS_CANONLIDE210, 1200, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22}, {CIS_CANONLIDE210, 1200, 0, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22},
{CIS_CANONLIDE210, 2400, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24}, {CIS_CANONLIDE210, 2400, 0, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24},
}; };
@ -613,10 +617,10 @@ static Sensor_Profile sensors[]={
static uint32_t lide110_max[] = { 62496, 31296, 0}; static uint32_t lide110_max[] = { 62496, 31296, 0};
static uint32_t lide110_slow[] = { 62496, 7896, 0}; static uint32_t lide110_slow[] = { 62496, 7896, 0};
static uint32_t lide110_alt[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0}; static uint32_t lide110_alt[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0};
static uint32_t lide110_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343,2343,2343,2051,1961,1901,1852,1809,1775,1745,1717,1692,1671,1650,1630,1613,1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0};
static uint32_t lide210_max[] = { 62496, 31296, 0}; static uint32_t lide210_max[] = { 62496, 31296, 0};
static uint32_t lide210_slow[] = { 62496, 7896, 0}; static uint32_t lide210_slow[] = { 62496, 7896, 0};
static uint32_t lide210_alt[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0}; static uint32_t lide210_fast[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0};
static uint32_t lide210_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1961, 1901, 1852, 1809, 1775, 1745, 1717, 1692, 1671, 1650, 1630, 1613, 1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0}; static uint32_t lide210_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1961, 1901, 1852, 1809, 1775, 1745, 1717, 1692, 1671, 1650, 1630, 1613, 1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0};
/** /**
@ -626,16 +630,14 @@ static uint32_t lide210_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343,234
/* NEXT LPERIOD=PREVIOUS*2-192 */ /* NEXT LPERIOD=PREVIOUS*2-192 */
static Motor_Profile motors[]={ static Motor_Profile motors[]={
{MOTOR_CANONLIDE110, 2304, 0, lide110_ok},
{MOTOR_CANONLIDE110, 5359, 0, lide110_alt}, {MOTOR_CANONLIDE110, 5359, 0, lide110_alt},
{MOTOR_CANONLIDE110, 5360, 1, lide110_alt}, {MOTOR_CANONLIDE110, 5360, 1, lide110_alt},
{MOTOR_CANONLIDE110, 10528, 1, lide110_slow}, {MOTOR_CANONLIDE110, 10528, 1, lide110_slow},
{MOTOR_CANONLIDE110, 20864, 2, lide110_max}, {MOTOR_CANONLIDE110, 20864, 2, lide110_max},
{MOTOR_CANONLIDE210, 2304, 0, lide110_ok}, {MOTOR_CANONLIDE210, 2768, 0, lide210_fast},
{MOTOR_CANONLIDE210, 5359, 0, lide110_alt}, {MOTOR_CANONLIDE210, 5360, 0, lide210_ok},
{MOTOR_CANONLIDE210, 5360, 1, lide110_alt}, {MOTOR_CANONLIDE210, 10528, 1, lide210_slow},
{MOTOR_CANONLIDE210, 10528, 1, lide110_slow}, {MOTOR_CANONLIDE210, 20864, 2, lide210_max},
{MOTOR_CANONLIDE210, 20864, 2, lide110_max},
{0, 0, 0, NULL}, {0, 0, 0, NULL},
}; };
/* *INDENT-ON* */ /* *INDENT-ON* */
@ -690,4 +692,10 @@ static
#endif #endif
SANE_Status gl124_feed (Genesys_Device * dev, unsigned int steps); SANE_Status gl124_feed (Genesys_Device * dev, unsigned int steps);
#ifndef UNIT_TESTING
static
#endif
SANE_Status
gl124_stop_action (Genesys_Device * dev);
/* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */ /* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */

Wyświetl plik

@ -610,6 +610,14 @@ sanei_genesys_fe_write_data (Genesys_Device * dev, uint8_t addr,
SANE_Status SANE_Status
sanei_genesys_get_status (Genesys_Device * dev, uint8_t * status) sanei_genesys_get_status (Genesys_Device * dev, uint8_t * status)
{ {
#ifdef UNIT_TESTING
if(dev->usb_mode<0)
{
*status=0;
return SANE_STATUS_GOOD;
}
#endif
if(dev->model->asic_type==GENESYS_GL124) if(dev->model->asic_type==GENESYS_GL124)
return sanei_genesys_read_hregister(dev, 0x101, status); return sanei_genesys_read_hregister(dev, 0x101, status);
return sanei_genesys_read_register (dev, 0x41, status); return sanei_genesys_read_register (dev, 0x41, status);
@ -1718,6 +1726,13 @@ sanei_genesys_is_compatible_calibration (Genesys_Device * dev,
resolution=sanei_genesys_compute_dpihw(dev,dev->settings.xres); resolution=sanei_genesys_compute_dpihw(dev,dev->settings.xres);
compatible = (resolution == ((int) sanei_genesys_compute_dpihw(dev,cache->used_setup.xres))); compatible = (resolution == ((int) sanei_genesys_compute_dpihw(dev,cache->used_setup.xres)));
} }
if (dev->current_setup.half_ccd != cache->used_setup.half_ccd)
{
DBG (DBG_io,
"sanei_genesys_is_compatible_calibration: half_ccd=%d, used=%d\n",
dev->current_setup.half_ccd, cache->used_setup.half_ccd);
compatible = 0;
}
if (dev->current_setup.scan_method != cache->used_setup.scan_method) if (dev->current_setup.scan_method != cache->used_setup.scan_method)
{ {
DBG (DBG_io, DBG (DBG_io,