work ing full width uncalibrated scans for GL847

merge-requests/1/head
Stphane Voltz 2010-05-16 07:37:00 +02:00
rodzic 587cc576f4
commit 89de65c6cd
4 zmienionych plików z 358 dodań i 189 usunięć

Wyświetl plik

@ -77,8 +77,6 @@
#include "genesys.h"
#include "genesys_devices.c"
#define FREE_IFNOT_NULL(x) if(x!=NULL) { free(x); x=NULL;}
static SANE_Int num_devices = 0;
static Genesys_Device *first_dev = 0;
static Genesys_Scanner *first_handle = 0;
@ -6666,6 +6664,10 @@ sane_close (SANE_Handle handle)
/* maybe todo: shut down scanner */
/* we need this to avoid ASIC getting stuck
* in bulk writes */
sanei_usb_reset (s->dev->dn);
sanei_usb_close (s->dev->dn);
free (s);

Wyświetl plik

@ -49,6 +49,8 @@
#include "genesys_low.h"
#define FREE_IFNOT_NULL(x) if(x!=NULL) { free(x); x=NULL;}
#define ENABLE(OPTION) s->opt[OPTION].cap &= ~SANE_CAP_INACTIVE
#define DISABLE(OPTION) s->opt[OPTION].cap |= SANE_CAP_INACTIVE
#define IS_ACTIVE(OPTION) (((s->opt[OPTION].cap) & SANE_CAP_INACTIVE) == 0)

Wyświetl plik

