diff --git a/backend/plustek-usb.c b/backend/plustek-usb.c
index 138dd636b..65fa61b36 100644
--- a/backend/plustek-usb.c
+++ b/backend/plustek-usb.c
@@ -45,6 +45,7 @@
* 1200DPI CIS devices don't use GrayFromColor any longer
* - 0.51 - added Syscan to the vendor list
* - added SCANFLAG_Calibration handling
+ * - 0.52 - added _WAF_LOFF_ON_START handling in usbDev_startScan()
* .
*
* This file is part of the SANE package.
@@ -108,6 +109,7 @@ static TabDef usbVendors[] = {
{ 0x1606, "UMAX", NULL },
{ 0x049F, "Compaq", NULL },
{ 0x0A82, "Syscan", NULL },
+ { 0x0A53, "PandP Co., Ltd.", NULL },
{ 0xFFFF, NULL, NULL }
};
@@ -132,7 +134,7 @@ static SANE_Bool usb_normFileName( char *fname, char* buffer, u_long max_len )
dst = buffer;
while( *src != '\0' ) {
- if((*src == '/') || isspace(*src))
+ if((*src == '/') || isspace(*src) || ispunct(*src))
*dst = '_';
else
*dst = *src;
@@ -286,17 +288,18 @@ usb_initDev( Plustek_Device *dev, int idx, int handle, int vendor )
sParam.Size.dwPixels = 0;
/* create calibration-filename */
- ptr = getenv ("HOME");
- if( !usb_normFileName( dev->usbDev.ModelStr, tmp_str1, PATH_MAX )) {
+ sprintf( tmp_str2, "%s-%s",
+ dev->sane.vendor, dev->usbDev.ModelStr );
+
+ if( !usb_normFileName( tmp_str2, tmp_str1, PATH_MAX )) {
strcpy( tmp_str1, "plustek-default" );
}
+ ptr = getenv ("HOME");
if( NULL == ptr ) {
- sprintf( tmp_str2, "/tmp/%s-%s",
- dev->sane.vendor, tmp_str1 );
+ sprintf( tmp_str2, "/tmp/%s", tmp_str1 );
} else {
- sprintf( tmp_str2, "%s/.sane/%s-%s",
- ptr, dev->sane.vendor, tmp_str1 );
+ sprintf( tmp_str2, "%s/.sane/%s", ptr, tmp_str1 );
}
dev->calFile = strdup( tmp_str2 );
DBG( _DBG_INFO, "Calibration file-names set to:\n" );
@@ -1081,6 +1084,16 @@ usbDev_startScan( Plustek_Device *dev )
return _E_ALLOC;
scan->dwFlag |= SCANFLAG_StartScan;
+
+ /* some devices (esp. BearPaw) do need a lamp switch off before
+ * switching it on again. Otherwise it might happen that the lamp
+ * remains off
+ */
+ if(dev->usbDev.Caps.workaroundFlag & _WAF_LOFF_ON_START) {
+ if (usb_GetLampStatus(dev))
+ usb_LampOn( dev, SANE_FALSE, SANE_TRUE );
+ }
+
usb_LampOn( dev, SANE_TRUE, SANE_TRUE );
m_fStart = m_fFirst = SANE_TRUE;
@@ -1275,6 +1288,8 @@ usbDev_Prepare( Plustek_Device *dev, SANE_Byte *buf )
} else {
+ /* CIS section */
+
/* this might be a simple gray operation or AFE 1 channel op */
scan->dwLinesDiscard = 0;
scan->Green.pb = scan->pbScanBufBegin;
@@ -1282,11 +1297,37 @@ usbDev_Prepare( Plustek_Device *dev, SANE_Byte *buf )
if(( scan->sParam.bDataType == SCANDATATYPE_Color ) &&
( hw->bReg_0x26 & _ONE_CH_COLOR )) {
+ u_char so;
u_long len = scan->sParam.Size.dwPhyBytes / 3;
- scan->Red.pb = scan->pbScanBufBegin;
- scan->Green.pb = scan->pbScanBufBegin + len;
- scan->Blue.pb = scan->pbScanBufBegin + len * 2UL;
+ so = scaps->bSensorOrder;
+ if (_WAF_RESET_SO_TO_RGB & scaps->workaroundFlag) {
+ if (scaps->bPCB != 0) {
+ if (scan->sParam.PhyDpi.x > scaps->bPCB) {
+ so = SENSORORDER_rgb;
+ DBG(_DBG_INFO, "* Resetting sensororder to RGB\n");
+ }
+ }
+ }
+
+ switch( so ) {
+
+ case SENSORORDER_rgb:
+ scan->Red.pb = scan->pbScanBufBegin;
+ scan->Green.pb = scan->pbScanBufBegin + len;
+ scan->Blue.pb = scan->pbScanBufBegin + len * 2UL;
+ break;
+
+ case SENSORORDER_gbr:
+ scan->Green.pb = scan->pbScanBufBegin;
+ scan->Blue.pb = scan->pbScanBufBegin + len;
+ scan->Red.pb = scan->pbScanBufBegin + len * 2UL;
+ break;
+ default:
+ DBG( _DBG_ERROR, "CIS: This bSensorOrder "
+ "is not defined\n" );
+ return _E_INTERNAL;
+ }
}
}
diff --git a/backend/plustek-usb.h b/backend/plustek-usb.h
index 98dd17c0a..b98beb8a7 100644
--- a/backend/plustek-usb.h
+++ b/backend/plustek-usb.h
@@ -7,7 +7,7 @@
* @brief Main defines for the USB devices.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2006 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -44,6 +44,11 @@
* - added _WAF_USE_ALT_DESC
* - added DEVCAPSFLAG_SheetFed
* - added dpi_thresh and lineend to motor structure
+ * - 0.52 - added MODEL_QSCAN
+ * - changed DCapsDef, lamp -> misc_io
+ * - bPCB is now ushort to be "missused" by non Plustek
+ * devices (as threshhold for resetting sensor order)
+ * - added _WAF_LOFF_ON_START
* .
*
* This file is part of the SANE package.
@@ -248,7 +253,9 @@ enum _WORKAROUNDS
_WAF_BIN_FROM_COLOR = 0x00000080, /* generate binary & gray images */
_WAF_GRAY_FROM_COLOR = 0x00000100, /* from color scans */
_WAF_MISC_IO_BUTTONS = 0x00000200, /* special handling for buttons */
- _WAF_USE_ALT_DESC = 0x00000400 /* use alternate manufacturer */
+ _WAF_USE_ALT_DESC = 0x00000400, /* use alternate manufacturer */
+ _WAF_RESET_SO_TO_RGB = 0x00000800, /* set sensororder to RGB(CIS only)*/
+ _WAF_LOFF_ON_START = 0x00001000 /* switch lamp off before scanning */
};
/** for lamps connected to the misc I/O pins*/
@@ -263,6 +270,8 @@ enum _LAMPS
_MIO6 = 0x0020
};
+#define _PSENSE_SHIFT 24
+#define _PSENSE_MASK 0xFF000000
#define _BUTTON_SHIFT 16
#define _BUTTON_MASK 0xFF0000
#define _TPA_SHIFT 8
@@ -276,6 +285,18 @@ enum _BUTTONS
_PORT2 = ((_MIO5 | _MIO6) << _BUTTON_SHIFT)
};
+enum _PAPER_SENSE
+{
+ _PS_INP1 = (0x01 << _PSENSE_SHIFT),
+ _PS_INP2 = (0x02 << _PSENSE_SHIFT),
+ _PS_INP_MIO1 = (_MIO1 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO2 = (_MIO2 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO3 = (_MIO3 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO4 = (_MIO4 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO5 = (_MIO5 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO6 = (_MIO6 << (_PSENSE_SHIFT+2))
+};
+
/** for encoding a misc I/O register as TPA */
#define _TPA(register) ((u_long)(register << _TPA_SHIFT))
@@ -285,6 +306,9 @@ enum _BUTTONS
/** Get the TPA misc I/O register */
#define _GET_TPALAMP(flag) ((flag >> _TPA_SHIFT) & 0xFF)
+/** Get the Papersense port*/
+#define _GET_PAPERSENSE_PORT(flag) ((flag >> _PSENSE_SHIFT) & 0xFF)
+
/** motor types */
typedef enum
{
@@ -302,6 +326,7 @@ typedef enum
MODEL_UMAX, /**< for UMAX 3400/3450 */
MODEL_UMAX1200, /**< for UMAX 5400 */
MODEL_TSCAN, /**< for Syscan Travelscan */
+ MODEL_QSCAN, /**< for PandP Q-Scan */
MODEL_LAST
} eModelDef;
@@ -382,10 +407,10 @@ typedef struct DevCaps
u_char bSensorDistance; /**< CCD Color distance */
u_char bButtons; /**< Number of buttons */
u_char bCCD; /**< CCD ID */
- u_char bPCB; /**< PCB ID */
+ u_short bPCB; /**< PCB ID/or threshold (only CIS) */
u_long workaroundFlag; /**< Flag to allow special work arounds, see */
/* _WORKAROUNDS */
- u_long lamp; /**< for lamp: loword: normal, hiword: tpa */
+ u_long misc_io; /**< for lamp, papersense and buttons */
} DCapsDef;
diff --git a/backend/plustek-usbcal.c b/backend/plustek-usbcal.c
index 66eaff769..c6af31625 100644
--- a/backend/plustek-usbcal.c
+++ b/backend/plustek-usbcal.c
@@ -7,7 +7,7 @@
* @brief Calibration routines for CanoScan CIS devices.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2006 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
* Large parts Copyright (C) 2003 Christopher Montgomery
*
* Montys' comment:
@@ -47,6 +47,7 @@
* - fixed segfault in fine calibration
* - 0.51 - added fine calibration cache
* - usb_SwitchLamp() now really switches off the sensor
+ * - 0.52 - fixed setting for frontend values (gain/offset)
*
* This file is part of the SANE package.
*
@@ -523,13 +524,15 @@ cano_AdjustGain( Plustek_Device *dev )
min[0] = min[1] = min[2] = 1;
DBG( _DBG_INFO, "cano_AdjustGain()\n" );
- if((dev->adj.rgain != -1) &&
- (dev->adj.ggain != -1) && (dev->adj.bgain != -1)) {
- setAdjGain( dev->adj.rgain, &dev->usbDev.a_bRegs[0x3b] );
- setAdjGain( dev->adj.ggain, &dev->usbDev.a_bRegs[0x3c] );
- setAdjGain( dev->adj.bgain, &dev->usbDev.a_bRegs[0x3d] );
- DBG( _DBG_INFO, "- function skipped, using frontend values!\n" );
- return SANE_TRUE;
+ if( !usb_InCalibrationMode(dev)) {
+ if((dev->adj.rgain != -1) &&
+ (dev->adj.ggain != -1) && (dev->adj.bgain != -1)) {
+ setAdjGain( dev->adj.rgain, &dev->usbDev.a_bRegs[0x3b] );
+ setAdjGain( dev->adj.ggain, &dev->usbDev.a_bRegs[0x3c] );
+ setAdjGain( dev->adj.bgain, &dev->usbDev.a_bRegs[0x3d] );
+ DBG( _DBG_INFO, "- function skipped, using frontend values!\n" );
+ return SANE_TRUE;
+ }
}
/* define the strip to scan for coarse calibration
@@ -714,13 +717,15 @@ cano_AdjustOffset( Plustek_Device *dev )
return SANE_FALSE;
DBG( _DBG_INFO, "cano_AdjustOffset()\n" );
- if((dev->adj.rofs != -1) &&
- (dev->adj.gofs != -1) && (dev->adj.bofs != -1)) {
- dev->usbDev.a_bRegs[0x38] = (dev->adj.rofs & 0x3f);
- dev->usbDev.a_bRegs[0x39] = (dev->adj.gofs & 0x3f);
- dev->usbDev.a_bRegs[0x3a] = (dev->adj.bofs & 0x3f);
- DBG( _DBG_INFO, "- function skipped, using frontend values!\n" );
- return SANE_TRUE;
+ if( !usb_InCalibrationMode(dev)) {
+ if((dev->adj.rofs != -1) &&
+ (dev->adj.gofs != -1) && (dev->adj.bofs != -1)) {
+ dev->usbDev.a_bRegs[0x38] = (dev->adj.rofs & 0x3f);
+ dev->usbDev.a_bRegs[0x39] = (dev->adj.gofs & 0x3f);
+ dev->usbDev.a_bRegs[0x3a] = (dev->adj.bofs & 0x3f);
+ DBG( _DBG_INFO, "- function skipped, using frontend values!\n" );
+ return SANE_TRUE;
+ }
}
m_ScanParam.Size.dwLines = 1;
@@ -1114,6 +1119,7 @@ static int
cano_DoCalibration( Plustek_Device *dev )
{
u_short dpi, idx, idx_end;
+ u_long save_waf;
SANE_Bool skip_fine;
ScanDef *scan = &dev->scanning;
HWDef *hw = &dev->usbDev.HwSetting;
@@ -1130,9 +1136,10 @@ cano_DoCalibration( Plustek_Device *dev )
return SANE_FALSE; /* can't cal this */
}
- /* Don't allow calibration settings from the other driver to confuse our use of
- * a few of its functions.
+ /* Don't allow calibration settings from the other driver to confuse our
+ * use of a few of its functions.
*/
+ save_waf = scaps->workaroundFlag;
scaps->workaroundFlag &= ~_WAF_SKIP_WHITEFINE;
scaps->workaroundFlag &= ~_WAF_SKIP_FINE;
scaps->workaroundFlag &= ~_WAF_BYPASS_CALIBRATION;
@@ -1206,7 +1213,7 @@ cano_DoCalibration( Plustek_Device *dev )
} else if( usb_IsSheetFedDevice(dev)) {
- /* we only to the calibration upon request !*/
+ /* we only do the calibration upon request !*/
if( !skip_fine ) {
DBG( _DBG_INFO2, "SHEET-FED device, skip fine calibration!\n" );
skip_fine = SANE_TRUE;
@@ -1220,9 +1227,14 @@ cano_DoCalibration( Plustek_Device *dev )
for( idx = 1; idx < idx_end; idx++ ) {
dpi = 0;
- if( usb_InCalibrationMode(dev))
+ if( usb_InCalibrationMode(dev)) {
dpi = usb_get_res( scaps->OpticDpi.x, idx );
+ /* we might should check against device specific limit */
+ if(dpi < 50)
+ continue;
+ }
+
DBG( _DBG_INFO2, "###### ADJUST DARK (FINE) ########\n" );
if(cano_PrepareToReadBlackCal(dev))
return SANE_FALSE;
@@ -1291,6 +1303,8 @@ cano_DoCalibration( Plustek_Device *dev )
DBG( _DBG_INFO, "REG[0x3a] = %i\n", dev->usbDev.a_bRegs[0x3a] );
DBG( _DBG_INFO, "-------------------------\n" );
+ scaps->workaroundFlag |= save_waf;
+
return SANE_TRUE;
}
diff --git a/backend/plustek-usbcalfile.c b/backend/plustek-usbcalfile.c
index 9fd26b067..5638b2e9a 100644
--- a/backend/plustek-usbcalfile.c
+++ b/backend/plustek-usbcalfile.c
@@ -6,7 +6,7 @@
/** @file plustek-usbcalfile.c
* @brief Functions for saving/restoring calibration settings
*
- * Copyright (C) 2001-2006 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
*
* History:
* - 0.46 - first version
@@ -16,6 +16,7 @@
* - 0.50 - cleanup
* - 0.51 - added functions for saving, reading and restoring
* fine calibration data
+ * - 0.52 - no changes
* .
*
* This file is part of the SANE package.
diff --git a/backend/plustek-usbdevs.c b/backend/plustek-usbdevs.c
index d4f2e1df7..03aea896e 100644
--- a/backend/plustek-usbdevs.c
+++ b/backend/plustek-usbdevs.c
@@ -7,7 +7,7 @@
* @brief Here we have our USB device definitions.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2006 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -68,6 +68,8 @@
* - fixed CanoScan LiDE20 settings, cause of various reports, seems
* Canon has built-in different motortypes
* - also fixed Motorsettings for LiDE30
+ * - 0.52 - added Q-Scan USB001 settings
+ * - tweaked motor settings for Bearpaw 1200
*
*
* This file is part of the SANE package.
@@ -539,8 +541,8 @@ static DCapsDef Cap0x0400_0x1000_0 =
SENSORORDER_rgb,
8,
5, kNEC8861, 0x00,
- _WAF_MISC_IO_LAMPS | _WAF_USE_ALT_DESC,
- _MIO5
+ _WAF_MISC_IO_LAMPS | _WAF_LOFF_ON_START | _WAF_USE_ALT_DESC,
+ _NO_MIO
};
/* Mustek BearPaw 2400
@@ -712,7 +714,7 @@ static DCapsDef Cap0x04A9_0x220E =
SENSORORDER_rgb,
16, /* sensor distance */
3, /* number of buttons */
- kCIS1240, /* use default settings during calibration */
+ kCIS1240,
0, /* not used here... */
_WAF_MISC_IO_LAMPS, _NO_MIO
};
@@ -730,7 +732,7 @@ static DCapsDef Cap0x04A9_0x2220 =
SENSORORDER_rgb,
16, /* sensor distance */
3, /* number of buttons */
- kCIS1240, /* use default settings during calibration */
+ kCIS1240,
0, /* not used here... */
_WAF_MISC_IO_LAMPS, _NO_MIO
};
@@ -739,7 +741,7 @@ static DCapsDef Cap0x04A9_0x2220 =
*/
static DCapsDef Cap0x0A82_0x6620 =
{
- {{ 0, 0}, 100, -1, {1226, 3508}, { 75, 75 }},
+ {{ 0, 0}, 100, -1, {1226, 3508}, {75, 75}},
{{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }},
{{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }},
{{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }},
@@ -752,7 +754,26 @@ static DCapsDef Cap0x0A82_0x6620 =
0, /* not used here... */
(_WAF_MISC_IO_LAMPS | _WAF_MISC_IO_BUTTONS |
_WAF_BIN_FROM_COLOR | _WAF_GRAY_FROM_COLOR),
- _MIO5 + _PORT1
+ _MIO5 + _PORT1 + _PS_INP_MIO2
+};
+
+/* IRIScan/Q-Scan USB001 A4 sheet-fed scanner
+ */
+static DCapsDef Cap0x0A53_0x1000 =
+{
+ {{ 0, 0}, 150, -1, {2550, 3508}, {150, 150}},
+ {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }},
+ {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }},
+ {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }},
+ {300, 300},
+ DEVCAPSFLAG_SheetFed,
+ SENSORORDER_gbr,
+ 2, /* sensor distance */
+ 0, /* number of buttons */
+ kNEC8861, /* use default settings during calibration */
+ 200, /* threshold for resetting sensor-order */
+ (_WAF_MISC_IO_LAMPS | _WAF_RESET_SO_TO_RGB),
+ _PS_INP1
};
/******************* additional Hardware descriptions ************************/
@@ -2285,10 +2306,10 @@ static HWDef Hw0x04A9_0x220E =
0x00, /* sensor control settings (reg 0x0e) */
{0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x05},
- /* mono (reg 0x0f to 0x18) */
+ /* mono (reg 0x0f to 0x18) */
{0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x05},
- /* color (reg 0x0f to 0x18) */
+ /* color (reg 0x0f to 0x18) */
(_BLUE_CH | _ONE_CH_COLOR), /* bReg_0x26 color mode */
@@ -2354,10 +2375,10 @@ static HWDef Hw0x04A9_0x2220 =
0x00, /* sensor control settings (reg 0x0e) */
{0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x07},
- /* mono (reg 0x0f to 0x18) */
+ /* mono (reg 0x0f to 0x18) */
{0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x07},
- /* color (reg 0x0f to 0x18) */
+ /* color (reg 0x0f to 0x18) */
(_BLUE_CH | _ONE_CH_COLOR), /* bReg_0x26 color mode */
@@ -2423,10 +2444,10 @@ static HWDef Hw0x0A82_0x6620 =
0x00, /* sensor control settings (reg 0x0e) */
{0x18, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07},
- /* mono (reg 0x0f to 0x18) */
+ /* mono (reg 0x0f to 0x18) */
{0x18, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07},
- /* color (reg 0x0f to 0x18) */
+ /* color (reg 0x0f to 0x18) */
(_BLUE_CH | _ONE_CH_COLOR), /* bReg_0x26 color mode */
@@ -2472,6 +2493,89 @@ static HWDef Hw0x0A82_0x6620 =
1.8
};
+/** IRIScan/Q-Scan USB001 - Portable Peripheral Co., Ltd. */
+static HWDef Hw0x0A53_0x1000 =
+{
+ 0.50, /* dMaxMotorSpeed */
+ 0.40, /* dMaxMoveSpeed */
+ 0.0, /* dHighSpeed */
+ 100, /* wIntegrationTimeLowLamp */
+ 100, /* wIntegrationTimeHighLamp */
+ 300, /* wMotorDpi (Full step DPI) */
+ 512, /* wRAMSize (KB) */
+ 3.75, /* dMinIntegrationTimeLowres (ms) */
+ 5.75, /* dMinIntegrationTimeHighres (ms) */
+ 4095, /* wGreenPWMDutyCycleLow (reg 0x2a + 0x2b) */
+ 4095, /* wGreenPWMDutyCycleHigh (reg 0x2a + 0x2b) */
+
+ 0x09, /* bSensorConfiguration (0x0b) */
+ 0x00, /* sensor control settings (reg 0x0c) */
+ 0x65, /* sensor control settings (reg 0x0d) */
+ 0x13, /* sensor control settings (reg 0x0e) */
+
+ {0x02, 0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02},
+ /* mono (reg 0x0f to 0x18) */
+
+ {0x02, 0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02},
+ /* color (reg 0x0f to 0x18) */
+
+ (_BLUE_CH | _ONE_CH_COLOR), /* bReg_0x26 color mode */
+
+ 0x00, /* bReg 0x27 color mode */
+ 2, /* bReg 0x29 illumination mode */
+
+ { 3, 0, 0, 2593, 4600, 0, 0 },
+#if 0
+ { 2, 2593, 4600, 2593, 4100, 2593, 4100 },
+#else
+ { 2, 2593, 7100, 2593, 4600, 2593, 4480 },
+#endif
+
+ 256, /* StepperPhaseCorrection (reg 0x1a + 0x1b) */
+ 0, /* bOpticBlackStart (reg 0x1c) */
+ 0x15, /* bOpticBlackEnd (reg 0x1d) */
+ 0x15, /* wActivePixelsStart (reg 0x1e + 0x1f) */
+ 5500, /* wLineEnd (reg 0x20 + 0x21) */
+
+#if 0
+ 2593, /* red lamp on (reg 0x2c + 0x2d) */
+ 4600, /* red lamp off (reg 0x2e + 0x2f) */
+ 2593, /* green lamp on (reg 0x30 + 0x31) */
+ 4100, /* green lamp off (reg 0x32 + 0x33) */
+ 2593, /* blue lamp on (reg 0x34 + 0x35) */
+ 4100, /* blue lamp off (reg 0x36 + 0x37) */
+#else
+ 2593, /* red lamp on (reg 0x2c + 0x2d) */
+ 7100, /* red lamp off (reg 0x2e + 0x2f) */
+ 2593, /* green lamp on (reg 0x30 + 0x31) */
+ 4600, /* green lamp off (reg 0x32 + 0x33) */
+ 2593, /* blue lamp on (reg 0x34 + 0x35) */
+ 4480, /* blue lamp off (reg 0x36 + 0x37) */
+#endif
+
+ 3, /* stepper motor control (reg 0x45) */
+ 0, /* wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
+
+ 0, /* steps to reverse when buffer is full reg 0x50) */
+ 0, /* acceleration profile (reg 0x51) */
+ 0, /* lines to process (reg 0x54) */
+ 0x1b, /* kickstart (reg 0x55) */
+ 0x08, /* pwm freq (reg 0x56) */
+ 0x15, /* pwm duty cycle (reg 0x57) */
+
+ 0x00, /* Paper sense (reg 0x58) */
+
+ 0x00, /* misc io12 (reg 0x59) */
+ 0x00, /* misc io34 (reg 0x5a) */
+ 0x00, /* misc io56 (reg 0x5b) */
+ 0, /* test mode ADC Output CODE MSB (reg 0x5c) */
+ 0, /* test mode ADC Output CODE LSB (reg 0x5d) */
+ 0, /* test mode (reg 0x5e) */
+ _LM9832,
+ MODEL_QSCAN,
+ 1.1
+};
+
/******************** all available combinations *****************************/
/** here we have all supported devices and their settings...
@@ -2546,6 +2650,9 @@ static SetDef Settings[] =
/* SYSCAN... */
{"0x0A82-0x6620", &Cap0x0A82_0x6620, &Hw0x0A82_0x6620, "TravelScan 662" },
+ /* Portable Peripheral Co., Ltd. */
+ {"0x0A53-0x1000", &Cap0x0A53_0x1000, &Hw0x0A53_0x1000, "Q-Scan USB001" },
+
/* Please add other devices here...
* The first entry is a string, composed out of the vendor and product id,
* it's used by the driver to select the device settings. For other devices
@@ -2621,16 +2728,11 @@ static ClkMotorDef Motors[] = {
{{ 16, 4, 1 }, { 16, 4, 1 }, { 16, 4, 1 }, { 16, 4, 1 }, { 16, 4, 1 },
{ 16, 4, 1 }, { 16, 4, 1 }, { 16, 4, 1 }, { 16, 4, 1 }, { 16, 4, 1 }},
/* Color mode MCLK settings */
-#if 0
- { 3.5, 3.5, 3.5, 4.0, 6.0, 8.0, 11.5, 11.5, 11.5, 11.5 },
- { 3.5, 3.5, 3.5, 4.0, 6.0, 8.0, 11.5, 11.5, 11.5, 11.5 },
-#else
- { 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
- { 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 11.5, 11.5, 11.5, 11.5 },
-#endif
+ { 4.0, 3.5, 3.5, 4.0, 4.0, 5.0, 5.0, 7.5, 7.5, 7.5 },
+ { 4.0, 3.5, 3.5, 4.0, 4.0, 5.0, 5.0, 7.5, 7.5, 7.5 },
/* Gray mode MCLK settings */
- { 10.5, 10.5, 10.5, 10.5, 10.5, 10.5, 11.5, 11.5, 11.5, 11.5 },
- { 10.5, 10.5, 10.5, 10.5, 10.5, 10.5, 11.5, 11.5, 11.5, 11.5 }
+ { 7.5, 7.0, 6.5, 5.5, 5.5, 5.5, 7.0, 7.0, 7.0, 7.0 },
+ { 7.5, 7.0, 6.5, 5.5, 5.5, 5.5, 7.0, 7.0, 7.0, 7.0 }
},
{ MODEL_MUSTEK1200, 2, 32, 3, 0, 0,
@@ -2763,12 +2865,25 @@ static ClkMotorDef Motors[] = {
/* <=400dpi <=600dpi <=800dpi <=1200dpi <=2400dpi */
{ 2, 22, 1 }, { 2, 22, 1 }, { 2, 22, 1 }, { 2, 22, 1 }, { 2, 22, 1 }},
/* Color mode MCLK settings */
- /* Color mode MCLK settings */
{ 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
{ 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
/* Gray mode MCLK settings */
{ 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0 },
{ 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0 },
+ },
+
+ { MODEL_QSCAN, 8, 21, 6, 300, 4600,
+ /* Motor settings (PWM and PWM_Duty) */
+ /* <=75dpi <=100dpi <=150dpi <=200dpi <=300dpi */
+ {{ 8, 21, 1 }, { 8, 21, 1 }, { 8, 21, 1 }, { 8, 21, 1 }, { 8, 21, 1 },
+ /* <=400dpi <=600dpi <=800dpi <=1200dpi <=2400dpi */
+ { 8, 21, 1 }, { 8, 21, 1 }, { 8, 21, 1 }, { 8, 21, 1 }, { 8, 21, 1 }},
+ /* Color mode MCLK settings */
+ { 6.5, 6.5, 6.5, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
+ { 6.5, 6.5, 6.5, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
+ /* Gray mode MCLK settings */
+ { 6.5, 6.5, 6.5, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
+ { 6.5, 6.5, 6.5, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 },
}
};
diff --git a/backend/plustek-usbhw.c b/backend/plustek-usbhw.c
index d76d2a57f..96d56cb85 100644
--- a/backend/plustek-usbhw.c
+++ b/backend/plustek-usbhw.c
@@ -7,7 +7,7 @@
* @brief Functions to control the scanner hardware.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2006 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -52,6 +52,7 @@
* devices
* - fixed button handling for Plustek/Genius devices and added
* some more debug output to that code path
+ * - 0.52 - changed DCapsDef, lamp -> misc_io
* .
*
* This file is part of the SANE package.
@@ -270,11 +271,14 @@ usb_IsScannerReady( Plustek_Device *dev )
/**
*/
static SANE_Bool
-usb_SensorAdf( int handle )
+usb_SensorAdf( Plustek_Device *dev )
{
u_char value;
- usbio_ReadReg( handle, 0x02, &value );
+ if( usb_IsSheetFedDevice(dev))
+ return SANE_FALSE;
+
+ usbio_ReadReg( dev->fd, 0x02, &value );
return (value & 0x20);
}
@@ -284,12 +288,13 @@ usb_SensorAdf( int handle )
static SANE_Bool
usb_SensorPaper( Plustek_Device *dev )
{
+ DCapsDef *sc = &dev->usbDev.Caps;
u_char val, mask = 0x02;
usbio_ReadReg( dev->fd, 0x02, &val );
if( usb_IsSheetFedDevice(dev))
- mask = 0x08;
+ mask = _GET_PAPERSENSE_PORT(sc->misc_io);
return (val & mask);
}
@@ -481,7 +486,7 @@ usb_ModuleMove( Plustek_Device *dev, u_char action, u_long dwStep )
ejected = SANE_TRUE;
}
- if( usb_SensorAdf(dev->fd) &&
+ if( usb_SensorAdf(dev) &&
!usb_ModuleMove(dev,MOVE_ToPaperSensor, 0 )) {
hw->dMaxMoveSpeed = d;
return SANE_FALSE;
@@ -498,6 +503,7 @@ usb_ModuleMove( Plustek_Device *dev, u_char action, u_long dwStep )
* BUT: not at startup
*/
if (dev->initialized >= 0 || ejected) {
+ DBG(_DBG_INFO2, "... MORE EJECT...\n");
if(!usb_ModuleMove( dev, MOVE_Forward, 300 /* *3 */)) {
hw->dMaxMoveSpeed = d;
return SANE_FALSE;
@@ -1056,7 +1062,7 @@ usb_GetLampStatus( Plustek_Device *dev )
/* do we use the misc I/O pins for switching the lamp ? */
if( _WAF_MISC_IO_LAMPS & sc->workaroundFlag ) {
- usb_GetLampRegAndMask( sc->lamp, ®, &msk );
+ usb_GetLampRegAndMask( sc->misc_io, ®, &msk );
if( 0 == reg ) {
usbio_ReadReg( dev->fd, 0x29, ® );
@@ -1068,19 +1074,22 @@ usb_GetLampStatus( Plustek_Device *dev )
/* check if the lamp is on */
usbio_ReadReg( dev->fd, reg, &val );
- DBG( _DBG_INFO2, "REG[0x%02x] = 0x%02x (msk=0x%02x)\n",reg,val,msk);
+ DBG( _DBG_INFO2, "LAMP-REG[0x%02x] = 0x%02x (msk=0x%02x)\n",
+ reg,val,msk);
if( val & msk )
iLampStatus |= DEV_LampReflection;
/* if the device supports a TPA, we check this here */
if( sc->wFlags & DEVCAPSFLAG_TPA ) {
- usb_GetLampRegAndMask( _GET_TPALAMP(sc->lamp), ®, &msk );
- usbio_ReadReg( dev->fd, reg, &val );
- DBG( _DBG_INFO2, "REG[0x%02x] = 0x%02x (msk=0x%02x)\n",
- reg,val,msk);
- if( val & msk )
- iLampStatus |= DEV_LampTPA;
+ usb_GetLampRegAndMask( _GET_TPALAMP(sc->misc_io), ®, &msk );
+ if (reg) {
+ usbio_ReadReg( dev->fd, reg, &val );
+ DBG( _DBG_INFO2, "TPA-REG[0x%02x] = 0x%02x (msk=0x%02x)\n",
+ reg,val,msk);
+ if( val & msk )
+ iLampStatus |= DEV_LampTPA;
+ }
}
/* CanoScan D660U extra vaganza... */
@@ -1111,7 +1120,8 @@ usb_GetLampStatus( Plustek_Device *dev )
}
}
- DBG( _DBG_INFO, "LAMP-STATUS: 0x%08x\n", iLampStatus );
+ DBG( _DBG_INFO, "LAMP-STATUS: 0x%08x (%s)\n",
+ iLampStatus, iLampStatus?"on":"off" );
return iLampStatus;
}
@@ -1126,9 +1136,9 @@ usb_switchLampX( Plustek_Device *dev, SANE_Bool on, SANE_Bool tpa )
u_char *regs = dev->usbDev.a_bRegs;
if( tpa )
- usb_GetLampRegAndMask( _GET_TPALAMP(sc->lamp), ®, &msk );
+ usb_GetLampRegAndMask( _GET_TPALAMP(sc->misc_io), ®, &msk );
else
- usb_GetLampRegAndMask( sc->lamp, ®, &msk );
+ usb_GetLampRegAndMask( sc->misc_io, ®, &msk );
if( 0 == reg )
return SANE_FALSE; /* no need to switch something */
@@ -1369,6 +1379,7 @@ usb_ResetRegisters( Plustek_Device *dev )
regs[0x1a] = _HIBYTE( hw->StepperPhaseCorrection );
regs[0x1b] = _LOBYTE( hw->StepperPhaseCorrection );
+/* HEINER: CHECK WHY THIS has been disabled*/
#if 0
regs[0x1c] = hw->bOpticBlackStart;
regs[0x1d] = hw->bOpticBlackEnd;
@@ -1409,6 +1420,7 @@ usb_ResetRegisters( Plustek_Device *dev )
regs[0x5d] = hw->bReg_0x5d;
regs[0x5e] = hw->bReg_0x5e;
sanei_lm983x_read( dev->fd, 0x59, ®s[0x59], 3, SANE_TRUE );
+
} else {
DBG( _DBG_INFO2, "SETTING THE MISC I/Os\n" );
@@ -1774,11 +1786,11 @@ usb_UpdateButtonStatus( Plustek_Scanner *s )
/* only use the "valid" ports, that reflect a button */
if( _WAF_MISC_IO_BUTTONS & caps->workaroundFlag ) {
- if((caps->lamp & _PORT0) == 0)
+ if((caps->misc_io & _PORT0) == 0)
mio[0] = 0xff;
- if((caps->lamp & _PORT1) == 0)
+ if((caps->misc_io & _PORT1) == 0)
mio[1] = 0xff;
- if((caps->lamp & _PORT2) == 0)
+ if((caps->misc_io & _PORT2) == 0)
mio[2] = 0xff;
}
diff --git a/backend/plustek-usbimg.c b/backend/plustek-usbimg.c
index 82f52a304..d0ef54d5e 100644
--- a/backend/plustek-usbimg.c
+++ b/backend/plustek-usbimg.c
@@ -32,6 +32,7 @@
* - 0.50 - cleanup
* - 0.51 - added usb_ColorDuplicateGray16_2(), usb_ColorScaleGray16_2()
* usb_BWScaleFromColor_2() and usb_BWDuplicateFromColor_2()
+ * - 0.52 - cleanup
* .
*
* This file is part of the SANE package.
@@ -82,26 +83,42 @@ static u_short wSum, Mask;
/*
*/
static u_char BitTable[8] = {
- 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
+ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};
static u_char BitsReverseTable[256] = {
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
- 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
- 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
- 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
- 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
- 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
- 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
- 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
- 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
- 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
- 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
- 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
- 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
- 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
- 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
- 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
};
/************************ some helper functions ******************************/
diff --git a/backend/plustek-usbio.c b/backend/plustek-usbio.c
index 77ecb9d4f..f418c3122 100644
--- a/backend/plustek-usbio.c
+++ b/backend/plustek-usbio.c
@@ -7,7 +7,7 @@
* @brief Some I/O stuff.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2006 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
*
* History:
* History:
@@ -27,6 +27,7 @@
* could not be red
* - usbio_ResetLM983x() checks for reg7 value before writing
* - 0.51 - allow dumpRegs to be called without valid fd
+ * - 0.52 - no changes
* .
*
* This file is part of the SANE package.
diff --git a/backend/plustek-usbmap.c b/backend/plustek-usbmap.c
index 343cec75a..247ff6fe9 100644
--- a/backend/plustek-usbmap.c
+++ b/backend/plustek-usbmap.c
@@ -22,6 +22,7 @@
* - 0.49 - changed usb_MapDownload
* - 0.50 - cleanup
* - 0.51 - no changes
+ * - 0.52 - no changes
* .
*
* This file is part of the SANE package.
diff --git a/backend/plustek-usbscan.c b/backend/plustek-usbscan.c
index fe20a211a..16e8bc0ef 100644
--- a/backend/plustek-usbscan.c
+++ b/backend/plustek-usbscan.c
@@ -29,6 +29,7 @@
* - changed usb_MapDownload prototype
* - 0.50 - cleanup
* - 0.51 - added usb_get_res() and usb_GetPhyPixels()
+ * - 0.52 - no changes
* .
*
* This file is part of the SANE package.
@@ -1314,7 +1315,7 @@ usb_SetScanParameters( Plustek_Device *dev, ScanParam *pParam )
_UIO(sanei_lm983x_write( dev->fd, 0x03, ®s[0x03], 3, SANE_TRUE));
_UIO(sanei_lm983x_write( dev->fd, 0x08, ®s[0x08], 0x7f - 0x08+1, SANE_TRUE));
- usleep( 100 );
+ usleep(100);
if( !usbio_WriteReg( dev->fd, 0x07, 0 ))
return SANE_FALSE;
diff --git a/backend/plustek-usbshading.c b/backend/plustek-usbshading.c
index 4e304a02e..edb9efa44 100644
--- a/backend/plustek-usbshading.c
+++ b/backend/plustek-usbshading.c
@@ -31,6 +31,8 @@
* - 0.50 - readded kCIS670 to add 5% extra to LiDE20 fine calibration
* - fixed line statistics and added data output
* - 0.51 - added fine calibration cache
+ * - 0.52 - added get_ptrs to let various sensororders work
+ * correctly
* .
*
* This file is part of the SANE package.
@@ -2280,7 +2282,14 @@ usb_PrepareCalibration( Plustek_Device *dev )
regs[0x3d] = 0x0a;
/* use frontend values... */
- if((dev->adj.rgain != -1) &&
+ if((dev->adj.rofs != -1) &&
+ (dev->adj.gofs != -1) && (dev->adj.bofs != -1)) {
+ regs[0x38] = (dev->adj.rofs & 0x3f);
+ regs[0x39] = (dev->adj.gofs & 0x3f);
+ regs[0x3a] = (dev->adj.bofs & 0x3f);
+ }
+
+ if((dev->adj.rgain != -1) &&
(dev->adj.ggain != -1) && (dev->adj.bgain != -1)) {
setAdjGain( dev->adj.rgain, ®s[0x3b] );
setAdjGain( dev->adj.ggain, ®s[0x3c] );
@@ -2992,14 +3001,57 @@ usb_DoCalibration( Plustek_Device *dev )
return SANE_TRUE;
}
+/* on different sensor orders, we need to adjust the shading buffer
+ * pointer, otherwise we correct the wrong channels
+ */
+static void
+get_ptrs(Plustek_Device *dev, u_short *buf, u_long offs,
+ u_short **r, u_short **g, u_short **b)
+{
+ ScanDef *scan = &dev->scanning;
+ DCapsDef *scaps = &dev->usbDev.Caps;
+ u_char so = scaps->bSensorOrder;
+
+ if (_WAF_RESET_SO_TO_RGB & scaps->workaroundFlag) {
+ if (scaps->bPCB != 0) {
+ if (scan->sParam.PhyDpi.x > scaps->bPCB)
+ so = SENSORORDER_rgb;
+ }
+ }
+
+ switch( so ) {
+ case SENSORORDER_gbr:
+ *g = buf;
+ *b = buf + offs;
+ *r = buf + offs * 2;
+ break;
+
+ case SENSORORDER_bgr:
+ *b = buf;
+ *g = buf + offs;
+ *r = buf + offs * 2;
+ break;
+
+ case SENSORORDER_rgb:
+ default:
+ *r = buf;
+ *g = buf + offs;
+ *b = buf + offs * 2;
+ break;
+ }
+}
+
/** usb_DownloadShadingData
* according to the job id, different registers or DRAM areas are set
* in preparation for calibration or scanning
*/
-static SANE_Bool usb_DownloadShadingData( Plustek_Device *dev, u_char what )
+static SANE_Bool
+usb_DownloadShadingData( Plustek_Device *dev, u_char what )
{
u_char channel;
+ u_short *r, *g, *b;
DCapsDef *scaps = &dev->usbDev.Caps;
+ ScanDef *scan = &dev->scanning;
HWDef *hw = &dev->usbDev.HwSetting;
ScanParam *param = &dev->scanning.sParam;
u_char *regs = dev->usbDev.a_bRegs;
@@ -3073,23 +3125,35 @@ static SANE_Bool usb_DownloadShadingData( Plustek_Device *dev, u_char what )
if( scaps->workaroundFlag & _WAF_SKIP_FINE ) {
DBG( _DBG_INFO, "Skipping fine calibration\n" );
regs[0x42] = (u_char)(( hw->wDRAMSize > 512)? 0x60: 0x20);
+ if (scan->skipCoarseCalib) {
- if( !usbio_WriteReg( dev->fd, 0x42, regs[0x42]))
- return SANE_FALSE;
+ DBG( _DBG_INFO, "...cleaning shading buffer\n" );
+ memset( a_wWhiteShading, 0, _SHADING_BUF );
+ memset( a_wDarkShading, 0, _SHADING_BUF );
+ regs[0x40] = 0x3f;
+ regs[0x41] = 0xff;
+
+ _UIO(sanei_lm983x_write( dev->fd, 0x40,
+ ®s[0x40], 3, SANE_TRUE));
+ } else {
+ if( !usbio_WriteReg( dev->fd, 0x42, regs[0x42]))
+ return SANE_FALSE;
+ }
break;
}
DBG( _DBG_INFO, "Downloading %lu pixels\n", m_dwPixels );
/* Download the dark & white shadings to LM983x */
if( param->bDataType == SCANDATATYPE_Color ) {
- usb_SetDarkShading( dev, CHANNEL_red, a_wDarkShading,
+
+ get_ptrs(dev, a_wDarkShading, m_dwPixels, &r, &g, &b);
+
+ usb_SetDarkShading( dev, CHANNEL_red, r,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
- usb_SetDarkShading( dev, CHANNEL_green,
- a_wDarkShading + m_dwPixels,
+ usb_SetDarkShading( dev, CHANNEL_green, g,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
- usb_SetDarkShading( dev, CHANNEL_blue,
- a_wDarkShading + m_dwPixels * 2,
+ usb_SetDarkShading( dev, CHANNEL_blue, b,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
} else {
usb_SetDarkShading( dev, channel,
@@ -3098,19 +3162,21 @@ static SANE_Bool usb_DownloadShadingData( Plustek_Device *dev, u_char what )
}
if( param->bDataType == SCANDATATYPE_Color ) {
- usb_SetWhiteShading( dev, CHANNEL_red, a_wWhiteShading,
+
+ get_ptrs(dev, a_wWhiteShading,
+ m_ScanParam.Size.dwPhyPixels, &r, &g, &b);
+
+ usb_SetWhiteShading( dev, CHANNEL_red, r,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
- usb_SetWhiteShading( dev, CHANNEL_green, a_wWhiteShading +
- m_ScanParam.Size.dwPhyPixels,
+ usb_SetWhiteShading( dev, CHANNEL_green, g,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
- usb_SetWhiteShading( dev, CHANNEL_blue, a_wWhiteShading +
- m_ScanParam.Size.dwPhyPixels * 2,
+ usb_SetWhiteShading( dev, CHANNEL_blue, b,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
} else {
usb_SetWhiteShading( dev, channel, a_wWhiteShading,
(u_short)m_ScanParam.Size.dwPhyPixels * 2);
}
-
+
/* set RAM configuration AND
* Gain = Multiplier Coefficient/16384
* External DRAM for Multiplier Coefficient Source
diff --git a/backend/plustek.c b/backend/plustek.c
index b6a26e189..55a80dd96 100644
--- a/backend/plustek.c
+++ b/backend/plustek.c
@@ -82,6 +82,7 @@
* - fixed constraint_type for OPT_BUTTON
* - 0.51 - added fine calibration caching
* - removed #define _PLUSTEK_USB
+ * - 0.52 - no changes
*.
*
* This file is part of the SANE package.
@@ -157,7 +158,7 @@
#include "../include/sane/sanei.h"
#include "../include/sane/saneopts.h"
-#define BACKEND_VERSION "0.51-16"
+#define BACKEND_VERSION "0.52-1"
#define BACKEND_NAME plustek
#include "../include/sane/sanei_access.h"
diff --git a/backend/plustek.h b/backend/plustek.h
index 7d8ce617c..8ce41c29f 100644
--- a/backend/plustek.h
+++ b/backend/plustek.h
@@ -11,7 +11,7 @@
*
* original code taken from sane-0.71
* Copyright (C) 1997 Hypercore Software Design, Ltd.
- * Copyright (C) 2001-2005 Gerhard Jaeger
+ * Copyright (C) 2001-2007 Gerhard Jaeger
*
* History:
* - 0.30 - initial version
@@ -58,6 +58,7 @@
* - 0.50 - cleanup
* - added OPT_SPEEDUP
* - 0.51 - added OPT_CALIBRATE
+ * - 0.52 -
* .
*
* This file is part of the SANE package.