Merge branch 'gl847'

merge-requests/1/head
Stphane Voltz 2010-05-16 21:19:52 +02:00
commit f805e27531
13 zmienionych plików z 5806 dodań i 26 usunięć

Wyświetl plik

@ -156,7 +156,7 @@ am_libfujitsu_la_OBJECTS = libfujitsu_la-fujitsu.lo
libfujitsu_la_OBJECTS = $(am_libfujitsu_la_OBJECTS)
libgenesys_la_LIBADD =
am_libgenesys_la_OBJECTS = libgenesys_la-genesys.lo \
libgenesys_la-genesys_gl646.lo libgenesys_la-genesys_gl841.lo
libgenesys_la-genesys_gl646.lo libgenesys_la-genesys_gl841.lo libgenesys_la-genesys_gl847.lo
libgenesys_la_OBJECTS = $(am_libgenesys_la_OBJECTS)
libgphoto2_i_la_LIBADD =
am_libgphoto2_i_la_OBJECTS = libgphoto2_i_la-gphoto2.lo
@ -1974,7 +1974,7 @@ nodist_libsane_fujitsu_la_SOURCES = fujitsu-s.c
libsane_fujitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=fujitsu
libsane_fujitsu_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_fujitsu_la_LIBADD = $(COMMON_LIBS) libfujitsu.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_magic.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS)
libgenesys_la_SOURCES = genesys.c genesys.h genesys_gl646.c genesys_gl646.h genesys_gl841.c genesys_low.h
libgenesys_la_SOURCES = genesys.c genesys.h genesys_gl646.c genesys_gl646.h genesys_gl841.c genesys_gl847.c genesys_gl847.h genesys_low.h
libgenesys_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=genesys
nodist_libsane_genesys_la_SOURCES = genesys-s.c
libsane_genesys_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=genesys
@ -2840,6 +2840,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgenesys_la-genesys.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgenesys_la-genesys_gl646.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgenesys_la-genesys_gl841.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgenesys_la-genesys_gl847.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgphoto2_i_la-gphoto2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgt68xx_la-gt68xx.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhp3500_la-hp3500.Plo@am__quote@
@ -3304,6 +3305,13 @@ libgenesys_la-genesys_gl841.lo: genesys_gl841.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgenesys_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgenesys_la-genesys_gl841.lo `test -f 'genesys_gl841.c' || echo '$(srcdir)/'`genesys_gl841.c
libgenesys_la-genesys_gl847.lo: genesys_gl847.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgenesys_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgenesys_la-genesys_gl847.lo -MD -MP -MF $(DEPDIR)/libgenesys_la-genesys_gl847.Tpo -c -o libgenesys_la-genesys_gl847.lo `test -f 'genesys_gl847.c' || echo '$(srcdir)/'`genesys_gl847.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libgenesys_la-genesys_gl847.Tpo $(DEPDIR)/libgenesys_la-genesys_gl847.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='genesys_gl847.c' object='libgenesys_la-genesys_gl847.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgenesys_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgenesys_la-genesys_gl847.lo `test -f 'genesys_gl847.c' || echo '$(srcdir)/'`genesys_gl847.c
libgphoto2_i_la-gphoto2.lo: gphoto2.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgphoto2_i_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgphoto2_i_la-gphoto2.lo -MD -MP -MF $(DEPDIR)/libgphoto2_i_la-gphoto2.Tpo -c -o libgphoto2_i_la-gphoto2.lo `test -f 'gphoto2.c' || echo '$(srcdir)/'`gphoto2.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libgphoto2_i_la-gphoto2.Tpo $(DEPDIR)/libgphoto2_i_la-gphoto2.Plo

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;
@ -166,7 +164,7 @@ static const SANE_Range threshold_curve_range = {
/* ------------------------------------------------------------------------ */
/*
* returns true if filter bit is on (monochrome scan)
* setup the hardware dependent functions
*/
static SANE_Status
genesys_init_cmd_set (Genesys_Device * dev)
@ -177,6 +175,8 @@ genesys_init_cmd_set (Genesys_Device * dev)
return sanei_gl646_init_cmd_set (dev);
case GENESYS_GL841:
return sanei_gl841_init_cmd_set (dev);
case GENESYS_GL847:
return sanei_gl847_init_cmd_set (dev);
default:
return SANE_STATUS_INVAL;
}
@ -284,13 +284,45 @@ sanei_genesys_set_reg_from_set (Genesys_Register_Set * reg, SANE_Byte address,
/* Read and write RAM, registers and AFE */
/* ------------------------------------------------------------------------ */
/**
* Write to one GL847 ASIC register
URB 10 control 0x40 0x04 0x83 0x00 len 2 wrote 0xa6 0x04
*/
static SANE_Status
sanei_genesys_write_gl847_register (Genesys_Device * dev, uint8_t reg, uint8_t val)
{
SANE_Status status;
uint8_t buffer[2];
/* Write to one register */
buffer[0]=reg;
buffer[1]=val;
status =
sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_BUFFER,
VALUE_SET_REGISTER, INDEX, 2, buffer);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "sanei_genesys_write_gl847_register (0x%02x, 0x%02x): failed : %s\n", reg, val, sane_strstatus (status));
return status;
}
DBG (DBG_io, "sanei_genesys_write_gl847_register (0x%02x, 0x%02x) completed\n",
reg, val);
return status;
}
/**
* Write to one ASIC register
*/
SANE_Status
sanei_genesys_write_register (Genesys_Device * dev, uint8_t reg, uint8_t val)
{
SANE_Status status;
/* route to gl847 function if needed */
if(dev->model->asic_type==GENESYS_GL847)
return sanei_genesys_write_gl847_register(dev, reg, val);
status =
sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER,
VALUE_SET_REGISTER, INDEX, 1, &reg);
@ -319,6 +351,29 @@ sanei_genesys_write_register (Genesys_Device * dev, uint8_t reg, uint8_t val)
return status;
}
/* read reg 0x41:
* URB 164 control 0xc0 0x04 0x8e 0x4122 len 2 read 0xfc 0x55
*/
static SANE_Status
sanei_genesys_read_gl847_register (Genesys_Device * dev, uint8_t reg, uint8_t * val)
{
SANE_Status status;
uint16_t value;
status =
sanei_usb_control_msg (dev->dn, REQUEST_TYPE_IN, REQUEST_BUFFER,
VALUE_GET_REGISTER, 0x22+(reg<<8), 2, (SANE_Byte *)&value);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"sanei_genesys_read_gl847_register (0x%02x): failed while setting register: %s\n",
reg, sane_strstatus (status));
return status;
}
*val=value & 0xff;
DBG( DBG_io2, "sanei_genesys_read_gl847_register(0x%02x)=0x%02x\n",reg,value & 0xff);
return status;
}
/* Read from one register */
SANE_Status
@ -326,6 +381,10 @@ sanei_genesys_read_register (Genesys_Device * dev, uint8_t reg, uint8_t * val)
{
SANE_Status status;
/* route to gl847 function if needed */
if(dev->model->asic_type==GENESYS_GL847)
return sanei_genesys_read_gl847_register(dev, reg, val);
status =
sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER,
VALUE_SET_REGISTER, INDEX, 1, &reg);
@ -361,6 +420,13 @@ SANE_Status
sanei_genesys_set_buffer_address (Genesys_Device * dev, uint32_t addr)
{
SANE_Status status;
if(dev->model->asic_type==GENESYS_GL847)
{
DBG (DBG_warn,
"sanei_genesys_set_buffer_address: shouldn't be used for GL847 \n");
return SANE_STATUS_GOOD;
}
DBG (DBG_io,
"sanei_genesys_set_buffer_address: setting address to 0x%05x\n",
@ -587,16 +653,29 @@ sanei_genesys_read_valid_words (Genesys_Device * dev, unsigned int *words)
uint8_t value;
DBG (DBG_proc, "sanei_genesys_read_valid_words\n");
RIE (sanei_genesys_read_register (dev, 0x44, &value));
*words = value;
RIE (sanei_genesys_read_register (dev, 0x43, &value));
*words += (value * 256);
RIE (sanei_genesys_read_register (dev, 0x42, &value));
if (dev->model->asic_type == GENESYS_GL646)
*words += ((value & 0x03) * 256 * 256);
if (dev->model->asic_type == GENESYS_GL847)
{
RIE (sanei_genesys_read_register (dev, 0x42, &value));
*words=(value & 0x03);
RIE (sanei_genesys_read_register (dev, 0x43, &value));
*words=*words*256+value;
RIE (sanei_genesys_read_register (dev, 0x44, &value));
*words=*words*256+value;
RIE (sanei_genesys_read_register (dev, 0x45, &value));
*words=*words*256+value;
}
else
*words += ((value & 0x0f) * 256 * 256);
{
RIE (sanei_genesys_read_register (dev, 0x44, &value));
*words = value;
RIE (sanei_genesys_read_register (dev, 0x43, &value));
*words += (value * 256);
RIE (sanei_genesys_read_register (dev, 0x42, &value));
if (dev->model->asic_type == GENESYS_GL646)
*words += ((value & 0x03) * 256 * 256);
else
*words += ((value & 0x0f) * 256 * 256);
}
DBG (DBG_proc, "sanei_genesys_read_valid_words: %d words\n", *words);
return SANE_STATUS_GOOD;
@ -631,7 +710,7 @@ Genesys_Register_Set *
sanei_genesys_get_address (Genesys_Register_Set * regs, SANE_Byte addr)
{
int i;
for (i = 0; i < GENESYS_MAX_REGS && regs[i].address; i++)
for (i = 0; i < GENESYS_MAX_REGS; i++)
{
if (regs[i].address == addr)
return &regs[i];
@ -1377,8 +1456,20 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data,
DBG (DBG_proc, "genesys_send_offset_and_shading (size = %d)\n", size);
/* ASIC higher than gl843 doesn't have register 2A/2B, so we route to
* a per ASIC shading data loading function if available */
if(dev->model->cmd_set->send_shading_data!=NULL)
{
status=dev->model->cmd_set->send_shading_data(dev, data, size);
DBG (DBG_proc, "genesys_send_offset_and_shading: completed\n");
return status;
}
/* gl646, gl84[123] case */
dpihw = sanei_genesys_read_reg_from_set (dev->reg, 0x05) >> 6;
/* TODO invert the test so only the 2 models behaving like that are
* tested instead of adding all the others */
/* many scanners send coefficient for lineart/gray like in color mode */
if (dev->settings.scan_mode < 2
&& dev->model->ccd_type != CCD_DSMOBILE600
@ -1766,8 +1857,10 @@ sanei_genesys_read_feed_steps (Genesys_Device * dev, unsigned int *steps)
RIE (sanei_genesys_read_register (dev, 0x48, &value));
if (dev->model->asic_type == GENESYS_GL646)
*steps += ((value & 0x03) * 256 * 256);
else
else if (dev->model->asic_type == GENESYS_GL841)
*steps += ((value & 0x0f) * 256 * 256);
else
*steps += ((value & 0x1f) * 256 * 256);
DBG (DBG_proc, "sanei_genesys_read_feed_steps: %d steps\n", *steps);
return SANE_STATUS_GOOD;
@ -3213,6 +3306,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
target_code);
break;
case CCD_CANONLIDE35:
case CIS_CANONLIDE100:
target_bright = 0xfa00;
target_dark = 0xa00;
o = 4; /*first four pixels are ignored */
@ -6055,7 +6149,10 @@ config_attach_genesys (SANEI_Config * config, const char *devname)
}
/* probes for scanner to attach to the backend */
static SANE_Status
#ifndef UNIT_TESTING
static
#endif
SANE_Status
probe_genesys_devices (void)
{
SANEI_Config config;
@ -6567,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

@ -36,6 +36,12 @@ usb 0x04a9 0x2213
# Canon LiDE 60
usb 0x04a9 0x221c
# Canon LiDE 100
usb 0x04a9 0x1904
# Canon LiDE 200
usb 0x04a9 0x1905
# Visioneer Strobe XP200
usb 0x04a7 0x0426

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

@ -137,7 +137,15 @@ static Genesys_Frontend Wolfson[] = {
, {0xa0, 0xa0, 0xa0}
, {0x07, 0x00, 0x00}
}
,
,
{DAC_CANONLIDE200,
{0x9d, 0x91, 0x00, 0x00}
, {0x00, 0x00, 0x00}
, {0x00, 0x3f, 0x00}
, {0x32, 0x04, 0x00}
, {0x00, 0x00, 0x00}
}
,
};
@ -393,6 +401,56 @@ static Genesys_Sensor Sensor[] = {
1.0, 1.0, 1.0,
NULL, NULL, NULL}
,
/* CANONLIDE200 */
{CIS_CANONLIDE200,
1200, /* optical resolution */
87, /* black pixels */
16, /* dummy pixels */
0,
10400,
210,
200,
{0x00, 0x00, 0x00, 0x00},
/* reg 0x10 - 0x1d */
{0x02, 0x7d, 0x02, 0x7d, 0x02, 0x7d, /* EXPR/EXPG/EXPB */
0x10, 0x0c, 0x00, 0xff, 0x34, 0x00, 0x02, 0x04 },
/* reg 0x52 - 0x5e */
{0x03, 0x07,
0x00, 0x00, 0x00, 0x00,
0x2a, 0xe1,
0x55,
0x00, 0x00, 0x00,
0x41
}
,
1.0, 1.0, 1.0,
NULL, NULL, NULL}
,
/* CANONLIDE100 */
{CIS_CANONLIDE100,
1200, /* optical resolution */
87, /* black pixels */
16, /* dummy pixels */
0,
10592, /* 10272 + 320 start */
210,
200,
{0x00, 0x00, 0x00, 0x00},
/* reg 0x10 - 0x1d */
{0x03, 0x00, 0x02, 0x00, 0x01, 0x80, /* EXPR/EXPG/EXPB */
0x10, 0x08, 0x00, 0xff, 0x34, 0x00, 0x02, 0x04 },
/* reg 0x52 - 0x5e */
{0x03, 0x07,
0x00, 0x00, 0x00, 0x00,
0x2a, 0xe1,
0x55,
0x00, 0x00, 0x00,
0x41
}
,
1.0, 1.0, 1.0,
NULL, NULL, NULL}
,
};
@ -492,6 +550,14 @@ static Genesys_Gpo Gpo[] = {
{0xfb, 0x00}, /* 6e, 6f */
}
,
/* CANONLIDE200 */
{GPO_CANONLIDE200,
{0xfb, 0x20} /* 0xfb when idle , 0xf9/0xe9 (1200) when scanning */
,
{0xff, 0x00}
,
}
,
};
static Genesys_Motor Motor[] = {
@ -712,6 +778,40 @@ static Genesys_Motor Motor[] = {
0.8,
},},},
},
{MOTOR_CANONLIDE100, /* Canon LiDE 100 */
1200,
4800,
2, /* maximum step type count */
1, /* maximum power modes count */
{ /* motor slopes */
{ /* power mode 0 */
{ 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 */
},
},
},
{MOTOR_CANONLIDE200, /* Canon LiDE 200 */
1200,
2400,
1,
1,
{{{
2343, /* first value of a recorded motor slope */
534, /* last value of recorded slope table */
60,
0.8,
},
{
3500,
1400,
60,
0.8,
},},},
},
};
/* here we have the various device settings...
@ -821,6 +921,115 @@ static Genesys_Model canon_lide_50_model = {
400
};
static Genesys_Model canon_lide_100_model = {
"canon-lide-100", /* Name */
"Canon", /* Device vendor string */
"LiDE 100", /* Device model name */
GENESYS_GL847,
NULL,
{1200, 600, 300, 150, 100, 75, 0}, /* possible x-resolutions */
{1200, 600, 300, 150, 100, 75, 0}, /* possible y-resolutions */
{16, 8, 0}, /* possible depths in gray mode */
{16, 8, 0}, /* possible depths in color mode */
SANE_FIX (6.42), /* Start of scan area in mm (x) */
SANE_FIX (0.0), /* Start of scan area in mm (y) */
SANE_FIX (217.44), /* Size of scan area in mm (x) */
SANE_FIX (299.0), /* Size of scan area 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 scan area in TA mode in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
SANE_FIX (100.0), /* Size of scan area in TA mode in mm (x) */
SANE_FIX (100.0), /* Size of scan area in TA mode in mm (y) */
SANE_FIX (0.0), /* Start of white strip in TA mode in mm (y) */
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
SANE_TRUE, /* Is this a CIS scanner? */
SANE_FALSE, /* Is this a sheetfed scanner? */
CIS_CANONLIDE100,
DAC_CANONLIDE200,
GPO_CANONLIDE200,
MOTOR_CANONLIDE100,
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_NO_CALIBRATION
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_WHITE_CALIBRATION
| GENESYS_FLAG_CUSTOM_GAMMA,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW,
150,
400
};
static Genesys_Model canon_lide_200_model = {
"canon-lide-200", /* Name */
"Canon", /* Device vendor string */
"LiDE 200", /* Device model name */
GENESYS_GL847,
NULL,
{1200, 600, 300, 150, 75, 0}, /* possible x-resolutions */
{1200, 600, 300, 150, 75, 0}, /* possible y-resolutions */
{16, 8, 0}, /* possible depths in gray mode */
{16, 8, 0}, /* possible depths in color mode */
SANE_FIX (0.42), /* Start of scan area in mm (x) */
SANE_FIX (7.9), /* Start of scan area in mm (y) */
SANE_FIX (218.0), /* Size of scan area in mm (x) */
SANE_FIX (299.0), /* Size of scan area 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 scan area in TA mode in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
SANE_FIX (100.0), /* Size of scan area in TA mode in mm (x) */
SANE_FIX (100.0), /* Size of scan area in TA mode in mm (y) */
SANE_FIX (0.0), /* Start of white strip in TA mode in mm (y) */
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
SANE_TRUE, /* Is this a CIS scanner? */
SANE_FALSE, /* Is this a sheetfed scanner? */
CIS_CANONLIDE200,
DAC_CANONLIDE200,
GPO_CANONLIDE200,
MOTOR_CANONLIDE200,
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_NO_CALIBRATION
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_WHITE_CALIBRATION
| GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_HALF_CCD_MODE,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW,
150,
400
};
static Genesys_Model canon_lide_60_model = {
"canon-lide-60", /* Name */
"Canon", /* Device vendor string */
@ -1906,5 +2115,8 @@ static Genesys_USB_Device_Entry genesys_usb_device_list[] = {
{0x0a82, 0x480c, &syscan_docketport_685_model},
{0x1dcc, 0x4810, &dct_docketport_487_model},
{0x1dcc, 0x4812, &syscan_docketport_467_model},
/* GL847 devices */
{0x04a9, 0x1904, &canon_lide_100_model},
{0x04a9, 0x1905, &canon_lide_200_model},
{0, 0, NULL}
};

Wyświetl plik

@ -5752,7 +5752,8 @@ static Genesys_Command_Set gl646_cmd_set = {
gl646_search_strip,
gl646_is_compatible_calibration,
gl646_move_to_ta
gl646_move_to_ta,
NULL
};
SANE_Status

Wyświetl plik

@ -107,6 +107,7 @@
#define REG05_DPIHW_600 0x00
#define REG05_DPIHW_1200 0x40
#define REG05_DPIHW_2400 0x80
#define REG05_DPIHW_4800 0xc0
#define REG05_GMMTYPE 0x30
#define REG05_GMM14BIT 0x10
#define REG05_GMMENB 0x08

Wyświetl plik

@ -6296,6 +6296,7 @@ static Genesys_Command_Set gl841_cmd_set = {
gl841_search_strip,
gl841_is_compatible_calibration,
NULL,
NULL
};

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,491 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2010 Stéphane Voltz <stef.dev@free.fr>
This file is part of the SANE package.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
If you do not wish that, delete this exception notice.
*/
#include "../include/sane/config.h"
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include "../include/sane/sane.h"
#include "../include/sane/sanei.h"
#include "../include/sane/saneopts.h"
#undef BACKEND_NAME
#define BACKEND_NAME genesys_gl847
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_config.h"
#include "../include/sane/sanei_usb.h"
#include "../include/_stdint.h"
#include "genesys.h"
#define DBGSTART DBG (DBG_proc, "%s start\n", __FUNCTION__);
#define DBGCOMPLETED DBG (DBG_proc, "%s completed\n", __FUNCTION__);
#define REG01 0x01
#define REG01_CISSET 0x80
#define REG01_DOGENB 0x40
#define REG01_DVDSET 0x20
#define REG01_STAGGER 0x10
#define REG01_COMPENB 0x08
#define REG01_TRUEGRAY 0x04
#define REG01_SHDAREA 0x02
#define REG01_SCAN 0x01
#define REG02 0x02
#define REG02_NOTHOME 0x80
#define REG02_ACDCDIS 0x40
#define REG02_AGOHOME 0x20
#define REG02_MTRPWR 0x10
#define REG02_FASTFED 0x08
#define REG02_MTRREV 0x04
#define REG02_HOMENEG 0x02
#define REG02_LONGCURV 0x01
#define REG03 0x03
#define REG03_LAMPDOG 0x80
#define REG03_AVEENB 0x40
#define REG03_XPASEL 0x20
#define REG03_LAMPPWR 0x10
#define REG03_LAMPTIM 0x0f
#define REG04 0x04
#define REG04_LINEART 0x80
#define REG04_BITSET 0x40
#define REG04_AFEMOD 0x30
#define REG04_FILTER 0x0c
#define REG04_FESET 0x03
#define REG04S_AFEMOD 4
#define REG05 0x05
#define REG05_DPIHW 0xc0
#define REG05_DPIHW_600 0x00
#define REG05_DPIHW_1200 0x40
#define REG05_DPIHW_2400 0x80
#define REG05_DPIHW_4800 0xc0
#define REG05_MTLLAMP 0x30
#define REG05_GMMENB 0x08
#define REG05_MTLBASE 0x03
#define REG06_SCANMOD 0xe0
#define REG06S_SCANMOD 5
#define REG06_PWRBIT 0x10
#define REG06_GAIN4 0x08
#define REG06_OPTEST 0x07
#define REG07_LAMPSIM 0x80
#define REG08_DRAM2X 0x80
#define REG08_MPENB 0x20
#define REG08_CIS_LINE 0x10
#define REG08_IR1ENB 0x08
#define REG08_IR2ENB 0x04
#define REG08_ENB24M 0x01
#define REG09_MCNTSET 0xc0
#define REG09_EVEN1ST 0x20
#define REG09_BLINE1ST 0x10
#define REG09_BACKSCAN 0x08
#define REG09_ENHANCE 0x04
#define REG09_SHORTTG 0x02
#define REG09_NWAIT 0x01
#define REG09S_MCNTSET 6
#define REG09S_CLKSET 4
#define REG0A_LPWMEN 0x10
#define REG0B 0x0b
#define REG0B_DRAMSEL 0x07
#define REG0B_ENBDRAM 0x08
#define REG0B_ENBDRAM 0x08
#define REG0B_RFHDIS 0x10
#define REG0B_CLKSET 0xe0
#define REG0B_24MHZ 0x00
#define REG0B_30MHZ 0x20
#define REG0B_40MHZ 0x40
#define REG0B_48MHZ 0x60
#define REG0B_60MHZ 0x80
#define REG0D 0x0d
#define REG0D_FULLSTP 0x10
#define REG0D_SEND 0x80
#define REG0D_CLRMCNT 0x04
#define REG0D_CLRDOCJM 0x02
#define REG0D_CLRLNCNT 0x01
#define REG0F 0x0f
#define REG16_CTRLHI 0x80
#define REG16_TOSHIBA 0x40
#define REG16_TGINV 0x20
#define REG16_CK1INV 0x10
#define REG16_CK2INV 0x08
#define REG16_CTRLINV 0x04
#define REG16_CKDIS 0x02
#define REG16_CTRLDIS 0x01
#define REG17_TGMODE 0xc0
#define REG17_TGMODE_NO_DUMMY 0x00
#define REG17_TGMODE_REF 0x40
#define REG17_TGMODE_XPA 0x80
#define REG17_TGW 0x3f
#define REG17S_TGW 0
#define REG18_CNSET 0x80
#define REG18_DCKSEL 0x60
#define REG18_CKTOGGLE 0x10
#define REG18_CKDELAY 0x0c
#define REG18_CKSEL 0x03
#define REG1A_SW2SET 0x80
#define REG1A_SW1SET 0x40
#define REG1A_MANUAL3 0x02
#define REG1A_MANUAL1 0x01
#define REG1A_CK4INV 0x08
#define REG1A_CK3INV 0x04
#define REG1A_LINECLP 0x02
#define REG1C_TGTIME 0x07
#define REG1D_CK4LOW 0x80
#define REG1D_CK3LOW 0x40
#define REG1D_CK1LOW 0x20
#define REG1D_TGSHLD 0x1f
#define REG1DS_TGSHLD 0
#define REG1E_WDTIME 0xf0
#define REG1ES_WDTIME 4
#define REG1E_LINESEL 0x0f
#define REG1ES_LINESEL 0
#define REG40 0x40
#define REG40_CHKVER 0x10
#define REG40_HISPDFLG 0x04
#define REG40_MOTMFLG 0x02
#define REG40_DATAENB 0x01
#define REG41_PWRBIT 0x80
#define REG41_BUFEMPTY 0x40
#define REG41_FEEDFSH 0x20
#define REG41_SCANFSH 0x10
#define REG41_HOMESNR 0x08
#define REG41_LAMPSTS 0x04
#define REG41_FEBUSY 0x02
#define REG41_MOTORENB 0x01
#define REG58_VSMP 0xf8
#define REG58S_VSMP 3
#define REG58_VSMPW 0x07
#define REG58S_VSMPW 0
#define REG59_BSMP 0xf8
#define REG59S_BSMP 3
#define REG59_BSMPW 0x07
#define REG59S_BSMPW 0
#define REG5A_ADCLKINV 0x80
#define REG5A_RLCSEL 0x40
#define REG5A_CDSREF 0x30
#define REG5AS_CDSREF 4
#define REG5A_RLC 0x0f
#define REG5AS_RLC 0
#define REG5E_DECSEL 0xe0
#define REG5ES_DECSEL 5
#define REG5E_STOPTIM 0x1f
#define REG5ES_STOPTIM 0
#define REG60 0x60
#define REG60_Z1MOD 0x1f
#define REG61 0x61
#define REG61_Z1MOD 0xff
#define REG62 0x62
#define REG62_Z1MOD 0xff
#define REG63 0x63
#define REG63_Z2MOD 0x1f
#define REG64 0x64
#define REG64_Z2MOD 0xff
#define REG65 0x65
#define REG65_Z2MOD 0xff
#define REG60S_STEPSEL 5
#define REG60_FSTPSEL 0xe0
#define REG60_FULLSTEP 0x00
#define REG60_HALFSTEP 0x20
#define REG60_EIGHTHSTEP 0x60
#define REG60_16THSTEP 0x80
#define REG63S_STEPSEL 5
#define REG63_FSTPSEL 0xe0
#define REG63_FULLSTEP 0x00
#define REG63_HALFSTEP 0x20
#define REG63_EIGHTHSTEP 0x60
#define REG63_16THSTEP 0x80
#define REG67 0x67
#define REG67_MTRPWM 0x80
#define REG68 0x68
#define REG68_FASTPWM 0x80
#define REG6B 0x6b
#define REG6B_MULTFILM 0x80
#define REG6B_GPOM13 0x40
#define REG6B_GPOM12 0x20
#define REG6B_GPOM11 0x10
#define REG6B_GPO18 0x02
#define REG6B_GPO17 0x01
#define REG6C 0x6c
#define REG6C_GPIO16 0x80
#define REG6C_GPIO15 0x40
#define REG6C_GPIO14 0x20
#define REG6C_GPIO13 0x10
#define REG6C_GPIO12 0x08
#define REG6C_GPIO11 0x04
#define REG6C_GPIO10 0x02
#define REG6C_GPIO9 0x01
#define REG6C_GPIOH 0xff
#define REG6C_GPIOL 0xff
#define REG6D 0x6d
#define REG6E 0x6e
#define REG6F 0x6f
#define REG87_LEDADD 0x04
#define REGA6 0xa6
#define REGA7 0xa7
#define REGA9 0xa9
#define SCAN_FLAG_SINGLE_LINE 0x01
#define SCAN_FLAG_DISABLE_SHADING 0x02
#define SCAN_FLAG_DISABLE_GAMMA 0x04
#define SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE 0x08
#define SCAN_FLAG_IGNORE_LINE_DISTANCE 0x10
#define SCAN_FLAG_USE_OPTICAL_RES 0x20
#define SCAN_FLAG_DISABLE_LAMP 0x40
#define SCAN_FLAG_DYNAMIC_LINEART 0x80
/**
* writable scanner registers */
enum
{
reg_0x01 = 0,
reg_0x02,
reg_0x03,
reg_0x04,
reg_0x05,
reg_0x06,
reg_0x08,
reg_0x09,
reg_0x0a,
reg_0x0b,
reg_0x0c,
reg_0x0d,
reg_0x0e,
reg_0x0f,
reg_0x10,
reg_0x11,
reg_0x12,
reg_0x13,
reg_0x14,
reg_0x15,
reg_0x16,
reg_0x17,
reg_0x18,
reg_0x19,
reg_0x1a,
reg_0x1b,
reg_0x1c,
reg_0x1d,
reg_0x1e,
reg_0x1f,
reg_0x20,
reg_0x21,
reg_0x22,
reg_0x23,
reg_0x24,
reg_0x25,
reg_0x26,
reg_0x27,
reg_0x2c,
reg_0x2d,
reg_0x2e,
reg_0x2f,
reg_0x30,
reg_0x31,
reg_0x32,
reg_0x33,
reg_0x34,
reg_0x35,
reg_0x36,
reg_0x37,
reg_0x38,
reg_0x39,
reg_0x3a,
reg_0x3b,
reg_0x3d,
reg_0x3e,
reg_0x3f,
reg_0x51,
reg_0x52,
reg_0x53,
reg_0x54,
reg_0x55,
reg_0x56,
reg_0x57,
reg_0x58,
reg_0x59,
reg_0x5a,
reg_0x5e,
reg_0x5f,
reg_0x60,
reg_0x61,
reg_0x62,
reg_0x63,
reg_0x64,
reg_0x65,
reg_0x67,
reg_0x68,
reg_0x69,
reg_0x6a,
reg_0x6b,
reg_0x6c,
reg_0x6d,
reg_0x6e,
reg_0x6f,
reg_0x74,
reg_0x75,
reg_0x76,
reg_0x77,
reg_0x78,
reg_0x79,
reg_0x7a,
reg_0x7b,
reg_0x7c,
reg_0x7d,
reg_0x87,
reg_0x9d,
reg_0xa2,
reg_0xa6,
reg_0xa7,
reg_0xa8,
reg_0xa9,
reg_0xbd,
reg_0xbe,
reg_0xc5,
reg_0xc6,
reg_0xc7,
reg_0xc8,
reg_0xc9,
reg_0xca,
reg_0xd0,
reg_0xd1,
reg_0xd2,
reg_0xe0,
reg_0xe1,
reg_0xe2,
reg_0xe3,
reg_0xe4,
reg_0xe5,
reg_0xe6,
reg_0xe7,
reg_0xe8,
reg_0xe9,
reg_0xea,
reg_0xeb,
reg_0xec,
reg_0xed,
reg_0xee,
reg_0xef,
reg_0xf0,
reg_0xf1,
reg_0xf2,
reg_0xf3,
reg_0xf4,
reg_0xf5,
reg_0xf6,
reg_0xf7,
reg_0xf8,
reg_0xfe,
GENESYS_GL847_MAX_REGS
};
#define SETREG(adr,val) {dev->reg[reg_##adr].address=adr;dev->reg[reg_##adr].value=val;}
typedef struct
{
uint8_t rd0;
uint8_t rd1;
uint8_t rd2;
uint8_t re0;
uint8_t re1;
uint8_t re2;
uint8_t re3;
uint8_t re4;
uint8_t re5;
uint8_t re6;
uint8_t re7;
} Memory_layout;
static Memory_layout layouts[]={
/* LIDE 100 */
{
0x0a, 0x15, 0x20,
0x00, 0xac, 0x02, 0x55, 0x02, 0x56, 0x03, 0xff
},
/* LIDE 200 */
{
0x0a, 0x1f, 0x34,
0x01, 0x24, 0x02, 0x91, 0x02, 0x92, 0x03, 0xff
}
};

Wyświetl plik

@ -123,6 +123,8 @@
#define GPIO_OUTPUT_ENABLE 0x89
#define GPIO_READ 0x8a
#define GPIO_WRITE 0x8b
#define VALUE_BUF_ENDACCESS 0x8c
#define VALUE_GET_REGISTER 0x8e
#define INDEX 0x00
/* todo: used?
@ -146,8 +148,8 @@
#define AFE_SET 2
#define AFE_POWER_SAVE 4
#define LOWORD(x) ((uint16_t)(x & 0xffff))
#define HIWORD(x) ((uint16_t)(x >> 16))
#define LOWORD(x) ((uint16_t)((x) & 0xffff))
#define HIWORD(x) ((uint16_t)((x) >> 16))
#define LOBYTE(x) ((uint8_t)((x) & 0xFF))
#define HIBYTE(x) ((uint8_t)((x) >> 8))
@ -240,9 +242,11 @@ Genesys_Color_Order;
#define GENESYS_GL646 646
#define GENESYS_GL841 841
#define GENESYS_GL846 846
#define GENESYS_GL847 847
#define GENESYS_GL848 848
/*135 registers for gl841 + 1 null-reg*/
#define GENESYS_MAX_REGS 136
#define GENESYS_MAX_REGS 256
#define DAC_WOLFSON_UMAX 0
#define DAC_WOLFSON_ST12 1
@ -255,6 +259,7 @@ Genesys_Color_Order;
#define DAC_WOLFSON_XP300 8
#define DAC_WOLFSON_HP3670 9
#define DAC_WOLFSON_DSM600 10
#define DAC_CANONLIDE200 11
#define CCD_UMAX 0
#define CCD_ST12 1 /* SONY ILX548: 5340 Pixel ??? */
@ -271,6 +276,8 @@ Genesys_Color_Order;
#define CCD_DSMOBILE600 12
#define CCD_XP300 13
#define CCD_DP685 14
#define CIS_CANONLIDE200 15
#define CIS_CANONLIDE100 16
#define GPO_UMAX 0
#define GPO_ST12 1
@ -284,6 +291,7 @@ Genesys_Color_Order;
#define GPO_HP3670 9
#define GPO_DP665 10
#define GPO_DP685 11
#define GPO_CANONLIDE200 12
#define MOTOR_UMAX 0
#define MOTOR_5345 1
@ -297,6 +305,8 @@ Genesys_Color_Order;
#define MOTOR_DP665 10
#define MOTOR_ROADWARRIOR 11
#define MOTOR_DSMOBILE_600 12
#define MOTOR_CANONLIDE200 13
#define MOTOR_CANONLIDE100 14
/* Forward typedefs */
@ -416,6 +426,12 @@ typedef struct Genesys_Command_Set
* move scanning head to transparency adapter
*/
SANE_Status (*move_to_ta) (Genesys_Device * dev);
/**
* write shading data calibration to ASIC
*/
SANE_Status (*send_shading_data) (Genesys_Device * dev, uint8_t * data, int size);
} Genesys_Command_Set;
typedef struct Genesys_Model
@ -567,8 +583,8 @@ struct Genesys_Device
SANE_String calib_file;
Genesys_Model *model;
Genesys_Register_Set reg[GENESYS_MAX_REGS];
Genesys_Register_Set calib_reg[GENESYS_MAX_REGS];
Genesys_Register_Set reg[256];
Genesys_Register_Set calib_reg[256];
Genesys_Settings settings;
Genesys_Frontend frontend;
Genesys_Sensor sensor;
@ -769,5 +785,6 @@ sanei_genesys_buffer_consume(Genesys_Buffer * buf, size_t size);
/*---------------------------------------------------------------------------*/
extern SANE_Status sanei_gl646_init_cmd_set (Genesys_Device * dev);
extern SANE_Status sanei_gl841_init_cmd_set (Genesys_Device * dev);
extern SANE_Status sanei_gl847_init_cmd_set (Genesys_Device * dev);
#endif /* not GENESYS_LOW_H */

