kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'gl847'
commit
3d9bcda3f0
|
@ -2958,6 +2958,165 @@ compute_coefficient (unsigned int coeff, unsigned int target, unsigned int value
|
|||
return result;
|
||||
}
|
||||
|
||||
/** @brief compute shading coefficients for LiDE scanners
|
||||
*
|
||||
The dark/white shading is actually performed _after_ reducing
|
||||
resolution via averaging. only dark/white shading data for what would be
|
||||
first pixel at full resolution is used.
|
||||
|
||||
scanner raw input to output value calculation:
|
||||
o=(i-off)*(gain/coeff)
|
||||
|
||||
from datasheet:
|
||||
off=dark_average
|
||||
gain=coeff*bright_target/(bright_average-dark_average)
|
||||
works for dark_target==0
|
||||
|
||||
what we want is these:
|
||||
bright_target=(bright_average-off)*(gain/coeff)
|
||||
dark_target=(dark_average-off)*(gain/coeff)
|
||||
leading to
|
||||
off = (dark_average*bright_target - bright_average*dark_target)/(bright_target - dark_target)
|
||||
gain = (bright_target - dark_target)/(bright_average - dark_average)*coeff
|
||||
*
|
||||
* @param dev scanner's device
|
||||
* @param shading_data memory area where to store the computed shading coefficients
|
||||
* @param pixels_per_line number of pixels per line
|
||||
* @param words_per_color memory words per color channel
|
||||
* @param channels number of color channels (actually 1 or 3)
|
||||
* @param o shading coefficients left offset
|
||||
* @param coeff 4000h or 2000h depending on fast scan mode or not (GAIN4 bit)
|
||||
* @param target_bright value of the white target code
|
||||
* @param target_dark value of the black target code
|
||||
*/
|
||||
#ifndef UNIT_TESTING
|
||||
static
|
||||
#endif
|
||||
void
|
||||
compute_averaged_planar (Genesys_Device * dev,
|
||||
uint8_t * shading_data,
|
||||
unsigned int pixels_per_line,
|
||||
unsigned int words_per_color,
|
||||
unsigned int channels,
|
||||
unsigned int o,
|
||||
unsigned int coeff,
|
||||
unsigned int target_bright,
|
||||
unsigned int target_dark)
|
||||
{
|
||||
unsigned int x, i, j, br, dk, res, avgpixels, val;
|
||||
|
||||
/* initialize result */
|
||||
/* memset (shading_data, 0xff, words_per_color * 3 * 2); */
|
||||
|
||||
/* duplicate half-ccd logic */
|
||||
res = dev->settings.xres;
|
||||
if ((dev->model->flags & GENESYS_FLAG_HALF_CCD_MODE)
|
||||
&& dev->settings.xres <= dev->sensor.optical_res / 2)
|
||||
{
|
||||
/* scanner is using half-ccd mode */
|
||||
res *= 2;
|
||||
}
|
||||
|
||||
/*this should be evenly dividable */
|
||||
avgpixels = dev->sensor.optical_res / res;
|
||||
|
||||
/* gl841 and gl847 supports 1/1 1/2 1/3 1/4 1/5 1/6 1/8 1/10 1/12 1/15 averaging */
|
||||
if (avgpixels < 1)
|
||||
avgpixels = 1;
|
||||
else if (avgpixels < 6)
|
||||
avgpixels = avgpixels;
|
||||
else if (avgpixels < 8)
|
||||
avgpixels = 6;
|
||||
else if (avgpixels < 10)
|
||||
avgpixels = 8;
|
||||
else if (avgpixels < 12)
|
||||
avgpixels = 10;
|
||||
else if (avgpixels < 15)
|
||||
avgpixels = 12;
|
||||
else
|
||||
avgpixels = 15;
|
||||
|
||||
DBG (DBG_info, "compute_planar_averaged: averaging over %d pixels\n",
|
||||
avgpixels);
|
||||
|
||||
for (x = 0; x <= pixels_per_line - avgpixels; x += avgpixels)
|
||||
{
|
||||
|
||||
if ((x + o) * 2 * 2 + 3 > words_per_color * 2)
|
||||
break;
|
||||
|
||||
for (j = 0; j < channels; j++)
|
||||
{
|
||||
|
||||
dk = 0;
|
||||
br = 0;
|
||||
for (i = 0; i < avgpixels; i++)
|
||||
{
|
||||
/* dark data */
|
||||
dk += (dev->dark_average_data[(x + i + pixels_per_line * j) * 2]
|
||||
| (dev-> dark_average_data[(x + i + pixels_per_line * j) * 2 + 1] << 8));
|
||||
|
||||
/* white data */
|
||||
br += (dev->white_average_data[(x + i + pixels_per_line * j) * 2]
|
||||
| (dev-> white_average_data[(x + i + pixels_per_line * j) * 2 + 1] << 8));
|
||||
}
|
||||
|
||||
br /= avgpixels;
|
||||
dk /= avgpixels;
|
||||
|
||||
if (br * target_dark > dk * target_bright)
|
||||
val = 0;
|
||||
else if (dk * target_bright - br * target_dark > 65535
|
||||
* (target_bright - target_dark))
|
||||
val = 65535;
|
||||
else
|
||||
val = (dk * target_bright - br * target_dark) / (target_bright
|
||||
- target_dark);
|
||||
|
||||
/*fill all pixels, even if only the last one is relevant */
|
||||
for (i = 0; i < avgpixels; i++)
|
||||
{
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j] = val & 0xff;
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j + 1] = val >> 8;
|
||||
}
|
||||
|
||||
val = br - dk;
|
||||
|
||||
if (65535 * val > (target_bright - target_dark) * coeff)
|
||||
val = (coeff * (target_bright - target_dark)) / val;
|
||||
else
|
||||
val = 65535;
|
||||
|
||||
/*fill all pixels, even if only the last one is relevant */
|
||||
for (i = 0; i < avgpixels; i++)
|
||||
{
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j + 2] = val & 0xff;
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j + 3] = val >> 8;
|
||||
}
|
||||
}
|
||||
|
||||
/*fill remaining channels */
|
||||
for (j = channels; j < 3; j++)
|
||||
{
|
||||
for (i = 0; i < avgpixels; i++)
|
||||
{
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j]
|
||||
= shading_data[(x + o + i) * 2 * 2 + words_per_color * 0];
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j + 1]
|
||||
= shading_data[(x + o + i) * 2 * 2 + words_per_color
|
||||
* 2 * 0 + 1];
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j + 2]
|
||||
= shading_data[(x + o + i) * 2 * 2 + words_per_color
|
||||
* 2 * 0 + 2];
|
||||
shading_data[(x + o + i) * 2 * 2 + words_per_color * 2 * j + 3]
|
||||
= shading_data[(x + o + i) * 2 * 2 + words_per_color
|
||||
* 2 * 0 + 3];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Computes shading coefficient using formula in data sheet. 16bit data values
|
||||
* manipulated here are little endian. For now we assume deletion scanning type
|
||||
|
@ -3305,8 +3464,19 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
|
|||
coeff,
|
||||
target_code);
|
||||
break;
|
||||
case CCD_CANONLIDE35:
|
||||
case CIS_CANONLIDE100:
|
||||
case CIS_CANONLIDE200:
|
||||
compute_averaged_planar(dev,
|
||||
shading_data,
|
||||
pixels_per_line,
|
||||
words_per_color,
|
||||
channels,
|
||||
4,
|
||||
coeff,
|
||||
0xfa00,
|
||||
0x0a00);
|
||||
break;
|
||||
case CCD_CANONLIDE35:
|
||||
target_bright = 0xfa00;
|
||||
target_dark = 0xa00;
|
||||
o = 4; /*first four pixels are ignored */
|
||||
|
@ -5530,7 +5700,7 @@ init_gamma_vector_option (Genesys_Scanner * scanner, int option)
|
|||
* @param size maximum size of the range
|
||||
* @return a poiter to a valid range or NULL
|
||||
*/
|
||||
static create_range(SANE_Fixed size)
|
||||
static SANE_Range *create_range(SANE_Fixed size)
|
||||
{
|
||||
SANE_Range *range=NULL;
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ static Genesys_Frontend Wolfson[] = {
|
|||
, /* 8: HP3670 */
|
||||
{DAC_WOLFSON_HP3670,
|
||||
/* reg0 reg1 reg2 reg3 */
|
||||
{0x00, 0x03, 0x05, 0x32} /* reg3=0x32 for 100-300 dpi, 0x12 at 1200 */
|
||||
{0x00, 0x03, 0x05, 0x32} /* reg3=0x32 for 100-300 dpi, 0x12 at 1200 */
|
||||
, {0x00, 0x00, 0x00} /* sign */
|
||||
, {0xba, 0xb8, 0xb8} /* offset */
|
||||
, {0x06, 0x05, 0x04} /* gain 4,3,2 at 1200 ?*/
|
||||
|
@ -141,7 +141,7 @@ static Genesys_Frontend Wolfson[] = {
|
|||
{DAC_CANONLIDE200,
|
||||
{0x9d, 0x91, 0x00, 0x00}
|
||||
, {0x00, 0x00, 0x00}
|
||||
, {0x00, 0x3f, 0x00}
|
||||
, {0x00, 0x3f, 0x00} /* 0x00 0x3f 0x00 : offset/brigthness ? */
|
||||
, {0x32, 0x04, 0x00}
|
||||
, {0x00, 0x00, 0x00}
|
||||
}
|
||||
|
@ -432,13 +432,14 @@ static Genesys_Sensor Sensor[] = {
|
|||
87, /* black pixels */
|
||||
16, /* dummy pixels */
|
||||
0,
|
||||
10592, /* 10272 + 320 start */
|
||||
10272, /* 10272 + 320 start ->10848=4*2712 max */
|
||||
210,
|
||||
200,
|
||||
{0x00, 0x00, 0x00, 0x00},
|
||||
/* reg 0x10 - 0x1d */
|
||||
/* reg 0x10 - 0x15 */
|
||||
{0x03, 0x00, 0x02, 0x00, 0x01, 0x80, /* EXPR/EXPG/EXPB */
|
||||
0x10, 0x08, 0x00, 0xff, 0x34, 0x00, 0x02, 0x04 },
|
||||
/* reg 0x16 - 0x1d */
|
||||
0x10, 0x08, 0x00, 0x50, 0x34, 0x00, 0x02, 0x04 },
|
||||
/* reg 0x52 - 0x5e */
|
||||
{0x03, 0x07,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
|
@ -929,8 +930,8 @@ static Genesys_Model canon_lide_100_model = {
|
|||
GENESYS_GL847,
|
||||
NULL,
|
||||
|
||||
{1200, 600, 300, 150, 100, 75, 0}, /* possible x-resolutions */
|
||||
{1200, 600, 300, 150, 100, 75, 0}, /* possible y-resolutions */
|
||||
{1200, 600, 300, 150, 100, 75, 50, 0}, /* possible x-resolutions */
|
||||
{1200, 600, 300, 150, 100, 75, 50, 0}, /* possible y-resolutions */
|
||||
{16, 8, 0}, /* possible depths in gray mode */
|
||||
{16, 8, 0}, /* possible depths in color mode */
|
||||
|
||||
|
@ -965,10 +966,9 @@ static Genesys_Model canon_lide_100_model = {
|
|||
GPO_CANONLIDE200,
|
||||
MOTOR_CANONLIDE100,
|
||||
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
|
||||
| GENESYS_FLAG_NO_CALIBRATION
|
||||
| GENESYS_FLAG_SKIP_WARMUP
|
||||
| GENESYS_FLAG_OFFSET_CALIBRATION
|
||||
| GENESYS_FLAG_DARK_WHITE_CALIBRATION
|
||||
| GENESYS_FLAG_DARK_CALIBRATION
|
||||
| GENESYS_FLAG_CUSTOM_GAMMA,
|
||||
GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW,
|
||||
150,
|
||||
|
|
|
@ -48,6 +48,27 @@
|
|||
Low level function
|
||||
****************************************************************************/
|
||||
|
||||
/**
|
||||
* decodes and prints content of status (0x41) register
|
||||
* @param val value read from reg41
|
||||
*/
|
||||
static void
|
||||
print_status (uint8_t val)
|
||||
{
|
||||
char msg[80];
|
||||
|
||||
sprintf (msg, "%s%s%s%s%s%s%s%s",
|
||||
val & REG41_PWRBIT ? "PWRBIT " : "",
|
||||
val & REG41_BUFEMPTY ? "BUFEMPTY " : "",
|
||||
val & REG41_FEEDFSH ? "FEEDFSH " : "",
|
||||
val & REG41_SCANFSH ? "SCANFSH " : "",
|
||||
val & REG41_HOMESNR ? "HOMESNR " : "",
|
||||
val & REG41_LAMPSTS ? "LAMPSTS " : "",
|
||||
val & REG41_FEBUSY ? "FEBUSY " : "",
|
||||
val & REG41_MOTORENB ? "MOTORENB" : "");
|
||||
DBG (DBG_info, "status=%s\n", msg);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* Read and write RAM, registers and AFE */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
@ -161,10 +182,8 @@ gl847_bulk_write_register (Genesys_Device * dev,
|
|||
}
|
||||
|
||||
/** @brief read scanned data
|
||||
* We never read more data than valid words advertised
|
||||
* the we split read in 0xeff0 maximum blocks. This read is done in 2
|
||||
* parts if not multple of 512
|
||||
* first read is rounded to a multiple of 512 bytes, last read fetches the
|
||||
* Read in 0xeff0 maximum sized blocks. This read is done in 2
|
||||
* parts if not multple of 512. First read is rounded to a multiple of 512 bytes, last read fetches the
|
||||
* remainder.
|
||||
* addr is always 0x10000000 with the memory layout setup
|
||||
*/
|
||||
|
@ -175,42 +194,12 @@ gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr,
|
|||
SANE_Status status;
|
||||
size_t size, target, read;
|
||||
uint8_t outdata[8], value;
|
||||
uint32_t words;
|
||||
|
||||
DBG (DBG_io, "gl847_bulk_read_data: requesting %lu bytes\n", (u_long) len);
|
||||
|
||||
if (len == 0)
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* we don't read more data than valid words avertised */
|
||||
RIE (sanei_genesys_read_register (dev, 0x42, &value));
|
||||
words = (value & 0x03);
|
||||
RIE (sanei_genesys_read_register (dev, 0x43, &value));
|
||||
words = words * 256 + value;
|
||||
RIE (sanei_genesys_read_register (dev, 0x44, &value));
|
||||
words = words * 256 + value;
|
||||
RIE (sanei_genesys_read_register (dev, 0x45, &value));
|
||||
words = words * 256 + value;
|
||||
DBG (DBG_io2, "gl847_bulk_read_data: %lu bytes available\n",
|
||||
(u_long) words);
|
||||
|
||||
words = words / 2;
|
||||
words = words * 2;
|
||||
|
||||
/* 100*1000=100ms is too much, 50ms also, 1ms is too small */
|
||||
/*usleep(50000); */
|
||||
|
||||
/* don't read more than available data */
|
||||
/*
|
||||
if (len > words)
|
||||
{
|
||||
target = words;
|
||||
}
|
||||
else
|
||||
{
|
||||
target = len;
|
||||
}
|
||||
*/
|
||||
target = len;
|
||||
|
||||
/* loop until computed data size is read */
|
||||
|
@ -255,7 +244,7 @@ gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr,
|
|||
read /= 512;
|
||||
read *= 512;
|
||||
}
|
||||
|
||||
|
||||
DBG (DBG_io2,
|
||||
"gl847_bulk_read_data: trying to read %lu bytes of data\n",
|
||||
(u_long) read);
|
||||
|
@ -328,7 +317,7 @@ gl847_get_lineart_bit (Genesys_Register_Set * regs)
|
|||
{
|
||||
Genesys_Register_Set *r = NULL;
|
||||
|
||||
r = sanei_genesys_get_address (regs, 0x04);
|
||||
r = sanei_genesys_get_address (regs, REG04);
|
||||
if (r && (r->value & REG04_LINEART))
|
||||
return SANE_TRUE;
|
||||
return SANE_FALSE;
|
||||
|
@ -339,7 +328,7 @@ gl847_get_bitset_bit (Genesys_Register_Set * regs)
|
|||
{
|
||||
Genesys_Register_Set *r = NULL;
|
||||
|
||||
r = sanei_genesys_get_address (regs, 0x04);
|
||||
r = sanei_genesys_get_address (regs, REG04);
|
||||
if (r && (r->value & REG04_BITSET))
|
||||
return SANE_TRUE;
|
||||
return SANE_FALSE;
|
||||
|
@ -372,27 +361,6 @@ gl847_test_motor_flag_bit (SANE_Byte val)
|
|||
return SANE_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* decodes and prints content of status (0x41) register
|
||||
* @param val value read from reg41
|
||||
*/
|
||||
static void
|
||||
print_status (uint8_t val)
|
||||
{
|
||||
char msg[80];
|
||||
|
||||
sprintf (msg, "%s%s%s%s%s%s%s%s",
|
||||
val & REG41_PWRBIT ? "PWRBIT " : "",
|
||||
val & REG41_BUFEMPTY ? "BUFEMPTY " : "",
|
||||
val & REG41_FEEDFSH ? "FEEDFSH " : "",
|
||||
val & REG41_SCANFSH ? "SCANFSH " : "",
|
||||
val & REG41_HOMESNR ? "HOMESNR " : "",
|
||||
val & REG41_LAMPSTS ? "LAMPSTS " : "",
|
||||
val & REG41_FEBUSY ? "FEBUSY " : "",
|
||||
val & REG41_MOTORENB ? "MOTORENB" : "");
|
||||
DBG (DBG_info, "status=%s\n", msg);
|
||||
}
|
||||
|
||||
|
||||
/** copy sensor specific settings */
|
||||
/* *dev : device infos
|
||||
|
@ -1017,9 +985,11 @@ HOME_FREE: 3
|
|||
|
||||
r = sanei_genesys_get_address (reg, 0x6a);
|
||||
r->value = (fast_slope_steps >> 1) + (fast_slope_steps & 1);
|
||||
r->value = fast_slope_steps; /* XXX STEF XXX */
|
||||
|
||||
r = sanei_genesys_get_address (reg, 0x5f);
|
||||
r->value = (fast_slope_steps >> 1) + (fast_slope_steps & 1);
|
||||
r->value = fast_slope_steps; /* XXX STEF XXX */
|
||||
|
||||
|
||||
DBG (DBG_proc, "gl847_init_motor_regs : completed. \n");
|
||||
|
@ -1320,7 +1290,15 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, Genesys_Register_Set * reg, un
|
|||
z1 = (slope_0_time-1) % exposure_time;
|
||||
z2 = (slope_0_time-1) % exposure_time;
|
||||
*/
|
||||
z1 = z2 = 0;
|
||||
|
||||
sanei_genesys_calculate_zmode2 (use_fast_fed,
|
||||
scan_exposure_time,
|
||||
slow_slope_table,
|
||||
slow_slope_steps,
|
||||
feedl,
|
||||
back_slope_steps,
|
||||
&z1,
|
||||
&z2);
|
||||
|
||||
DBG (DBG_info, "gl847_init_motor_regs_scan: z1 = %d\n", z1);
|
||||
r = sanei_genesys_get_address (reg, REG60);
|
||||
|
@ -1377,7 +1355,7 @@ static int
|
|||
gl847_get_dpihw (Genesys_Device * dev)
|
||||
{
|
||||
Genesys_Register_Set *r;
|
||||
r = sanei_genesys_get_address (dev->reg, 0x05);
|
||||
r = sanei_genesys_get_address (dev->reg, REG05);
|
||||
if ((r->value & REG05_DPIHW) == REG05_DPIHW_600)
|
||||
return 600;
|
||||
if ((r->value & REG05_DPIHW) == REG05_DPIHW_1200)
|
||||
|
@ -1451,10 +1429,6 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
|
|||
used_res, start, pixels, channels, depth, half_ccd, flags);
|
||||
|
||||
end = start + pixels;
|
||||
if (end > dev->sensor.sensor_pixels)
|
||||
{
|
||||
DBG (DBG_error, "XXX STEF XXX overflow\n");
|
||||
}
|
||||
|
||||
status = gl847_set_fe (dev, AFE_SET);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
|
@ -1481,7 +1455,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
|
|||
dpiset = used_res;
|
||||
|
||||
/* enable shading */
|
||||
r = sanei_genesys_get_address (reg, 0x01);
|
||||
r = sanei_genesys_get_address (reg, REG01);
|
||||
r->value &= ~(REG01_SCAN | REG01_SHDAREA);
|
||||
if ((flags & OPTICAL_FLAG_DISABLE_SHADING) ||
|
||||
(dev->model->flags & GENESYS_FLAG_NO_CALIBRATION))
|
||||
|
@ -1510,6 +1484,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
|
|||
|
||||
r = sanei_genesys_get_address (reg, 0x19);
|
||||
r->value = 0xff;
|
||||
r->value = 0x50; /* XXX STEF XXX */
|
||||
|
||||
/* BW threshold */
|
||||
r = sanei_genesys_get_address (reg, 0x2e);
|
||||
|
@ -1518,7 +1493,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
|
|||
r->value = dev->settings.threshold;
|
||||
|
||||
/* monochrome / color scan */
|
||||
r = sanei_genesys_get_address (reg, 0x04);
|
||||
r = sanei_genesys_get_address (reg, REG04);
|
||||
switch (depth)
|
||||
{
|
||||
case 1:
|
||||
|
@ -1619,6 +1594,14 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
|
|||
|
||||
r = sanei_genesys_get_address (reg, 0x34);
|
||||
r->value = dev->sensor.dummy_pixel;
|
||||
|
||||
/* XXX STEF XXX */
|
||||
r = sanei_genesys_get_address (reg, 0x1d);
|
||||
i = 2*r->value;
|
||||
r = sanei_genesys_get_address (reg, 0x17);
|
||||
i += r->value;
|
||||
r = sanei_genesys_get_address (reg, 0x34);
|
||||
r->value = i;
|
||||
|
||||
DBG (DBG_proc, "gl847_init_optical_regs_scan : completed. \n");
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -2343,6 +2326,7 @@ gl847_set_lamp_power (Genesys_Device * dev,
|
|||
}
|
||||
r = sanei_genesys_get_address (regs, 0x19);
|
||||
r->value = 0x50;
|
||||
r->value = 0x50; /* XXX STEF XXX */
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2358,6 +2342,7 @@ gl847_set_lamp_power (Genesys_Device * dev,
|
|||
}
|
||||
r = sanei_genesys_get_address (regs, 0x19);
|
||||
r->value = 0xff;
|
||||
r->value = 0x50; /* XXX STEF XXX */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3327,6 +3312,11 @@ gl847_init_regs_for_shading (Genesys_Device * dev)
|
|||
dev->model->shading_lines);
|
||||
|
||||
dev->calib_channels = 3;
|
||||
|
||||
/* initial calibration reg values */
|
||||
memcpy (dev->calib_reg, dev->reg,
|
||||
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
|
||||
|
||||
status = gl847_init_scan_regs (dev,
|
||||
dev->calib_reg,
|
||||
dev->settings.xres,
|
||||
|
@ -3667,19 +3657,12 @@ gl847_led_calibration (Genesys_Device * dev)
|
|||
|
||||
DBG (DBG_proc, "gl847_led_calibration\n");
|
||||
|
||||
/* move to white strip */
|
||||
status = gl847_feed (dev, 280);
|
||||
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_error,
|
||||
"gl847_led_calibration: failed to feed: %s\n",
|
||||
sane_strstatus (status));
|
||||
return status;
|
||||
}
|
||||
|
||||
/* offset calibration is always done in color mode */
|
||||
channels = 3;
|
||||
|
||||
/* initial calibration reg values */
|
||||
memcpy (dev->calib_reg, dev->reg,
|
||||
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
|
||||
|
||||
status = gl847_init_scan_regs (dev,
|
||||
dev->calib_reg,
|
||||
|
@ -3689,7 +3672,10 @@ gl847_led_calibration (Genesys_Device * dev)
|
|||
0,
|
||||
(dev->sensor.sensor_pixels *
|
||||
dev->settings.xres) /
|
||||
dev->sensor.optical_res, 1, 16, channels,
|
||||
dev->sensor.optical_res,
|
||||
1,
|
||||
16,
|
||||
channels,
|
||||
dev->settings.color_filter,
|
||||
SCAN_FLAG_DISABLE_SHADING |
|
||||
SCAN_FLAG_DISABLE_GAMMA |
|
||||
|
@ -3700,7 +3686,7 @@ gl847_led_calibration (Genesys_Device * dev)
|
|||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_error,
|
||||
"gl847_led_calibration: Failed to setup scan: %s\n",
|
||||
"gl847_led_calibration: failed to setup scan: %s\n",
|
||||
sane_strstatus (status));
|
||||
return status;
|
||||
}
|
||||
|
@ -3809,17 +3795,18 @@ gl847_led_calibration (Genesys_Device * dev)
|
|||
*/
|
||||
avge = (expr + expg + expb) / 3;
|
||||
|
||||
if (avge > 2000)
|
||||
/* don't overflow max exposure */
|
||||
if (avge > 2712)
|
||||
{
|
||||
expr = (expr * 2000) / avge;
|
||||
expg = (expg * 2000) / avge;
|
||||
expb = (expb * 2000) / avge;
|
||||
}
|
||||
if (avge < 500)
|
||||
if (avge < 50)
|
||||
{
|
||||
expr = (expr * 500) / avge;
|
||||
expg = (expg * 500) / avge;
|
||||
expb = (expb * 500) / avge;
|
||||
expr = (expr * 50) / avge;
|
||||
expg = (expg * 50) / avge;
|
||||
expb = (expb * 50) / avge;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3898,21 +3885,21 @@ sanei_gl847_repark_head (Genesys_Device * dev)
|
|||
{
|
||||
SANE_Status status;
|
||||
|
||||
DBG (DBG_proc, "sanei_gl847_repark_head\n");
|
||||
DBGSTART;
|
||||
|
||||
status = gl847_feed (dev, 232);
|
||||
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_error,
|
||||
"gl847_repark_head: Failed to feed: %s\n",
|
||||
DBG (DBG_error, "gl847_repark_head: failed to feed: %s\n",
|
||||
sane_strstatus (status));
|
||||
return status;
|
||||
}
|
||||
|
||||
/* toggle motor flag, put an huge step number and redo move backward */
|
||||
status = gl847_slow_back_home (dev, 1);
|
||||
DBG (DBG_proc, "gl847_repark_head: completed\n");
|
||||
|
||||
DBGCOMPLETED;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue