From 7f30df8b6f5ff0a5b3640452d6245159ce30b080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Wed, 23 Feb 2011 21:36:37 +0100 Subject: [PATCH] 1200 DPI working again --- backend/genesys.c | 48 ++++---- backend/genesys_devices.c | 4 +- backend/genesys_gl124.c | 2 - backend/genesys_gl847.c | 253 ++++---------------------------------- backend/genesys_gl847.h | 17 ++- backend/genesys_low.c | 5 +- backend/genesys_low.h | 1 - 7 files changed, 66 insertions(+), 264 deletions(-) diff --git a/backend/genesys.c b/backend/genesys.c index 0dd27072e..a1a858ca1 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -4749,7 +4749,7 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s if(dev->settings.double_xres==SANE_TRUE) { /* copy only even pixel */ - work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; + work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; /* update counter and pointer */ count++; dev->cur++; @@ -4764,9 +4764,9 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s while (dev->cur < dev->len && count < size) { /* copy even pixel */ - work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; + work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; /* copy odd pixel */ - work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->dist + dev->oe_buffer.pos]; /* update counter and pointer */ count += 2; dev->cur++; @@ -4777,11 +4777,11 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s while (dev->cur < dev->len && count < size) { /* copy even pixel */ - work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; - work_buffer_dst[count+1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos+1]; + work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; + work_buffer_dst[count+1] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos+1]; /* copy odd pixel */ - work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos]; - work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos+1]; + work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->dist + dev->oe_buffer.pos+1]; /* update counter and pointer */ count += 4; dev->cur+=2; @@ -4790,8 +4790,8 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s while (dev->cur < dev->len && count < size) { /* get values to merge */ - odd = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; - even = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos]; + odd = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; + even = dev->oe_buffer.buffer[dev->cur + dev->dist + dev->oe_buffer.pos]; /* interleave bits .... */ merged=0; @@ -4831,10 +4831,10 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s { while (dev->cur < dev->len && count < size) { - work_buffer_dst[count + 0] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; - work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + 2*dev->dist + dev->oe_buffer.pos]; - work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + 1*dev->dist + dev->oe_buffer.pos]; - work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + 3*dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 0] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; + work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + 2*dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + 1*dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + 3*dev->dist + dev->oe_buffer.pos]; /* update counter and pointer */ count += 4; dev->cur+=1; @@ -4844,14 +4844,14 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s { while (dev->cur < dev->len && count < size) { - work_buffer_dst[count + 0] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; - work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos+1]; - work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + 2*dev->dist + dev->oe_buffer.pos]; - work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + 2*dev->dist + dev->oe_buffer.pos+1]; - work_buffer_dst[count + 4] = dev->oe_buffer.buffer[dev->cur + dev->skip + 1*dev->dist + dev->oe_buffer.pos]; - work_buffer_dst[count + 5] = dev->oe_buffer.buffer[dev->cur + dev->skip + 1*dev->dist + dev->oe_buffer.pos+1]; - work_buffer_dst[count + 6] = dev->oe_buffer.buffer[dev->cur + dev->skip + 3*dev->dist + dev->oe_buffer.pos]; - work_buffer_dst[count + 7] = dev->oe_buffer.buffer[dev->cur + dev->skip + 3*dev->dist + dev->oe_buffer.pos+1]; + work_buffer_dst[count + 0] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; + work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos+1]; + work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + 2*dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + 2*dev->dist + dev->oe_buffer.pos+1]; + work_buffer_dst[count + 4] = dev->oe_buffer.buffer[dev->cur + 1*dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 5] = dev->oe_buffer.buffer[dev->cur + 1*dev->dist + dev->oe_buffer.pos+1]; + work_buffer_dst[count + 6] = dev->oe_buffer.buffer[dev->cur + 3*dev->dist + dev->oe_buffer.pos]; + work_buffer_dst[count + 7] = dev->oe_buffer.buffer[dev->cur + 3*dev->dist + dev->oe_buffer.pos+1]; /* update counter and pointer */ count += 8; @@ -4861,8 +4861,8 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s while (dev->cur < dev->len && count < size) { /* get values to merge */ - odd = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; - even = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos]; + odd = dev->oe_buffer.buffer[dev->cur + dev->oe_buffer.pos]; + even = dev->oe_buffer.buffer[dev->cur + dev->dist + dev->oe_buffer.pos]; /* interleave bits .... */ merged=0; @@ -5652,6 +5652,7 @@ calc_parameters (Genesys_Scanner * s) s->dev->settings.yres = resolution; /* double x resolution mode */ + /* XXX STEF XXX s->dev->settings.double_xres = SANE_FALSE; if ((s->dev->model->flags & GENESYS_FLAG_SIS_SENSOR) && s->dev->settings.xres <= s->dev->sensor.optical_res / 2 @@ -5659,6 +5660,7 @@ calc_parameters (Genesys_Scanner * s) { s->dev->settings.double_xres = SANE_TRUE; } + */ s->params.lines = ((br_y - tl_y) * s->dev->settings.yres) / MM_PER_INCH; s->params.pixels_per_line = diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c index d1230e752..37ad17594 100644 --- a/backend/genesys_devices.c +++ b/backend/genesys_devices.c @@ -440,8 +440,8 @@ static Genesys_Sensor Sensor[] = { 4800, /* optical resolution */ 87*4, /* black pixels */ 16*4, /* dummy pixels */ - 303*4, - 5144*8, + 320*8, /* CCD_startx_offset */ + 5136*8, /* 5144 */ 210, 200, {0x00, 0x00, 0x00, 0x00}, diff --git a/backend/genesys_gl124.c b/backend/genesys_gl124.c index 513ec717f..07a254a56 100644 --- a/backend/genesys_gl124.c +++ b/backend/genesys_gl124.c @@ -1436,7 +1436,6 @@ gl124_init_optical_regs_scan (Genesys_Device * dev, dev->len = dev->bpl/segnb; dev->dist = dev->bpl/segnb; dev->segnb = segnb; - dev->skip = 0; dev->line_count = 0; if(dpiset>=300) { @@ -1457,7 +1456,6 @@ 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->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->skip =%lu\n", __FUNCTION__, (unsigned long)dev->skip); words_per_line *= channels; dev->wpl = words_per_line; diff --git a/backend/genesys_gl847.c b/backend/genesys_gl847.c index bdef951f0..6eb1f7a74 100644 --- a/backend/genesys_gl847.c +++ b/backend/genesys_gl847.c @@ -878,7 +878,7 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, factor = gl847_get_step_multiplier (reg); use_fast_fed=0; - if(scan_yres>=300 && feed_steps>900) + if(scan_yres>600 && feed_steps>900) use_fast_fed=1; sanei_genesys_set_triple(reg, REG_LINCNT, scan_lines); @@ -939,6 +939,7 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, { dist += fast_steps*2; } + dist *=factor; DBG (DBG_io2, "%s: acceleration distance=%d\n", __FUNCTION__, dist); /* get sure we don't use insane value */ @@ -953,9 +954,9 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, sanei_genesys_calculate_zmode2 (use_fast_fed, scan_exposure_time, scan_table, - scan_steps, + scan_steps*factor, feedl, - scan_steps, + fast_steps*factor, &z1, &z2); @@ -1085,6 +1086,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, unsigned int bytes; Genesys_Register_Set *r; SANE_Status status; + Sensor_Profile *sensor; DBG (DBG_proc, "gl847_init_optical_regs_scan : exposure_time=%d, " "used_res=%d, start=%d, pixels=%d, channels=%d, depth=%d, " @@ -1103,32 +1105,32 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, DBG (DBG_io2, "%s: dpihw=%d (factor=%d)\n", __FUNCTION__, dpihw, factor); /* sensor parameters */ + sensor=get_sensor_profile(dev->model->ccd_type, dpihw); gl847_setup_sensor (dev, reg, dpihw); dpiset = used_res * cksel; /* start and end coordinate in optical dpi coordinates */ - /* startx = start/cksel + dev->sensor.dummy_pixel; XXX STEF XXX */ - startx = start/cksel; + startx = start/cksel+dev->sensor.CCD_start_xoffset; used_pixels=pixels/cksel; endx = startx + used_pixels; /* sensors are built from 600 dpi segments */ segnb=dpihw/600; - /* pixel coordinate factor correction when used dpihw is not maximal one - * in case of software handling of multi-segment sensors, we must - * use the whole sensor, so we override start and end pixel - */ + /* compute pixel coordinate in the given dpihw space, + * taking segments into account */ + startx/=factor*segnb; + endx/=factor*segnb; + dev->len=endx-startx; + dev->dist=0; + + /* in cas of multi-segments sensor, we have to add the witdh + * of the sensor crossed by the scan area */ if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR && segnb>1) { - startx = dev->sensor.dummy_pixel + 1 + dev->sensor.CCD_start_xoffset; - endx = startx + dev->sensor.sensor_pixels/factor; - } - else - { /* no segment to care about */ - startx/=factor; - endx/=factor; + dev->dist = sensor->segcnt*(segnb-1); } + endx += dev->dist; used_pixels=endx-startx; status = gl847_set_fe (dev, AFE_SET); @@ -1262,23 +1264,19 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, if (depth == 1) { words_per_line = (words_per_line >> 3) + ((words_per_line & 7) ? 1 : 0); + dev->len = (dev->len >> 3) + ((dev->len & 7) ? 1 : 0); + dev->dist = (dev->dist >> 3) + ((dev->dist & 7) ? 1 : 0); } else { words_per_line *= bytes; + dev->dist *= bytes; + dev->len *= bytes; } - dev->bpl = words_per_line; dev->cur=0; - dev->len=dev->bpl/segnb; - dev->dist=dev->bpl/segnb; dev->segnb=segnb; - dev->skip=((start*dpiset)/dpihw)/segnb*bytes; - if(dev->skip>=dev->dist) - { - dev->skip-=dev->dist; - } dev->line_interp = 0; DBG (DBG_io2, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels); @@ -1287,7 +1285,7 @@ gl847_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->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->skip =%lu\n", __FUNCTION__, (unsigned long)dev->skip); + DBG (DBG_io2, "%s: dev->segnb =%lu\n", __FUNCTION__, (unsigned long)dev->segnb); words_per_line *= channels; dev->wpl = words_per_line; @@ -1298,20 +1296,11 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, } RIE (sanei_genesys_buffer_alloc (&(dev->oe_buffer), dev->wpl)); - /* MAXWD is expressed in 4 words unit */ - r = sanei_genesys_get_address (reg, 0x35); - r->value = LOBYTE (HIWORD (words_per_line >> 2)); - r = sanei_genesys_get_address (reg, 0x36); - r->value = HIBYTE (LOWORD (words_per_line >> 2)); - r = sanei_genesys_get_address (reg, 0x37); - r->value = LOBYTE (LOWORD (words_per_line >> 2)); + sanei_genesys_set_triple(reg, REG_MAXWD, (words_per_line >> 2)); DBG (DBG_io2, "%s: words_per_line used=%d\n", __FUNCTION__, words_per_line); - r = sanei_genesys_get_address (reg, 0x38); - r->value = HIBYTE (exposure_time); - r = sanei_genesys_get_address (reg, 0x39); - r->value = LOBYTE (exposure_time); + sanei_genesys_set_double(reg, REG_LPERIOD, exposure_time); DBG (DBG_io2, "%s: exposure_time used=%d\n", __FUNCTION__, exposure_time); r = sanei_genesys_get_address (reg, 0x34); @@ -1321,28 +1310,6 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, return SANE_STATUS_GOOD; } -#if 0 -static int -gl847_get_led_exposure (Genesys_Device * dev) -{ - int d, r, g, b, m; - if (!dev->model->is_cis) - return 0; - d = dev->reg[reg_0x19].value; - r = dev->sensor.regs_0x10_0x1d[1] | (dev->sensor.regs_0x10_0x1d[0] << 8); - g = dev->sensor.regs_0x10_0x1d[3] | (dev->sensor.regs_0x10_0x1d[2] << 8); - b = dev->sensor.regs_0x10_0x1d[5] | (dev->sensor.regs_0x10_0x1d[4] << 8); - - m = r; - if (m < g) - m = g; - if (m < b) - m = b; - - return m + d; -} -#endif - /* set up registers for an actual scan * * this function sets up the scanner to scan in normal or single line mode @@ -2033,107 +2000,6 @@ gl847_end_scan (Genesys_Device * dev, Genesys_Register_Set * reg, return status; } -/* Moves the slider to steps */ -static SANE_Status -gl847_feed (Genesys_Device * dev, int steps) -{ - Genesys_Register_Set local_reg[GENESYS_GL847_MAX_REGS]; - SANE_Status status; - Genesys_Register_Set *r; - float resolution; - uint8_t val; - int loop; - - DBG (DBG_proc, "gl847_feed (steps = %d)\n", steps); - - status = gl847_stop_action (dev); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_feed: failed to stop action: %s\n", - sane_strstatus (status)); - return status; - } - - memset (local_reg, 0, sizeof (local_reg)); - - memcpy (local_reg, dev->reg, - GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set)); - - resolution=sanei_genesys_get_lowest_ydpi(dev); - gl847_init_scan_regs (dev, - local_reg, - resolution, - resolution, - 0, - steps, - 100, - 3, - 8, - 3, - dev->settings.color_filter, - SCAN_FLAG_DISABLE_SHADING | - SCAN_FLAG_DISABLE_GAMMA | - SCAN_FLAG_FEEDING | - SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE | - SCAN_FLAG_IGNORE_LINE_DISTANCE); - sanei_genesys_set_double(local_reg,REG_EXPR,0); - sanei_genesys_set_double(local_reg,REG_EXPG,0); - sanei_genesys_set_double(local_reg,REG_EXPB,0); - - /* clear scan and feed count */ - RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT)); - RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRMCNT)); - - /* set up for no scan */ - r = sanei_genesys_get_address (local_reg, REG01); - r->value &= ~REG01_SCAN; - - /* send registers */ - RIE (gl847_bulk_write_register (dev, local_reg, GENESYS_GL847_MAX_REGS)); - - status = gl847_start_action (dev); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_feed: failed to start motor: %s\n", - sane_strstatus (status)); - gl847_stop_action (dev); - /* send original registers */ - gl847_bulk_write_register (dev, dev->reg, GENESYS_GL847_MAX_REGS); - return status; - } - - loop = 0; - while (loop < 300) /* do not wait longer then 30 seconds */ - { - status = sanei_genesys_get_status (dev, &val); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_feed: failed to read home sensor: %s\n", - sane_strstatus (status)); - return status; - } - - if (!(val & REG41_MOTORENB)) /* motor enabled */ - { - DBG (DBG_proc, "gl847_feed: finished\n"); - dev->scanhead_position_in_steps += steps; - return SANE_STATUS_GOOD; - } - usleep (100000); /* sleep 100 ms */ - ++loop; - } - - /* when we come here then the scanner needed too much time for this, so we better stop the motor */ - gl847_stop_action (dev); - - DBG (DBG_error, - "gl847_feed: timeout while feeding\n"); - return SANE_STATUS_IO_ERROR; -} - /* Moves the slider to the home (top) postion slowly */ static SANE_Status gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) @@ -2586,19 +2452,6 @@ gl847_init_regs_for_scan (Genesys_Device * dev) move = (move * move_dpi) / MM_PER_INCH; DBG (DBG_info, "gl847_init_regs_for_scan: move=%f steps\n", move); - /* at high res we do fast move to scan area */ - /* XXX STEF XXX - if(dev->settings.xres>150) - { - status = gl847_feed (dev, move); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, "%s: failed to move to scan area\n",__FUNCTION__); - return status; - } - move=0; - } */ - /* clear scancnt and fedcnt */ val = REG0D_CLRLNCNT; RIE (sanei_genesys_write_register (dev, REG0D, val)); @@ -3371,59 +3224,6 @@ gl847_cold_boot (Genesys_Device * dev) return SANE_STATUS_GOOD; } -/** @brief dummy scan at 150 to warm scanner - * - * */ -static SANE_Status -gl847_warm_scan (Genesys_Device * dev) -{ - SANE_Status status; - size_t size; - uint8_t *line; - float pixels; - int dpi = 300; - - DBGSTART; - - pixels = (dev->sensor.sensor_pixels * dpi) / dev->sensor.optical_res; - status = gl847_init_scan_regs (dev, - dev->reg, - dpi, - dpi, - 0, - 90, - pixels, - 1, - 16, - 3, - 0, - SCAN_FLAG_DISABLE_SHADING | - SCAN_FLAG_DISABLE_GAMMA | - SCAN_FLAG_IGNORE_LINE_DISTANCE); - - RIE (gl847_bulk_write_register - (dev, dev->reg, GENESYS_GL847_MAX_REGS)); - - /* colors * bytes_per_color * scan lines */ - size = ((int) pixels) * 3 * 2 * 1; - - line = malloc (size); - if (!line) - return SANE_STATUS_NO_MEM; - - DBG (DBG_info, "%s: starting dummy data reading\n", __FUNCTION__); - - RIE (gl847_begin_scan (dev, dev->reg, SANE_TRUE)); - sanei_genesys_read_data_from_scanner (dev, line, size); - RIE (gl847_end_scan (dev, dev->reg, SANE_TRUE)); - - free (line); - RIE (gl847_slow_back_home (dev, SANE_TRUE)); - - DBGCOMPLETED; - return SANE_STATUS_GOOD; -} - /* * * initialize backend and ASIC : registers, motor tables, and gamma tables * then ensure scanner's head is at home @@ -3530,9 +3330,6 @@ gl847_init (Genesys_Device * dev) /* Move home if needed */ RIE (gl847_slow_back_home (dev, SANE_TRUE)); - /* XXX STEF XXX - RIE (gl847_warm_scan (dev)); - */ dev->scanhead_position_in_steps = 0; /* Set powersaving (default = 15 minutes) */ diff --git a/backend/genesys_gl847.h b/backend/genesys_gl847.h index a5ad498ac..348a5f81a 100644 --- a/backend/genesys_gl847.h +++ b/backend/genesys_gl847.h @@ -319,6 +319,8 @@ #define REG_STRPIXEL 0x30 #define REG_ENDPIXEL 0x32 #define REG_LINCNT 0x25 +#define REG_MAXWD 0x35 +#define REG_LPERIOD 0x38 #define REG_FEEDL 0x3d #define REG_FMOVDEC 0x5e #define REG_FSHDEC 0x69 @@ -543,17 +545,20 @@ static Sensor_Profile sensors[]={ {CIS_CANONLIDE200, 150, 2848, 240, 636, 340, 5144, 0, 255, 637, 637, 637}, {CIS_CANONLIDE200, 300, 1424, 240, 636, 340, 5144, 0, 255, 637, 637, 637}, */ - {CIS_CANONLIDE200, 200, 2848, 60, 159, 85, 5144, 255, 410, 275, 203, 0x0a}, - {CIS_CANONLIDE200, 600, 1432, 60, 159, 85, 5144, 255, 410, 275, 203, 0x0a}, - {CIS_CANONLIDE200, 1200, 2712, 60, 159, 85, 5144, 255, 746, 478, 353, 0x08}, - {CIS_CANONLIDE200, 2400, 5280, 60, 159, 85, 5144, 255, 1417, 909, 643, 0x06}, - {CIS_CANONLIDE200, 4800, 10416, 60, 159, 85, 5144, 255, 2692, 1728, 1221, 0x04}, + {CIS_CANONLIDE200, 200, 2848, 60, 159, 85, 5136, 255, 410, 275, 203, 0x0a}, + {CIS_CANONLIDE200, 600, 1432, 60, 159, 85, 5136, 255, 410, 275, 203, 0x0a}, + {CIS_CANONLIDE200, 1200, 2712, 60, 159, 85, 5136, 255, 746, 478, 353, 0x08}, + {CIS_CANONLIDE200, 2400, 5280, 60, 159, 85, 5136, 255, 1417, 909, 643, 0x06}, + {CIS_CANONLIDE200, 4800, 10416, 60, 159, 85, 5136, 255, 2692, 1728, 1221, 0x04}, }; /* *INDENT-ON* */ /* target=((exposure * dpi) / base_dpi)>>step_type; */ +/* too fast for the motor static uint16_t lide200_fast[] = { 46876, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2334, 2325, 2316, 2306, 2297, 2288, 2279, 2270, 2261, 2252, 2243, 2233, 2224, 2215, 2206, 2197, 2188, 2179, 2170, 2160, 2151, 2142, 2133, 2124, 2115, 2106, 2096, 2087, 2078, 2069, 2060, 2051, 2042, 2033, 2023, 2014, 2005, 1996, 1987, 1978, 1969, 1960, 1950, 1941, 1932, 1923, 1914, 1905, 1896, 1887, 1877, 1868, 1859, 1850, 1841, 1832, 1823, 1813, 1804, 1795, 1786, 1777, 1768, 1759, 1750, 1740, 1731, 1722, 1713, 1704, 1695, 1686, 1677, 1667, 1658, 1649, 1640, 1631, 1622, 1613, 1603, 1594, 1585, 1576, 1567, 1558, 1549, 1540, 1530, 1521, 1512, 1503, 1494, 1485, 1476, 1467, 1457, 1448, 1439, 1430, 1421, 1412, 1403, 1393, 1384, 1375, 1366, 1357, 1348, 1339, 1330, 1320, 1311, 1302, 1293, 1284, 1275, 1266, 1257, 1247, 1238, 1229, 1220, 1211, 1202, 1193, 1183, 1174, 1165, 1156, 1147, 1138, 1129, 1120, 1110, 1101, 1092, 1083, 1074, 1065, 1056, 1047, 1037, 1028, 1019, 1010, 1001, 992, 983, 974, 964, 955, 946, 937, 928, 919, 910, 900, 891, 882, 873, 864, 855, 846, 837, 827, 818, 809, 800, 791, 782, 773, 764, 754, 745, 736, 727, 718, 709, 700, 690, 681, 672, 663, 654, 645, 636, 627, 617, 608, 599, 590, 581, 572, 563, 554, 544, 535, 526, 517, 508, 499, 490, 480, 471, 462, 453, 444, 435, 426, 417, 407, 398, 389, 380, 371, 362, 353, 344, 334, 325, 316, 307, 298, 289, 280, 270, 261, 252, 243, 234, 225, 216, 207, 197, 188, 179, 170, 161, 152, 143, 134, 124, 115, 106, 97, 88, 0 }; +*/ static uint16_t lide200_base[] = { 46876, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2336, 2329, 2322, 2314, 2307, 2300,2292,2285,2278,2271,2263,2256,2249,2241,2234,2227,2219,2212,2205,2198,2190,2183,2176,2168,2161,2154,2146,2139,2132,2125,2117,2110,2103,2095,2088,2081,2073,2066,2059,2052,2044,2037,2030,2022,2015,2008,2001,1993,1986,1979,1971,1964,1957,1949,1942,1935,1928,1920,1913,1906,1898,1891,1884,1876,1869,1862,1855,1847,1840,1833,1825,1818,1811,1803,1796,1789,1782,1774,1767,1760,1752,1745,1738,1731,1723,1716,1709,1701,1694,1687,1679,1672,1665,1658,1650,1643,1636,1628,1621,1614,1606,1599,1592,1585,1577,1570,1563,1555,1548,1541,1533,1526,1519,1512,1504,1497,1490,1482,1475,1468,1461,1453,1446,1439,1431,1424,1417,1409,1402,1395,1388,1380,1373,1366,1358,1351,1344,1336,1329,1322,1315,1307,1300,1293,1285,1278,1271,1263,1256,1249,1242,1234,1227,1220,1212,1205,1198,1191,1183,1176,1169,1161,1154,1147,1139,1132,1125,1118,1110,1103,1096,1088,1081,1074,1066,1059,1052,1045,1037,1030,1023,1015,1008,1001,993,986,979,972,964,957,950,942,935,928,921,913,906,899,891,884,877,869,862,855,848,840,833,826,818,811,804,796,789,782,775,767,760,753,745,738,731,723,716,709,702,694,687,680,672,665,658,651,643,636,629,621,614,607,599,592,585,578,570,563,556,534,534, 0}; +static uint16_t lide200_medium[] = { 46876, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136, 8136,0}; /** * database of motor profiles @@ -563,7 +568,7 @@ static uint16_t lide200_base[] = { 46876, 2343, 2343, 2343, 2343, 2343, 2343, 23 static Motor_Profile gl847_motors[]={ {MOTOR_CANONLIDE200, 2848, 0, lide200_base}, {MOTOR_CANONLIDE200, 1432, 0, lide200_base}, - {MOTOR_CANONLIDE200, 2712, 1, lide200_base}, + {MOTOR_CANONLIDE200, 2712, 2, lide200_medium}, {MOTOR_CANONLIDE200, 5280, 2, lide200_base}, {MOTOR_CANONLIDE200, 10416, 2, lide200_base}, /* end of database entry */ diff --git a/backend/genesys_low.c b/backend/genesys_low.c index 742ddae4c..ce0f1d4fb 100644 --- a/backend/genesys_low.c +++ b/backend/genesys_low.c @@ -1264,7 +1264,7 @@ Motor_Profile *profile; current=profile->table[0]; /* loop on profile copying and apply step type */ - while(i=target) + while(profile->table[i]!=0 && current>=target) { slope[i]=current; sum+=slope[i]; @@ -1273,7 +1273,7 @@ Motor_Profile *profile; } /* range checking */ - if(profile->table[i]==0 && DBG_LEVEL >= DBG_warn) + if(profile->table[i]==0 && DBG_LEVEL >= DBG_warn && current>target) { DBG (DBG_warn,"%s: short slope table, failed to reach %d. target too low ?\n",__FUNCTION__,target); } @@ -1293,6 +1293,7 @@ Motor_Profile *profile; /* ensure minimal slope size */ while(i<8) { + slope[i+1]=slope[i]; sum+=slope[i]; i++; } diff --git a/backend/genesys_low.h b/backend/genesys_low.h index b5276d24b..0ce6877b7 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -661,7 +661,6 @@ struct Genesys_Device int line_interp; /**> number of lines used in line interpolation */ int line_count; /**> number of scan lines used during scan */ size_t bpl; /**> bytes per full scan widthline */ - size_t skip; /**> bytes to skip from start of line to get first required pixel */ size_t dist; /**> bytes distance between an odd and an even pixel */ size_t len; /**> number of even pixels */ size_t cur; /**> current pixel position within sub window */