kopia lustrzana https://gitlab.com/sane-project/backends
Major update to support Canon CIS scanner N670/676U and N650/656U
rodzic
8fed746702
commit
ff6e86ef36
|
@ -24,6 +24,10 @@
|
|||
* added _WAF_MISC_IO5 for HP lamp switching
|
||||
* added motor profiles
|
||||
* cleanup
|
||||
* 0.44 - added EPSON 1260 and 660
|
||||
* added Genius Model strings
|
||||
* added Canon N670U entry
|
||||
* added bStepsToReverse to the HwDesc structure
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -72,9 +76,10 @@
|
|||
/*
|
||||
* for Register 0x26
|
||||
*/
|
||||
#define _RED_CH 0x00
|
||||
#define _GREEN_CH 0x08
|
||||
#define _BLUE_CH 0x10
|
||||
#define _ONE_CH_COLOR 0x04
|
||||
#define _RED_CH 0x00
|
||||
#define _GREEN_CH 0x08
|
||||
#define _BLUE_CH 0x10
|
||||
|
||||
|
||||
/* Plustek Model: UT12/UT16
|
||||
|
@ -631,18 +636,36 @@ static DCapsDef Cap0x1606_0x0060_0 =
|
|||
*/
|
||||
static DCapsDef Cap0x04A9_0x2206_0 =
|
||||
{
|
||||
{{ 0, 165}, 0, {2550, 3510 - 165}, {100, 100}, COLOR_BW },
|
||||
{{ 0, 128}, 0, {2550, 3508}, {75, 75}, COLOR_BW },
|
||||
{{ 0, 0}, 0, {0, 0}, { 0, 0 }, 0 },
|
||||
{{ 0, 0}, 0, {0, 0}, { 0, 0 }, 0 },
|
||||
{{ 0, 0}, 0, {0, 0}, { 0, 0 }, 0 },
|
||||
{600, 600},
|
||||
0,
|
||||
SENSORORDER_bgr,
|
||||
SENSORORDER_rgb,
|
||||
8, /* sensor distance */
|
||||
4, /* number of buttons */
|
||||
3, /* number of buttons */
|
||||
kNEC8861, /* use default settings during calibration */
|
||||
0, /* not used here... */
|
||||
_WAF_NONE, _NO_MIO
|
||||
(_WAF_MISC_IO_LAMPS | _WAF_BYPASS_CALIBRATION), _NO_MIO
|
||||
};
|
||||
|
||||
/* Canon N670U/N676U
|
||||
*/
|
||||
static DCapsDef Cap0x04A9_0x220D_0 =
|
||||
{
|
||||
{{ 0, 128},0, {2550, 3508}, {75, 75}, COLOR_BW },
|
||||
{{ 0, 0}, 0, {0, 0}, { 0, 0 }, 0 },
|
||||
{{ 0, 0}, 0, {0, 0}, { 0, 0 }, 0 },
|
||||
{{ 0, 0}, 0, {0, 0}, { 0, 0 }, 0 },
|
||||
{600, 600},
|
||||
0,
|
||||
SENSORORDER_rgb,
|
||||
8, /* sensor distance */
|
||||
3, /* number of buttons */
|
||||
kNEC8861, /* use default settings during calibration */
|
||||
0, /* not used here... */
|
||||
(_WAF_MISC_IO_LAMPS | _WAF_BYPASS_CALIBRATION), _NO_MIO
|
||||
};
|
||||
|
||||
/******************* additional Hardware descriptions ************************/
|
||||
|
@ -690,6 +713,7 @@ static HWDef Hw0x07B3_0x0017_0 =
|
|||
/* Misc */
|
||||
3, /* bReg_0x45 */
|
||||
0, /* wStepsAfterPaperSensor2 (0x4c & 0x4d) */
|
||||
0x1e, /* bstepsToReverse reg 0x50) */
|
||||
0xa8, /* 0xfc -bReg_0x51 */
|
||||
0, /* bReg_0x54 */
|
||||
0xff, /* 0xa3 - bReg_0x55 */
|
||||
|
@ -733,6 +757,7 @@ static HWDef Hw0x07B3_0x0007_0 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -771,6 +796,7 @@ static HWDef Hw0x07B3_0x0007_2 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xfc,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -809,6 +835,7 @@ static HWDef Hw0x07B3_0x0007_4 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -847,6 +874,7 @@ static HWDef Hw0x07B3_0x000F_0 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -885,6 +913,7 @@ static HWDef Hw0x07B3_0x0013_0 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -922,7 +951,8 @@ static HWDef Hw0x07B3_0x0013_4 =
|
|||
0,
|
||||
16383,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -961,6 +991,7 @@ static HWDef Hw0x07B3_0x000F_4 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -999,6 +1030,7 @@ static HWDef Hw0x07B3_0x0016_4 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -1039,7 +1071,8 @@ static HWDef Hw0x07B3_0x0017_4 =
|
|||
0,
|
||||
16383,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -1078,6 +1111,7 @@ static HWDef Hw0x07B3_0x0017_1 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -1115,7 +1149,8 @@ static HWDef Hw0x07B3_0x0012_0 =
|
|||
0,
|
||||
16383,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -1153,7 +1188,8 @@ static HWDef Hw0x07B3_0x0017_2 =
|
|||
0,
|
||||
16383,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -1192,6 +1228,7 @@ static HWDef Hw0x07B3_0x0017_3 =
|
|||
16383,
|
||||
3,
|
||||
0,
|
||||
0x1e,
|
||||
0xa8,
|
||||
0,
|
||||
0xff,
|
||||
|
@ -1248,6 +1285,7 @@ static HWDef Hw0x03F0_0x0505 =
|
|||
/* Misc */
|
||||
0x13, /* bReg_0x45 */
|
||||
0, /* wStepsAfterPaperSensor2 (0x4c & 0x4d) */
|
||||
0x1e, /* steps to reverse on buffer full reg 0x50 */
|
||||
0xfc, /* 0xa8 -bReg_0x51 */
|
||||
0, /* bReg_0x54 */
|
||||
0x18, /* bReg_0x55 */
|
||||
|
@ -1309,6 +1347,7 @@ static HWDef Hw0x03F0_0x0605 =
|
|||
/* Misc */
|
||||
0x13, /* bReg_0x45 */
|
||||
0, /* wStepsAfterPaperSensor2 (0x4c & 0x4d) */
|
||||
0x1e, /* steps to reverse on buffer full (0x50) */
|
||||
0xfc, /* 0xa8 -bReg_0x51 */
|
||||
0, /* bReg_0x54 */
|
||||
0x18, /* bReg_0x55 */
|
||||
|
@ -1362,6 +1401,7 @@ static HWDef Hw0x0400_0x1000_0 =
|
|||
16383, /* blue lamp off (reg 0x36 + 0x37) */
|
||||
0x13, /* ok stepper motor control (reg 0x45) */
|
||||
0, /* wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
|
||||
0x1e, /* steps to reverse on buffer full (reg 0x50) */
|
||||
0xfc, /* ok acceleration profile (reg 0x51) */
|
||||
0, /* ok lines to process (reg 0x54) */
|
||||
0x13, /* ok kickstart (reg 0x55) */
|
||||
|
@ -1422,6 +1462,7 @@ static HWDef Hw0x0400_0x1001_0 =
|
|||
|
||||
0x03, /* ok stepper motor control (reg 0x45) */
|
||||
0, /* wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
|
||||
0x1e, /* steps to reverse on buffer full (reg 0x50) */
|
||||
0xfc, /* ok acceleration profile (reg 0x51) */
|
||||
0x03, /* ok lines to process (reg 0x54) */
|
||||
0x13, /* Kickstart 0x55 */
|
||||
|
@ -1479,6 +1520,7 @@ static HWDef Hw0x04B8_0x010F_0 =
|
|||
|
||||
3, /* ok stepper motor control (reg 0x45) */
|
||||
0, /* ok wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
|
||||
0x1e, /* steps to reverse on buffer full (reg 0x50) */
|
||||
0x0c, /* ok acceleration profile (reg 0x51) */
|
||||
0, /* ok lines to process (reg 0x54) */
|
||||
0x0f, /* ok kickstart (reg 0x55) */
|
||||
|
@ -1540,6 +1582,7 @@ static HWDef Hw0x1606_0x0060_0 =
|
|||
|
||||
3, /* stepper motor control (reg 0x45) */
|
||||
0, /* wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
|
||||
0x1e, /* steps to reverse on buffer full (reg 0x50)*/
|
||||
0xf4, /* acceleration profile (reg 0x51) */
|
||||
0, /* lines to process (reg 0x54) */
|
||||
0xcb, /* kickstart (reg 0x55) */
|
||||
|
@ -1558,19 +1601,19 @@ static HWDef Hw0x1606_0x0060_0 =
|
|||
MODEL_NOPLUSTEK_1200
|
||||
};
|
||||
|
||||
/* Canon 650 */
|
||||
/* Canon 650/656 */
|
||||
static HWDef Hw0x04A9_0x2206_0 =
|
||||
{
|
||||
0.7, /* dMaxMotorSpeed (Max_Speed) */
|
||||
0.7, /* dMaxMoveSpeed (Max_Speed) */
|
||||
0.86, /* dMaxMotorSpeed (Max_Speed) */
|
||||
0.21, /* dMaxMoveSpeed (Max_Speed) */
|
||||
100, /* wIntegrationTimeLowLamp */
|
||||
100, /* wIntegrationTimeHighLamp */
|
||||
600, /* wMotorDpi (Full step DPI) */
|
||||
1200, /* 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) */
|
||||
0, /* wGreenPWMDutyCycleLow (reg 0x2a + 0x2b) */
|
||||
0, /* wGreenPWMDutyCycleHigh (reg 0x2a + 0x2b) */
|
||||
|
||||
0x15, /* bSensorConfiguration (0x0b) */
|
||||
0x4c, /* sensor control settings (reg 0x0c) */
|
||||
|
@ -1583,42 +1626,121 @@ static HWDef Hw0x04A9_0x2206_0 =
|
|||
{0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x05},
|
||||
/* color (reg 0x0f to 0x18) */
|
||||
|
||||
(_BLUE_CH | 0x05), /* bReg_0x26 color mode */
|
||||
(_BLUE_CH | _ONE_CH_COLOR), /* bReg_0x26 color mode */
|
||||
|
||||
0x00, /* bReg 0x27 color mode */
|
||||
2, /* bReg 0x29 illumination mode */
|
||||
|
||||
1, /* StepperPhaseCorrection (reg 0x1a + 0x1b) */
|
||||
1, /* bOpticBlackStart (reg 0x1c) */
|
||||
52, /* bOpticBlackEnd (reg 0x1d) */
|
||||
75, /* ? wActivePixelsStart (reg 0x1e + 0x1f) */
|
||||
5293, /* wLineEnd (reg 0x20 + 0x21) */
|
||||
|
||||
#if 1
|
||||
23, /* red lamp on (reg 0x2c + 0x2d) */
|
||||
4397, /* red lamp off (reg 0x2e + 0x2f) */
|
||||
23, /* green lamp on (reg 0x30 + 0x31) */
|
||||
2664, /* green lamp off (reg 0x32 + 0x33) */
|
||||
23, /* blue lamp on (reg 0x34 + 0x35) */
|
||||
1426, /* blue lamp off (reg 0x36 + 0x37) */
|
||||
#else
|
||||
|
||||
1, /* red lamp on (reg 0x2c + 0x2d) */
|
||||
16383, /* red lamp off (reg 0x2e + 0x2f) */
|
||||
1, /* green lamp on (reg 0x30 + 0x31) */
|
||||
16383, /* green lamp off (reg 0x32 + 0x33) */
|
||||
1, /* blue lamp on (reg 0x34 + 0x35) */
|
||||
16383, /* 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) */
|
||||
0xfc, /* acceleration profile (reg 0x51) */
|
||||
0, /* lines to process (reg 0x54) */
|
||||
0x0f, /* kickstart (reg 0x55) */
|
||||
0x08, /* pwm freq (reg 0x56) */
|
||||
0x1f, /* pwm duty cycle (reg 0x57) */
|
||||
|
||||
0x05, /* Paper sense (reg 0x58) */
|
||||
|
||||
0x44, /* misc io12 (reg 0x59) */
|
||||
0x94, /* misc io34 (reg 0x5a) */
|
||||
0x19, /* misc io56 (reg 0x5b) */
|
||||
0x01, /* test mode ADC Output CODE MSB (reg 0x5c) */
|
||||
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
|
||||
0, /* test mode (reg 0x5e) */
|
||||
_LM9832,
|
||||
MODEL_CANON1200
|
||||
};
|
||||
|
||||
/* Canon 670/676 */
|
||||
static HWDef Hw0x04A9_0x220D_0 =
|
||||
{
|
||||
0.86, /* dMaxMotorSpeed (Max_Speed) */
|
||||
0.21, /* dMaxMoveSpeed (Max_Speed) */
|
||||
100, /* wIntegrationTimeLowLamp */
|
||||
100, /* wIntegrationTimeHighLamp */
|
||||
1200, /* wMotorDpi (Full step DPI) */
|
||||
512, /* wRAMSize (KB) */
|
||||
3.75, /* dMinIntegrationTimeLowres (ms) */
|
||||
5.75, /* dMinIntegrationTimeHighres (ms) */
|
||||
0, /* wGreenPWMDutyCycleLow (reg 0x2a + 0x2b) */
|
||||
0, /* wGreenPWMDutyCycleHigh (reg 0x2a + 0x2b) */
|
||||
|
||||
0x15, /* bSensorConfiguration (0x0b) */
|
||||
0x4c, /* sensor control settings (reg 0x0c) */
|
||||
0x2f, /* sensor control settings (reg 0x0d) */
|
||||
0x00, /* sensor control settings (reg 0x0e) */
|
||||
|
||||
{0x00, 0x03, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03},
|
||||
/* mono (reg 0x0f to 0x18) */
|
||||
|
||||
{0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x05},
|
||||
/* color (reg 0x0f to 0x18) */
|
||||
|
||||
(_BLUE_CH | _ONE_CH_COLOR), /* bReg_0x26 color mode */
|
||||
|
||||
0x00, /* bReg 0x27 color mode */
|
||||
2, /* bReg 0x29 illumination mode */
|
||||
|
||||
5, /* StepperPhaseCorrection (reg 0x1a + 0x1b) */
|
||||
1, /* StepperPhaseCorrection (reg 0x1a + 0x1b) */
|
||||
1, /* bOpticBlackStart (reg 0x1c) */
|
||||
52, /* bOpticBlackEnd (reg 0x1d) */
|
||||
110, /* ? wActivePixelsStart (reg 0x1e + 0x1f) */
|
||||
5469, /* wLineEnd (reg 0x20 + 0x21) */
|
||||
75, /* ? wActivePixelsStart (reg 0x1e + 0x1f) */
|
||||
5293, /* wLineEnd (reg 0x20 + 0x21) */
|
||||
|
||||
100, /* red lamp on (reg 0x2c + 0x2d) */
|
||||
5100, /* red lamp off (reg 0x2e + 0x2f) */
|
||||
100, /* green lamp on (reg 0x30 + 0x31) */
|
||||
3100, /* green lamp off (reg 0x32 + 0x33) */
|
||||
100, /* blue lamp on (reg 0x34 + 0x35) */
|
||||
2100, /* blue lamp off (reg 0x36 + 0x37) */
|
||||
#if 0
|
||||
23, /* red lamp on (reg 0x2c + 0x2d) */
|
||||
4562, /* red lamp off (reg 0x2e + 0x2f) */
|
||||
23, /* green lamp on (reg 0x30 + 0x31) */
|
||||
4315, /* green lamp off (reg 0x32 + 0x33) */
|
||||
23, /* blue lamp on (reg 0x34 + 0x35) */
|
||||
3076, /* blue lamp off (reg 0x36 + 0x37) */
|
||||
#else
|
||||
1, 16383,
|
||||
1, 16383,
|
||||
1, 16383,
|
||||
#endif
|
||||
3, /* stepper motor control (reg 0x45) */
|
||||
0, /* wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
|
||||
0, /* steps to reverse when buffer is full reg 0x50) */
|
||||
0xfc, /* acceleration profile (reg 0x51) */
|
||||
0, /* lines to process (reg 0x54) */
|
||||
0x0f, /* kickstart (reg 0x55) */
|
||||
0x08, /* pwm freq (reg 0x56) */
|
||||
0x1f, /* pwm duty cycle (reg 0x57) */
|
||||
|
||||
3, /* stepper motor control (reg 0x45) */
|
||||
0, /* wStepsAfterPaperSensor2 (reg 0x4c + 0x4d) */
|
||||
0xfc, /* acceleration profile (reg 0x51) */
|
||||
0, /* lines to process (reg 0x54) */
|
||||
0x17, /* kickstart (reg 0x55) */
|
||||
0x08, /* pwm freq (reg 0x56) */
|
||||
0x1f, /* pwm duty cycle (reg 0x57) */
|
||||
0x04, /* Paper sense (reg 0x58) */
|
||||
|
||||
0x05, /* Paper sense (reg 0x58) */
|
||||
|
||||
0x24, /* misc io12 (reg 0x59) */
|
||||
0x12, /* misc io34 (reg 0x5a) */
|
||||
0x11, /* misc io56 (reg 0x5b) */
|
||||
0, /* test mode ADC Output CODE MSB (reg 0x5c) */
|
||||
0x44, /* misc io12 (reg 0x59) */
|
||||
0x94, /* misc io34 (reg 0x5a) */
|
||||
0x19, /* misc io56 (reg 0x5b) */
|
||||
0x01, /* test mode ADC Output CODE MSB (reg 0x5c) */
|
||||
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
|
||||
0, /* test mode (reg 0x5e) */
|
||||
_LM9832,
|
||||
MODEL_NOPLUSTEK_600
|
||||
MODEL_CANON1200
|
||||
};
|
||||
|
||||
/******************** all available combinations *****************************/
|
||||
|
@ -1659,11 +1781,11 @@ static SetDef Settings[] =
|
|||
|
||||
/* Genius devices... */
|
||||
{"0x0458-0x2007", &Cap0x07B3_0x0007_0, &Hw0x07B3_0x0007_0, "ColorPage-HR6 V2" },
|
||||
{"0x0458-0x2008", &Cap0x07B3_0x0007_0, &Hw0x07B3_0x0007_0, "Unknown device" },
|
||||
{"0x0458-0x2009", &Cap0x07B3_0x000F_0, &Hw0x07B3_0x000F_0, "Unknown device" },
|
||||
{"0x0458-0x2013", &Cap0x07B3_0x0007_4, &Hw0x07B3_0x0007_4, "Unknown device" },
|
||||
{"0x0458-0x2015", &Cap0x07B3_0x0005_4, &Hw0x07B3_0x0007_4, "Unknown device" },
|
||||
{"0x0458-0x2016", &Cap0x07B3_0x0005_4, &Hw0x07B3_0x0007_0, "Unknown device" },
|
||||
{"0x0458-0x2008", &Cap0x07B3_0x0007_0, &Hw0x07B3_0x0007_0, "ColorPage-HR6 V2" },
|
||||
{"0x0458-0x2009", &Cap0x07B3_0x000F_0, &Hw0x07B3_0x000F_0, "ColorPage-HR6A" },
|
||||
{"0x0458-0x2013", &Cap0x07B3_0x0007_4, &Hw0x07B3_0x0007_4, "ColorPage-HR7" },
|
||||
{"0x0458-0x2015", &Cap0x07B3_0x0005_4, &Hw0x07B3_0x0007_4, "ColorPage-HR7LE" },
|
||||
{"0x0458-0x2016", &Cap0x07B3_0x0005_4, &Hw0x07B3_0x0007_0, "ColorPage-HR6X" },
|
||||
|
||||
/* Hewlett Packard... */
|
||||
{"0x03F0-0x0505", &Cap0x03F0_0x0505, &Hw0x03F0_0x0505, "Scanjet 2100c" },
|
||||
|
@ -1671,13 +1793,15 @@ static SetDef Settings[] =
|
|||
|
||||
/* EPSON... */
|
||||
{"0x04B8-0x010F", &Cap0x04B8_0x010F_0, &Hw0x04B8_0x010F_0, "Perfection 1250/Photo" },
|
||||
{"0x04B8-0x011D", &Cap0x04B8_0x010F_0, &Hw0x04B8_0x010F_0, "Perfection 1260" },
|
||||
{"0x04B8-0x0114", &Cap0x04B8_0x010F_0, &Hw0x04B8_0x010F_0, "Perfection 660" },
|
||||
|
||||
/* UMAX... */
|
||||
{"0x1606-0x0060", &Cap0x1606_0x0060_0, &Hw0x1606_0x0060_0, "UMAX 3400" },
|
||||
|
||||
/* CANON... */
|
||||
{"0x04A9-0x2206", &Cap0x04A9_0x2206_0, &Hw0x04A9_0x2206_0, "N650U/N656U" },
|
||||
/* {"0x04A9-0x220D", ,, "N670U" }, */
|
||||
{"0x04A9-0x220D", &Cap0x04A9_0x220D_0, &Hw0x04A9_0x220D_0, "N670U/N676U" },
|
||||
|
||||
/* Please add other devices here...
|
||||
* The first entry is a string, composed out of the vendor and product id,
|
||||
|
@ -1799,6 +1923,19 @@ static ClkMotorDef Motors[] = {
|
|||
{ 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 3.5, 3.5, 3.5, 3.5 },
|
||||
/* Gray mode MCLK settings */
|
||||
{ 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0 }
|
||||
},
|
||||
|
||||
{ MODEL_CANON1200, 8, 51, 6,
|
||||
/* Motor settings (PWM and PWM_Duty) */
|
||||
/* <=75dpi <=100dpi <=150dpi <=200dpi <=300dpi */
|
||||
{{ 8, 63 }, { 8, 63 }, { 8, 63 }, { 8, 63 }, { 6, 32 },
|
||||
|
||||
/* <=400dpi <=600dpi <=800dpi <=1200dpi <=2400dpi */
|
||||
{ 6, 32 }, { 6, 32 }, { 6, 32 }, { 6, 32 }, { 6, 32 }},
|
||||
/* Color mode MCLK settings */
|
||||
{ 6.0, 5.0, 4.0, 4.0, 3.0, 2.0, 1.5, 1.0, 1.0, 1.0 },
|
||||
/* Gray mode MCLK settings */
|
||||
{ 4.5, 4.5, 4.5, 4.5, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0 }
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
* 0.42 - added setmap function
|
||||
* fixed the stopscan problem, that causes a crash in the kernel module
|
||||
* 0.43 - no changes
|
||||
* 0.44 - no changes
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
* changed IOCTL interface to allow downloadable MAPS
|
||||
* added error codes
|
||||
* 0.43 - added tpa entry for AdjDef
|
||||
* 0.44 - no changes
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
* changed detection stuff, so we first check whether
|
||||
* the vendor and product Ids match with the ones in our list
|
||||
* 0.43 - cleanup
|
||||
* 0.44 - changes to integration CIS based devices
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -113,9 +114,8 @@ static void usb_initDev( pPlustek_Device dev, int idx, int handle, int vendor )
|
|||
* the following you normally get from the registry...
|
||||
* 30 and 8 are for a UT12
|
||||
*/
|
||||
bMaxITA = 0; /* Maximum integration time adjust */
|
||||
dev->usbDev.bStepsToReverse = 30;
|
||||
dev->usbDev.dwBufferSize = 8 * 1024 * 1024; /*min val is 4MB!!!*/
|
||||
bMaxITA = 0; /* Maximum integration time adjust */
|
||||
dev->usbDev.dwBufferSize = 8 * 1024 * 1024; /*min val is 4MB!!!*/
|
||||
|
||||
dev->usbDev.ModelStr = Settings[idx].pModelString;
|
||||
|
||||
|
@ -142,9 +142,10 @@ static void usb_initDev( pPlustek_Device dev, int idx, int handle, int vendor )
|
|||
}
|
||||
|
||||
dev->usbDev.currentLamp = usb_GetLampStatus( dev );
|
||||
|
||||
|
||||
usb_ResetRegisters( dev );
|
||||
usbio_ResetLM983x ( dev );
|
||||
usb_IsScannerReady( dev );
|
||||
|
||||
sParam.bBitDepth = 8;
|
||||
sParam.bCalibration = PARAM_Scan;
|
||||
|
@ -369,7 +370,6 @@ static int usbDev_open( const char *dev_name, void *misc )
|
|||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if( SANE_STATUS_GOOD != usbio_DetectLM983x( handle, &version )) {
|
||||
sanei_usb_close( handle );
|
||||
return -1;
|
||||
|
@ -390,6 +390,9 @@ static int usbDev_open( const char *dev_name, void *misc )
|
|||
sanei_lm983x_reset( handle );
|
||||
#endif
|
||||
|
||||
dev->usbDev.vendor = vendor;
|
||||
dev->usbDev.product = product;
|
||||
|
||||
/*
|
||||
* Plustek uses the misc IO 1/2 to get the PCB ID
|
||||
* (PCB = printed circuit board), so it's possible to have one
|
||||
|
@ -612,7 +615,7 @@ static int usbDev_setScanEnv( Plustek_Device *dev, pScanInfo si )
|
|||
}
|
||||
}
|
||||
|
||||
usb_SaveImageInfo( &si->ImgDef, &dev->scanning.sParam );
|
||||
usb_SaveImageInfo( dev, &si->ImgDef );
|
||||
usb_GetImageInfo ( &si->ImgDef, &dev->scanning.sParam.Size );
|
||||
|
||||
/* Flags */
|
||||
|
@ -782,10 +785,11 @@ static int usbDev_startScan( Plustek_Device *dev, pStartScan start )
|
|||
static int usbDev_readImage( struct Plustek_Device *dev,
|
||||
SANE_Byte *buf, unsigned long data_length )
|
||||
{
|
||||
int result, lines;
|
||||
u_long dw;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pDCapsDef scaps = &dev->usbDev.Caps;
|
||||
int result, lines;
|
||||
u_long dw, scaler;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pDCapsDef scaps = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
||||
DBG( _DBG_INFO, "usbDev_readImage()\n" );
|
||||
|
||||
|
@ -793,7 +797,7 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
* to it's home position if necessary...
|
||||
*/
|
||||
usb_ModuleStatus( dev );
|
||||
|
||||
|
||||
result = usb_DoCalibration( dev );
|
||||
if( SANE_TRUE != result ) {
|
||||
DBG( _DBG_INFO, "calibration failed!!!\n" );
|
||||
|
@ -801,12 +805,20 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
}
|
||||
|
||||
DBG( _DBG_INFO, "calibration done.\n" );
|
||||
|
||||
scaler = 1;
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
if( pParam->bDataType == SCANDATATYPE_Color ) {
|
||||
scaler = 3;
|
||||
}
|
||||
}
|
||||
|
||||
if( !( scanning->dwFlag & SCANFLAG_Scanning )) {
|
||||
|
||||
usleep( 10 * 1000 );
|
||||
|
||||
if( usb_SetScanParameters( dev, &scanning->sParam )) {
|
||||
|
||||
/* what if error !!!*/
|
||||
scanning->pbScanBufBegin = scanning->pScanBuffer;
|
||||
|
||||
if((dev->caps.dwFlag & SFLAG_ADF) && (scaps->OpticDpi.x == 600))
|
||||
|
@ -815,14 +827,17 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
scanning->dwLinesScanBuf = 32;
|
||||
|
||||
scanning->dwBytesScanBuf = scanning->dwLinesScanBuf *
|
||||
scanning->sParam.Size.dwPhyBytes;
|
||||
scanning->sParam.Size.dwPhyBytes *
|
||||
scaler;
|
||||
|
||||
scanning->dwNumberOfScanBufs = dev->usbDev.dwBufferSize /
|
||||
scanning->dwBytesScanBuf;
|
||||
scanning->dwLinesPerScanBufs = scanning->dwNumberOfScanBufs *
|
||||
scanning->dwLinesScanBuf;
|
||||
scanning->pbScanBufEnd = scanning->pbScanBufBegin +
|
||||
scanning->dwLinesPerScanBufs *
|
||||
scanning->sParam.Size.dwPhyBytes;
|
||||
scanning->sParam.Size.dwPhyBytes *
|
||||
scaler;
|
||||
|
||||
if( scanning->sParam.bChannels == 3 ) {
|
||||
|
||||
|
@ -911,8 +926,19 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
}
|
||||
|
||||
} else {
|
||||
|
||||
/* this might be simple gray operation or AFE 1 channel op */
|
||||
scanning->dwLinesDiscard = 0;
|
||||
scanning->Green.pb = scanning->pbScanBufBegin;
|
||||
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
|
||||
scanning->Red.pb = scanning->pbScanBufBegin;
|
||||
scanning->Green.pb = scanning->pbScanBufBegin +
|
||||
(scanning->sParam.Size.dwPhyBytes );
|
||||
scanning->Blue.pb = scanning->pbScanBufBegin +
|
||||
(scanning->sParam.Size.dwPhyBytes )* 2UL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -950,8 +976,7 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
* as the SANE stuff already forked the driver to read data, I think
|
||||
* we should only read data by using a function...
|
||||
*/
|
||||
/* HEINER: CHECK THIS!!! */
|
||||
scanning->dwLinesUser = scanning->sParam.Size.dwLines; /*lpCB->dwIn / scanning->dwBytesLine*/;
|
||||
scanning->dwLinesUser = scanning->sParam.Size.dwLines;
|
||||
if( !scanning->dwLinesUser )
|
||||
return _E_BUFFER_TOO_SMALL;
|
||||
|
||||
|
@ -976,6 +1001,7 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
DBG(_DBG_INFO,"NumberOfScanBufs = %lu\n",scanning->dwNumberOfScanBufs);
|
||||
DBG(_DBG_INFO,"LinesPerScanBufs = %lu\n",scanning->dwLinesPerScanBufs);
|
||||
DBG(_DBG_INFO,"dwPhyBytes = %lu\n",scanning->sParam.Size.dwPhyBytes);
|
||||
DBG(_DBG_INFO,"dwPhyPixels = %lu\n",scanning->sParam.Size.dwPhyPixels);
|
||||
DBG(_DBG_INFO,"dwTotalBytes = %lu\n",scanning->sParam.Size.dwTotalBytes);
|
||||
DBG(_DBG_INFO,"dwPixels = %lu\n",scanning->sParam.Size.dwPixels);
|
||||
DBG(_DBG_INFO,"dwValidPixels = %lu\n",scanning->sParam.Size.dwValidPixels);
|
||||
|
@ -987,6 +1013,8 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
|
||||
scanning->pbGetDataBuf = scanning->pbScanBufBegin;
|
||||
|
||||
dumpPic( "plustek-pic.raw", NULL, 0 );
|
||||
|
||||
lines = usb_ReadData( dev );
|
||||
if( 0 == lines )
|
||||
return _E_DATAREAD;
|
||||
|
@ -996,6 +1024,8 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
*/
|
||||
for( dw = 0; scanning->dwLinesUser; ) {
|
||||
|
||||
int wrap = 0;
|
||||
|
||||
if( usb_IsEscPressed()) {
|
||||
DBG( _DBG_INFO, "ReadImage() - Cancel detected...\n" );
|
||||
return 0;
|
||||
|
@ -1029,20 +1059,26 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
/* Adjust get buffer pointers */
|
||||
if( scanning->sParam.bDataType == SCANDATATYPE_Color ) {
|
||||
|
||||
scanning->Red.pb += scanning->sParam.Size.dwPhyBytes;
|
||||
if( scanning->Red.pb >= scanning->pbScanBufEnd )
|
||||
scanning->Red.pb += (scanning->sParam.Size.dwPhyBytes * scaler);
|
||||
if( scanning->Red.pb >= scanning->pbScanBufEnd ) {
|
||||
scanning->Red.pb = scanning->pbScanBufBegin +
|
||||
scanning->dwRedShift;
|
||||
wrap = 1;
|
||||
}
|
||||
|
||||
scanning->Green.pb += scanning->sParam.Size.dwPhyBytes;
|
||||
if( scanning->Green.pb >= scanning->pbScanBufEnd )
|
||||
scanning->Green.pb += (scanning->sParam.Size.dwPhyBytes * scaler);
|
||||
if( scanning->Green.pb >= scanning->pbScanBufEnd ) {
|
||||
scanning->Green.pb = scanning->pbScanBufBegin +
|
||||
scanning->dwGreenShift;
|
||||
wrap = 1;
|
||||
}
|
||||
|
||||
scanning->Blue.pb += scanning->sParam.Size.dwPhyBytes;
|
||||
if( scanning->Blue.pb >= scanning->pbScanBufEnd )
|
||||
scanning->Blue.pb += (scanning->sParam.Size.dwPhyBytes * scaler);
|
||||
if( scanning->Blue.pb >= scanning->pbScanBufEnd ) {
|
||||
scanning->Blue.pb = scanning->pbScanBufBegin +
|
||||
scanning->dwBlueShift;
|
||||
wrap = 1;
|
||||
}
|
||||
} else {
|
||||
scanning->Green.pb += scanning->sParam.Size.dwPhyBytes;
|
||||
if( scanning->Green.pb >= scanning->pbScanBufEnd )
|
||||
|
@ -1050,6 +1086,25 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
scanning->dwGreenShift;
|
||||
}
|
||||
|
||||
/*
|
||||
* on any wrap-around of the get pointers in one channel mode
|
||||
* we have to reset them
|
||||
*/
|
||||
if( wrap ) {
|
||||
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
|
||||
if( pParam->bDataType == SCANDATATYPE_Color ) {
|
||||
|
||||
scanning->Red.pb = scanning->pbScanBufBegin;
|
||||
scanning->Green.pb = scanning->pbScanBufBegin +
|
||||
(scanning->sParam.Size.dwPhyBytes );
|
||||
scanning->Blue.pb = scanning->pbScanBufBegin +
|
||||
(scanning->sParam.Size.dwPhyBytes )* 2UL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* line processed, check if we have to get more...
|
||||
*/
|
||||
|
@ -1067,7 +1122,7 @@ static int usbDev_readImage( struct Plustek_Device *dev,
|
|||
(dw * scanning->dwBytesLine), dw, data_length );
|
||||
usb_ScanEnd( dev );
|
||||
|
||||
return data_length; /* (dw * scanning->dwBytesLine);*/
|
||||
return data_length;
|
||||
}
|
||||
|
||||
/* END PLUSTEK-USB.C ........................................................*/
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
* added _WAF_MISC_IO3_LAMP for UMAX 3400
|
||||
* 0.43 - added _WAF_MISC_IOx_LAMP (x=1,2,4,5)
|
||||
* added CLKDef
|
||||
* 0.44 - added vendor and product ID to struct DeviceDef
|
||||
* added _WAF_BYPASS_CALIBRATION
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -169,10 +171,11 @@ enum _DEVCAPSFLAG
|
|||
|
||||
enum _WORKAROUNDS
|
||||
{
|
||||
_WAF_NONE = 0x00000000, /* no fix anywhere needed */
|
||||
_WAF_BSHIFT7_BUG = 0x00000001, /* to fix U12 bug in 14bit mode */
|
||||
_WAF_MISC_IO_LAMPS = 0x00000002, /* special lamp switching */
|
||||
_WAF_BLACKFINE = 0x00000004 /* use black calibration strip */
|
||||
_WAF_NONE = 0x00000000, /* no fix anywhere needed */
|
||||
_WAF_BSHIFT7_BUG = 0x00000001, /* to fix U12 bug in 14bit mode */
|
||||
_WAF_MISC_IO_LAMPS = 0x00000002, /* special lamp switching */
|
||||
_WAF_BLACKFINE = 0x00000004, /* use black calibration strip */
|
||||
_WAF_BYPASS_CALIBRATION = 0x00000008 /* no calibration,use linear gamma */
|
||||
};
|
||||
|
||||
enum _LAMPS
|
||||
|
@ -196,11 +199,12 @@ typedef enum
|
|||
MODEL_KaoHsiung = 0,
|
||||
MODEL_HuaLien,
|
||||
MODEL_Tokyo600,
|
||||
MODEL_NOPLUSTEK_600, /* for 600 dpi models */
|
||||
MODEL_NOPLUSTEK_1200, /* for 1200 dpi models */
|
||||
MODEL_MUSTEK600, /* for BearPaw 1200 */
|
||||
MODEL_MUSTEK1200, /* for BearPaw 2400 */
|
||||
MODEL_HP, /* for HP2x00 */
|
||||
MODEL_NOPLUSTEK_600, /* for 600 dpi models */
|
||||
MODEL_NOPLUSTEK_1200, /* for 1200 dpi models */
|
||||
MODEL_MUSTEK600, /* for BearPaw 1200 */
|
||||
MODEL_MUSTEK1200, /* for BearPaw 2400 */
|
||||
MODEL_HP, /* for HP2x00 */
|
||||
MODEL_CANON1200, /* for Canon N670U/676U */
|
||||
MODEL_LAST
|
||||
} eModelDef;
|
||||
|
||||
|
@ -343,6 +347,7 @@ typedef struct HWDefault
|
|||
/* Misc */
|
||||
u_char bReg_0x45;
|
||||
u_short wStepsAfterPaperSensor2;/* 0x4c & 0x4d */
|
||||
u_char bStepsToReverse; /* 0x50 */
|
||||
u_char bReg_0x51;
|
||||
u_char bReg_0x54;
|
||||
u_char bReg_0x55;
|
||||
|
@ -367,6 +372,8 @@ typedef struct HWDefault
|
|||
typedef struct DeviceDef
|
||||
{
|
||||
char* ModelStr; /* pointer to our model string */
|
||||
int vendor; /* vendor ID */
|
||||
int product; /* product ID */
|
||||
DCapsDef Caps; /* pointer to the attribute of current dev */
|
||||
HWDef HwSetting; /* Pointer to the characteristics of device */
|
||||
pSrcAttrDef pSource; /* Scanning src, it's equal to Caps.Normal */
|
||||
|
@ -380,7 +387,6 @@ typedef struct DeviceDef
|
|||
u_long dwLampOnPeriod; /* How many seconds to keep lamp on */
|
||||
SANE_Bool bLampOffOnEnd; /* switch lamp off on end or keep cur. state*/
|
||||
int currentLamp; /* The lamp ID */
|
||||
u_char bStepsToReverse; /* reg 0x50, this value is from registry */
|
||||
u_long dwBufferSize; /* */
|
||||
|
||||
} DeviceDef, *pDeviceDef;
|
||||
|
|
|
@ -15,6 +15,9 @@
|
|||
* added UMAX 3400 stuff
|
||||
* fixed problem with minimum wait time...
|
||||
* 0.43 - added usb_switchLamp for non-Plustek devices
|
||||
* 0.44 - added bStepsToReverse and active Pixelstart values
|
||||
* to resetRegister function
|
||||
* modified getLampStatus function for CIS devices
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -490,8 +493,11 @@ static SANE_Bool usb_ModuleToHome( pPlustek_Device dev, SANE_Bool fWait )
|
|||
|
||||
a_bRegs[0x45] |= 0x10;
|
||||
|
||||
DBG( _DBG_INFO, "MOTOR-Settings: PWM=0x%02x, PWM_DUTY=0x%02x 0x%02x\n",
|
||||
a_bRegs[0x56], a_bRegs[0x57], a_bRegs[0x45] );
|
||||
DBG( _DBG_INFO, "MOTOR: "
|
||||
"PWM=0x%02x, PWM_DUTY=0x%02x 0x45=0x%02x "
|
||||
"0x48=0x%02x, 0x49=0x%02x\n",
|
||||
a_bRegs[0x56], a_bRegs[0x57],
|
||||
a_bRegs[0x45], a_bRegs[0x48], a_bRegs[0x49] );
|
||||
|
||||
/* The setting for chassis moving is:
|
||||
* MCLK divider = 6, 8 bits/pixel, HDPI divider = 12,
|
||||
|
@ -690,20 +696,31 @@ static int usb_GetLampStatus( pPlustek_Device dev )
|
|||
|
||||
usb_GetLampRegAndMask( sc->lamp, ®, &msk );
|
||||
|
||||
/* check if the lamp is on */
|
||||
usbio_ReadReg( dev->fd, reg, &val );
|
||||
DBG( _DBG_INFO, "REG[0x%02x] = 0x%02x (msk=0x%02x)\n", reg, val, msk );
|
||||
if( val & msk )
|
||||
iLampStatus |= DEV_LampReflection;
|
||||
if( 0 == reg ) {
|
||||
|
||||
/* if the device supports a TPA, we check this here */
|
||||
if( sc->wFlags & DEVCAPSFLAG_TPA ) {
|
||||
usbio_ReadReg( dev->fd, 0x29, &a_bRegs[0x29] );
|
||||
|
||||
usb_GetLampRegAndMask( _GET_TPALAMP(sc->lamp), ®, &msk );
|
||||
if( a_bRegs[0x29] & 3)
|
||||
iLampStatus |= DEV_LampReflection;
|
||||
} else {
|
||||
|
||||
/* check if the lamp is on */
|
||||
usbio_ReadReg( dev->fd, reg, &val );
|
||||
|
||||
DBG( _DBG_INFO, "REG[0x%02x] = 0x%02x (msk=0x%02x)\n",reg,val,msk);
|
||||
if( val & msk )
|
||||
iLampStatus |= DEV_LampTPA;
|
||||
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_INFO, "REG[0x%02x] = 0x%02x (msk=0x%02x)\n",
|
||||
reg,val,msk);
|
||||
if( val & msk )
|
||||
iLampStatus |= DEV_LampTPA;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -938,6 +955,7 @@ static SANE_Bool usb_LampOn( pPlustek_Device dev,
|
|||
* 0x20 - 0x21 - Line End<br>
|
||||
* 0x45 - Stepper Motor Mode<br>
|
||||
* 0x4c - 0x4d - Full Steps to Scan after PAPER SENSE 2 trips<br>
|
||||
* 0x50 - Steps to reverse when buffer is full<br>
|
||||
* 0x51 - Acceleration Profile<br>
|
||||
* 0x54 - 0x5e - Motor Settings, Paper-Sense Settings and Misc I/O<br>
|
||||
*
|
||||
|
@ -956,11 +974,14 @@ static void usb_ResetRegisters( pPlustek_Device dev )
|
|||
memcpy( a_bRegs+0x0f, &hw->bReg_0x0f_Color, 10 );
|
||||
a_bRegs[0x1a] = _HIBYTE( hw->StepperPhaseCorrection );
|
||||
a_bRegs[0x1b] = _LOBYTE( hw->StepperPhaseCorrection );
|
||||
a_bRegs[0x1e] = _HIBYTE( hw->wActivePixelsStart );
|
||||
a_bRegs[0x1f] = _LOBYTE( hw->wActivePixelsStart );
|
||||
a_bRegs[0x20] = _HIBYTE( hw->wLineEnd );
|
||||
a_bRegs[0x21] = _LOBYTE( hw->wLineEnd );
|
||||
a_bRegs[0x45] = hw->bReg_0x45;
|
||||
a_bRegs[0x4c] = _HIBYTE( hw->wStepsAfterPaperSensor2 );
|
||||
a_bRegs[0x4d] = _LOBYTE( hw->wStepsAfterPaperSensor2 );
|
||||
a_bRegs[0x50] = hw->bStepsToReverse;
|
||||
a_bRegs[0x51] = hw->bReg_0x51;
|
||||
|
||||
memcpy( a_bRegs+0x54, &hw->bReg_0x54, 0x5e - 0x54 + 1 );
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
* 0.41 - fixed the 14bit problem for LM9831 devices
|
||||
* 0.42 - no changes
|
||||
* 0.43 - no changes
|
||||
* 0.44 - added CIS parts and dumpPic function
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -205,6 +206,7 @@ static void usb_AverageColorByte( struct Plustek_Device *dev )
|
|||
if((scanning->sParam.bSource == SOURCE_Negative ||
|
||||
scanning->sParam.bSource == SOURCE_Transparency) &&
|
||||
scanning->sParam.PhyDpi.x > 800) {
|
||||
|
||||
for (dw = 0; dw < (scanning->sParam.Size.dwPhyPixels - 1); dw++)
|
||||
{
|
||||
scanning->Red.pcb[dw].a_bColor[0] =
|
||||
|
@ -399,7 +401,7 @@ static void usb_ColorScaleGray( struct Plustek_Device *dev )
|
|||
}
|
||||
|
||||
/*.............................................................................
|
||||
* here we copy and scale from scanner world to user word...
|
||||
* here we copy and scale from scanner world to user world...
|
||||
*/
|
||||
static void usb_ColorScale8( struct Plustek_Device *dev )
|
||||
{
|
||||
|
@ -443,6 +445,46 @@ static void usb_ColorScale8( struct Plustek_Device *dev )
|
|||
}
|
||||
}
|
||||
|
||||
static void usb_ColorScale8_2( struct Plustek_Device *dev )
|
||||
{
|
||||
int izoom, ddax;
|
||||
u_long dw;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
|
||||
dw = scanning->sParam.Size.dwPixels;
|
||||
|
||||
if( scanning->sParam.bSource == SOURCE_ADF ) {
|
||||
iNext = -1;
|
||||
dwPixels = scanning->sParam.Size.dwPixels - 1;
|
||||
} else {
|
||||
iNext = 1;
|
||||
dwPixels = 0;
|
||||
}
|
||||
|
||||
izoom = usb_GetScaler( scanning );
|
||||
|
||||
for( dwBitsPut = 0, ddax = 0; dw; dwBitsPut++ ) {
|
||||
|
||||
ddax -= _SCALER;
|
||||
|
||||
while((ddax < 0) && (dw > 0)) {
|
||||
|
||||
scanning->UserBuf.pb_rgb[dwPixels].Red =
|
||||
scanning->Red.pb[dwBitsPut];
|
||||
|
||||
scanning->UserBuf.pb_rgb[dwPixels].Green =
|
||||
scanning->Green.pb[dwBitsPut];
|
||||
|
||||
scanning->UserBuf.pb_rgb[dwPixels].Blue =
|
||||
scanning->Blue.pb[dwBitsPut];
|
||||
|
||||
dwPixels = dwPixels + iNext;
|
||||
ddax += izoom;
|
||||
dw--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
*
|
||||
*/
|
||||
|
@ -599,7 +641,32 @@ static void usb_ColorDuplicate8( struct Plustek_Device *dev )
|
|||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
/**
|
||||
* reorder from rgb line to rgb pixel (CIS scanner)
|
||||
*/
|
||||
static void usb_ColorDuplicate8_2( struct Plustek_Device *dev )
|
||||
{
|
||||
u_long dw;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
|
||||
if( scanning->sParam.bSource == SOURCE_ADF ) {
|
||||
iNext = -1;
|
||||
dwPixels = scanning->sParam.Size.dwPixels - 1;
|
||||
} else {
|
||||
iNext = 1;
|
||||
dwPixels = 0;
|
||||
}
|
||||
|
||||
for( dw = 0; dw < scanning->sParam.Size.dwPixels;
|
||||
dw++, dwPixels = dwPixels + iNext ) {
|
||||
|
||||
scanning->UserBuf.pb_rgb[dwPixels].Red = (u_char)scanning->Red.pb[dw];
|
||||
scanning->UserBuf.pb_rgb[dwPixels].Green = (u_char)scanning->Green.pb[dw];
|
||||
scanning->UserBuf.pb_rgb[dwPixels].Blue = (u_char)scanning->Blue.pb[dw];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void usb_ColorDuplicate16( struct Plustek_Device *dev )
|
||||
|
@ -636,6 +703,54 @@ static void usb_ColorDuplicate16( struct Plustek_Device *dev )
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void usb_ColorDuplicate16_2( struct Plustek_Device *dev )
|
||||
{
|
||||
HiLoDef tmp;
|
||||
u_long dw;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
|
||||
usb_AverageColorWord( dev );
|
||||
|
||||
if( scanning->sParam.bSource == SOURCE_ADF ) {
|
||||
iNext = -1;
|
||||
dwPixels = scanning->sParam.Size.dwPixels - 1;
|
||||
} else {
|
||||
iNext = 1;
|
||||
dwPixels = 0;
|
||||
}
|
||||
|
||||
if( scanning->dwFlag & SCANFLAG_RightAlign ) {
|
||||
|
||||
for (dw = 0; dw < scanning->sParam.Size.dwPixels; dw++, dwPixels = dwPixels + iNext)
|
||||
{
|
||||
tmp = *((pHiLoDef)&scanning->Red.pw[dw]);
|
||||
scanning->UserBuf.pw_rgb[dwPixels].Red = _HILO2WORD(tmp) >> 2;
|
||||
|
||||
tmp = *((pHiLoDef)&scanning->Green.pw[dw]);
|
||||
scanning->UserBuf.pw_rgb[dwPixels].Green = _HILO2WORD(tmp) >> 2;
|
||||
|
||||
tmp = *((pHiLoDef)&scanning->Blue.pw[dw]);
|
||||
scanning->UserBuf.pw_rgb[dwPixels].Blue = _HILO2WORD(tmp) >> 2;
|
||||
}
|
||||
} else {
|
||||
|
||||
for (dw = 0; dw < scanning->sParam.Size.dwPixels; dw++, dwPixels = dwPixels + iNext)
|
||||
{
|
||||
tmp = *((pHiLoDef)&scanning->Red.pw[dw]);
|
||||
scanning->UserBuf.pw_rgb[dwPixels].Red = _HILO2WORD(tmp);
|
||||
|
||||
tmp = *((pHiLoDef)&scanning->Green.pw[dw]);
|
||||
scanning->UserBuf.pw_rgb[dwPixels].Green = _HILO2WORD(tmp);
|
||||
|
||||
tmp = *((pHiLoDef)&scanning->Blue.pw[dw]);
|
||||
scanning->UserBuf.pw_rgb[dwPixels].Blue = _HILO2WORD(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
*
|
||||
*/
|
||||
|
@ -998,12 +1113,13 @@ static void usb_GetImageProc( struct Plustek_Device *dev )
|
|||
{
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pDCapsDef sc = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
||||
bShift = 0;
|
||||
|
||||
if( scanning->sParam.UserDpi.x != scanning->sParam.PhyDpi.x ) {
|
||||
|
||||
/* Pixels scaling... */
|
||||
/* Pixel scaling... */
|
||||
switch( scanning->sParam.bDataType ) {
|
||||
|
||||
case SCANDATATYPE_Color:
|
||||
|
@ -1020,8 +1136,14 @@ static void usb_GetImageProc( struct Plustek_Device *dev )
|
|||
DBG( _DBG_INFO, "ImageProc is: ColorScaleGray\n" );
|
||||
|
||||
} else {
|
||||
scanning->pfnProcess = usb_ColorScale8;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorScale8\n" );
|
||||
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
scanning->pfnProcess = usb_ColorScale8_2;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorScale8_2\n" );
|
||||
} else {
|
||||
scanning->pfnProcess = usb_ColorScale8;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorScale8\n" );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1054,8 +1176,13 @@ static void usb_GetImageProc( struct Plustek_Device *dev )
|
|||
|
||||
case SCANDATATYPE_Color:
|
||||
if (scanning->sParam.bBitDepth > 8) {
|
||||
scanning->pfnProcess = usb_ColorDuplicate16;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicate16\n" );
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
scanning->pfnProcess = usb_ColorDuplicate16_2;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicate16_2\n" );
|
||||
} else {
|
||||
scanning->pfnProcess = usb_ColorDuplicate16;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicate16\n" );
|
||||
}
|
||||
} else if (scanning->dwFlag & SCANFLAG_Pseudo48) {
|
||||
scanning->pfnProcess = usb_ColorDuplicatePseudo16;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicatePseudo16\n" );
|
||||
|
@ -1063,8 +1190,13 @@ static void usb_GetImageProc( struct Plustek_Device *dev )
|
|||
scanning->pfnProcess = usb_ColorDuplicateGray;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicateGray\n" );
|
||||
} else {
|
||||
scanning->pfnProcess = usb_ColorDuplicate8;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicate8\n" );
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
scanning->pfnProcess = usb_ColorDuplicate8_2;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicate8_2\n" );
|
||||
} else {
|
||||
scanning->pfnProcess = usb_ColorDuplicate8;
|
||||
DBG( _DBG_INFO, "ImageProc is: ColorDuplicate8\n" );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1118,12 +1250,22 @@ static void usb_GetImageProc( struct Plustek_Device *dev )
|
|||
*/
|
||||
static SANE_Int usb_ReadData( struct Plustek_Device *dev )
|
||||
{
|
||||
u_long dw, dwRet, dwBytes;
|
||||
u_long dw, dwRet, dwBytes, dwAdjust;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
||||
|
||||
DBG( _DBG_READ, "usb_ReadData()\n" );
|
||||
|
||||
dwAdjust = 1;
|
||||
|
||||
/* for 1 channel color, we have to adjust the phybytes... */
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
if( scanning->sParam.bDataType == SCANDATATYPE_Color ) {
|
||||
dwAdjust = 3;
|
||||
}
|
||||
}
|
||||
|
||||
while( scanning->sParam.Size.dwTotalBytes ) {
|
||||
|
||||
if( usb_IsEscPressed()) {
|
||||
|
@ -1140,10 +1282,10 @@ static SANE_Int usb_ReadData( struct Plustek_Device *dev )
|
|||
|
||||
if(!scanning->sParam.Size.dwTotalBytes && dw < (m_dwPauseLimit * 1024))
|
||||
{
|
||||
if(!(a_bRegs[0x4E] = (u_char)ceil(dw / (4 * hw->wDRAMSize))))
|
||||
if(!(a_bRegs[0x4e] = (u_char)ceil(dw / (4 * hw->wDRAMSize))))
|
||||
a_bRegs[0x4e] = 1;
|
||||
|
||||
a_bRegs[0x4F] = 0;
|
||||
a_bRegs[0x4f] = 0;
|
||||
|
||||
sanei_lm983x_write( dev->fd, 0x4e, &a_bRegs[0x4e], 2, SANE_TRUE );
|
||||
}
|
||||
|
@ -1151,8 +1293,9 @@ static SANE_Int usb_ReadData( struct Plustek_Device *dev )
|
|||
while( scanning->bLinesToSkip ) {
|
||||
|
||||
DBG( _DBG_READ, "Skipping %u lines\n", scanning->bLinesToSkip );
|
||||
|
||||
|
||||
dwBytes = scanning->bLinesToSkip*scanning->sParam.Size.dwPhyBytes;
|
||||
dwBytes *= dwAdjust;
|
||||
|
||||
if (dwBytes > scanning->dwBytesScanBuf) {
|
||||
|
||||
|
@ -1166,13 +1309,15 @@ static SANE_Int usb_ReadData( struct Plustek_Device *dev )
|
|||
}
|
||||
|
||||
if( usb_ScanReadImage( dev, scanning->pbGetDataBuf, dw )) {
|
||||
|
||||
dumpPic( "plustek-pic.raw", scanning->pbGetDataBuf, dw );
|
||||
|
||||
if( scanning->dwLinesDiscard ) {
|
||||
|
||||
DBG( _DBG_READ, "Discarding %lu lines\n",
|
||||
scanning->dwLinesDiscard );
|
||||
|
||||
dwRet = dw / scanning->sParam.Size.dwPhyBytes;
|
||||
dwRet = dw / (scanning->sParam.Size.dwPhyBytes * dwAdjust);
|
||||
|
||||
if (scanning->dwLinesDiscard > dwRet) {
|
||||
scanning->dwLinesDiscard -= dwRet;
|
||||
|
@ -1182,7 +1327,8 @@ static SANE_Int usb_ReadData( struct Plustek_Device *dev )
|
|||
scanning->dwLinesDiscard = 0;
|
||||
}
|
||||
} else {
|
||||
dwRet = dw / scanning->sParam.Size.dwPhyBytes;
|
||||
|
||||
dwRet = dw / (scanning->sParam.Size.dwPhyBytes * dwAdjust);
|
||||
}
|
||||
|
||||
scanning->pbGetDataBuf += scanning->dwBytesScanBuf;
|
||||
|
|
|
@ -11,6 +11,9 @@
|
|||
* 0.40 - starting version of the USB support
|
||||
* 0.41 - moved some functions to a sane library (sanei_lm983x.c)
|
||||
* 0.42 - no changes
|
||||
* 0.43 - no changes
|
||||
* 0.44 - added dump registers and dumpPic functions
|
||||
* beautyfied output of ASIC detection
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -69,6 +72,104 @@
|
|||
#define usbio_ReadReg(fd, reg, value) \
|
||||
sanei_lm983x_read (fd, reg, value, 1, 0)
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void dumpPic( char* name, SANE_Byte *buffer, u_long len )
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
if( DBG_LEVEL < _DBG_DUMP )
|
||||
return;
|
||||
|
||||
if( NULL == buffer )
|
||||
fp = fopen( name, "w+b" );
|
||||
else
|
||||
fp = fopen( name, "a+b" );
|
||||
|
||||
if( NULL == fp ) {
|
||||
DBG( _DBG_DUMP, "Can not open file '%s'\n", name );
|
||||
return;
|
||||
}
|
||||
|
||||
fwrite( buffer, 1, len, fp );
|
||||
fclose( fp );
|
||||
}
|
||||
|
||||
/**
|
||||
* dump the LM983x registers
|
||||
*/
|
||||
static void dumpregs( int fd, SANE_Byte *cmp )
|
||||
{
|
||||
char buf[256], b2[10];
|
||||
SANE_Byte regs[0x80];
|
||||
int i;
|
||||
|
||||
if( DBG_LEVEL < _DBG_INFO2 )
|
||||
return;
|
||||
|
||||
buf[0] = '\0';
|
||||
|
||||
usbio_ReadReg(fd, 0x01, ®s[0x01]);
|
||||
usbio_ReadReg(fd, 0x02, ®s[0x02]);
|
||||
usbio_ReadReg(fd, 0x03, ®s[0x03]);
|
||||
usbio_ReadReg(fd, 0x04, ®s[0x04]);
|
||||
usbio_ReadReg(fd, 0x07, ®s[0x07]);
|
||||
|
||||
sanei_lm983x_read( fd, 0x08, ®s[0x8], 0x80-0x8, SANE_TRUE );
|
||||
|
||||
for( i = 0x0; i < 0x80; i++ ) {
|
||||
|
||||
if((i%16) ==0 ) {
|
||||
|
||||
if( buf[0] )
|
||||
DBG( _DBG_INFO2, "%s\n", buf );
|
||||
sprintf( buf, "0x%02x:", i );
|
||||
}
|
||||
|
||||
if((i%8)==0)
|
||||
strcat( buf, " ");
|
||||
|
||||
/* the dataport read returns with "0 Bytes read", of course. */
|
||||
if((i == 0) || (i == 5) || (i == 6))
|
||||
strcat( buf, "XX ");
|
||||
else {
|
||||
|
||||
sprintf( b2, "%02x ", regs[i]);
|
||||
strcat( buf, b2 );
|
||||
}
|
||||
|
||||
}
|
||||
DBG( _DBG_INFO2, "%s\n", buf );
|
||||
|
||||
if( cmp ) {
|
||||
|
||||
DBG( _DBG_INFO2, "Internal setting:\n" );
|
||||
for( i = 0x0; i < 0x80; i++ ) {
|
||||
|
||||
if((i%16) ==0 ) {
|
||||
|
||||
if( buf[0] )
|
||||
DBG( _DBG_INFO2, "%s\n", buf );
|
||||
sprintf( buf, "0x%02x:", i );
|
||||
}
|
||||
|
||||
if((i%8)==0)
|
||||
strcat( buf, " ");
|
||||
|
||||
if((i == 0) || (i == 5) || (i == 6))
|
||||
strcat( buf, "XX ");
|
||||
else {
|
||||
|
||||
sprintf( b2, "%02x ", cmp[i]);
|
||||
strcat( buf, b2 );
|
||||
}
|
||||
|
||||
}
|
||||
DBG( _DBG_INFO2, "%s\n", buf );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* function to read the contents of a LM983x register and regarding some
|
||||
* extra stuff, like flushing register 2 when writing register 0x58, etc
|
||||
|
@ -116,7 +217,9 @@ static SANE_Bool usbio_WriteReg( SANE_Int handle,
|
|||
*/
|
||||
static SANE_Status usbio_DetectLM983x( SANE_Int fd, SANE_Byte *version )
|
||||
{
|
||||
SANE_Byte value;
|
||||
char buf[256];
|
||||
SANE_Byte value;
|
||||
SANE_Status res;
|
||||
|
||||
DBG( _DBG_INFO, "usbio_DetectLM983x\n");
|
||||
|
||||
|
@ -130,21 +233,24 @@ static SANE_Status usbio_DetectLM983x( SANE_Int fd, SANE_Byte *version )
|
|||
if (version)
|
||||
*version = value;
|
||||
|
||||
DBG( _DBG_INFO, "usbio_DetectLM983x: found " );
|
||||
res = SANE_STATUS_GOOD;
|
||||
|
||||
sprintf( buf, "usbio_DetectLM983x: found " );
|
||||
|
||||
switch((SANE_Int)value ) {
|
||||
|
||||
case 4: DBG( _DBG_INFO, "LM9832/3\n" ); break;
|
||||
case 3: DBG( _DBG_INFO, "LM9831\n" ); break;
|
||||
case 2: DBG( _DBG_INFO, "LM9830 --> unsupported!!!\n" );
|
||||
return SANE_STATUS_INVAL;
|
||||
case 4: strcat( buf, "LM9832/3" ); break;
|
||||
case 3: strcat( buf, "LM9831" ); break;
|
||||
case 2: strcat( buf, "LM9830 --> unsupported!!!" );
|
||||
res = SANE_STATUS_INVAL;
|
||||
break;
|
||||
default: DBG( _DBG_INFO, "Unknown chip v%d\n", value );
|
||||
return SANE_STATUS_INVAL;
|
||||
default: DBG( _DBG_INFO, "Unknown chip v%d", value );
|
||||
res = SANE_STATUS_INVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
DBG( _DBG_INFO, "%s\n", buf );
|
||||
return res;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
* 0.41 - fixed brightness problem for lineart mode
|
||||
* 0.42 - removed preset of linear gamma tables
|
||||
* 0.43 - no changes
|
||||
* 0.44 - no changes
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
* 0.41 - minor fixes
|
||||
* 0.42 - added some stuff for CIS devices
|
||||
* 0.43 - no changes
|
||||
* 0.44 - added CIS specific settings and calculations
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -241,6 +242,7 @@ static u_short usb_SetAsicDpiY( pPlustek_Device dev, u_short ydpi )
|
|||
}
|
||||
}
|
||||
|
||||
DBG( _DBG_INFO2, "YDPI=%u, MinDPIY=%u\n", wDpi, wMinDpi );
|
||||
return wDpi;
|
||||
}
|
||||
|
||||
|
@ -266,7 +268,15 @@ static void usb_SetColorAndBits( pPlustek_Device dev, pScanParam pParam )
|
|||
switch( pParam->bDataType ) {
|
||||
case SCANDATATYPE_Color:
|
||||
m_bCM = 3;
|
||||
a_bRegs[0x26] = 0;
|
||||
a_bRegs[0x26] = hw->bReg_0x26 & 0x7;
|
||||
|
||||
/* if set to one channel color, we select the blue channel
|
||||
* as input source, this is the default, but I don't know
|
||||
* what happens, if we deselect this
|
||||
*/
|
||||
if( a_bRegs[0x26] & _ONE_CH_COLOR )
|
||||
a_bRegs[0x26] |= (_BLUE_CH | 0x01);
|
||||
|
||||
memcpy( &a_bRegs[0x0f], hw->bReg_0x0f_Color, 10 );
|
||||
break;
|
||||
|
||||
|
@ -432,7 +442,7 @@ static void usb_GetScanRect( pPlustek_Device dev, pScanParam pParam )
|
|||
a_bRegs[0x4b] = _LOBYTE( pParam->Origin.y );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
/** calculate default phase difference DPD
|
||||
*
|
||||
*/
|
||||
static void usb_GetDPD( pPlustek_Device dev )
|
||||
|
@ -469,6 +479,11 @@ static void usb_GetDPD( pPlustek_Device dev )
|
|||
(m_wLineLength * m_bLineRateColor);
|
||||
dpd = m_wLineLength * m_bLineRateColor - dpd;
|
||||
}
|
||||
|
||||
DBG( _DBG_INFO2, "DPD =%u, step size=%u, steps2rev=%u\n", dpd, st, strev );
|
||||
DBG( _DBG_INFO2, "llen=%u, lineRateColor=%u, qtcnt=%u, hfcnt=%u\n",
|
||||
m_wLineLength, m_bLineRateColor, qtcnt, hfcnt );
|
||||
|
||||
a_bRegs[0x51] |= (u_char)((dpd >> 16) & 0x03);
|
||||
a_bRegs[0x52] = (u_char)(dpd >> 8);
|
||||
a_bRegs[0x53] = (u_char)(dpd & 0xFF);
|
||||
|
@ -529,6 +544,8 @@ static double usb_GetMCLKDivider( pPlustek_Device dev, pScanParam pParam )
|
|||
a_bRegs[0x46] = _HIBYTE(m_wStepSize);
|
||||
a_bRegs[0x47] = _LOBYTE(m_wStepSize);
|
||||
|
||||
DBG( _DBG_INFO2, "Stepsize = %u, 0x46=0x%02x 0x47=0x%02x\n",
|
||||
m_wStepSize, a_bRegs[0x46], a_bRegs[0x47] );
|
||||
usb_GetDPD( dev );
|
||||
}
|
||||
|
||||
|
@ -831,6 +848,9 @@ static void usb_GetStepSize( pPlustek_Device dev, pScanParam pParam )
|
|||
|
||||
a_bRegs[0x46] = _HIBYTE( m_wStepSize );
|
||||
a_bRegs[0x47] = _LOBYTE( m_wStepSize );
|
||||
|
||||
DBG( _DBG_INFO2, "Stepsize = %u, 0x46=0x%02x 0x47=0x%02x\n",
|
||||
m_wStepSize, a_bRegs[0x46], a_bRegs[0x47] );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
|
@ -875,8 +895,9 @@ static void usb_GetLineLength( pPlustek_Device dev )
|
|||
|
||||
ctmode = (a_bRegs[0x0b] >> 3) & 3; /* cis tr timing mode */
|
||||
|
||||
/* always, we just support 3 color pixel and 1 channel gray */
|
||||
m_bLineRateColor = 1;
|
||||
m_bLineRateColor = 1;
|
||||
if (afeop == 1 || afeop == 5) /* if 3 channel line or 1 channel mode b */
|
||||
m_bLineRateColor = 3;
|
||||
|
||||
/* according to turbo/preview mode to set value */
|
||||
if( tpsel == 0 ) {
|
||||
|
@ -896,7 +917,6 @@ static void usb_GetLineLength( pPlustek_Device dev )
|
|||
if( ctmode == 2 ) /* CIS mode scanner */
|
||||
b = 3;
|
||||
|
||||
|
||||
tr = m_bLineRateColor * (hw->wLineEnd + tp * (b + 3 - ntr));
|
||||
|
||||
if( tradj == 0 ) {
|
||||
|
@ -932,6 +952,9 @@ static void usb_GetLineLength( pPlustek_Device dev )
|
|||
tr *= m_bLineRateColor;
|
||||
}
|
||||
m_wLineLength = tr / m_bLineRateColor;
|
||||
|
||||
DBG( _DBG_INFO2, "LineLength=%d, LineRateColor=%u\n",
|
||||
m_wLineLength, m_bLineRateColor );
|
||||
}
|
||||
|
||||
/** usb_GetMotorParam
|
||||
|
@ -1074,9 +1097,16 @@ static void usb_GetMotorParam( pPlustek_Device dev, pScanParam pParam )
|
|||
*/
|
||||
static void usb_GetPauseLimit( pPlustek_Device dev, pScanParam pParam )
|
||||
{
|
||||
int coeffsize;
|
||||
int coeffsize, scaler;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
||||
scaler = 1;
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
if( pParam->bDataType == SCANDATATYPE_Color ) {
|
||||
scaler = 3;
|
||||
}
|
||||
}
|
||||
|
||||
/* compute size of coefficient ram */
|
||||
coeffsize = 4 + 16 + 16; /* gamma and shading and offset */
|
||||
|
||||
|
@ -1092,12 +1122,15 @@ static void usb_GetPauseLimit( pPlustek_Device dev, pScanParam pParam )
|
|||
* for 2Mb this will be 1832
|
||||
*/
|
||||
m_dwPauseLimit = (u_long)(hw->wDRAMSize - (u_long)(coeffsize));
|
||||
m_dwPauseLimit -= (pParam->Size.dwPhyBytes / 1024 + 1);
|
||||
m_dwPauseLimit -= ((pParam->Size.dwPhyBytes*scaler) / 1024 + 1);
|
||||
|
||||
/* If not reversing, take into account the steps to reverse */
|
||||
if( a_bRegs[0x50] == 0 )
|
||||
m_dwPauseLimit -= ((a_bRegs[0x54] & 7) *
|
||||
pParam->Size.dwPhyBytes + 1023) / 1024;
|
||||
(pParam->Size.dwPhyBytes * scaler) + 1023) / 1024;
|
||||
|
||||
DBG( _DBG_INFO, "PL=%lu, coeffsize=%u, scaler=%u\n",
|
||||
m_dwPauseLimit, coeffsize, scaler );
|
||||
|
||||
m_dwPauseLimit = usb_max( usb_min(m_dwPauseLimit,
|
||||
(u_long)ceil(pParam->Size.dwTotalBytes / 1024.0)), 2);
|
||||
|
@ -1111,10 +1144,9 @@ static void usb_GetPauseLimit( pPlustek_Device dev, pScanParam pParam )
|
|||
} else
|
||||
a_bRegs[0x4e] = 1;
|
||||
|
||||
/* original code:
|
||||
* a_bRegs[0x4f] = 1;
|
||||
*/
|
||||
/* a_bRegs[0x4f] = a_bRegs[0x4e] - 1;*/
|
||||
/*
|
||||
* resume, when buffer is 2/8 kbytes full (512k/2M memory)
|
||||
*/
|
||||
a_bRegs[0x4f] = 1;
|
||||
|
||||
DBG( _DBG_INFO, "PauseLimit = %lu, [0x4e] = 0x%02x, [0x4f] = 0x%02x\n",
|
||||
|
@ -1127,6 +1159,7 @@ static void usb_GetPauseLimit( pPlustek_Device dev, pScanParam pParam )
|
|||
static void usb_GetScanLinesAndSize( pPlustek_Device dev, pScanParam pParam )
|
||||
{
|
||||
pDCapsDef sCaps = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
||||
pParam->Size.dwPhyLines = (u_long)ceil((double) pParam->Size.dwLines *
|
||||
pParam->PhyDpi.y / pParam->UserDpi.y);
|
||||
|
@ -1142,6 +1175,14 @@ static void usb_GetScanLinesAndSize( pPlustek_Device dev, pScanParam pParam )
|
|||
dev->scanning.bLineDistance = 0;
|
||||
|
||||
pParam->Size.dwTotalBytes = pParam->Size.dwPhyBytes * pParam->Size.dwPhyLines;
|
||||
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR ) {
|
||||
|
||||
if( pParam->bDataType == SCANDATATYPE_Color ) {
|
||||
|
||||
pParam->Size.dwTotalBytes *= 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** function to preset/reset the merlin registers
|
||||
|
@ -1190,7 +1231,7 @@ static SANE_Bool usb_SetScanParameters( pPlustek_Device dev, pScanParam pParam )
|
|||
else
|
||||
a_bRegs[0x54] = (a_bRegs[0x54] & ~7) | 5; /* 4; */
|
||||
} else {
|
||||
a_bRegs[0x50] = dev->usbDev.bStepsToReverse;
|
||||
a_bRegs[0x50] = hw->bStepsToReverse;
|
||||
a_bRegs[0x51] = hw->bReg_0x51;
|
||||
a_bRegs[0x54] &= ~7;
|
||||
}
|
||||
|
@ -1198,7 +1239,7 @@ static SANE_Bool usb_SetScanParameters( pPlustek_Device dev, pScanParam pParam )
|
|||
a_bRegs[0x50] = 0;
|
||||
} else {
|
||||
if( pParam->bCalibration == PARAM_Scan )
|
||||
a_bRegs[0x50] = dev->usbDev.bStepsToReverse;
|
||||
a_bRegs[0x50] = hw->bStepsToReverse;
|
||||
else
|
||||
a_bRegs[0x50] = 0;
|
||||
}
|
||||
|
@ -1208,10 +1249,11 @@ static SANE_Bool usb_SetScanParameters( pPlustek_Device dev, pScanParam pParam )
|
|||
|
||||
/* Initiate variables */
|
||||
|
||||
/* Get variables for calculation algorithms */
|
||||
/* Get variables from calculation algorithms */
|
||||
if(!(pParam->bCalibration == PARAM_Scan &&
|
||||
pParam->bSource == SOURCE_ADF && fLastScanIsAdf )) {
|
||||
|
||||
DBG( _DBG_INFO2, "Scan calculations...\n" );
|
||||
usb_GetLineLength ( dev );
|
||||
usb_GetStepSize ( dev, pParam );
|
||||
usb_GetDPD ( dev );
|
||||
|
@ -1261,7 +1303,7 @@ static SANE_Bool usb_SetScanParameters( pPlustek_Device dev, pScanParam pParam )
|
|||
}
|
||||
|
||||
/* Reset LM983x's state machine before setting register values */
|
||||
if( !usbio_WriteReg( dev->fd, 0x18, 24 ))
|
||||
if( !usbio_WriteReg( dev->fd, 0x18, 0x18 ))
|
||||
return SANE_FALSE;
|
||||
|
||||
usleep(200 * 1000); /* Need to delay at least xxx microseconds */
|
||||
|
@ -1277,19 +1319,40 @@ static SANE_Bool usb_SetScanParameters( pPlustek_Device dev, pScanParam pParam )
|
|||
/* Set register values */
|
||||
memset( &a_bRegs[0x03], 0, 3 );
|
||||
memset( &a_bRegs[0x5C], 0, 0x7F-0x5C+1 );
|
||||
|
||||
|
||||
/* 0x08 - 0x5E */
|
||||
_UIO(sanei_lm983x_write( dev->fd, 0x08, &a_bRegs[0x08], 0x5E - 0x08+1, SANE_TRUE));
|
||||
_UIO(sanei_lm983x_write( dev->fd, 0x08, &a_bRegs[0x08], 0x5a - 0x08+1, SANE_TRUE));
|
||||
|
||||
/* 0x03 - 0x05 */
|
||||
_UIO(sanei_lm983x_write( dev->fd, 0x03, &a_bRegs[0x03], 3, SANE_TRUE));
|
||||
|
||||
/* special setting for CANON... */
|
||||
if( dev->usbDev.vendor == 0x4a9 )
|
||||
a_bRegs[0x70] = 0x73;
|
||||
|
||||
/* 0x5C - 0x7F */
|
||||
_UIO(sanei_lm983x_write( dev->fd, 0x5C, &a_bRegs[0x5C], 0x7F - 0x5C +1, SANE_TRUE));
|
||||
_UIO(sanei_lm983x_write( dev->fd, 0x5c, &a_bRegs[0x5c], 0x7f - 0x5c +1, SANE_TRUE));
|
||||
|
||||
usbio_WriteReg( dev->fd, 0x5a, a_bRegs[0x5a] );
|
||||
usbio_WriteReg( dev->fd, 0x5b, a_bRegs[0x5b] );
|
||||
|
||||
if( !usbio_WriteReg( dev->fd, 0x07, 0 ))
|
||||
return SANE_FALSE;
|
||||
|
||||
/* special procedure for CANON... */
|
||||
if( dev->usbDev.vendor == 0x4a9 ) {
|
||||
|
||||
SANE_Byte tmp;
|
||||
|
||||
usbio_WriteReg( dev->fd, 0x5b, 0x11 );
|
||||
usbio_WriteReg( dev->fd, 0x5b, 0x91 );
|
||||
usbio_ReadReg ( dev->fd, 0x5a, &tmp );
|
||||
usbio_WriteReg( dev->fd, 0x5a, 0x14 );
|
||||
|
||||
usbio_WriteReg( dev->fd, 0x59, a_bRegs[0x59] );
|
||||
usbio_WriteReg( dev->fd, 0x5a, a_bRegs[0x5a] );
|
||||
}
|
||||
|
||||
DBG( _DBG_INFO, "usb_SetScanParameters() done.\n" );
|
||||
|
||||
return SANE_TRUE;
|
||||
|
@ -1364,6 +1427,9 @@ static SANE_Bool usb_ScanBegin( pPlustek_Device dev, SANE_Bool fAutoPark )
|
|||
m_bOldScanData = 0; /* No data at all */
|
||||
m_fStart = m_fFirst = SANE_TRUE; /* Prepare to read */
|
||||
|
||||
DBG( _DBG_INFO2, "Register Dump before reading data:\n" );
|
||||
dumpregs( dev->fd, NULL );
|
||||
|
||||
return SANE_TRUE;
|
||||
}
|
||||
|
||||
|
@ -1459,7 +1525,7 @@ static SANE_Bool usb_ScanReadImage( pPlustek_Device dev,
|
|||
static u_long dwBytes = 0;
|
||||
SANE_Status res;
|
||||
|
||||
DBG( _DBG_READ, "usb_ScanReadImage()\n" );
|
||||
DBG( _DBG_READ, "usb_ScanReadImage(%lu)\n", dwSize );
|
||||
|
||||
if( m_fFirst ) {
|
||||
|
||||
|
@ -1523,8 +1589,9 @@ static SANE_Bool usb_ScanReadImage( pPlustek_Device dev,
|
|||
|
||||
DBG( _DBG_READ, "usb_ScanReadImage() done, result: %d\n", res );
|
||||
|
||||
if( SANE_STATUS_GOOD == res )
|
||||
if( SANE_STATUS_GOOD == res ) {
|
||||
return SANE_TRUE;
|
||||
}
|
||||
|
||||
DBG( _DBG_ERROR, "usb_ScanReadImage() failed\n" );
|
||||
|
||||
|
@ -1568,8 +1635,11 @@ static void usb_GetImageInfo( pImgDef pInfo, pWinInfo pSize )
|
|||
/*.............................................................................
|
||||
*
|
||||
*/
|
||||
static void usb_SaveImageInfo( pImgDef pInfo, pScanParam pParam )
|
||||
static void usb_SaveImageInfo( pPlustek_Device dev, pImgDef pInfo )
|
||||
{
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
pScanParam pParam = &dev->scanning.sParam;
|
||||
|
||||
DBG( _DBG_INFO, "usb_SaveImageInfo()\n" );
|
||||
|
||||
/* Dpi & Origins */
|
||||
|
@ -1584,10 +1654,16 @@ static void usb_SaveImageInfo( pImgDef pInfo, pScanParam pParam )
|
|||
|
||||
case COLOR_TRUE48:
|
||||
pParam->bBitDepth = 16;
|
||||
/* fall through... */
|
||||
|
||||
case COLOR_TRUE24:
|
||||
pParam->bDataType = SCANDATATYPE_Color;
|
||||
pParam->bChannels = 3;
|
||||
|
||||
/* AFE operation: one or 3 channels ! */
|
||||
if( hw->bReg_0x26 & _ONE_CH_COLOR )
|
||||
pParam->bChannels = 1;
|
||||
else
|
||||
pParam->bChannels = 3;
|
||||
break;
|
||||
|
||||
case COLOR_GRAY16:
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
* - added workaround stuff for EPSON1250
|
||||
* 0.42 - added workaround stuff for UMAX 3400
|
||||
* 0.43 - added call to usb_switchLamp before reading dark data
|
||||
* 0.44 - added more debug output and bypass calibration
|
||||
* added dump of shading data
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -426,6 +428,8 @@ static u_char usb_GetNewGain( u_short wMax )
|
|||
*/
|
||||
static SANE_Bool usb_AdjustGain( pPlustek_Device dev, int fNegative )
|
||||
{
|
||||
char tmp[40];
|
||||
int i;
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pDCapsDef scaps = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
@ -438,6 +442,8 @@ static SANE_Bool usb_AdjustGain( pPlustek_Device dev, int fNegative )
|
|||
|
||||
bMaxITA = 0xff;
|
||||
|
||||
DBG( _DBG_INFO2, "usb_AdjustGain()\n" );
|
||||
|
||||
/*
|
||||
* define the strip to scan for coarse calibration
|
||||
*/
|
||||
|
@ -450,6 +456,7 @@ static SANE_Bool usb_AdjustGain( pPlustek_Device dev, int fNegative )
|
|||
300UL / scaps->OpticDpi.x);
|
||||
m_ScanParam.bCalibration = PARAM_Gain;
|
||||
|
||||
i = 0;
|
||||
TOGAIN:
|
||||
m_ScanParam.dMCLK = dMCLK;
|
||||
|
||||
|
@ -471,7 +478,7 @@ TOGAIN:
|
|||
dw = t.tv_sec - dev->usbDev.dwTicksLampOn;
|
||||
|
||||
if( usb_IsEscPressed()) {
|
||||
DBG( _DBG_INFO, "ReadImage() - Cancel detected...\n" );
|
||||
DBG( _DBG_INFO, "adjustGain() - Cancel detected...\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -483,6 +490,11 @@ TOGAIN:
|
|||
DBG( _DBG_ERROR, "usb_AdjustGain() failed\n" );
|
||||
return SANE_FALSE;
|
||||
}
|
||||
|
||||
sprintf( tmp, "coarse-gain-%u.raw", i++ );
|
||||
|
||||
dumpPic( tmp, NULL, 0 );
|
||||
dumpPic( tmp, pScanBuffer, m_ScanParam.Size.dwPhyBytes );
|
||||
|
||||
usb_Swap((u_short *)pScanBuffer, m_ScanParam.Size.dwPhyBytes );
|
||||
|
||||
|
@ -627,6 +639,10 @@ TOGAIN:
|
|||
a_bRegs[0x3b] = a_bRegs[0x3c] = a_bRegs[0x3d] = usb_GetNewGain(w);
|
||||
}
|
||||
}
|
||||
DBG( _DBG_INFO2, "REG[0x3b] = %u\n", a_bRegs[0x3b] );
|
||||
DBG( _DBG_INFO2, "REG[0x3c] = %u\n", a_bRegs[0x3c] );
|
||||
DBG( _DBG_INFO2, "REG[0x3d] = %u\n", a_bRegs[0x3d] );
|
||||
DBG( _DBG_INFO2, "usb_AdjustGain() done.\n" );
|
||||
|
||||
return SANE_TRUE;
|
||||
}
|
||||
|
@ -679,9 +695,11 @@ static void usb_GetNewOffset( u_long *pdwSum, u_long *pdwDiff, char *pcOffset,
|
|||
*/
|
||||
static SANE_Bool usb_AdjustOffset( pPlustek_Device dev )
|
||||
{
|
||||
char tmp[40];
|
||||
char cAdjust = 16;
|
||||
char cOffset[3];
|
||||
u_char bExpect[3];
|
||||
int i;
|
||||
u_long dw, dwPixels;
|
||||
u_long dwDiff[3], dwSum[3];
|
||||
|
||||
|
@ -690,6 +708,8 @@ static SANE_Bool usb_AdjustOffset( pPlustek_Device dev )
|
|||
if( usb_IsEscPressed())
|
||||
return SANE_FALSE;
|
||||
|
||||
DBG( _DBG_INFO2, "usb_AdjustOffset()\n" );
|
||||
|
||||
m_ScanParam.Size.dwLines = 1; /* for gain */
|
||||
dwPixels = (u_long)(hw->bOpticBlackEnd - hw->bOpticBlackStart );
|
||||
m_ScanParam.Size.dwPixels = 2550;
|
||||
|
@ -706,11 +726,17 @@ static SANE_Bool usb_AdjustOffset( pPlustek_Device dev )
|
|||
|
||||
a_bRegs[0x38] = a_bRegs [0x39] = a_bRegs [0x3a] = 0;
|
||||
|
||||
if( 0 == dwPixels ) {
|
||||
DBG( _DBG_ERROR, "OpticBlackEnd = OpticBlackStart!!!\n" );
|
||||
return SANE_FALSE;
|
||||
}
|
||||
|
||||
if( !usb_SetScanParameters( dev, &m_ScanParam )) {
|
||||
DBG( _DBG_ERROR, "usb_AdjustOffset() failed\n" );
|
||||
return SANE_FALSE;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while( cAdjust ) {
|
||||
|
||||
/*
|
||||
|
@ -723,6 +749,11 @@ static SANE_Bool usb_AdjustOffset( pPlustek_Device dev )
|
|||
return SANE_FALSE;
|
||||
}
|
||||
|
||||
sprintf( tmp, "coarse-off-%u.raw", i++ );
|
||||
|
||||
dumpPic( tmp, NULL, 0 );
|
||||
dumpPic( tmp, pScanBuffer, m_ScanParam.Size.dwPhyBytes );
|
||||
|
||||
if( m_ScanParam.bDataType == SCANDATATYPE_Color ) {
|
||||
|
||||
dwSum [0] = dwSum [1] = dwSum [2] = 0;
|
||||
|
@ -765,6 +796,11 @@ static SANE_Bool usb_AdjustOffset( pPlustek_Device dev )
|
|||
a_bRegs[0x38] = a_bRegs[0x39] = a_bRegs[0x3a] = bExpect[0];
|
||||
}
|
||||
|
||||
DBG( _DBG_INFO2, "REG[0x38] = %u\n", a_bRegs[0x38] );
|
||||
DBG( _DBG_INFO2, "REG[0x39] = %u\n", a_bRegs[0x39] );
|
||||
DBG( _DBG_INFO2, "REG[0x3a] = %u\n", a_bRegs[0x3a] );
|
||||
DBG( _DBG_INFO2, "usb_AdjustOffset() done.\n" );
|
||||
|
||||
return SANE_TRUE;
|
||||
}
|
||||
|
||||
|
@ -858,6 +894,7 @@ static void usb_GetDarkShading( pPlustek_Device dev, u_short *pwDest,
|
|||
*/
|
||||
static SANE_Bool usb_AdjustDarkShading( pPlustek_Device dev )
|
||||
{
|
||||
char tmp[40];
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pDCapsDef scaps = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
@ -928,6 +965,12 @@ static SANE_Bool usb_AdjustDarkShading( pPlustek_Device dev )
|
|||
return SANE_FALSE;
|
||||
}
|
||||
|
||||
sprintf( tmp, "fine-black.raw" );
|
||||
|
||||
dumpPic( tmp, NULL, 0 );
|
||||
dumpPic( tmp, pScanBuffer, m_ScanParam.Size.dwPhyBytes );
|
||||
|
||||
|
||||
usleep(500 * 1000); /* Warm up lamp again */
|
||||
|
||||
if (m_ScanParam.bDataType == SCANDATATYPE_Color)
|
||||
|
@ -966,6 +1009,7 @@ static SANE_Bool usb_AdjustDarkShading( pPlustek_Device dev )
|
|||
*/
|
||||
static SANE_Bool usb_AdjustWhiteShading( pPlustek_Device dev )
|
||||
{
|
||||
char tmp[40];
|
||||
pScanDef scanning = &dev->scanning;
|
||||
pDCapsDef scaps = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
@ -1025,9 +1069,12 @@ static SANE_Bool usb_AdjustWhiteShading( pPlustek_Device dev )
|
|||
m_ScanParam.Size.dwLines = dwShadingLines; /* SHADING_Lines */
|
||||
}
|
||||
|
||||
sprintf( tmp, "fine-white.raw" );
|
||||
dumpPic( tmp, NULL, 0 );
|
||||
|
||||
|
||||
for( dw = dwShadingLines /*SHADING_Lines*/,
|
||||
dwRead = 0; dw; dw -= m_ScanParam.Size.dwLines ) {
|
||||
dwRead = 0; dw; dw -= m_ScanParam.Size.dwLines ) {
|
||||
|
||||
if( usb_SetScanParameters( dev, &m_ScanParam) &&
|
||||
usb_ScanBegin( dev, SANE_FALSE )) {
|
||||
|
@ -1045,6 +1092,8 @@ static SANE_Bool usb_AdjustWhiteShading( pPlustek_Device dev )
|
|||
usleep(10 * 1000);
|
||||
}
|
||||
|
||||
dumpPic( tmp, pBuf + dwRead, m_ScanParam.Size.dwPhyBytes );
|
||||
|
||||
if( usb_ScanEnd( dev )) {
|
||||
dwRead += m_ScanParam.Size.dwTotalBytes;
|
||||
continue;
|
||||
|
@ -1433,6 +1482,22 @@ static int usb_DoCalibration( pPlustek_Device dev )
|
|||
|
||||
DBG( _DBG_INFO, "shading position reached\n" );
|
||||
|
||||
/*
|
||||
* this won't work for Plustek devices!!!
|
||||
*/
|
||||
if( scaps->workaroundFlag & _WAF_BYPASS_CALIBRATION ) {
|
||||
|
||||
DBG( _DBG_INFO, "--> BYPASS\n" );
|
||||
a_bRegs[0x38] = a_bRegs[0x39] = a_bRegs[0x3a] = 1;
|
||||
a_bRegs[0x3b] = a_bRegs[0x3c] = a_bRegs[0x3d] = 1;
|
||||
a_bRegs[0x45] |= 0x10;
|
||||
usb_SetMCLK( dev );
|
||||
|
||||
dumpregs( dev->fd, a_bRegs );
|
||||
DBG( _DBG_INFO, "<-- BYPASS\n" );
|
||||
return SANE_TRUE;
|
||||
}
|
||||
|
||||
switch( scanning->sParam.bSource ) {
|
||||
|
||||
case SOURCE_Negative:
|
||||
|
@ -1730,7 +1795,10 @@ static int usb_DoCalibration( pPlustek_Device dev )
|
|||
*/
|
||||
static SANE_Bool usb_DownloadShadingData( pPlustek_Device dev, u_char bJobID )
|
||||
{
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
pDCapsDef scaps = &dev->usbDev.Caps;
|
||||
pHWDef hw = &dev->usbDev.HwSetting;
|
||||
|
||||
DBG( _DBG_INFO2, "usb_DownloadShadingData(%u)\n", bJobID );
|
||||
|
||||
switch( bJobID ) {
|
||||
|
||||
|
@ -1766,6 +1834,28 @@ static SANE_Bool usb_DownloadShadingData( pPlustek_Device dev, u_char bJobID )
|
|||
|
||||
case PARAM_Scan:
|
||||
{
|
||||
if( scaps->workaroundFlag & _WAF_BYPASS_CALIBRATION ) {
|
||||
|
||||
DBG( _DBG_INFO, "--> BYPASS\n" );
|
||||
|
||||
/* set RAM configuration AND
|
||||
* Bypass Multiplier
|
||||
* CFG Register 0x40/0x41 for Multiplier Coefficient Source
|
||||
* CFG Register 0x3e/0x3f for Offset Coefficient Source
|
||||
*/
|
||||
a_bRegs[0x03] = 0;
|
||||
a_bRegs[0x40] = 0x40;
|
||||
a_bRegs[0x41] = 0x00;
|
||||
a_bRegs[0x42] = (u_char)((hw->wDRAMSize > 512)? 0x61:0x21);
|
||||
|
||||
if( !usbio_WriteReg( dev->fd, 0x03, a_bRegs[0x03]))
|
||||
return SANE_FALSE;
|
||||
|
||||
_UIO(sanei_lm983x_write( dev->fd, 0x40,
|
||||
&a_bRegs[0x40], 3, SANE_TRUE));
|
||||
break;
|
||||
}
|
||||
|
||||
if( _LM9831 != hw->chip )
|
||||
m_dwPixels = m_ScanParam.Size.dwPhyPixels;
|
||||
|
||||
|
@ -1802,7 +1892,7 @@ static SANE_Bool usb_DownloadShadingData( pPlustek_Device dev, u_char bJobID )
|
|||
}
|
||||
|
||||
/* set RAM configuration AND
|
||||
* Gain = Multiplier Coefficient/16384
|
||||
* Gain = Multiplier Coefficient/16384
|
||||
* External DRAM for Multiplier Coefficient Source
|
||||
* External DRAM for Offset Coefficient Source
|
||||
*/
|
||||
|
@ -1814,14 +1904,14 @@ static SANE_Bool usb_DownloadShadingData( pPlustek_Device dev, u_char bJobID )
|
|||
break;
|
||||
|
||||
default:
|
||||
/* for coarse calibration and "black fine"*/
|
||||
/* for coarse calibration and "black fine" */
|
||||
a_bRegs[0x3e] = 0;
|
||||
a_bRegs[0x3f] = 0;
|
||||
a_bRegs[0x40] = 0x40;
|
||||
a_bRegs[0x41] = 0x00;
|
||||
|
||||
/* set RAM configuration AND
|
||||
* Bypass Multiplier
|
||||
* GAIN = Multiplier Coefficient/16384
|
||||
* CFG Register 0x40/0x41 for Multiplier Coefficient Source
|
||||
* CFG Register 0x3e/0x3f for Offset Coefficient Source
|
||||
*/
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
* devices
|
||||
* added OS/2 switch to disable the USB stuff for OS/2
|
||||
* 0.43 - added support for PREVIEW flag
|
||||
* 0.44 - added _DBG_DUMP debug level
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
@ -142,7 +143,8 @@
|
|||
#define _DBG_PROC 7
|
||||
#define _DBG_SANE_INIT 10
|
||||
#define _DBG_INFO2 13
|
||||
#define _DBG_READ 15
|
||||
#define _DBG_DUMP 20
|
||||
#define _DBG_READ 25
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ option negOffY 0
|
|||
|
||||
#
|
||||
# for adjusting the default gamma values
|
||||
# use values of 2.5 for CanoScan
|
||||
#
|
||||
option redGamma 1.0
|
||||
option greenGamma 1.0
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
* changed usbId to static array
|
||||
* added _MAX_ID_LEN
|
||||
* 0.43 - no changes
|
||||
* 0.44 - no changes
|
||||
*
|
||||
*.............................................................................
|
||||
*
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
;
|
||||
|
||||
:backend "plustek" ; name of backend
|
||||
:version "0.43" ; version of backend
|
||||
:version "0.44" ; version of backend
|
||||
:status :stable ; :alpha, :beta, :stable, :new
|
||||
:manpage "sane-plustek" ; name of manpage (if it exists)
|
||||
|
||||
|
@ -230,5 +230,18 @@
|
|||
:status :stable
|
||||
:comment "Mostly OK"
|
||||
|
||||
:mfg "Canon" ; name a manufacturer
|
||||
:url "http://www.canon.com/"
|
||||
|
||||
:model "CanoScan N650U/N656U"
|
||||
:interface "USB"
|
||||
:status :stable
|
||||
:comment "8-bit Color mode only"
|
||||
|
||||
:model "CanoScan N670U/N676U"
|
||||
:interface "USB"
|
||||
:status :stable
|
||||
:comment "8-bit Color mode only"
|
||||
|
||||
; :comment and :url specifiers are optional after :mfg, :model, :desc,
|
||||
; and at the top-level.
|
||||
|
|
|
@ -1,12 +1,8 @@
|
|||
.TH sane-plustek 5 "25 March 2002"
|
||||
.TH sane-plustek 5 "27 September 2002"
|
||||
.IX sane-plustek
|
||||
.SH NAME
|
||||
sane-plustek
|
||||
.br
|
||||
SANE backend for Plustek parallel port and
|
||||
.br
|
||||
sane-plustek \- SANE backend for Plustek parallel port and
|
||||
LM983[1/2/3] based USB flatbed scanners
|
||||
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B sane-plustek
|
||||
|
@ -198,6 +194,19 @@ USB Model: ASIC: Properties: Prod-ID
|
|||
UMAX 3400 LM9832 1200x2400dpi 42bit 2Mb 0x0060
|
||||
.PP
|
||||
|
||||
Vendor CANON - ID: 0x04A9
|
||||
.br
|
||||
----------------------------------------------------------
|
||||
.br
|
||||
USB Model: ASIC: Properties: Prod-ID
|
||||
.br
|
||||
----------------------------------------------------------
|
||||
.br
|
||||
CanoScan N650/656U LM9832 1200x2400dpi 42bit 512Kb 0x2206
|
||||
.br
|
||||
CanoScan N670/676U LM9832 1200x2400dpi 42bit 512Kb 0x220D
|
||||
.PP
|
||||
|
||||
.SH "OTHER PLUSTEK SCANNERS"
|
||||
|
||||
The SCSI scanner OpticPro 19200S is a rebadged Artec AM12S scanner
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sane-backends 1.0.7\n"
|
||||
"POT-Creation-Date: 2002-01-17 22:00+0100\n"
|
||||
"POT-Creation-Date: 2002-09-28 10:03+0200\n"
|
||||
"PO-Revision-Date: 2002-01-17 22:08+0100\n"
|
||||
"Last-Translator: Gerhard Jaeger <gerhard@gjaeger.de>\n"
|
||||
"Language-Team:\n"
|
||||
|
@ -12,62 +12,62 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=iso-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: .tmp/plustek.c:200 .tmp/plustek.c:210 .tmp/plustek.c:220
|
||||
#: .tmp/plustek.c:208 .tmp/plustek.c:218 .tmp/plustek.c:228
|
||||
msgid "Binary"
|
||||
msgstr "Strichzeichnung"
|
||||
|
||||
#: .tmp/plustek.c:201 .tmp/plustek.c:211
|
||||
#: .tmp/plustek.c:209 .tmp/plustek.c:219
|
||||
msgid "Halftone"
|
||||
msgstr "Halbton"
|
||||
|
||||
#: .tmp/plustek.c:202 .tmp/plustek.c:212 .tmp/plustek.c:221
|
||||
#: .tmp/plustek.c:210 .tmp/plustek.c:220 .tmp/plustek.c:229
|
||||
msgid "Gray"
|
||||
msgstr "Graustufen"
|
||||
|
||||
#: .tmp/plustek.c:203 .tmp/plustek.c:213 .tmp/plustek.c:222
|
||||
#: .tmp/plustek.c:211 .tmp/plustek.c:221 .tmp/plustek.c:230
|
||||
msgid "Color"
|
||||
msgstr "Farbe"
|
||||
|
||||
#: .tmp/plustek.c:214
|
||||
#: .tmp/plustek.c:222
|
||||
msgid "Color36"
|
||||
msgstr "Farbe36"
|
||||
|
||||
#: .tmp/plustek.c:223
|
||||
#: .tmp/plustek.c:231
|
||||
msgid "Color42"
|
||||
msgstr "Farbe42"
|
||||
|
||||
#: .tmp/plustek.c:229
|
||||
#: .tmp/plustek.c:237
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: .tmp/plustek.c:230
|
||||
#: .tmp/plustek.c:238
|
||||
msgid "Transparency"
|
||||
msgstr "Durchlicht"
|
||||
|
||||
#: .tmp/plustek.c:231
|
||||
#: .tmp/plustek.c:239
|
||||
msgid "Negative"
|
||||
msgstr "Negativ"
|
||||
|
||||
#: .tmp/plustek.c:237
|
||||
#: .tmp/plustek.c:245
|
||||
msgid "Dithermap 1"
|
||||
msgstr "Halbtonmuster 1"
|
||||
|
||||
#: .tmp/plustek.c:238
|
||||
#: .tmp/plustek.c:246
|
||||
msgid "Dithermap 2"
|
||||
msgstr "Halbtonmuster 2"
|
||||
|
||||
#: .tmp/plustek.c:239
|
||||
#: .tmp/plustek.c:247
|
||||
msgid "Randomize"
|
||||
msgstr "Zufallsmuster"
|
||||
|
||||
#: .tmp/plustek.c:717
|
||||
#: .tmp/plustek.c:727
|
||||
msgid "Scan Mode"
|
||||
msgstr "Scanmodus"
|
||||
|
||||
#: .tmp/plustek.c:805
|
||||
#: .tmp/plustek.c:822
|
||||
msgid "Geometry"
|
||||
msgstr "Scanbereich"
|
||||
|
||||
#: .tmp/plustek.c:851
|
||||
#: .tmp/plustek.c:868
|
||||
msgid "Enhancement"
|
||||
msgstr "Farbverbesserung"
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sane-backends 1.0.7\n"
|
||||
"POT-Creation-Date: 2002-01-17 22:00+0100\n"
|
||||
"POT-Creation-Date: 2002-09-02 20:00+0200\n"
|
||||
"PO-Revision-Date: 2002-03-03 01:20GMT\n"
|
||||
"Last-Translator: Gustavo D. Vranjes <gvranjes@abaconet.com.ar>\n"
|
||||
"Language-Team: Castellano <es@li.org>\n"
|
||||
|
@ -13,67 +13,62 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: KBabel 0.9.5\n"
|
||||
|
||||
#: .tmp/plustek.c:194 .tmp/plustek.c:204 .tmp/plustek.c:214
|
||||
|
||||
#: .tmp/plustek.c:206 .tmp/plustek.c:216 .tmp/plustek.c:226
|
||||
msgid "Binary"
|
||||
msgstr "Binario"
|
||||
|
||||
#: .tmp/plustek.c:195 .tmp/plustek.c:205
|
||||
#: .tmp/plustek.c:207 .tmp/plustek.c:217
|
||||
msgid "Halftone"
|
||||
msgstr "Mediotono"
|
||||
|
||||
#: .tmp/plustek.c:196 .tmp/plustek.c:206 .tmp/plustek.c:215
|
||||
|
||||
#: .tmp/plustek.c:208 .tmp/plustek.c:218 .tmp/plustek.c:227
|
||||
msgid "Gray"
|
||||
msgstr "Gris"
|
||||
|
||||
#: .tmp/plustek.c:197 .tmp/plustek.c:207 .tmp/plustek.c:216
|
||||
|
||||
#: .tmp/plustek.c:209 .tmp/plustek.c:219 .tmp/plustek.c:228
|
||||
msgid "Color"
|
||||
msgstr "Color"
|
||||
|
||||
#: .tmp/plustek.c:208
|
||||
#: .tmp/plustek.c:220
|
||||
msgid "Color36"
|
||||
msgstr "Color36"
|
||||
|
||||
#: .tmp/plustek.c:217
|
||||
#: .tmp/plustek.c:229
|
||||
msgid "Color42"
|
||||
msgstr "Color42"
|
||||
|
||||
#: .tmp/plustek.c:223
|
||||
|
||||
#: .tmp/plustek.c:235
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: .tmp/plustek.c:224
|
||||
|
||||
#: .tmp/plustek.c:236
|
||||
msgid "Transparency"
|
||||
msgstr "Transparencia"
|
||||
|
||||
#: .tmp/plustek.c:225 .tmp/saneopts.h:145
|
||||
#: .tmp/plustek.c:237
|
||||
msgid "Negative"
|
||||
msgstr "Negativo"
|
||||
|
||||
#: .tmp/plustek.c:231
|
||||
#: .tmp/plustek.c:243
|
||||
msgid "Dithermap 1"
|
||||
msgstr "Mapa de entramado 1"
|
||||
|
||||
#: .tmp/plustek.c:232
|
||||
#: .tmp/plustek.c:244
|
||||
msgid "Dithermap 2"
|
||||
msgstr "Mapa de entramado 2"
|
||||
|
||||
#: .tmp/plustek.c:233
|
||||
#: .tmp/plustek.c:245
|
||||
msgid "Randomize"
|
||||
msgstr "Aleatorio"
|
||||
|
||||
#: .tmp/plustek.c:632
|
||||
#: .tmp/plustek.c:725
|
||||
msgid "Scan Mode"
|
||||
msgstr "Modo de Escaneo"
|
||||
|
||||
#: .tmp/plustek.c:711
|
||||
#: .tmp/plustek.c:820
|
||||
msgid "Geometry"
|
||||
msgstr "Geometría"
|
||||
|
||||
#: .tmp/plustek.c:866
|
||||
msgid "Enhancement"
|
||||
msgstr "Mejora"
|
||||
|
||||
|
|
|
@ -226,9 +226,9 @@ sanei_lm983x_read( SANE_Int fd, SANE_Byte reg,
|
|||
|
||||
SANE_Bool sanei_lm983x_reset( SANE_Int fd )
|
||||
{
|
||||
SANE_Byte cmd_buffer[_CMD_BYTE_CNT];
|
||||
SANE_Byte tmp;
|
||||
SANE_Int i;
|
||||
SANE_Status res;
|
||||
SANE_Byte tmp;
|
||||
SANE_Int i;
|
||||
|
||||
DBG( 15, "sanei_lm983x_reset()\n" );
|
||||
|
||||
|
@ -241,42 +241,29 @@ SANE_Bool sanei_lm983x_reset( SANE_Int fd )
|
|||
* Write the command bytes for a register read
|
||||
* without increment
|
||||
*/
|
||||
cmd_buffer[0] = 0x01;
|
||||
cmd_buffer[1] = 7; /* command/status register */
|
||||
cmd_buffer[2] = 0;
|
||||
cmd_buffer[3] = 1;
|
||||
if( SANE_STATUS_GOOD != sanei_lm983x_read_byte( fd, 0x07, &tmp ))
|
||||
continue;
|
||||
|
||||
if( _CMD_BYTE_CNT == write( fd, cmd_buffer, _CMD_BYTE_CNT )) {
|
||||
|
||||
/* Then read the register in question */
|
||||
unsigned long cbBytes = 1;
|
||||
|
||||
if( read( fd, &tmp, cbBytes )) {
|
||||
|
||||
if( tmp & 0x20 ) {
|
||||
|
||||
SANE_Byte wrt_buffer[_CMD_BYTE_CNT + 1];
|
||||
|
||||
/* Write the command bytes for a register read
|
||||
* without increment
|
||||
*/
|
||||
wrt_buffer[0] = 0x00;
|
||||
wrt_buffer[1] = 7;
|
||||
wrt_buffer[2] = 0;
|
||||
wrt_buffer[3] = 1;
|
||||
wrt_buffer[4] = 0; /* <--- The data for the register */
|
||||
/* should this be 0x20???? */
|
||||
if( tmp & 0x20 ) {
|
||||
|
||||
/* We will attempt to reset it but we really don't do
|
||||
* anything if this fails
|
||||
*/
|
||||
if( write( fd, wrt_buffer, _CMD_BYTE_CNT + 1)) {
|
||||
DBG( 15, "Resetting the LM983x done\n" );
|
||||
return SANE_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
res = sanei_lm983x_write_byte( fd, 0x07, 0 );
|
||||
|
||||
/* We will attempt to reset it but we really don't do
|
||||
* anything if this fails
|
||||
*/
|
||||
if( res == SANE_STATUS_GOOD ) {
|
||||
DBG( 15, "Resetting the LM983x already done\n" );
|
||||
return SANE_TRUE;
|
||||
}
|
||||
} else {
|
||||
|
||||
res = sanei_lm983x_write_byte( fd, 0x07, 0x20 );
|
||||
|
||||
if( res == SANE_STATUS_GOOD ) {
|
||||
DBG( 15, "Resetting the LM983x done\n" );
|
||||
return SANE_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return SANE_FALSE;
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue