[sane-devel] [genesy backend] some patches and a few questions

Stéphane VOLTZ svoltz@wanadoo.fr
Wed, 15 Dec 2004 07:50:44 +0100


 Hello,

  I have worked on the genesys experimental backend to make my MD6471 work. 
First here are some patches:
- I had to put back a MD6471 sensor since there is a little difference with 
the ST24:
http://perso.wanadoo.fr/septieme/MD6471/03_md6471_sensor.patch

- since the motors from the different scanners are different, I added a 
motor_type field in the device structure. I haven't created a Genesys_Motor 
struct since I haven't a clear idea of what it should really contain.
http://perso.wanadoo.fr/septieme/MD6471/04_motor_type.patch

- I have removed the parameter override in genesys_create_slope_table, and 
changed a little the pow() computing, since my compiler produces buggy code
when 'j' is 0.
http://perso.wanadoo.fr/septieme/MD6471/05_create_slope_params.patch

 Then comes some problems:
- I believe that there's a bug in genesys_create_slope_table. We cuurently 
have:
     time_period =  /* time required for full steps */
 (u_int32_t) (yres * exposure_time / dev->model->base_ydpi)  /
       (start_speed + (1 - start_speed) * t);    

and I think it should be (multiply instead of a divide):
   time_period =  /* time required for full steps */
 (u_int32_t) (yres * exposure_time / dev->model->base_ydpi) *
      * (start_speed + (1 - start_speed) * t);

 With the first formula (divided by (start_speed + ....), I cannot reach
satsifying parameters to have a good slope_table, while with the second
formula (multyply by ...), I can find near perfect match with the slope tables
in the USB logs. However, changing it would mean changing the start_speed
and 'acceleration'. I can do it for the MD6471, but not fot the other 
scanners. 

- the MD6471 doesn't need the extensive asic test done at init, and I feel 
like adding a flag to optionally skip it.

- another problem is the warmup function, I think this isn't warmup, but
offset calibration. In th MD6471 logs, a one line scan is done with AFE offset 
at zero, then at a higher value, but both with a coarse gain at zero. And 
since this takes place where it should (right before coarse gain 
calibration), I really believe it is offset calibration. Lamp warmup 
detection is only a byproduct.

- I have created for my needs a genesys_par_head() which is used instead of 
slow_back_home() which doesn't work for my scanner. In fact, it is really 
close to genesys_check_scanner_lock(). It sends the head back home by setting 
motor to reverse direction, 2 table scanning and steps before scan area to 
65535. If parking head after moving it doesn't work, this will indeed detect 
if the head is locked, but doesn't seem the real goal of the function.

- and last, I resurrected genesys_search_start_position(), but taylored for 
the MD6471, would it be OK to add it, with a device flag to control if the 
backend calls it ? I need this to locate the black and with stripes below the 
scanner's top in order to make offset and coarse gain calibration work 
reliably.

To sum up is it OK to:
- change genesy_create_slope_table()
- add a flag for optional lazy init
- add a genesys_park_head() and a flag to control it's use
- add a flag to control the use of genesys_search_start_position(), and
resurrect this function.
- either modify warmup(), or create a genesys_offset_calibration with it's 
assorted flag

Regards,
 Stef