Wyświetl plik

@ -278,6 +278,12 @@ extern SANE_Status sanei_usb_clear_halt (SANE_Int dn);
*/
#define HAVE_SANEI_USB_CLEAR_HALT
/** Reset device
*
* @param dn device number
*/
extern SANE_Status sanei_usb_reset (SANE_Int dn);
/** Initiate a bulk transfer read.
*
* Read up to size bytes from the device to buffer. After the read, size

Wyświetl plik

@ -2014,6 +2014,34 @@ sanei_usb_clear_halt (SANE_Int dn)
return SANE_STATUS_GOOD;
}
SANE_Status
sanei_usb_reset (SANE_Int dn)
{
#ifdef HAVE_LIBUSB
int ret;
ret = usb_reset (devices[dn].libusb_handle);
if (ret){
DBG (1, "sanei_usb_reset: ret=%d\n", ret);
return SANE_STATUS_INVAL;
}
#elif defined(HAVE_LIBUSB_1_0)
int ret;
ret = libusb_reset_device (devices[dn].lu_handle);
if (ret){
DBG (1, "sanei_usb_reset: ret=%d\n", ret);
return SANE_STATUS_INVAL;
}
#else /* not HAVE_LIBUSB && not HAVE_LIBUSB_1_0 */
DBG (1, "sanei_usb_reset: libusb support missing\n");
#endif /* HAVE_LIBUSB || HAVE_LIBUSB_1_0 */
return SANE_STATUS_GOOD;
}
SANE_Status
sanei_usb_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
{