diff --git a/ChangeLog b/ChangeLog index 8d3d1db60..f968ba151 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-11-22 Pierre Willenbrock + * backend/genesys.c, backend/genesys_devices.c, + backend/genesys_low.h, backend/genesys_gl646.c, + backend/genesys_gl841.c: add infrastructure for multiple motor + power modes + 2007-11-21 Pierre Willenbrock * backend/genesys_gl841.c: add internal flag for disabling lamp during scan(useful for black level calibration) diff --git a/backend/genesys.c b/backend/genesys.c index 25fb0aa5a..a86a5bedf 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -649,7 +649,8 @@ sanei_genesys_create_slope_table3 (Genesys_Device * dev, int step_type, int exposure_time, double yres, unsigned int *used_steps, - unsigned int *final_exposure) + unsigned int *final_exposure, + int power_mode) { unsigned int sum_time = 0; unsigned int vtarget; @@ -659,14 +660,14 @@ sanei_genesys_create_slope_table3 (Genesys_Device * dev, DBG (DBG_proc, "sanei_genesys_create_slope_table: step_type = %d, " - "exposure_time = %d, yres = %g\n", step_type, exposure_time, yres); - DBG (DBG_proc, "sanei_genesys_create_slope_table: yres = %.2f\n", yres); + "exposure_time = %d, yres = %g, power_mode = %d\n", step_type, + exposure_time, yres, power_mode); /* final speed */ vtarget = (exposure_time * yres) / dev->motor.base_ydpi; - vstart = dev->motor.slopes[step_type].maximum_start_speed; - vend = dev->motor.slopes[step_type].maximum_speed; + vstart = dev->motor.slopes[power_mode][step_type].maximum_start_speed; + vend = dev->motor.slopes[power_mode][step_type].maximum_speed; vtarget >>= step_type; if (vtarget > 65535) @@ -685,9 +686,9 @@ sanei_genesys_create_slope_table3 (Genesys_Device * dev, vtarget, vstart, vend, - dev->motor.slopes[step_type]. + dev->motor.slopes[power_mode][step_type]. minimum_steps << step_type, - dev->motor.slopes[step_type].g, + dev->motor.slopes[power_mode][step_type].g, used_steps, &vfinal); if (final_exposure) @@ -708,7 +709,8 @@ static SANE_Int genesys_create_slope_table4 (Genesys_Device * dev, u_int16_t * slope_table, int steps, int step_type, int exposure_time, - SANE_Bool same_speed, double yres) + SANE_Bool same_speed, double yres, + int power_mode) { unsigned int sum_time = 0; unsigned int vtarget; @@ -717,15 +719,15 @@ genesys_create_slope_table4 (Genesys_Device * dev, DBG (DBG_proc, "sanei_genesys_create_slope_table: %d steps, step_type = %d, " - "exposure_time = %d, same_speed =%d\n", steps, step_type, - exposure_time, same_speed); - DBG (DBG_proc, "sanei_genesys_create_slope_table: yres = %.2f\n", yres); + "exposure_time = %d, same_speed = %d, yres = %.2f, power_mode = %d\n", + steps, step_type, + exposure_time, same_speed, yres, power_mode); /* final speed */ vtarget = (exposure_time * yres) / dev->motor.base_ydpi; - vstart = dev->motor.slopes[step_type].maximum_start_speed; - vend = dev->motor.slopes[step_type].maximum_speed; + vstart = dev->motor.slopes[power_mode][step_type].maximum_start_speed; + vend = dev->motor.slopes[power_mode][step_type].maximum_speed; vtarget >>= step_type; if (vtarget > 65535) @@ -744,9 +746,9 @@ genesys_create_slope_table4 (Genesys_Device * dev, vtarget, vstart, vend, - dev->motor.slopes[step_type]. + dev->motor.slopes[power_mode][step_type]. minimum_steps << step_type, - dev->motor.slopes[step_type].g, + dev->motor.slopes[power_mode][step_type].g, NULL, NULL); DBG (DBG_proc, @@ -762,7 +764,8 @@ static SANE_Int genesys_create_slope_table2 (Genesys_Device * dev, u_int16_t * slope_table, int steps, int step_type, int exposure_time, - SANE_Bool same_speed, double yres) + SANE_Bool same_speed, double yres, + int power_mode) { double t, g; SANE_Int sum = 0; @@ -771,9 +774,9 @@ genesys_create_slope_table2 (Genesys_Device * dev, DBG (DBG_proc, "sanei_genesys_create_slope_table2: %d steps, step_type = %d, " - "exposure_time = %d, same_speed =%d\n", steps, step_type, - exposure_time, same_speed); - DBG (DBG_proc, "sanei_genesys_create_slope_table2: yres = %.2f\n", yres); + "exposure_time = %d, same_speed = %d, yres = %.2f, power_mode = %d\n", + steps, step_type, + exposure_time, same_speed, yres, power_mode); /* start speed */ if (dev->model->motor_type == MOTOR_5345) @@ -884,7 +887,8 @@ SANE_Int sanei_genesys_create_slope_table (Genesys_Device * dev, u_int16_t * slope_table, int steps, int step_type, int exposure_time, - SANE_Bool same_speed, double yres) + SANE_Bool same_speed, double yres, + int power_mode) { double t; double start_speed; @@ -899,13 +903,13 @@ sanei_genesys_create_slope_table (Genesys_Device * dev, if (dev->model->flags & GENESYS_FLAG_ALT_SLOPE_CREATE) return genesys_create_slope_table4 (dev, slope_table, steps, step_type, exposure_time, - same_speed, yres); + same_speed, yres, power_mode); if (dev->model->motor_type == MOTOR_5345 || dev->model->motor_type == MOTOR_HP2300) return genesys_create_slope_table2 (dev, slope_table, steps, step_type, exposure_time, - same_speed, yres); + same_speed, yres, power_mode); DBG (DBG_proc, "sanei_genesys_create_slope_table: %d steps, step_type = %d, " @@ -1096,11 +1100,13 @@ sanei_genesys_create_gamma_table (u_int16_t * gamma_table, int size, */ SANE_Int sanei_genesys_exposure_time2 (Genesys_Device * dev, float ydpi, - int step_type, int endpixel, int led_exposure) + int step_type, int endpixel, + int led_exposure, int power_mode) { int exposure_by_ccd = endpixel + 32; - int exposure_by_motor = (dev->motor.slopes[step_type].maximum_speed - * dev->motor.base_ydpi) / ydpi; + int exposure_by_motor = + (dev->motor.slopes[power_mode][step_type].maximum_speed + *dev->motor.base_ydpi)/ydpi; int exposure_by_led = led_exposure; int exposure = exposure_by_ccd; diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c index 7614b3a2c..832e5de58 100644 --- a/backend/genesys_devices.c +++ b/backend/genesys_devices.c @@ -289,7 +289,8 @@ static Genesys_Motor Motor[] = { 1200, /* motor base steps */ 2400, /* maximum motor resolution */ 1, /* maximum step mode */ - {{ + 1, /* number of power modes*/ + {{{ 11000, /* maximum start speed */ 3000, /* maximum end speed */ 128, /* step count */ @@ -300,14 +301,14 @@ static Genesys_Motor Motor[] = { 3000, 128, 1.0, - }, - }, - }, + },},}, + }, { /* MD5345/6228/6471 */ 1200, 2400, 1, - {{ + 1, + {{{ 2000, 1375, 128, @@ -318,14 +319,14 @@ static Genesys_Motor Motor[] = { 1375, 128, 0.5, - }, - }, - }, + },},}, + }, { /* ST24 */ 2400, 2400, 1, - {{ + 1, + {{{ 2289, 2100, 128, @@ -336,14 +337,14 @@ static Genesys_Motor Motor[] = { 2100, 128, 0.3, - }, - }, - }, + },},}, + }, { /* HP 2400c */ 1200, 2400, 1, - {{ + 1, + {{{ 11000, 3000, 128, @@ -354,14 +355,14 @@ static Genesys_Motor Motor[] = { 3000, 128, 1.0, - }, - }, - }, + },},}, + }, { /* HP 2300c */ 600, 1200, 1, - {{ + 1, + {{{ 3200, 1200, 128, @@ -372,14 +373,14 @@ static Genesys_Motor Motor[] = { 1200, 128, 0.5, - }, - }, - }, + },},}, + }, { /* Canon LiDE 35 */ 1200, 2400, 1, - {{ + 1, + {{{ 3500, 1300, 60, @@ -390,9 +391,8 @@ static Genesys_Motor Motor[] = { 1400, 60, 0.8, - }, - }, - }, + },},}, + }, }; /* here we have the various device settings... diff --git a/backend/genesys_gl646.c b/backend/genesys_gl646.c index beaf5acc4..36c199305 100644 --- a/backend/genesys_gl646.c +++ b/backend/genesys_gl646.c @@ -1623,14 +1623,14 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) local_reg[reg_0x21].value, local_reg[reg_0x02]. value & REG02_STEPSEL, exposure_time, - 0, dpi); + 0, dpi, 0); } else { sanei_genesys_create_slope_table (dev, slope_table0, prepare_steps, 0, exposure_time, 0, - dev->motor. - base_ydpi /*MOTOR_GEAR */ ); + dev->motor.base_ydpi, /*MOTOR_GEAR */ + 0); } /* when scanhead is moving then wait until scanhead stops or timeout */ @@ -2079,14 +2079,14 @@ gl646_search_start_position (Genesys_Device * dev) local_reg[reg_0x21].value, local_reg[reg_0x02]. value & REG02_STEPSEL, exposure_time, 0, - dpi); + dpi, 0); else sanei_genesys_create_slope_table (dev, slope_table0, local_reg[reg_0x21].value, local_reg[reg_0x02]. value & REG02_STEPSEL, exposure_time, 0, - dev->motor.base_ydpi); + dev->motor.base_ydpi, 0); status = gl646_send_slope_table (dev, 0, slope_table0, local_reg[reg_0x21].value); @@ -2311,7 +2311,8 @@ gl646_init_regs_for_coarse_calibration (Genesys_Device * dev) dev->calib_reg[reg_0x02]. value & REG02_STEPSEL, dev->settings.exposure_time, 0, - dev->motor.base_ydpi /*MOTOR_GEAR */ ); + dev->motor.base_ydpi, /*MOTOR_GEAR */ + 0); /* todo: z1 = z2 = 0? */ sanei_genesys_calculate_zmode (dev, @@ -2515,7 +2516,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev) value & REG02_STEPSEL, sanei_genesys_exposure_time (dev, dev->reg, dpiset), - 0, dpiset); + 0, dpiset, 0); move = (dev->model->shading_lines * dev->motor.base_ydpi) / dpiset; DBG (DBG_info, "gl646_init_regs_for_shading: computed move = %d, dpiset = %d\n", @@ -2947,7 +2948,7 @@ gl646_init_regs_for_scan (Genesys_Device * dev) dev->slope_table0, dev->reg[reg_0x21].value, dev->reg[reg_0x02].value & REG02_STEPSEL, - exposure_time, same_speed, slope_dpi); + exposure_time, same_speed, slope_dpi, 0); /* computes sum of used steps */ steps_sum = 0; @@ -2960,7 +2961,7 @@ gl646_init_regs_for_scan (Genesys_Device * dev) dev->reg[reg_0x6b].value, (dev->reg[reg_0x6a]. value & REG6A_FSTPSEL) >> 6, - fast_exposure, 0, fast_dpi); + fast_exposure, 0, fast_dpi, 0); /* steps to move to reach scanning area: - first we move to physical start of scanning @@ -4123,14 +4124,14 @@ gl646_repark_head (Genesys_Device * dev) slope_table, local_reg[reg_0x21].value, local_reg[reg_0x02].value & REG02_STEPSEL, - exposure_time, 0, 600); + exposure_time, 0, 600, 0); sanei_genesys_create_slope_table (dev, dev->slope_table1, local_reg[reg_0x6b].value, (local_reg[reg_0x6a]. value & REG6A_FSTPSEL) >> 6, 2700, - SANE_FALSE, dev->motor.base_ydpi / 4); + SANE_FALSE, dev->motor.base_ydpi / 4, 0); status = gl646_send_slope_table (dev, 0, slope_table, local_reg[reg_0x21].value); @@ -4259,12 +4260,12 @@ gl646_init (Genesys_Device * dev) sanei_genesys_exposure_time (dev, dev->reg, 150), 0, - 150); + 150, 0); sanei_genesys_create_slope_table (dev, dev->slope_table1, dev->reg[reg_0x6b].value, (dev->reg[reg_0x6a]. value & REG6A_FSTPSEL) >> 6, 3600, 0, - 200); + 200, 0); } else if (dev->model->motor_type == MOTOR_ST24) { @@ -4272,24 +4273,25 @@ gl646_init (Genesys_Device * dev) dev->reg[reg_0x21].value, dev->reg[reg_0x02]. value & REG02_STEPSEL, - dev->settings.exposure_time, 0, 600); + dev->settings.exposure_time, 0, 600, + 0); sanei_genesys_create_slope_table (dev, dev->slope_table1, dev->reg[reg_0x6b].value, (dev->reg[reg_0x6a]. value & REG6A_FSTPSEL) >> 6, 1200, 0, - 400); + 400, 0); } else { sanei_genesys_create_slope_table (dev, dev->slope_table0, dev->reg[reg_0x21].value, dev->reg[reg_0x02]. - value & REG02_STEPSEL, 250, 0, 600); + value & REG02_STEPSEL, 250, 0, 600, 0); sanei_genesys_create_slope_table (dev, dev->slope_table1, dev->reg[reg_0x6b].value, (dev->reg[reg_0x6a]. value & REG6A_FSTPSEL) >> 6, 250, 0, - 600); + 600, 0); } /* build default gamma tables */ diff --git a/backend/genesys_gl841.c b/backend/genesys_gl841.c index 298c5de89..e6856539e 100644 --- a/backend/genesys_gl841.c +++ b/backend/genesys_gl841.c @@ -1905,6 +1905,7 @@ gl841_init_motor_regs(Genesys_Device * dev, dev->motor.base_ydpi / 4, 0,/*step_type*/ 0,/*last used pixel*/ + 0, 0); DBG (DBG_info, "gl841_init_motor_regs : fast_exposure=%d pixels\n", @@ -1914,7 +1915,7 @@ gl841_init_motor_regs(Genesys_Device * dev, if (action == MOTOR_ACTION_HOME_FREE) { /* HOME_FREE must be able to stop in one step, so do not try to get faster */ fast_slope_steps = 256; - fast_exposure = dev->motor.slopes[0].maximum_start_speed; + fast_exposure = dev->motor.slopes[0][0].maximum_start_speed; } fast_slope_time = sanei_genesys_create_slope_table3 ( @@ -1925,7 +1926,7 @@ gl841_init_motor_regs(Genesys_Device * dev, fast_exposure, dev->motor.base_ydpi / 4, &fast_slope_steps, - &fast_exposure); + &fast_exposure, 0); feedl = feed_steps - fast_slope_steps*2; use_fast_fed = 1; @@ -2042,6 +2043,7 @@ gl841_init_motor_regs_scan(Genesys_Device * dev, /*number of scan lines to add in a scan_lines line*/ unsigned int feed_steps,/*1/base_ydpi*/ /*maybe float for half/quarter step resolution?*/ + int scan_power_mode, unsigned int flags) { SANE_Status status; @@ -2065,13 +2067,14 @@ gl841_init_motor_regs_scan(Genesys_Device * dev, DBG (DBG_proc, "gl841_init_motor_regs_scan : scan_exposure_time=%d, " "scan_yres=%g, scan_step_type=%d, scan_lines=%d, scan_dummy=%d, " - "feed_steps=%d, flags=%x\n", + "feed_steps=%d, scan_power_mode=%d, flags=%x\n", scan_exposure_time, scan_yres, scan_step_type, scan_lines, scan_dummy, feed_steps, + scan_power_mode, flags); fast_exposure = sanei_genesys_exposure_time2( @@ -2079,7 +2082,8 @@ gl841_init_motor_regs_scan(Genesys_Device * dev, dev->motor.base_ydpi / 4, 0,/*step_type*/ 0,/*last used pixel*/ - 0); + 0, + scan_power_mode); DBG (DBG_info, "gl841_init_motor_regs_scan : fast_exposure=%d pixels\n", fast_exposure); @@ -2107,7 +2111,8 @@ gl841_init_motor_regs_scan(Genesys_Device * dev, scan_exposure_time, scan_yres, &slow_slope_steps, - NULL); + NULL, + scan_power_mode); back_slope_time = sanei_genesys_create_slope_table3 ( dev, @@ -2117,7 +2122,8 @@ gl841_init_motor_regs_scan(Genesys_Device * dev, 0, scan_yres, &back_slope_steps, - NULL); + NULL, + scan_power_mode); if (feed_steps < (slow_slope_steps >> scan_step_type)) { /*TODO: what should we do here?? go back to exposure calculation?*/ @@ -2142,7 +2148,8 @@ gl841_init_motor_regs_scan(Genesys_Device * dev, fast_exposure, dev->motor.base_ydpi / 4, &fast_slope_steps, - &fast_exposure); + &fast_exposure, + scan_power_mode); if (feed_steps < fast_slope_steps*2 + (slow_slope_steps >> scan_step_type)) { use_fast_fed = 0; @@ -2636,7 +2643,7 @@ gl841_init_scan_regs (Genesys_Device * dev, int bytes_per_line; int move; unsigned int lincnt; - int exposure_time; + int exposure_time, exposure_time2, led_exposure; int i; int stagger; @@ -2644,6 +2651,7 @@ gl841_init_scan_regs (Genesys_Device * dev, int move_dpi = 0; int dummy = 0; int scan_step_type = 1; + int scan_power_mode = 0; int max_shift; size_t requested_buffer_size, read_buffer_size; @@ -2819,14 +2827,31 @@ dummy \ scanned lines scan_step_type = 2; /* exposure_time */ + led_exposure = gl841_get_led_exposure(dev); + exposure_time = sanei_genesys_exposure_time2( dev, slope_dpi, scan_step_type, start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/ - gl841_get_led_exposure(dev) - ); + led_exposure, + scan_power_mode); + while(scan_power_mode + 1 < dev->motor.power_mode_count) { + exposure_time2 = sanei_genesys_exposure_time2( + dev, + slope_dpi, + scan_step_type, + start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/ + led_exposure, + scan_power_mode + 1); + if (exposure_time < exposure_time2) + break; + exposure_time = exposure_time2; + scan_power_mode++; + } + + DBG (DBG_info, "gl841_init_scan_regs : exposure_time=%d pixels\n", exposure_time); @@ -2913,6 +2938,7 @@ dummy \ scanned lines dev->model->is_cis?lincnt*channels:lincnt, dummy, move, + scan_power_mode, (flags & SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE)? MOTOR_FLAG_DISABLE_BUFFER_FULL_MOVE:0 ); diff --git a/backend/genesys_low.h b/backend/genesys_low.h index 221c1a5ab..8e6ca7e11 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -202,7 +202,8 @@ typedef struct SANE_Int base_ydpi; /* motor base steps. Unit: 1/" */ SANE_Int optical_ydpi; /* maximum resolution in y-direction. Unit: 1/" */ SANE_Int max_step_type; /* maximum step type. 0-2 */ - Genesys_Motor_Slope slopes[3]; /* slopes to derive individual slopes from */ + SANE_Int power_mode_count; /* number of power modes*/ + Genesys_Motor_Slope slopes[2][3]; /* slopes to derive individual slopes from */ } Genesys_Motor; typedef enum Genesys_Color_Order @@ -543,7 +544,7 @@ sanei_genesys_fe_write_data (Genesys_Device * dev, u_int8_t addr, extern SANE_Int sanei_genesys_exposure_time2 (Genesys_Device * dev, float ydpi, int step_type, int endpixel, - int led_exposure); + int led_exposure, int power_mode); extern SANE_Int sanei_genesys_exposure_time (Genesys_Device * dev, Genesys_Register_Set * reg, @@ -553,7 +554,8 @@ extern SANE_Int sanei_genesys_create_slope_table (Genesys_Device * dev, u_int16_t * slope_table, int steps, int step_type, int exposure_time, - SANE_Bool same_speed, double yres); + SANE_Bool same_speed, double yres, + int power_mode); SANE_Int sanei_genesys_create_slope_table3 (Genesys_Device * dev, @@ -562,7 +564,8 @@ sanei_genesys_create_slope_table3 (Genesys_Device * dev, int step_type, int exposure_time, double yres, unsigned int *used_steps, - unsigned int *final_exposure); + unsigned int *final_exposure, + int power_mode); extern void sanei_genesys_create_gamma_table (u_int16_t * gamma_table, int size,