diff --git a/ChangeLog b/ChangeLog index c73ad59d0..13c303dd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ +2012-11-11 Stéphane Voltz + * backend/genesys.c backend/genesys_gl124.c: improve calibration for + gl124 based scanners. Fix head parking issue at 1200 dpi. + 2012-11-02 Stéphane Voltz - * doc/descriptiios/unsupported.desc: add USB ID 0x07b3, 0x0802 + * doc/descriptions/unsupported.desc: add USB ID 0x07b3, 0x0802 2012-11-02 Stéphane Voltz * configure configure.in doc/Makefile.am doc/Makefile.in: add optional diff --git a/backend/genesys.c b/backend/genesys.c index 02bcc5636..544c62395 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -58,7 +58,7 @@ * SANE backend for Genesys Logic GL646/GL841/GL842/GL843/GL847/GL124 based scanners */ -#define BUILD 2402 +#define BUILD 2404 #define BACKEND_NAME genesys #include "genesys.h" @@ -3004,6 +3004,10 @@ genesys_send_shading_coefficient (Genesys_Device * dev) case CIS_CANONLIDE100: case CIS_CANONLIDE200: case CIS_CANONLIDE110: + if(dev->model->ccd_type==CIS_CANONLIDE110) + target_code=0xdc00; + else + target_code=0xf000; words_per_color=pixels_per_line*2; length = words_per_color * 3 * 2; free(shading_data); @@ -3024,7 +3028,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev) cmat, 0, coeff, - 0xdc00); + target_code); break; case CCD_CANONLIDE35: compute_averaged_planar (dev, diff --git a/backend/genesys_gl124.c b/backend/genesys_gl124.c index 1a13c876c..764d7967b 100644 --- a/backend/genesys_gl124.c +++ b/backend/genesys_gl124.c @@ -900,7 +900,7 @@ gl124_set_fe (Genesys_Device * dev, uint8_t set) case 1: case 2: default: - DBG (DBG_error, "%s: unsupported anlog FE 0x%02x\n",__FUNCTION__,val); + DBG (DBG_error, "%s: unsupported analog FE 0x%02x\n",__FUNCTION__,val); status=SANE_STATUS_INVAL; break; } @@ -2051,6 +2051,33 @@ gl124_stop_action (Genesys_Device * dev) return SANE_STATUS_IO_ERROR; } + +static SANE_Status +gl124_setup_scan_gpio(Genesys_Device *dev, int resolution) +{ +SANE_Status status; +uint8_t val; + + DBGSTART; + RIE (sanei_genesys_read_register (dev, REG32, &val)); + if(resolution>=dev->motor.base_ydpi/2) + { + val &= 0xf7; + } + else if(resolution>=dev->motor.base_ydpi/4) + { + val &= 0xef; + } + else + { + val |= 0x10; + } + val |= 0x02; + RIE (sanei_genesys_write_register (dev, REG32, val)); + DBGCOMPLETED; + return SANE_STATUS_GOOD; +} + /* Send the low-level scan command */ /* todo : is this that useful ? */ #ifndef UNIT_TESTING @@ -2068,21 +2095,7 @@ gl124_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg, return SANE_STATUS_INVAL; /* set up GPIO for scan */ - RIE (sanei_genesys_read_register (dev, REG32, &val)); - if(dev->settings.yres>=dev->motor.base_ydpi/2) - { - val &= 0xf7; - } - else if(dev->settings.yres>=dev->motor.base_ydpi/4) - { - val &= 0xef; - } - else - { - val |= 0x10; - } - val |= 0x02; - RIE (sanei_genesys_write_register (dev, REG32, val)); + RIE(gl124_setup_scan_gpio(dev,dev->settings.yres)); /* clear scan and feed count */ RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT)); @@ -2232,6 +2245,8 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) r->value |= REG02_MTRREV; RIE (gl124_bulk_write_register (dev, local_reg, GENESYS_GL124_MAX_REGS)); + + RIE(gl124_setup_scan_gpio(dev,resolution)); status = gl124_start_action (dev); if (status != SANE_STATUS_GOOD) @@ -2965,6 +2980,76 @@ gl124_send_gamma_table (Genesys_Device * dev, SANE_Bool generic) return status; } +/** @brief move to calibration area + * This functions moves scanning head to calibration area + * by doing a 600 dpi scan + * @param dev scanner device + * @return SANE_STATUS_GOOD on success, else the error code + */ +static SANE_Status +move_to_calibration_area (Genesys_Device * dev) +{ + int pixels; + int size; + uint8_t *line; + SANE_Status status = SANE_STATUS_GOOD; + + DBGSTART; + + pixels = (dev->sensor.sensor_pixels*600)/dev->sensor.optical_res; + + /* initial calibration reg values */ + memcpy (dev->calib_reg, dev->reg, GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set)); + + /* set up for the calibration scan */ + status = gl124_init_scan_regs (dev, + dev->calib_reg, + 600, + 600, + 0, + 0, + pixels, + 1, + 8, + 3, + dev->settings.color_filter, + SCAN_FLAG_DISABLE_SHADING | + SCAN_FLAG_DISABLE_GAMMA | + SCAN_FLAG_SINGLE_LINE | + SCAN_FLAG_IGNORE_LINE_DISTANCE); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, "%s: failed to setup scan: %s\n", __FUNCTION__, sane_strstatus (status)); + return status; + } + + size = pixels * 3; + line = malloc (size); + if (!line) + return SANE_STATUS_NO_MEM; + + /* write registers and scan data */ + RIE (gl124_bulk_write_register (dev, dev->calib_reg, GENESYS_GL124_MAX_REGS)); + + DBG (DBG_info, "%s: starting line reading\n", __FUNCTION__); + RIE (gl124_begin_scan (dev, dev->calib_reg, SANE_TRUE)); + RIE (sanei_genesys_read_data_from_scanner (dev, line, size)); + + /* stop scanning */ + RIE (gl124_stop_action (dev)); + + if (DBG_LEVEL >= DBG_data) + { + sanei_genesys_write_pnm_file ("movetocalarea.pnm", line, 8, 3, pixels, 1); + } + + /* cleanup before return */ + free (line); + + DBGCOMPLETED; + return status; +} + /* this function does the led calibration by scanning one line of the calibration area below scanner's top on white strip. @@ -2990,7 +3075,10 @@ gl124_led_calibration (Genesys_Device * dev) DBGSTART; - /* offset calibration is always done in color mode */ + /* move to calibration area */ + move_to_calibration_area(dev); + + /* offset calibration is always done in 16 bit depth color mode */ channels = 3; depth=16; used_res=sanei_genesys_compute_dpihw(dev,dev->settings.xres);