kopia lustrzana https://gitlab.com/sane-project/backends
working 200 and 300 dpi mode for G4050
rodzic
71f1fc1115
commit
8e5c4e3c7d
|
@ -486,11 +486,11 @@ static Genesys_Sensor Sensor[] = {
|
||||||
NULL, NULL, NULL}
|
NULL, NULL, NULL}
|
||||||
,
|
,
|
||||||
{CCD_G4050,
|
{CCD_G4050,
|
||||||
1200, /* XXX STEF XXX 4800 */
|
600, /* 4800 */
|
||||||
48,
|
48,
|
||||||
28,
|
28,
|
||||||
152,
|
152,
|
||||||
10200, /* XXX STEF XXX 42574 */
|
2696*2, /* 2696*2=>600, *4=>2400 */
|
||||||
210,
|
210,
|
||||||
230,
|
230,
|
||||||
/* 08 09 0a 0b */
|
/* 08 09 0a 0b */
|
||||||
|
@ -876,14 +876,15 @@ static Genesys_Motor Motor[] = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{MOTOR_G4050,
|
{MOTOR_G4050,
|
||||||
1200, 2400,
|
2400,
|
||||||
|
4800,
|
||||||
2,
|
2,
|
||||||
1,
|
1,
|
||||||
{ /* motor slopes */
|
{ /* motor slopes */
|
||||||
{ /* power mode 0 */
|
{ /* power mode 0 */
|
||||||
{ 3961, 240, 95, 0.8 }, /* full step */
|
{ 3961, 240, 246, 0.8 }, /* full step */
|
||||||
{ 3961, 240, 95, 0.8 }, /* half step */
|
{ 3961, 240, 246, 0.8 }, /* half step */
|
||||||
{ 3961, 240, 95, 0.8 }, /* quarter step */
|
{ 3961, 240, 246, 0.8 }, /* quarter step */
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -1054,15 +1055,15 @@ static Genesys_Model hpg4050_model = {
|
||||||
GENESYS_GL843,
|
GENESYS_GL843,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
||||||
{ 1200, 600, 300, 200, 150, 75, 0}, /* possible x-resolutions */
|
{ /* 4800, 2400, 1200, 800, 600, 400, */ 300, 200, 0},
|
||||||
{ 1200, 600, 300, 200, 150, 75, 0}, /* possible y-resolutions */
|
{ /* 4800, 2400, 1200, 800, 600, 400, */ 300, 200, 0},
|
||||||
{16, 8, 0}, /* possible depths in gray mode */
|
{16, 8, 0}, /* possible depths in gray mode */
|
||||||
{16, 8, 0}, /* possible depths in color mode */
|
{16, 8, 0}, /* possible depths in color mode */
|
||||||
|
|
||||||
SANE_FIX (0.42), /* Start of scan area in mm (x) */
|
SANE_FIX (6.55), /* Start of scan area in mm (x) */
|
||||||
SANE_FIX (7.9), /* Start of scan area in mm (y) */
|
SANE_FIX (15.00), /* Start of scan area in mm (y) */
|
||||||
SANE_FIX (218.0), /* Size of scan area in mm (x) */
|
SANE_FIX (223.0), /* Size of scan area in mm (x) */
|
||||||
SANE_FIX (299.0), /* Size of scan area in mm (y) */
|
SANE_FIX (315.0), /* Size of scan area in mm (y) */
|
||||||
|
|
||||||
SANE_FIX (3.0), /* Start of white strip in mm (y) */
|
SANE_FIX (3.0), /* Start of white strip in mm (y) */
|
||||||
SANE_FIX (0.0), /* Start of black mark in mm (x) */
|
SANE_FIX (0.0), /* Start of black mark in mm (x) */
|
||||||
|
|
|
@ -460,17 +460,53 @@ gl843_test_motor_flag_bit (SANE_Byte val)
|
||||||
return SANE_FALSE;
|
return SANE_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t *get_motor_profile(int motor_type, int exposure)
|
/** @get motor profile
|
||||||
|
* search for the database of motor profiles and get the best one. Each
|
||||||
|
* profile is at full step and at a reference exposure. Use KV-SS080 table
|
||||||
|
* by default.
|
||||||
|
* @param motor_type motor id
|
||||||
|
* @param exposure exposure time
|
||||||
|
* @return a pointer to a Motor_Profile struct
|
||||||
|
*/
|
||||||
|
static Motor_Profile *get_motor_profile(int motor_type, int exposure)
|
||||||
{
|
{
|
||||||
switch(motor_type)
|
unsigned int i;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
idx=-1;
|
||||||
|
while(i<sizeof(motors)/sizeof(Motor_Profile))
|
||||||
{
|
{
|
||||||
case MOTOR_G4050:
|
/* exact match */
|
||||||
return g4050_profile;
|
if(motors[i].motor_type==motor_type && motors[i].exposure==exposure)
|
||||||
case MOTOR_KVSS080:
|
{
|
||||||
return kvss080_profile;
|
return &(motors[i]);
|
||||||
default:
|
|
||||||
return kvss080_profile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* closest match */
|
||||||
|
if(motors[i].motor_type==motor_type)
|
||||||
|
{
|
||||||
|
if(idx<0)
|
||||||
|
{
|
||||||
|
idx=i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(motors[i].exposure>=exposure
|
||||||
|
&& motors[i].exposure<motors[idx].exposure)
|
||||||
|
{
|
||||||
|
idx=i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* default fallback */
|
||||||
|
if(idx<0)
|
||||||
|
idx=0;
|
||||||
|
|
||||||
|
return &(motors[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gl843_slope_table(uint16_t *slope,
|
static int gl843_slope_table(uint16_t *slope,
|
||||||
|
@ -483,26 +519,30 @@ static int gl843_slope_table(uint16_t *slope,
|
||||||
int motor_type)
|
int motor_type)
|
||||||
{
|
{
|
||||||
int sum, i;
|
int sum, i;
|
||||||
uint16_t target, *profile;
|
uint16_t target,current;
|
||||||
|
Motor_Profile *profile;
|
||||||
|
|
||||||
/* required speed */
|
/* required speed */
|
||||||
target=((exposure * dpi) / base_dpi)>>step_type;
|
target=((exposure * dpi) / base_dpi)>>step_type;
|
||||||
|
DBG( DBG_io2, "XXX exposure=%d, dpi=%d, base_dpi=%d, step_type=%d, target=%d\n",exposure,dpi,base_dpi,step_type,target);
|
||||||
|
|
||||||
/* fill result with target speed */
|
/* fill result with target speed */
|
||||||
for(i=0;i<256*factor;i++)
|
for(i=0;i<256*factor;i++)
|
||||||
slope[i]=target;
|
slope[i]=target;
|
||||||
|
|
||||||
/* TODO choose profile to use per motor type, for now only one */
|
|
||||||
profile=get_motor_profile(motor_type,exposure);
|
profile=get_motor_profile(motor_type,exposure);
|
||||||
|
|
||||||
/* use profile to build table */
|
/* use profile to build table */
|
||||||
sum=0;
|
sum=0;
|
||||||
i=0;
|
i=0;
|
||||||
while(i<(256*factor) && (profile[i]>>step_type)>target)
|
current=((profile->table[0]*exposure)/profile->exposure)>>step_type;
|
||||||
|
while(i<(256*factor) && current>target)
|
||||||
{
|
{
|
||||||
slope[i]=profile[i]>>step_type;
|
slope[i]=current;
|
||||||
sum+=slope[i];
|
sum+=slope[i];
|
||||||
i++;
|
i++;
|
||||||
|
current=((profile->table[i]*exposure)/profile->exposure)>>step_type;
|
||||||
|
DBG( DBG_io2, "current=%d, target=%d\n",current,target);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* align size on step time factor */
|
/* align size on step time factor */
|
||||||
|
@ -527,7 +567,7 @@ gl843_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs, int dpi)
|
||||||
Genesys_Register_Set *r;
|
Genesys_Register_Set *r;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DBG (DBG_proc, "gl843_setup_sensor\n");
|
DBGSTART;
|
||||||
|
|
||||||
for (i = 0x06; i < 0x0e; i++)
|
for (i = 0x06; i < 0x0e; i++)
|
||||||
{
|
{
|
||||||
|
@ -708,6 +748,7 @@ gl843_init_registers (Genesys_Device * dev)
|
||||||
SETREG (0x9b, 0x80);
|
SETREG (0x9b, 0x80);
|
||||||
|
|
||||||
SETREG (0xac, 0x00);
|
SETREG (0xac, 0x00);
|
||||||
|
SETREG (0x18, 0x01); /* XXX STEF XXX CKSEL=1, CKTOGGLE=0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fine tune upon device description */
|
/* fine tune upon device description */
|
||||||
|
@ -1120,12 +1161,6 @@ gl843_init_optical_regs_scan (Genesys_Device * dev,
|
||||||
r = sanei_genesys_get_address (reg, REG18);
|
r = sanei_genesys_get_address (reg, REG18);
|
||||||
cksel= (r->value & REG18_CKSEL)+1;
|
cksel= (r->value & REG18_CKSEL)+1;
|
||||||
|
|
||||||
/* XXX STEF XXX visible colors are on the left side of the sensor */
|
|
||||||
if (dev->model->ccd_type == CCD_G4050)
|
|
||||||
{
|
|
||||||
cksel*=2;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG (DBG_io2, "%s: cksel=%d\n", __FUNCTION__, cksel);
|
DBG (DBG_io2, "%s: cksel=%d\n", __FUNCTION__, cksel);
|
||||||
dpiset = used_res * cksel;
|
dpiset = used_res * cksel;
|
||||||
|
|
||||||
|
@ -1305,6 +1340,30 @@ gl843_get_led_exposure (Genesys_Device * dev)
|
||||||
return m + d;
|
return m + d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**@ brief comput exposure to use
|
||||||
|
* compute the sensor exposure based on target resolution
|
||||||
|
*/
|
||||||
|
static int gl843_compute_exposure(Genesys_Device *dev, int xres)
|
||||||
|
{
|
||||||
|
switch(dev->model->ccd_type)
|
||||||
|
{
|
||||||
|
case CCD_G4050:
|
||||||
|
if(xres<=300)
|
||||||
|
{
|
||||||
|
return 3840;
|
||||||
|
}
|
||||||
|
if(xres<=600)
|
||||||
|
{
|
||||||
|
return 8016;
|
||||||
|
}
|
||||||
|
return 21376;
|
||||||
|
case CCD_KVSS080:
|
||||||
|
default:
|
||||||
|
return 8000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* set up registers for an actual scan
|
/* set up registers for an actual scan
|
||||||
*
|
*
|
||||||
* this function sets up the scanner to scan in normal or single line mode
|
* this function sets up the scanner to scan in normal or single line mode
|
||||||
|
@ -1329,7 +1388,7 @@ gl843_init_scan_regs (Genesys_Device * dev, Genesys_Register_Set * reg, float xr
|
||||||
int move;
|
int move;
|
||||||
unsigned int lincnt;
|
unsigned int lincnt;
|
||||||
unsigned int oflags; /**> optical flags */
|
unsigned int oflags; /**> optical flags */
|
||||||
int exposure_time, led_exposure;
|
int exposure_time;
|
||||||
int stagger;
|
int stagger;
|
||||||
|
|
||||||
int slope_dpi = 0;
|
int slope_dpi = 0;
|
||||||
|
@ -1457,16 +1516,8 @@ independent of our calculated values:
|
||||||
|
|
||||||
/* scan_step_type */
|
/* scan_step_type */
|
||||||
scan_step_type = 1;
|
scan_step_type = 1;
|
||||||
exposure_time=8000;
|
scan_step_type = 0; /* XXX STEF XXX */
|
||||||
|
exposure_time=gl843_compute_exposure (dev, used_res);
|
||||||
led_exposure = gl843_get_led_exposure (dev);
|
|
||||||
/* TODO either fix exposure2 or build a new exposure computing function
|
|
||||||
exposure_time = sanei_genesys_exposure_time2 (dev,
|
|
||||||
slope_dpi,
|
|
||||||
scan_step_type,
|
|
||||||
start + used_pixels + 258,
|
|
||||||
led_exposure,
|
|
||||||
scan_power_mode); */
|
|
||||||
|
|
||||||
DBG (DBG_info, "gl843_init_scan_regs : exposure_time=%d pixels\n",
|
DBG (DBG_info, "gl843_init_scan_regs : exposure_time=%d pixels\n",
|
||||||
exposure_time);
|
exposure_time);
|
||||||
|
@ -1739,6 +1790,7 @@ gl843_calculate_current_setup (Genesys_Device * dev)
|
||||||
|
|
||||||
/* scan_step_type */
|
/* scan_step_type */
|
||||||
scan_step_type = 1;
|
scan_step_type = 1;
|
||||||
|
scan_step_type = 0; /* XXX STEF XXX */
|
||||||
|
|
||||||
exposure_time = sanei_genesys_exposure_time2 (dev,
|
exposure_time = sanei_genesys_exposure_time2 (dev,
|
||||||
slope_dpi,
|
slope_dpi,
|
||||||
|
@ -2307,7 +2359,7 @@ gl843_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
|
||||||
SCAN_FLAG_IGNORE_LINE_DISTANCE);
|
SCAN_FLAG_IGNORE_LINE_DISTANCE);
|
||||||
gl843_init_motor_regs_scan (dev,
|
gl843_init_motor_regs_scan (dev,
|
||||||
local_reg,
|
local_reg,
|
||||||
8000,
|
gl843_compute_exposure (dev, 300),
|
||||||
300,
|
300,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
|
|
File diff suppressed because one or more lines are too long
Ładowanie…
Reference in New Issue