@ -785,9 +785,9 @@ static Genesys_Motor Motor[] = {
1, /* maximum power modes count */
{ /* motor slopes */
{ /* power mode 0 */
{ 2343, 1017, 32, 0.80}, /* full step */
{ 4678, 2034, 16, 0.80}, /* half step */
{ 4*2034, 4*2034, 16, 0.80}, /* quarter step */
{ 2343, 1017, 128, 0.80}, /* full step */
{ 4678, 2034, 64, 0.80}, /* half step */
{ 4*2034, 4*2034, 32, 0.80}, /* quarter step */
/* extra values kept for documentation
{ 2343, 864, 32, 0.80}, full step
{ 2*1171, 2*648, 32, 0.80}, half step */

Wyświetl plik

@ -87,6 +87,8 @@ write_ahb (SANE_Int dn, uint32_t addr, uint32_t size, uint8_t * data)
uint8_t outdata[8];
size_t written;
SANE_Status status = SANE_STATUS_GOOD;
int i;
char msg[60]="AHB=";
outdata[0] = addr & 0xff;
outdata[1] = ((addr >> 8) & 0xff);
@ -97,10 +99,19 @@ write_ahb (SANE_Int dn, uint32_t addr, uint32_t size, uint8_t * data)
outdata[6] = ((size >> 16) & 0xff);
outdata[7] = ((size >> 24) & 0xff);
if (DBG_LEVEL >= DBG_io)
{
for (i = 0; i < 8; i++)
{
sprintf (msg, "%s 0x%02x", msg, outdata[i]);
}
DBG (DBG_io, "%s: %s\n", __FUNCTION__, msg);
}
/* write addr and size for AHB */
status =
sanei_usb_control_msg (dn, REQUEST_TYPE_OUT, REQUEST_BUFFER, VALUE_BUFFER,
0x01, sizeof (outdata), outdata);
0x01, 8, outdata);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "write_ahb: failed while setting addr and size: %s\n",
@ -180,26 +191,27 @@ gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr,
words = words * 256 + value;
RIE (sanei_genesys_read_register (dev, 0x45, &value));
words = words * 256 + value;
DBG (DBG_io2, "gl847_bulk_read_data: %lu bytes available\n", (u_long) words);
DBG (DBG_io2, "gl847_bulk_read_data: %lu bytes available\n",
(u_long) words);
words=words/2;
words=words*2;
words = words / 2;
words = words * 2;
/* 100*1000=100ms is too much, 50ms also, 1ms is too small */
/*usleep(50000); */
/* don't read more than available data */
/*
if (len > words)
{
target = words;
}
else
{
target = len;
}
*/
target = len;
if (len > words)
{
target = words;
}
else
{
target = len;
}
*/
target = len;
/* loop until computed data size is read */
while (target)
@ -457,7 +469,7 @@ gl847_bulk_full_size (void)
static void
gl847_init_registers (Genesys_Device * dev)
{
DBG (DBG_proc, "gl847_init_registers\n");
DBGSTART;
memset (dev->reg, 0,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
@ -467,7 +479,7 @@ gl847_init_registers (Genesys_Device * dev)
SETREG (0x03, 0x50);
SETREG (0x04, 0x12);
SETREG (0x05, 0x80);
SETREG (0x06, 0x50);
SETREG (0x06, 0x50); /* FASTMODE + POWERBIT */
SETREG (0x08, 0x10);
SETREG (0x09, 0x01);
SETREG (0x0a, 0x00);
@ -545,6 +557,7 @@ gl847_init_registers (Genesys_Device * dev)
SETREG (0x7d, 0x00);
SETREG (0x87, 0x02);
SETREG (0x9d, 0x06);
SETREG (0x9d, 0x00); /* XXX STEF XXX 1x multiplier instead of 8x */
SETREG (0xa2, 0x0f);
SETREG (0xa6, 0x04);
SETREG (0xbd, 0x18);
@ -581,7 +594,7 @@ gl847_init_registers (Genesys_Device * dev)
memcpy (dev->calib_reg, dev->reg,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
DBG (DBG_proc, "gl847_init_registers completed\n");
DBGCOMPLETED;
}
/* Send slope table for motor movement
@ -591,7 +604,6 @@ static SANE_Status
gl847_send_slope_table (Genesys_Device * dev, int table_nr,
uint16_t * slope_table, int steps)
{
int dpihw;
SANE_Status status;
uint8_t *table;
int i;
@ -652,58 +664,58 @@ gl847_set_ad_fe (Genesys_Device * dev, uint8_t set)
sanei_genesys_init_fe (dev);
}
/* reset DAC */
status = sanei_genesys_fe_write_data (dev, 0x00, 0x80);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl847_set_ad_fe: failed to write reg0: %s\n",
sane_strstatus (status));
return status;
}
/* reset DAC */
status = sanei_genesys_fe_write_data (dev, 0x00, 0x80);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl847_set_ad_fe: failed to write reg0: %s\n",
sane_strstatus (status));
return status;
}
/* write them to analog frontend */
val = dev->frontend.reg[0];
status = sanei_genesys_fe_write_data (dev, 0x00, val);
/* write them to analog frontend */
val = dev->frontend.reg[0];
status = sanei_genesys_fe_write_data (dev, 0x00, val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl847_set_ad_fe: failed to write reg0: %s\n",
sane_strstatus (status));
return status;
}
val = dev->frontend.reg[1];
status = sanei_genesys_fe_write_data (dev, 0x01, val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl847_set_ad_fe: failed to write reg1: %s\n",
sane_strstatus (status));
return status;
}
for (i = 0; i < 3; i++)
{
val = dev->frontend.gain[i];
status = sanei_genesys_fe_write_data (dev, 0x02 + i, val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl847_set_ad_fe: failed to write reg0: %s\n",
DBG (DBG_error,
"gl847_set_ad_fe: failed to write gain %d: %s\n", i,
sane_strstatus (status));
return status;
}
val = dev->frontend.reg[1];
status = sanei_genesys_fe_write_data (dev, 0x01, val);
}
for (i = 0; i < 3; i++)
{
val = dev->frontend.offset[i];
status = sanei_genesys_fe_write_data (dev, 0x05 + i, val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl847_set_ad_fe: failed to write reg1: %s\n",
DBG (DBG_error,
"gl847_set_ad_fe: failed to write offset %d: %s\n", i,
sane_strstatus (status));
return status;
}
for (i = 0; i < 3; i++)
{
val = dev->frontend.gain[i];
status = sanei_genesys_fe_write_data (dev, 0x02 + i, val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_set_ad_fe: failed to write gain %d: %s\n", i,
sane_strstatus (status));
return status;
}
}
for (i = 0; i < 3; i++)
{
val = dev->frontend.offset[i];
status = sanei_genesys_fe_write_data (dev, 0x05 + i, val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_set_ad_fe: failed to write offset %d: %s\n", i,
sane_strstatus (status));
return status;
}
}
}
DBG (DBG_proc, "gl847_set_ad_fe(): end\n");
return status;
@ -714,15 +726,16 @@ static SANE_Status
gl847_set_fe (Genesys_Device * dev, uint8_t set)
{
SANE_Status status;
int i;
uint8_t val;
DBG (DBG_proc, "gl847_set_fe (%s)\n",
set == AFE_INIT ? "init" : set == AFE_SET ? "set" : set ==
AFE_POWER_SAVE ? "powersave" : "huh?");
RIE (sanei_genesys_read_register (dev, REG04, &val));
/* route to AD devices */
if ((dev->reg[reg_0x04].value & REG04_FESET) == 0x02)
if ((val & REG04_FESET) == 0x02)
{
return gl847_set_ad_fe (dev, set);
}
@ -866,7 +879,8 @@ gl847_init_motor_regs (Genesys_Device * dev, Genesys_Register_Set * reg, unsigne
{
/* FEED and GO_HOME can use fastest slopes available */
fast_slope_steps = 256;
fast_exposure = sanei_genesys_exposure_time2 (dev, dev->motor.base_ydpi / 4,
fast_exposure = sanei_genesys_exposure_time2 (dev,
dev->motor.base_ydpi / 4,
0, /*step_type */
0, /*last used pixel */
0,
@ -1084,10 +1098,7 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, Genesys_Register_Set * reg, un
fast_exposure =
sanei_genesys_exposure_time2 (dev, dev->motor.base_ydpi / 4,
0,
0,
0,
scan_power_mode);
0, 0, 0, scan_power_mode);
DBG (DBG_info, "gl847_init_motor_regs_scan : fast_exposure=%d pixels\n",
fast_exposure);
@ -1141,8 +1152,8 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, Genesys_Register_Set * reg, un
fast_slope_steps,
0,
fast_exposure,
dev->motor.base_ydpi / 4,
&fast_slope_steps,
dev->motor.base_ydpi /
4, &fast_slope_steps,
&fast_exposure,
scan_power_mode);
@ -1182,9 +1193,6 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, Genesys_Register_Set * reg, un
DBG (DBG_info, "gl847_init_motor_regs_scan: decided to use %s mode\n",
use_fast_fed ? "fast feed" : "slow feed");
/* XXX STEF XXX */
use_fast_fed = 0;
if (use_fast_fed)
feedl = feed_steps - fast_slope_steps * 2 -
(slow_slope_steps >> scan_step_type);
@ -1289,11 +1297,11 @@ gl847_init_motor_regs_scan (Genesys_Device * dev, Genesys_Register_Set * reg, un
/* steps of table 0*/
r = sanei_genesys_get_address (reg, 0x22);
r->value = min_restep - slow_slope_steps * 2;
/* steps of table 1*/
r = sanei_genesys_get_address (reg, 0x23);
r->value = min_restep - back_slope_steps * 2;
/*
for z1/z2:
@ -1437,7 +1445,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
used_res, start, pixels, channels, depth, half_ccd, flags);
end = start + pixels;
if(end>dev->sensor.sensor_pixels)
if (end > dev->sensor.sensor_pixels)
{
DBG (DBG_error, "XXX STEF XXX overflow\n");
}
@ -1639,9 +1647,7 @@ gl847_get_led_exposure (Genesys_Device * dev)
static
#endif
SANE_Status
gl847_init_scan_regs (Genesys_Device * dev,
Genesys_Register_Set * reg,
float xres, /*dpi */
gl847_init_scan_regs (Genesys_Device * dev, Genesys_Register_Set * reg, float xres, /*dpi */
float yres, /*dpi */
float startx, /*optical_res, from dummy_pixel+1 */
float starty, /*base_ydpi, from home! */
@ -1659,7 +1665,6 @@ gl847_init_scan_regs (Genesys_Device * dev,
int exposure_time, exposure_time2, led_exposure;
int i;
int stagger;
uint8_t val, effective;
int slope_dpi = 0;
int move_dpi = 0;
@ -1834,8 +1839,10 @@ independent of our calculated values:
scan_power_mode++;
}
DBG (DBG_info, "gl847_init_scan_regs : exposure_time=%d pixels\n", exposure_time);
DBG (DBG_info, "gl847_init_scan_regs : scan_step_type=%d\n", scan_step_type);
DBG (DBG_info, "gl847_init_scan_regs : exposure_time=%d pixels\n",
exposure_time);
DBG (DBG_info, "gl847_init_scan_regs : scan_step_type=%d\n",
scan_step_type);
/*** optical parameters ***/
/* in case of dynamic lineart, we use an internal 8 bit gray scan
@ -2352,8 +2359,6 @@ gl847_set_lamp_power (Genesys_Device * dev,
static SANE_Status
gl847_save_power (Genesys_Device * dev, SANE_Bool enable)
{
uint8_t val;
DBG (DBG_proc, "gl847_save_power: enable = %d\n", enable);
DBG (DBG_proc, "gl847_save_power: completed \n");
@ -2837,11 +2842,10 @@ gl847_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
SANE_Bool start_motor)
{
SANE_Status status;
Genesys_Register_Set local_reg[2];
uint8_t val;
unsigned int scancnt;
DBG (DBG_proc, "gl847_begin_scan\n");
DBGSTART;
/* clear GPIO 10 */
RIE (sanei_genesys_read_register (dev, REG6C, &val));
@ -2866,7 +2870,7 @@ gl847_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
RIE (sanei_genesys_write_register (dev, REG0F, 0));
}
DBG (DBG_proc, "gl847_begin_scan: completed\n");
DBGCOMPLETED;
return status;
}
@ -3484,7 +3488,7 @@ gl847_send_gamma_table (Genesys_Device * dev, SANE_Bool generic)
{
int size;
int status;
uint8_t *gamma;
uint8_t *gamma, val;
int i, gmmval;
DBG (DBG_proc, "gl847_send_gamma_table\n");
@ -3543,6 +3547,20 @@ gl847_send_gamma_table (Genesys_Device * dev, SANE_Bool generic)
/* loop sending gamma tables NOTE: 0x01000000 not 0x10000000 */
for (i = 0; i < 3; i++)
{
/* clear corresponding GMM_N bit */
RIE (sanei_genesys_read_register (dev, 0xbd, &val));
val &= ~(0x01 << i);
RIE (sanei_genesys_write_register (dev, 0xbd, val));
/* clear corresponding GMM_F bit */
RIE (sanei_genesys_read_register (dev, 0xbe, &val));
val &= ~(0x01 << i);
RIE (sanei_genesys_write_register (dev, 0xbe, val));
/* set GMM_Z */
RIE (sanei_genesys_write_register (dev, 0xc5+2*i, 0x00));
RIE (sanei_genesys_write_register (dev, 0xc6+2*i, 0x00));
status =
write_ahb (dev->dn, 0x01000000 + 0x200 * i, size * 2,
gamma + i * size * 2);
@ -3568,6 +3586,7 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
{
SANE_Status status = SANE_STATUS_GOOD;
uint32_t addr, length;
uint8_t val;
/* shading data is plit in 3 (up to 5 with IR) areas
write(0x10014000,0x00000dd8)
@ -3581,7 +3600,8 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
* is 8192*reg value */
/* write actual red data */
addr = dev->reg[reg_0xd0].value * 8192 + 0x10000000;
RIE (sanei_genesys_read_register (dev, 0xd0, &val));
addr = val * 8192 + 0x10000000;
status = write_ahb (dev->dn, addr, length, data);
if (status != SANE_STATUS_GOOD)
{
@ -3591,7 +3611,8 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
}
/* write actual green data */
addr = dev->reg[reg_0xd1].value * 8192 + 0x10000000;
RIE (sanei_genesys_read_register (dev, 0xd1, &val));
addr = val * 8192 + 0x10000000;
status = write_ahb (dev->dn, addr, length, data + length);
if (status != SANE_STATUS_GOOD)
{
@ -3601,7 +3622,8 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
}
/* write actual blue data */
addr = dev->reg[reg_0xd2].value * 8192 + 0x10000000;
RIE (sanei_genesys_read_register (dev, 0xd2, &val));
addr = val * 8192 + 0x10000000;
status = write_ahb (dev->dn, addr, length, data + 2 * length);
if (status != SANE_STATUS_GOOD)
{
@ -3868,7 +3890,6 @@ gl847_init_regs_for_warmup (Genesys_Device * dev,
static SANE_Status
sanei_gl847_repark_head (Genesys_Device * dev)
{
Genesys_Register_Set local_reg[GENESYS_GL847_MAX_REGS];
SANE_Status status;
DBG (DBG_proc, "sanei_gl847_repark_head\n");
@ -4078,23 +4099,26 @@ gl847_init_memory_layout (Genesys_Device * dev)
return status;
}
/** @brief dummy sca nto reset scanner
#if 0
/** @brief dummy scan to reset scanner
*
* */
static SANE_Status gl847_dummy_scan(Genesys_Device *dev)
static SANE_Status
gl847_dummy_scan (Genesys_Device * dev)
{
SANE_Status status;
size_t size;
uint8_t *line;
float pixels;
int dpi=300;
int dpi = 300;
DBGSTART;
/* initial calibration reg values */
memcpy (dev->calib_reg, dev->reg, GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
memcpy (dev->calib_reg, dev->reg,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
pixels= (16 * 300) / dev->sensor.optical_res;
pixels = (16 * 300) / dev->sensor.optical_res;
status = gl847_init_scan_regs (dev,
dev->calib_reg,
dpi,
@ -4110,8 +4134,7 @@ static SANE_Status gl847_dummy_scan(Genesys_Device *dev)
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_SINGLE_LINE |
SCAN_FLAG_IGNORE_LINE_DISTANCE |
SCAN_FLAG_USE_OPTICAL_RES
);
SCAN_FLAG_USE_OPTICAL_RES);
RIE (gl847_bulk_write_register
(dev, dev->calib_reg, GENESYS_GL847_MAX_REGS));
@ -4127,71 +4150,184 @@ static SANE_Status gl847_dummy_scan(Genesys_Device *dev)
RIE (gl847_begin_scan (dev, dev->calib_reg, SANE_TRUE));
sanei_usb_set_timeout(1000);/* 1 second*/
sanei_usb_set_timeout (1000); /* 1 second */
/*ignore errors. next read will succeed*/
/*ignore errors. next read will succeed */
sanei_genesys_read_data_from_scanner (dev, line, size);
sanei_usb_set_timeout(30 * 1000);/* 30 seconds*/
sanei_usb_set_timeout (30 * 1000); /* 30 seconds */
RIE (gl847_end_scan (dev, dev->calib_reg, SANE_TRUE));
free(line);
free (line);
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
/* *
* initialize ASIC : registers, motor tables, and gamma tables
* then ensure scanner's head is at home
/**
* reads a register from device and set up corresponding shadow register
*/
static SANE_Status
gl847_init (Genesys_Device * dev)
gl847_bulk_read_register (Genesys_Device * dev,
Genesys_Register_Set * reg, size_t elems)
{
SANE_Status status = SANE_STATUS_GOOD;
size_t i;
for (i = 0; i < elems && status == SANE_STATUS_GOOD; i++)
{
if (reg[i].address != 0)
{
status =
sanei_genesys_read_register (dev, reg[i].address, &(reg[i].value));
}
}
return status;
}
/* *
* initialize registers from hardware since it is warm
*/
static SANE_Status
gl847_warm_boot (Genesys_Device * dev)
{
SANE_Status status;
DBGSTART;
memset (dev->reg, 0,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
SETREG (0x01, 0x00);
SETREG (0x02, 0x00);
SETREG (0x03, 0x00);
SETREG (0x04, 0x00);
SETREG (0x05, 0x00);
SETREG (0x06, 0x00);
SETREG (0x08, 0x00);
SETREG (0x09, 0x00);
SETREG (0x0a, 0x00);
SETREG (0x0c, 0x00);
SETREG (0x0d, 0x00);
SETREG (0x10, 0x00);
SETREG (0x11, 0x00);
SETREG (0x12, 0x00);
SETREG (0x13, 0x00);
SETREG (0x14, 0x00);
SETREG (0x15, 0x00);
SETREG (0x16, 0x00);
SETREG (0x17, 0x00);
SETREG (0x18, 0x00);
SETREG (0x19, 0x00);
SETREG (0x1a, 0x00);
SETREG (0x1b, 0x00);
SETREG (0x1c, 0x00);
SETREG (0x1d, 0x00);
SETREG (0x1e, 0x00);
SETREG (0x1f, 0x00);
SETREG (0x20, 0x00);
SETREG (0x21, 0x00);
SETREG (0x22, 0x00);
SETREG (0x23, 0x00);
SETREG (0x24, 0x00);
SETREG (0x25, 0x00);
SETREG (0x26, 0x00);
SETREG (0x27, 0x00);
SETREG (0x2c, 0x00);
SETREG (0x2d, 0x00);
SETREG (0x2e, 0x00);
SETREG (0x2f, 0x00);
SETREG (0x30, 0x00);
SETREG (0x31, 0x00);
SETREG (0x32, 0x00);
SETREG (0x33, 0x00);
SETREG (0x34, 0x00);
SETREG (0x35, 0x00);
SETREG (0x36, 0x00);
SETREG (0x37, 0x00);
SETREG (0x38, 0x00);
SETREG (0x39, 0x00);
SETREG (0x3d, 0x00);
SETREG (0x3e, 0x00);
SETREG (0x3f, 0x00);
SETREG (0x52, 0x00);
SETREG (0x53, 0x00);
SETREG (0x54, 0x00);
SETREG (0x55, 0x00);
SETREG (0x56, 0x00);
SETREG (0x57, 0x00);
SETREG (0x58, 0x00);
SETREG (0x59, 0x00);
SETREG (0x5a, 0x00);
SETREG (0x5e, 0x00);
SETREG (0x5f, 0x00);
SETREG (0x60, 0x00);
SETREG (0x61, 0x00);
SETREG (0x62, 0x00);
SETREG (0x63, 0x00);
SETREG (0x64, 0x00);
SETREG (0x65, 0x00);
SETREG (0x67, 0x00);
SETREG (0x68, 0x00);
SETREG (0x69, 0x00);
SETREG (0x6a, 0x00);
SETREG (0x74, 0x00);
SETREG (0x75, 0x00);
SETREG (0x76, 0x00);
SETREG (0x7a, 0x00);
SETREG (0x7b, 0x00);
SETREG (0x7c, 0x00);
SETREG (0x7d, 0x00);
SETREG (0x87, 0x00);
SETREG (0x9d, 0x00);
SETREG (0xa2, 0x00);
SETREG (0xa6, 0x00);
SETREG (0xbd, 0x00);
SETREG (0xbe, 0x00);
SETREG (0xc5, 0x00);
SETREG (0xc6, 0x00);
SETREG (0xc7, 0x00);
SETREG (0xc8, 0x00);
SETREG (0xc9, 0x00);
SETREG (0xca, 0x00);
SETREG (0xf8, 0x00);
SETREG (0xfe, 0x00);
/* fill registers from ASIC */
RIE(gl847_bulk_read_register(dev, dev->reg, GENESYS_GL847_MAX_REGS));
/* initalize calibration reg */
memcpy (dev->calib_reg, dev->reg,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
DBGCOMPLETED;
return status;
}
#endif
/* *
* initialize ASIC from power on condition
*/
static SANE_Status
gl847_cold_boot (Genesys_Device * dev)
{
SANE_Status status;
uint8_t val;
size_t size;
DBG_INIT ();
DBG (DBG_proc, "gl847_init: start\n");
DBGSTART;
dev->scanhead_position_in_steps = 0;
RIE (sanei_genesys_write_register (dev, 0x0e, 0x01));
RIE (sanei_genesys_write_register (dev, 0x0e, 0x00));
/* check if the device has already been initialized and powered up
* we read register 6 and check PWRBIT, if reset scanner has been
* freshly powered up. This bit will be set to later so that following
* reads can detect power down/up cycle*/
RIE (sanei_genesys_read_register (dev, 0x06, &val));
DBG (DBG_info, "gl847_init: device is %s\n",
(val & REG06_PWRBIT) ? "warm" : "cold");
if (dev->already_initialized && (val & REG06_PWRBIT))
{
DBG (DBG_info, "gl847_init: already initialized\n");
return SANE_STATUS_GOOD;
}
/* try to use CHKVER */
/* test CHKVER */
RIE (sanei_genesys_read_register (dev, REG40, &val));
if (val & REG40_CHKVER)
{
RIE (sanei_genesys_read_register (dev, 0x00, &val));
DBG (DBG_info, "gl847_init: reported version is 0x%02x\n", val);
DBG (DBG_info, "gl847_cold_boot: reported version for genesys chip is 0x%02x\n", val);
}
/* here either the backend or the scanner need to be initialized */
/* XXX STEF XXX FREEIFNOTNULL */
dev->dark_average_data = NULL;
dev->white_average_data = NULL;
dev->settings.color_filter = 0;
/* ASIC reset */
/* XXX STEF XXX just writes 0 for GL841
RIE (sanei_genesys_write_register (dev, 0x0e, 0x01));
sleep (1); */
RIE (sanei_genesys_write_register (dev, 0x0e, 0x00));
sleep (1);
/* setup GPIO */
sanei_genesys_read_register (dev, REGA6, &val);
sanei_genesys_write_register (dev, REGA6, val | 0x04);
@ -4210,17 +4346,17 @@ gl847_init (Genesys_Device * dev)
/* Write initial registers */
RIE (gl847_bulk_write_register (dev, dev->reg, GENESYS_GL847_MAX_REGS));
/* Enable DRAM by setting a rising edge on bit 3 of reg 0x09 */
/* Enable DRAM by setting a rising edge on bit 3 of reg 0x0b */
val = dev->reg[reg_0x0b].value & REG0B_DRAMSEL;
val = (val | REG0B_ENBDRAM);
RIE (sanei_genesys_write_register (dev, 0x0b, val));
RIE (sanei_genesys_write_register (dev, REG0B, val));
dev->reg[reg_0x0b].value = val;
/* read back GPIO TODO usefull ? */
sanei_genesys_read_register (dev, REGA6, &val);
if (val != 0x04)
{
DBG (DBG_warn, "gl847_init: GPIO is 0x%02d instead of 0x04\n", val);
DBG (DBG_warn, "gl847_cold_boot: GPIO is 0x%02d instead of 0x04\n", val);
}
/* set up clock once for all */
@ -4230,9 +4366,12 @@ gl847_init (Genesys_Device * dev)
/* CLKSET */
val = (dev->reg[reg_0x0b].value & ~REG0B_CLKSET) | REG0B_30MHZ;
RIE (sanei_genesys_write_register (dev, 0x0b, val));
RIE (sanei_genesys_write_register (dev, REG0B, val));
dev->reg[reg_0x0b].value = val;
/* prevent further writings by bulk write register */
dev->reg[reg_0x0b].address = 0x00;
/* CIS_LINE */
SETREG (0x08, REG08_CIS_LINE);
RIE (sanei_genesys_write_register (dev, 0x08, dev->reg[reg_0x08].value));
@ -4253,35 +4392,73 @@ gl847_init (Genesys_Device * dev)
SETREG (0xf8, 0x01);
RIE (sanei_genesys_write_register (dev, 0xf8, dev->reg[reg_0xf8].value));
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
/* *
* initialize backend and ASIC : registers, motor tables, and gamma tables
* then ensure scanner's head is at home
*/
static SANE_Status
gl847_init (Genesys_Device * dev)
{
SANE_Status status;
uint8_t val;
SANE_Bool cold = SANE_TRUE;
int size;
DBG_INIT ();
DBGSTART;
status = sanei_usb_control_msg (dev->dn, REQUEST_TYPE_IN, REQUEST_REGISTER, VALUE_GET_REGISTER, 0, 1, &val);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_init: request register failed %s\n", sane_strstatus (status));
return status;
}
DBG( DBG_io2, "gl847_init: value=0x%02x\n",val);
/* check if the device has already been initialized and powered up
* we read register 6 and check PWRBIT, if reset scanner has been
* freshly powered up. This bit will be set to later so that following
* reads can detect power down/up cycle*/
RIE (sanei_genesys_read_register (dev, 0x06, &val));
if (val & REG06_PWRBIT)
{
cold = SANE_FALSE;
}
DBG (DBG_info, "%s: device is %s\n", __FUNCTION__, cold ? "cold" : "warm");
/* don't do anything is backend is initialized and hardware hasn't been
* replug */
if (dev->already_initialized && !cold)
{
DBG (DBG_info, "gl847_init: already initialized, nothing to do\n");
return SANE_STATUS_GOOD;
}
/* set up hardware and registers */
RIE (gl847_cold_boot (dev));
/* now hardware part is OK, set up device struct */
FREE_IFNOT_NULL (dev->white_average_data);
FREE_IFNOT_NULL (dev->dark_average_data);
FREE_IFNOT_NULL (dev->sensor.red_gamma_table);
FREE_IFNOT_NULL (dev->sensor.green_gamma_table);
FREE_IFNOT_NULL (dev->sensor.blue_gamma_table);
dev->settings.color_filter = 0;
memcpy (dev->calib_reg, dev->reg,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
/* Set analog frontend */
RIE (gl847_set_fe (dev, AFE_INIT));
/* Move home */
RIE (gl847_slow_back_home (dev, SANE_TRUE));
/* Init shading data */
RIE (sanei_genesys_init_shading_data (dev, dev->sensor.sensor_pixels));
/* ensure head is correctly parked, and check lock */
if (dev->model->flags & GENESYS_FLAG_REPARK)
{
status = sanei_gl847_repark_head (dev);
if (status != SANE_STATUS_GOOD)
{
if (status == SANE_STATUS_INVAL)
DBG (DBG_error0,
"Your scanner is locked. Please move the lock switch "
"to the unlocked position\n");
else
DBG (DBG_error,
"gl847_init: sanei_gl847_repark_head failed: %s\n",
sane_strstatus (status));
return status;
}
}
/* init gamma tables */
size = 256;
if (dev->sensor.red_gamma_table == NULL)
{
dev->sensor.red_gamma_table = (uint16_t *) malloc (2 * size);
@ -4319,29 +4496,17 @@ gl847_init (Genesys_Device * dev)
sanei_genesys_create_gamma_table (dev->sensor.blue_gamma_table, size,
65535, 65535, dev->sensor.blue_gamma);
}
dev->already_initialized = SANE_TRUE;
/* send gamma tables if needed */
status = gl847_send_gamma_table (dev, 1);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_init: failed to send generic gamma tables: %s\n",
sane_strstatus (status));
return status;
}
/* to clear error condition on scan */
gl847_dummy_scan(dev);
memcpy (dev->calib_reg, dev->reg,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
/* Move home */
RIE (gl847_slow_back_home (dev, SANE_TRUE));
dev->scanhead_position_in_steps = 0;
/* Set powersaving (default = 15 minutes) */
RIE (gl847_set_powersaving (dev, 15));
dev->already_initialized = SANE_TRUE;
DBG (DBG_proc, "gl847_init: completed\n");
return SANE_STATUS_GOOD;
DBGCOMPLETED;
return status;
}
static SANE_Status