kopia lustrzana https://gitlab.com/sane-project/backends
add support for Ambir/Syscan DS685
rodzic
eb66f734ba
commit
ef4c5102ca
|
@ -1312,6 +1312,7 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data,
|
||||||
&& dev->model->ccd_type != CCD_DSMOBILE600
|
&& dev->model->ccd_type != CCD_DSMOBILE600
|
||||||
&& dev->model->ccd_type != CCD_XP300
|
&& dev->model->ccd_type != CCD_XP300
|
||||||
&& dev->model->ccd_type != CCD_DP665
|
&& dev->model->ccd_type != CCD_DP665
|
||||||
|
&& dev->model->ccd_type != CCD_DP685
|
||||||
&& dev->model->ccd_type != CCD_ROADWARRIOR
|
&& dev->model->ccd_type != CCD_ROADWARRIOR
|
||||||
&& dev->model->ccd_type != CCD_HP2300
|
&& dev->model->ccd_type != CCD_HP2300
|
||||||
&& dev->model->ccd_type != CCD_HP2400
|
&& dev->model->ccd_type != CCD_HP2400
|
||||||
|
@ -3030,6 +3031,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
|
||||||
case CCD_XP300:
|
case CCD_XP300:
|
||||||
case CCD_ROADWARRIOR:
|
case CCD_ROADWARRIOR:
|
||||||
case CCD_DP665:
|
case CCD_DP665:
|
||||||
|
case CCD_DP685:
|
||||||
case CCD_DSMOBILE600:
|
case CCD_DSMOBILE600:
|
||||||
target_code = 0xdc00;
|
target_code = 0xdc00;
|
||||||
o = 4;
|
o = 4;
|
||||||
|
@ -3699,7 +3701,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DBG (DBG_info, "genesys_flatbed_calibration\n");
|
DBG (DBG_info, "genesys_sheetfed_calibration\n");
|
||||||
|
|
||||||
/* led, offset and gain calibration are influenced by scan
|
/* led, offset and gain calibration are influenced by scan
|
||||||
* settings. So we set it to sensor resolution */
|
* settings. So we set it to sensor resolution */
|
||||||
|
@ -3729,7 +3731,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (DBG_error,
|
DBG (DBG_error,
|
||||||
"genesys_flatbed_calibration: led calibration failed: %s\n",
|
"genesys_sheetfed_calibration: led calibration failed: %s\n",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -3742,7 +3744,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (DBG_error,
|
DBG (DBG_error,
|
||||||
"genesys_flatbed_calibration: offset calibration failed: %s\n",
|
"genesys_sheetfed_calibration: offset calibration failed: %s\n",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -3753,7 +3755,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (DBG_error,
|
DBG (DBG_error,
|
||||||
"genesys_flatbed_calibration: coarse gain calibration: %s\n",
|
"genesys_sheetfed_calibration: coarse gain calibration: %s\n",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -3767,7 +3769,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (DBG_error,
|
DBG (DBG_error,
|
||||||
"genesys_flatbed_calibration: failed to send calibration registers: %s\n",
|
"genesys_sheetfed_calibration: failed to send calibration registers: %s\n",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -3776,7 +3778,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (DBG_error,
|
DBG (DBG_error,
|
||||||
"genesys_flatbed_calibration: failed to do static calibration: %s\n",
|
"genesys_sheetfed_calibration: failed to do static calibration: %s\n",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,3 +62,6 @@ usb 0x0a82 0x4800
|
||||||
|
|
||||||
# DCT DocketPort 487
|
# DCT DocketPort 487
|
||||||
usb 0x1dcc 0x4810
|
usb 0x1dcc 0x4810
|
||||||
|
|
||||||
|
# Syscan/Ambir DocketPort 685
|
||||||
|
usb 0x0a82 0x480c
|
||||||
|
|
|
@ -115,7 +115,7 @@ static Genesys_Frontend Wolfson[] = {
|
||||||
, {0x93, 0x93, 0x93}
|
, {0x93, 0x93, 0x93}
|
||||||
, {0x07, 0x00, 0x00}
|
, {0x07, 0x00, 0x00}
|
||||||
}
|
}
|
||||||
, /* 8: XP300 */
|
, /* 8: HP3670 */
|
||||||
{DAC_WOLFSON_HP3670, /* uses one write for offset or gain like hp2300/2400 */
|
{DAC_WOLFSON_HP3670, /* uses one write for offset or gain like hp2300/2400 */
|
||||||
{0x00, 0x03, 0x04, 0x02}
|
{0x00, 0x03, 0x04, 0x02}
|
||||||
, {0x00, 0x00, 0x00}
|
, {0x00, 0x00, 0x00}
|
||||||
|
@ -124,7 +124,7 @@ static Genesys_Frontend Wolfson[] = {
|
||||||
, {0x00, 0x00, 0x00}
|
, {0x00, 0x00, 0x00}
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{DAC_WOLFSON_DSM600,{0x00, 0x35, 0x20, 0x14} /* 7a: DSMOBILE600 */
|
{DAC_WOLFSON_DSM600,{0x00, 0x35, 0x20, 0x14} /* 9: DSMOBILE600 */
|
||||||
, {0x00, 0x00, 0x00}
|
, {0x00, 0x00, 0x00}
|
||||||
, {0x85, 0x85, 0x85}
|
, {0x85, 0x85, 0x85}
|
||||||
, {0xa0, 0xa0, 0xa0}
|
, {0xa0, 0xa0, 0xa0}
|
||||||
|
@ -364,6 +364,28 @@ static Genesys_Sensor Sensor[] = {
|
||||||
1.0, 1.0, 1.0,
|
1.0, 1.0, 1.0,
|
||||||
NULL, NULL, NULL}
|
NULL, NULL, NULL}
|
||||||
,
|
,
|
||||||
|
/* 13: Strobe XP300 */
|
||||||
|
{CCD_DP685, 600,
|
||||||
|
27, /*(black) */
|
||||||
|
27, /* (dummy) */
|
||||||
|
0, /* (startxoffset) */
|
||||||
|
5020, /*sensor_pixels */
|
||||||
|
210,
|
||||||
|
200,
|
||||||
|
{0x00, 0x00, 0x00, 0x00},
|
||||||
|
{0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x02, 0x04, 0x50,
|
||||||
|
0x10, 0x00, 0x20, 0x02
|
||||||
|
},
|
||||||
|
{0x04, 0x05,
|
||||||
|
0x00, 0x00, 0x00, 0x00, /*[GB](HI|LOW) not needed for cis */
|
||||||
|
0x54, 0x03,
|
||||||
|
0x00, /*TODO: bit7 */
|
||||||
|
0x00, 0x00, 0x00, 0x01 /*TODO (these do no harm, but may be neccessery for CCD) */
|
||||||
|
}
|
||||||
|
,
|
||||||
|
1.0, 1.0, 1.0,
|
||||||
|
NULL, NULL, NULL}
|
||||||
|
,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -454,7 +476,15 @@ static Genesys_Gpo Gpo[] = {
|
||||||
GPO_DP665,
|
GPO_DP665,
|
||||||
{0x18, 0x00},/*0x19,0x00*/
|
{0x18, 0x00},/*0x19,0x00*/
|
||||||
{0xbb, 0x00},
|
{0xbb, 0x00},
|
||||||
}
|
}
|
||||||
|
,
|
||||||
|
/* Syscan DP 685 */
|
||||||
|
{
|
||||||
|
GPO_DP685,
|
||||||
|
{0x3f, 0x46}, /* 6c, 6d */
|
||||||
|
{0xfb, 0x00}, /* 6e, 6f */
|
||||||
|
}
|
||||||
|
,
|
||||||
};
|
};
|
||||||
|
|
||||||
static Genesys_Motor Motor[] = {
|
static Genesys_Motor Motor[] = {
|
||||||
|
@ -1565,6 +1595,58 @@ static Genesys_Model syscan_docketport_467_model = {
|
||||||
400
|
400
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static Genesys_Model syscan_docketport_685_model = {
|
||||||
|
"syscan-docketport-685", /* Name */
|
||||||
|
"Syscan/Ambir", /* Device vendor string */
|
||||||
|
"DocketPORT 685", /* Device model name */
|
||||||
|
GENESYS_GL841,
|
||||||
|
NULL,
|
||||||
|
|
||||||
|
{600, 300, 150, 75, 0}, /* possible x-resolutions */
|
||||||
|
{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.0), /* Start of scan area in mm (x) */
|
||||||
|
SANE_FIX (1.0), /* Start of scan area in mm (y) */
|
||||||
|
SANE_FIX (212.0), /* Size of scan area in mm (x) */
|
||||||
|
SANE_FIX (500), /* 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 (26.5), /* Size of scan area after paper sensor stops
|
||||||
|
sensing document in mm */
|
||||||
|
/* this is larger than needed -- accounts for second sensor head, which is a
|
||||||
|
calibration item */
|
||||||
|
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_TRUE, /* Is this a sheetfed scanner? */
|
||||||
|
CCD_DP685,
|
||||||
|
DAC_WOLFSON_DSM600,
|
||||||
|
GPO_DP685,
|
||||||
|
MOTOR_XP300,
|
||||||
|
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
|
||||||
|
| GENESYS_FLAG_SKIP_WARMUP
|
||||||
|
| GENESYS_FLAG_OFFSET_CALIBRATION
|
||||||
|
| GENESYS_FLAG_DARK_CALIBRATION,
|
||||||
|
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
|
||||||
|
100,
|
||||||
|
400
|
||||||
|
};
|
||||||
|
|
||||||
static Genesys_Model syscan_docketport_485_model = {
|
static Genesys_Model syscan_docketport_485_model = {
|
||||||
"syscan-docketport-485", /* Name */
|
"syscan-docketport-485", /* Name */
|
||||||
"Syscan/Ambir", /* Device vendor string */
|
"Syscan/Ambir", /* Device vendor string */
|
||||||
|
@ -1689,6 +1771,7 @@ static Genesys_USB_Device_Entry genesys_usb_device_list[] = {
|
||||||
{0x04a7, 0x049b, &visioneer_xp100_r3_model},
|
{0x04a7, 0x049b, &visioneer_xp100_r3_model},
|
||||||
{0x0a17, 0x3210, &pentax_dsmobile_600_model},
|
{0x0a17, 0x3210, &pentax_dsmobile_600_model},
|
||||||
{0x0a82, 0x4800, &syscan_docketport_485_model},
|
{0x0a82, 0x4800, &syscan_docketport_485_model},
|
||||||
|
{0x0a82, 0x480c, &syscan_docketport_685_model},
|
||||||
{0x1dcc, 0x4810, &dct_docketport_487_model},
|
{0x1dcc, 0x4810, &dct_docketport_487_model},
|
||||||
{0, 0, NULL}
|
{0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1475,7 +1475,7 @@ gl841_init_registers (Genesys_Device * dev)
|
||||||
dev->reg[reg_0x06].value |= REG06_GAIN4;
|
dev->reg[reg_0x06].value |= REG06_GAIN4;
|
||||||
|
|
||||||
/* XP300 CCD needs different clock and clock/pixels values */
|
/* XP300 CCD needs different clock and clock/pixels values */
|
||||||
if (dev->model->ccd_type != CCD_XP300)
|
if (dev->model->ccd_type != CCD_XP300 && dev->model->ccd_type != CCD_DP685)
|
||||||
{
|
{
|
||||||
dev->reg[reg_0x06].value |= 0 << REG06S_SCANMOD;
|
dev->reg[reg_0x06].value |= 0 << REG06S_SCANMOD;
|
||||||
dev->reg[reg_0x09].value |= 1 << REG09S_CLKSET;
|
dev->reg[reg_0x09].value |= 1 << REG09S_CLKSET;
|
||||||
|
@ -1547,6 +1547,12 @@ gl841_init_registers (Genesys_Device * dev)
|
||||||
dev->reg[reg_0x6b].value |= REG6B_GPO17;
|
dev->reg[reg_0x6b].value |= REG6B_GPO17;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->model->gpo_type == GPO_DP685)
|
||||||
|
{
|
||||||
|
/* REG6B_GPO18 lights on green led */
|
||||||
|
dev->reg[reg_0x6b].value |= REG6B_GPO17|REG6B_GPO18;
|
||||||
|
}
|
||||||
|
|
||||||
DBG (DBG_proc, "gl841_init_registers complete\n");
|
DBG (DBG_proc, "gl841_init_registers complete\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2180,7 +2186,7 @@ gl841_init_motor_regs_scan(Genesys_Device * dev,
|
||||||
&fast_exposure,
|
&fast_exposure,
|
||||||
scan_power_mode);
|
scan_power_mode);
|
||||||
|
|
||||||
if (dev->model->gpo_type == GPO_XP300)
|
if (dev->model->gpo_type == GPO_XP300 || dev->model->gpo_type == GPO_DP685)
|
||||||
{
|
{
|
||||||
/* quirk: looks like at least this scanner is unable to use
|
/* quirk: looks like at least this scanner is unable to use
|
||||||
2-feed mode */
|
2-feed mode */
|
||||||
|
@ -3455,6 +3461,13 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) {
|
||||||
sanei_genesys_write_register(dev, 0x6D, val & ~0x80);
|
sanei_genesys_write_register(dev, 0x6D, val & ~0x80);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (dev->model->gpo_type == GPO_DP685)
|
||||||
|
{
|
||||||
|
sanei_genesys_read_register(dev, 0x6B, &val);
|
||||||
|
sanei_genesys_write_register(dev, 0x6B, val & ~REG6B_GPO17);
|
||||||
|
dev->reg[reg_0x6b].value &= ~REG6B_GPO17;
|
||||||
|
dev->calib_reg[reg_0x6b].value &= ~REG6B_GPO17;
|
||||||
|
}
|
||||||
|
|
||||||
gl841_set_fe (dev, AFE_POWER_SAVE);
|
gl841_set_fe (dev, AFE_POWER_SAVE);
|
||||||
|
|
||||||
|
@ -3500,7 +3513,8 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) {
|
||||||
dev->calib_reg[reg_0x6b].value |= REG6B_GPO18;
|
dev->calib_reg[reg_0x6b].value |= REG6B_GPO18;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (dev->model->gpo_type == GPO_DP665)
|
if (dev->model->gpo_type == GPO_DP665
|
||||||
|
|| dev->model->gpo_type == GPO_DP685)
|
||||||
{
|
{
|
||||||
sanei_genesys_read_register(dev, 0x6B, &val);
|
sanei_genesys_read_register(dev, 0x6B, &val);
|
||||||
sanei_genesys_write_register(dev, 0x6B, val | REG6B_GPO17);
|
sanei_genesys_write_register(dev, 0x6B, val | REG6B_GPO17);
|
||||||
|
@ -5077,7 +5091,7 @@ gl841_offset_calibration (Genesys_Device * dev)
|
||||||
RIE (sanei_genesys_read_data_from_scanner (dev, first_line, total_size));
|
RIE (sanei_genesys_read_data_from_scanner (dev, first_line, total_size));
|
||||||
|
|
||||||
if (DBG_LEVEL >= DBG_data) {
|
if (DBG_LEVEL >= DBG_data) {
|
||||||
snprintf(fn,20,"offset1_%d.pnm",turn);
|
snprintf(fn,20,"offset1_%02d.pnm",turn);
|
||||||
sanei_genesys_write_pnm_file (fn,
|
sanei_genesys_write_pnm_file (fn,
|
||||||
first_line,
|
first_line,
|
||||||
16,
|
16,
|
||||||
|
@ -5108,6 +5122,11 @@ gl841_offset_calibration (Genesys_Device * dev)
|
||||||
cmax[j]++;
|
cmax[j]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO the DP685 has a black strip in the middle of the sensor
|
||||||
|
* should be handled in a more elegant way , could be a bug */
|
||||||
|
if (dev->model->ccd_type == CCD_DP685)
|
||||||
|
cmin[j] -= 20;
|
||||||
|
|
||||||
if (cmin[j] > num_pixels/100) {
|
if (cmin[j] > num_pixels/100) {
|
||||||
acceptable = SANE_FALSE;
|
acceptable = SANE_FALSE;
|
||||||
if (dev->model->is_cis)
|
if (dev->model->is_cis)
|
||||||
|
@ -5853,7 +5872,8 @@ gl841_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->dev->model->gpo_type == GPO_XP300 ||
|
if (s->dev->model->gpo_type == GPO_XP300 ||
|
||||||
s->dev->model->gpo_type == GPO_DP665)
|
s->dev->model->gpo_type == GPO_DP665 ||
|
||||||
|
s->dev->model->gpo_type == GPO_DP685)
|
||||||
{
|
{
|
||||||
RIE(sanei_genesys_read_register(s->dev, 0x6d, &val));
|
RIE(sanei_genesys_read_register(s->dev, 0x6d, &val));
|
||||||
|
|
||||||
|
|
|
@ -270,6 +270,7 @@ Genesys_Color_Order;
|
||||||
#define CCD_ROADWARRIOR 11
|
#define CCD_ROADWARRIOR 11
|
||||||
#define CCD_DSMOBILE600 12
|
#define CCD_DSMOBILE600 12
|
||||||
#define CCD_XP300 13
|
#define CCD_XP300 13
|
||||||
|
#define CCD_DP685 14
|
||||||
|
|
||||||
#define GPO_UMAX 0
|
#define GPO_UMAX 0
|
||||||
#define GPO_ST12 1
|
#define GPO_ST12 1
|
||||||
|
@ -282,6 +283,7 @@ Genesys_Color_Order;
|
||||||
#define GPO_XP300 8
|
#define GPO_XP300 8
|
||||||
#define GPO_HP3670 9
|
#define GPO_HP3670 9
|
||||||
#define GPO_DP665 10
|
#define GPO_DP665 10
|
||||||
|
#define GPO_DP685 11
|
||||||
|
|
||||||
#define MOTOR_UMAX 0
|
#define MOTOR_UMAX 0
|
||||||
#define MOTOR_5345 1
|
#define MOTOR_5345 1
|
||||||
|
|
|
@ -152,4 +152,10 @@
|
||||||
:interface "USB"
|
:interface "USB"
|
||||||
:usbid "0x0a82" "0x4803"
|
:usbid "0x0a82" "0x4803"
|
||||||
:status :basic
|
:status :basic
|
||||||
:comment "All resolution and mode supported, but uncorrected scans"
|
:comment "All resolution and mode supported, calibration is available"
|
||||||
|
|
||||||
|
:model "DocketPort 685/ Ambir DS685"
|
||||||
|
:interface "USB"
|
||||||
|
:usbid "0x0a82" "0x480c"
|
||||||
|
:status :good
|
||||||
|
:comment "All resolution and mode supported, calibration is available, front- and backside side-by-side, with backside mirrored horizontally."
|
||||||
|
|
Ładowanie…
Reference in New Issue