kopia lustrzana https://gitlab.com/sane-project/backends
rodzic
eee0012786
commit
b635ba26b1
|
@ -1,3 +1,8 @@
|
|||
2009-03-09 Stéphane Voltz <stef.dev@free.fr>
|
||||
* backend/genesys.c backend/genesys_devices.c backend/genesys_gl646.c:
|
||||
1200 dpi scan fix and head positionning fixes
|
||||
|
||||
|
||||
2009-03-07 m. allan noah <kitno455 a t gmail d o t com>
|
||||
* backend/canon_dr.c, backend/canon_dr.conf.in: backend version 14
|
||||
- remove HARD_SELECT from counter (Legitimate, but API violation)
|
||||
|
|
|
@ -222,7 +222,7 @@ sanei_genesys_write_pnm_file (char *filename, uint8_t * data, int depth,
|
|||
{
|
||||
if (depth == 8)
|
||||
{
|
||||
fputc (*(data++), out);
|
||||
fputc (*(data+count), out);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1511,6 +1511,7 @@ sanei_genesys_search_reference_point (Genesys_Device * dev, uint8_t * data,
|
|||
}
|
||||
|
||||
/* laplace filter to denoise picture */
|
||||
memcpy (image, data, size); /* to initialize unprocessed part of the image buffer */
|
||||
for (y = 1; y < height - 1; y++)
|
||||
for (x = 1; x < width - 1; x++)
|
||||
{
|
||||
|
@ -2258,7 +2259,7 @@ genesys_dark_shading_calibration (Genesys_Device * dev)
|
|||
}
|
||||
|
||||
/* size is size in bytes for scanarea: bytes_per_line * lines */
|
||||
size = channels * 2 * pixels_per_line * dev->model->shading_lines;
|
||||
size = channels * 2 * pixels_per_line * (dev->model->shading_lines+1);
|
||||
|
||||
calibration_data = malloc (size);
|
||||
if (!calibration_data)
|
||||
|
@ -3610,7 +3611,7 @@ genesys_warmup_lamp (Genesys_Device * dev)
|
|||
second_average /= pixel;
|
||||
difference = abs (first_average - second_average);
|
||||
|
||||
if (second_average > (110 * 256)
|
||||
if (second_average > (100 * 256)
|
||||
&& (difference / second_average) < 0.002)
|
||||
break;
|
||||
}
|
||||
|
@ -4183,6 +4184,14 @@ genesys_read_ordered_data (Genesys_Device * dev, SANE_Byte * destination,
|
|||
((dev->model->ld_shift_b * dev->settings.yres) /
|
||||
dev->motor.base_ydpi);
|
||||
|
||||
/* TODO find an explanation for this special case */
|
||||
/*if(dev->model->motor_type == MOTOR_HP2300 && dev->settings.yres>dev->motor.base_ydpi)
|
||||
{
|
||||
ccd_shift[0] *= 2;
|
||||
ccd_shift[1] *= 2;
|
||||
ccd_shift[2] *= 2;
|
||||
}*/
|
||||
|
||||
ccd_shift[3] = ccd_shift[0] + dev->current_setup.stagger;
|
||||
ccd_shift[4] = ccd_shift[1] + dev->current_setup.stagger;
|
||||
ccd_shift[5] = ccd_shift[2] + dev->current_setup.stagger;
|
||||
|
|
|
@ -519,7 +519,7 @@ static Genesys_Motor Motor[] = {
|
|||
},},},
|
||||
},
|
||||
{MOTOR_HP2300, /* HP 2300c */
|
||||
600,
|
||||
600, /* 600/1200 */
|
||||
1200,
|
||||
1,
|
||||
1,
|
||||
|
|
|
@ -1004,12 +1004,12 @@ static Motor_Master motor_master[] = {
|
|||
{MOTOR_HP2300, 150, SANE_TRUE, 150, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 67, 7903, 543, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300, 300, SANE_TRUE, 300, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 44, 5386, 2175, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300, 600, SANE_TRUE, 600, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 8700, 4350, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300,1200, SANE_TRUE,1200, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 26100, 17400, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300,1200, SANE_TRUE,1200, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 17400, 8700, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300, 75, SANE_FALSE, 75, FULL_STEP, SANE_FALSE, SANE_TRUE , 63, 120, 8139, 560, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300, 150, SANE_FALSE, 150, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 67, 7903, 543, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300, 300, SANE_FALSE, 300, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 44, 5386, 2175, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300, 600, SANE_FALSE, 600, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 8700, 4350, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300,1200, SANE_FALSE,1200, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 26100, 17400, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
{MOTOR_HP2300,1200, SANE_FALSE,1200, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 17400, 8700, 120, 4905, 337, 0.3, 0.4, 16},
|
||||
|
||||
/* MD5345/6471 motor settings */
|
||||
/* vfinal=(exposure/(1200/dpi))/step_type */
|
||||
|
@ -1202,6 +1202,7 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
size_t read_buffer_size;
|
||||
SANE_Bool half_ccd = SANE_FALSE;
|
||||
SANE_Int xresolution;
|
||||
int feedl;
|
||||
|
||||
DBG (DBG_proc, "gl646_setup_registers: start\n");
|
||||
DBG (DBG_info, "gl646_setup_registers: startx=%d, endx=%d, linecnt=%d\n",
|
||||
|
@ -1281,6 +1282,12 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
|
||||
/* vfinal=(exposure/(1200/dpi))/step_type */
|
||||
DBG (DBG_info, "XXX STEF XXX vfinal=%d, vend1=%d\n",
|
||||
(sensor->exposure * sensor->xdpi) / ((1 << motor->steptype) *
|
||||
dev->sensor.optical_res),
|
||||
motor->vend1);
|
||||
|
||||
/* half_ccd if manual clock programming or dpi is half dpiset */
|
||||
half_ccd = sensor->half_ccd;
|
||||
|
||||
|
@ -1443,7 +1450,7 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
/* we adjust linecnt according to real motor dpi */
|
||||
linecnt = (linecnt * motor->ydpi) / scan_settings.yres;
|
||||
|
||||
/* scanned area must be enlarged by max color shift needed */
|
||||
/* scanned area height must be enlarged by max color shift needed */
|
||||
/* all values are assumed >= 0 */
|
||||
if (channels > 1)
|
||||
{
|
||||
|
@ -1518,12 +1525,13 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
|
||||
/* move distance must be adjusted to take into account the extra lines
|
||||
* read to reorder data */
|
||||
if (stagger + max_shift > 0 && move > 0)
|
||||
feedl = move;
|
||||
if (stagger + max_shift > 0 && feedl != 0)
|
||||
{
|
||||
if (move >
|
||||
if (feedl >
|
||||
((max_shift + stagger) * dev->motor.optical_ydpi) / motor->ydpi)
|
||||
move =
|
||||
move -
|
||||
feedl =
|
||||
feedl -
|
||||
((max_shift + stagger) * dev->motor.optical_ydpi) / motor->ydpi;
|
||||
}
|
||||
|
||||
|
@ -1531,7 +1539,8 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
/*
|
||||
feedl = feed_steps - fast_slope_steps*2 -
|
||||
(slow_slope_steps >> scan_step_type); */
|
||||
if (move > 0)
|
||||
/* but head has moved due to shading calibration => y_position_in_steps */
|
||||
if (feedl > 0)
|
||||
{
|
||||
/* TODO clean up this when I'll fully understand
|
||||
* for now, special casing each motor */
|
||||
|
@ -1539,25 +1548,47 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
{
|
||||
case MOTOR_5345:
|
||||
if (motor->steptype != QUATER_STEP)
|
||||
move = move - motor->steps1;
|
||||
feedl = feedl - motor->steps1;
|
||||
else
|
||||
move = move + 90;
|
||||
feedl = feedl + 110; /* 90 < */
|
||||
break;
|
||||
case MOTOR_HP2300:
|
||||
switch (motor->ydpi)
|
||||
{
|
||||
case 75:
|
||||
feedl -= 300; /*440 > 280, 240 */
|
||||
break;
|
||||
case 150:
|
||||
feedl -= 134;
|
||||
break;
|
||||
case 300:
|
||||
feedl -= 156; /* 200, 165 > 155, 150 */
|
||||
break;
|
||||
case 600:
|
||||
feedl -= 6;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
/* theorical value */
|
||||
default:
|
||||
if (motor->fastfed)
|
||||
{
|
||||
move =
|
||||
move - 2 * motor->steps2 - (motor->steps1 >> motor->steptype);
|
||||
feedl =
|
||||
feedl - 2 * motor->steps2 -
|
||||
(motor->steps1 >> motor->steptype);
|
||||
}
|
||||
else
|
||||
{
|
||||
move = move - (motor->steps1 >> motor->steptype);
|
||||
feedl = feedl - (motor->steps1 >> motor->steptype);
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* security */
|
||||
if (move < 0)
|
||||
move = 0;
|
||||
if (feedl < 0)
|
||||
feedl = 0;
|
||||
}
|
||||
|
||||
/* round move distance according to dummy lines */
|
||||
|
@ -1567,7 +1598,8 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
dummy = regs[reg_0x1e].value & 0x0f;
|
||||
move = ((move + dummy) / (dummy + 1)) * (dummy + 1);
|
||||
} */
|
||||
gl646_set_triple_reg (regs, REG_FEEDL, move);
|
||||
DBG (DBG_info, "gl646_setup_registers: final move=%d\n", feedl);
|
||||
gl646_set_triple_reg (regs, REG_FEEDL, feedl);
|
||||
|
||||
regs[reg_0x65].value = motor->mtrpwm;
|
||||
|
||||
|
@ -2923,19 +2955,21 @@ end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
|
|||
{
|
||||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
int i = 0;
|
||||
uint8_t val;
|
||||
uint8_t val, scanfsh = 0;
|
||||
unsigned int value;
|
||||
|
||||
DBG (DBG_proc, "end_scan (check_stop = %d, eject = %d)\n", check_stop,
|
||||
eject);
|
||||
|
||||
status = sanei_genesys_get_status (dev, &val);
|
||||
DBG (DBG_info, "end_scan: current status =0x%02x\n", val);
|
||||
if (DBG_LEVEL > DBG_io)
|
||||
{
|
||||
print_status (val);
|
||||
read_triple_reg (dev, REG_SCANCNT, &value);
|
||||
}
|
||||
/*status = sanei_genesys_get_status (dev, &val);
|
||||
if (val & REG41_SCANFSH)
|
||||
scanfsh = 1;
|
||||
DBG (DBG_info, "end_scan: current status =0x%02x\n", val);
|
||||
if (DBG_LEVEL > DBG_io)
|
||||
{
|
||||
print_status (val);
|
||||
read_triple_reg (dev, REG_SCANCNT, &value);
|
||||
} */
|
||||
|
||||
/* for sheetfed scanners, we have to eject document and read
|
||||
* left data in buffers */
|
||||
|
@ -2954,7 +2988,10 @@ end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
|
|||
else /* flat bed scanners */
|
||||
{
|
||||
/* ends scan */
|
||||
status = sanei_genesys_write_register (dev, 0x01, 0x00);
|
||||
val = sanei_genesys_read_reg_from_set (reg, 0x01);
|
||||
val &= ~REG01_SCAN;
|
||||
sanei_genesys_set_reg_from_set (reg, 0x01, val);
|
||||
status = sanei_genesys_write_register (dev, 0x01, val);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_error,
|
||||
|
@ -2968,10 +3005,6 @@ end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
|
|||
for (i = 0; i < 300; i++) /* do not wait longer than wait 30 seconds */
|
||||
{
|
||||
status = sanei_genesys_get_status (dev, &val);
|
||||
if (DBG_LEVEL > DBG_io)
|
||||
{
|
||||
print_status (val);
|
||||
}
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_error,
|
||||
|
@ -2979,9 +3012,14 @@ end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
|
|||
sane_strstatus (status));
|
||||
return status;
|
||||
}
|
||||
if (val & REG41_SCANFSH)
|
||||
scanfsh = 1;
|
||||
if (DBG_LEVEL > DBG_io)
|
||||
{
|
||||
print_status (val);
|
||||
}
|
||||
|
||||
if (!(val & REG41_MOTMFLG) && (val & REG41_FEEDFSH)
|
||||
&& (val & REG41_SCANFSH))
|
||||
if (!(val & REG41_MOTMFLG) && (val & REG41_FEEDFSH) && scanfsh)
|
||||
{
|
||||
DBG (DBG_proc, "end_scan: scanfeed finished\n");
|
||||
break; /* leave while loop */
|
||||
|
@ -2993,7 +3031,7 @@ end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
|
|||
break; /* leave while loop */
|
||||
}
|
||||
|
||||
/* XXX STEF XXX usleep (10000UL); sleep 100 ms */
|
||||
usleep (10000UL); /* sleep 100 ms */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3035,6 +3073,10 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
|
|||
sane_strstatus (status));
|
||||
return status;
|
||||
}
|
||||
if (DBG_LEVEL > DBG_io)
|
||||
{
|
||||
print_status (val);
|
||||
}
|
||||
|
||||
dev->scanhead_position_in_steps = 0;
|
||||
|
||||
|
@ -3165,11 +3207,13 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
|
|||
|
||||
/* when we come here then the scanner needed too much time for this, so we better stop the motor */
|
||||
gl646_stop_motor (dev);
|
||||
end_scan (dev, dev->reg, SANE_TRUE, SANE_FALSE);
|
||||
DBG (DBG_error,
|
||||
"gl646_slow_back_home: timeout while waiting for scanhead to go home\n");
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
DBG (DBG_info, "gl646_slow_back_home: scanhead is still moving\n");
|
||||
DBG (DBG_proc, "gl646_slow_back_home: end\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -3337,6 +3381,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
|
|||
dev->reg[reg_0x01].value &= ~REG01_DVDSET;
|
||||
dev->reg[reg_0x02].value |= REG02_ACDCDIS; /* ease backtracking */
|
||||
dev->reg[reg_0x02].value &= ~(REG02_FASTFED | REG02_AGOHOME);
|
||||
dev->reg[reg_0x02].value &= ~REG02_MTRPWR;
|
||||
|
||||
/* TODO another flag to setup regs ? */
|
||||
/* enforce needed LINCNT, getting rid of extra lines for color reordering */
|
||||
|
@ -3358,7 +3403,6 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
|
|||
static SANE_Status
|
||||
gl646_init_regs_for_scan (Genesys_Device * dev)
|
||||
{
|
||||
usleep (10000UL);
|
||||
return setup_for_scan (dev, dev->settings, SANE_FALSE, SANE_TRUE,
|
||||
SANE_TRUE);
|
||||
}
|
||||
|
@ -3459,14 +3503,14 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
|
|||
|
||||
/* stagger works with odd start cordinates */
|
||||
if (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE)
|
||||
startx |= 1;
|
||||
startx |= 1;
|
||||
|
||||
pixels = (settings.pixels * dev->sensor.optical_res) / settings.xres;
|
||||
/* special requirement for 400 dpi on 1200 dpi sensors */
|
||||
if(settings.xres==400)
|
||||
{
|
||||
pixels = (pixels/6)*6;
|
||||
}
|
||||
if (settings.xres == 400)
|
||||
{
|
||||
pixels = (pixels / 6) * 6;
|
||||
}
|
||||
endx = startx + pixels;
|
||||
|
||||
/* XXX STEF XXX TODO check for pixel width overflow */
|
||||
|
@ -3768,6 +3812,7 @@ gl646_offset_calibration (Genesys_Device * dev)
|
|||
bottomavg =
|
||||
dark_average (first_line, settings.pixels, settings.lines, channels,
|
||||
black_pixels);
|
||||
free (first_line);
|
||||
|
||||
/* now top value */
|
||||
top = 231;
|
||||
|
@ -3791,6 +3836,7 @@ gl646_offset_calibration (Genesys_Device * dev)
|
|||
topavg =
|
||||
dark_average (second_line, settings.pixels, settings.lines, channels,
|
||||
black_pixels);
|
||||
free (second_line);
|
||||
|
||||
/* loop until acceptable level */
|
||||
while ((pass < 32) && (top - bottom > 1))
|
||||
|
@ -3823,6 +3869,7 @@ gl646_offset_calibration (Genesys_Device * dev)
|
|||
black_pixels);
|
||||
DBG (DBG_info, "gl646_offset_calibration: avg=%d offset=%d\n", avg,
|
||||
dev->frontend.offset[1]);
|
||||
free (second_line);
|
||||
|
||||
/* compute new boundaries */
|
||||
if (topavg == avg)
|
||||
|
@ -3850,11 +3897,9 @@ gl646_offset_calibration (Genesys_Device * dev)
|
|||
sanei_genesys_write_pnm_file ("offset-final.pnm", second_line, 8,
|
||||
channels, settings.pixels,
|
||||
settings.lines);
|
||||
free (second_line);
|
||||
}
|
||||
|
||||
/* cleanup before return */
|
||||
free (first_line);
|
||||
free (second_line);
|
||||
DBG (DBG_info, "gl646_offset_calibration: offset=(%d,%d,%d)\n",
|
||||
dev->frontend.offset[0], dev->frontend.offset[1],
|
||||
dev->frontend.offset[2]);
|
||||
|
@ -3991,6 +4036,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
|
|||
"gl646_coarse_gain_calibration: channel %d, average = %.2f, gain = %d\n",
|
||||
k, average[k], dev->frontend.gain[k]);
|
||||
}
|
||||
free (line);
|
||||
}
|
||||
|
||||
if (channels < 3)
|
||||
|
@ -3999,7 +4045,6 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
|
|||
dev->frontend.gain[2] = dev->frontend.gain[0];
|
||||
}
|
||||
|
||||
free (line);
|
||||
DBG (DBG_info, "gl646_coarse_gain_calibration: gains=(%d,%d,%d)\n",
|
||||
dev->frontend.gain[0], dev->frontend.gain[1], dev->frontend.gain[2]);
|
||||
DBG (DBG_proc, "gl646_coarse_gain_calibration: end\n");
|
||||
|
@ -4058,8 +4103,8 @@ gl646_init_regs_for_warmup (Genesys_Device * dev,
|
|||
dev->reg[reg_0x05].value &= ~REG05_GMMENB;
|
||||
|
||||
/* copy reg to calib_reg */
|
||||
memcpy (local_reg, dev->reg,
|
||||
GENESYS_GL646_MAX_REGS * sizeof (Genesys_Register_Set));
|
||||
/* XXX STEF XXX memcpy (local_reg, dev->reg,
|
||||
GENESYS_GL646_MAX_REGS * sizeof (Genesys_Register_Set)); */
|
||||
|
||||
/* turn off motor during this scan */
|
||||
gl646_set_motor_power (local_reg, SANE_FALSE);
|
||||
|
|
Ładowanie…
Reference in New Issue