* 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
merge-requests/1/head
Pierre Willenbrock 2007-11-22 14:05:13 +00:00
rodzic f58aa28cd0
commit 8d2069c0dd
6 zmienionych plików z 123 dodań i 80 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2007-11-22 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
* 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 <pierre@pirsoft.dnsalias.org>
* backend/genesys_gl841.c: add internal flag for disabling lamp
during scan(useful for black level calibration)

Wyświetl plik

@ -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;

Wyświetl plik

@ -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...

Wyświetl plik

@ -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 */

Wyświetl plik

@ -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
);

Wyświetl plik

@ -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,