Merge mustek_usb2_reflective/transparent.c into mustek_usb2_high.c.

merge-requests/1/head
Jan Hauffa 2011-04-16 20:24:26 +02:00 zatwierdzone przez m. allan noah
rodzic a45931dd11
commit 3479acf538
7 zmienionych plików z 1010 dodań i 2828 usunięć

Wyświetl plik

@ -1073,16 +1073,8 @@ sane_start (SANE_Handle handle)
return SANE_STATUS_NO_MEM; return SANE_STATUS_NO_MEM;
s->scan_buffer_len = 0; s->scan_buffer_len = 0;
if (s->setpara.ssScanSource == SS_Reflective) if (!MustScanner_SetupScan (&s->setpara))
{ return SANE_STATUS_INVAL;
DBG (DBG_INFO, "StartScan: ssScanSource==SS_Reflective\n");
Reflective_SetupScan (&s->setpara); /* TODO: error handling */
}
else
{
DBG (DBG_INFO, "StartScan: ssScanSource!=SS_Reflective\n");
Transparent_SetupScan (&s->setpara); /* TODO: error handling */
}
DBG (DBG_FUNC, "sane_start: exit\n"); DBG (DBG_FUNC, "sane_start: exit\n");
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;

Wyświetl plik

@ -1512,46 +1512,29 @@ SetLEDTime (PAsic chip)
static void static void
SetAFEGainOffset (PAsic chip) SetAFEGainOffset (PAsic chip)
{ {
int i; int i, j;
DBG (DBG_ASIC, "SetAFEGainOffset: Enter\n"); DBG (DBG_ASIC, "SetAFEGainOffset: Enter\n");
Mustek_SendData (chip, ES01_60_AFE_AUTO_GAIN_OFFSET_RED_LB, for (i = 0; i < 3; i++)
(chip->AD.GainR << 1) | chip->AD.DirectionR); {
Mustek_SendData (chip, ES01_61_AFE_AUTO_GAIN_OFFSET_RED_HB, Mustek_SendData (chip, ES01_60_AFE_AUTO_GAIN_OFFSET_RED_LB + (i * 2),
chip->AD.OffsetR); (chip->AD.Gain[i] << 1) | chip->AD.Direction[i]);
Mustek_SendData (chip, ES01_61_AFE_AUTO_GAIN_OFFSET_RED_HB + (i * 2),
Mustek_SendData (chip, ES01_62_AFE_AUTO_GAIN_OFFSET_GREEN_LB, chip->AD.Offset[i]);
(chip->AD.GainG << 1) | chip->AD.DirectionG); }
Mustek_SendData (chip, ES01_63_AFE_AUTO_GAIN_OFFSET_GREEN_HB,
chip->AD.OffsetG);
Mustek_SendData (chip, ES01_64_AFE_AUTO_GAIN_OFFSET_BLUE_LB,
(chip->AD.GainB << 1) | chip->AD.DirectionB);
Mustek_SendData (chip, ES01_65_AFE_AUTO_GAIN_OFFSET_BLUE_HB,
chip->AD.OffsetB);
Mustek_SendData (chip, ES01_2A0_AFE_GAIN_OFFSET_CONTROL, 0x01); Mustek_SendData (chip, ES01_2A0_AFE_GAIN_OFFSET_CONTROL, 0x01);
for (i = 0; i < 4; i++) for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{ {
Mustek_SendData (chip, ES01_2A1_AFE_AUTO_CONFIG_GAIN, Mustek_SendData (chip, ES01_2A1_AFE_AUTO_CONFIG_GAIN,
(chip->AD.GainR << 1) | chip->AD.DirectionR); (chip->AD.Gain[i] << 1) | chip->AD.Direction[i]);
Mustek_SendData (chip, ES01_2A2_AFE_AUTO_CONFIG_OFFSET, chip->AD.OffsetR); Mustek_SendData (chip, ES01_2A2_AFE_AUTO_CONFIG_OFFSET,
chip->AD.Offset[i]);
} }
for (i = 0; i < 4; i++)
{
Mustek_SendData (chip, ES01_2A1_AFE_AUTO_CONFIG_GAIN,
(chip->AD.GainG << 1) | chip->AD.DirectionG);
Mustek_SendData (chip, ES01_2A2_AFE_AUTO_CONFIG_OFFSET, chip->AD.OffsetG);
}
for (i = 0; i < 4; i++)
{
Mustek_SendData (chip, ES01_2A1_AFE_AUTO_CONFIG_GAIN,
(chip->AD.GainB << 1) | chip->AD.DirectionB);
Mustek_SendData (chip, ES01_2A2_AFE_AUTO_CONFIG_OFFSET, chip->AD.OffsetB);
} }
for (i = 0; i < 36; i++) for (i = 0; i < 36; i++)
@ -1562,24 +1545,18 @@ SetAFEGainOffset (PAsic chip)
Mustek_SendData (chip, ES01_2A0_AFE_GAIN_OFFSET_CONTROL, 0x00); Mustek_SendData (chip, ES01_2A0_AFE_GAIN_OFFSET_CONTROL, 0x00);
Mustek_SendData (chip, ES01_04_ADAFEPGACH1, chip->AD.GainR); for (i = 0; i < 3; i++)
Mustek_SendData (chip, ES01_06_ADAFEPGACH2, chip->AD.GainG); Mustek_SendData (chip, ES01_04_ADAFEPGACH1 + (i * 2), chip->AD.Gain[i]);
Mustek_SendData (chip, ES01_08_ADAFEPGACH3, chip->AD.GainB);
if (chip->AD.DirectionR == DIR_NEGATIVE) for (i = 0; i < 3; i++)
Mustek_SendData (chip, ES01_0B_AD9826OffsetRedN, chip->AD.OffsetR); {
if (chip->AD.Direction[i] == DIR_NEGATIVE)
Mustek_SendData (chip, ES01_0B_AD9826OffsetRedN + (i * 2),
chip->AD.Offset[i]);
else else
Mustek_SendData (chip, ES01_0A_AD9826OffsetRedP, chip->AD.OffsetR); Mustek_SendData (chip, ES01_0A_AD9826OffsetRedP + (i * 2),
chip->AD.Offset[i]);
if (chip->AD.DirectionG == DIR_NEGATIVE) }
Mustek_SendData (chip, ES01_0D_AD9826OffsetGreenN, chip->AD.OffsetG);
else
Mustek_SendData (chip, ES01_0C_AD9826OffsetGreenP, chip->AD.OffsetG);
if (chip->AD.DirectionB == DIR_NEGATIVE)
Mustek_SendData (chip, ES01_0F_AD9826OffsetBlueN, chip->AD.OffsetB);
else
Mustek_SendData (chip, ES01_0E_AD9826OffsetBlueP, chip->AD.OffsetB);
DBG (DBG_ASIC, "SetAFEGainOffset: Exit\n"); DBG (DBG_ASIC, "SetAFEGainOffset: Exit\n");
} }
@ -2016,7 +1993,6 @@ Asic_Initialize (PAsic chip)
chip->isMotorMoveToFirstLine = MOTOR_MOVE_TO_FIRST_LINE_ENABLE; chip->isMotorMoveToFirstLine = MOTOR_MOVE_TO_FIRST_LINE_ENABLE;
chip->lpShadingTable = NULL; chip->lpShadingTable = NULL;
Asic_ResetADParameters (chip, LS_REFLECTIVE);
InitTiming (chip); InitTiming (chip);
chip->firmwarestate = FS_ATTACHED; chip->firmwarestate = FS_ATTACHED;
@ -2086,10 +2062,11 @@ GetBytePerPixel (SANE_Byte bBitPerPixel)
} }
static SANE_Byte static SANE_Byte
GetDummyCycleNumber (PAsic chip, unsigned short wYResolution) GetDummyCycleNumber (PAsic chip, unsigned short wYResolution,
SCANSOURCE lsLightSource)
{ {
SANE_Byte bDummyCycleNum = 0; SANE_Byte bDummyCycleNum = 0;
if (chip->lsLightSource == LS_REFLECTIVE) if (lsLightSource == SS_Reflective)
{ {
if (chip->UsbHost == HT_USB10) if (chip->UsbHost == HT_USB10)
{ {
@ -2148,7 +2125,8 @@ GetDummyCycleNumber (PAsic chip, unsigned short wYResolution)
} }
static SANE_Status static SANE_Status
Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits, Asic_SetWindow (PAsic chip, SCANSOURCE lsLightSource,
SANE_Byte bScanType, SANE_Byte bScanBits,
unsigned short wXResolution, unsigned short wYResolution, unsigned short wXResolution, unsigned short wYResolution,
unsigned short wX, unsigned short wY, unsigned short wX, unsigned short wY,
unsigned short wWidth, unsigned short wLength) unsigned short wWidth, unsigned short wLength)
@ -2178,10 +2156,11 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits,
unsigned short wFullBank; unsigned short wFullBank;
DBG (DBG_ASIC, "Asic_SetWindow: Enter\n"); DBG (DBG_ASIC, "Asic_SetWindow: Enter\n");
DBG (DBG_ASIC, "bScanType=%d,bScanBits=%d,wXResolution=%d,wYResolution=%d," \ DBG (DBG_ASIC, "lsLightSource=%d,bScanType=%d,bScanBits=%d," \
"wX=%d,wY=%d,wWidth=%d,wLength=%d\n", "wXResolution=%d,wYResolution=%d,wX=%d,wY=%d," \
bScanType, bScanBits, wXResolution, wYResolution, wX, wY, wWidth, "wWidth=%d,wLength=%d\n",
wLength); lsLightSource, bScanType, bScanBits, wXResolution, wYResolution, wX, wY,
wWidth, wLength);
if (chip->firmwarestate != FS_OPENED) if (chip->firmwarestate != FS_OPENED)
{ {
@ -2205,7 +2184,7 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits,
DBG (DBG_ASIC, "dwBytesCountPerRow=%d\n", chip->dwBytesCountPerRow); DBG (DBG_ASIC, "dwBytesCountPerRow=%d\n", chip->dwBytesCountPerRow);
if (bScanType == SCAN_TYPE_NORMAL) if (bScanType == SCAN_TYPE_NORMAL)
bDummyCycleNum = GetDummyCycleNumber (chip, wYResolution); bDummyCycleNum = GetDummyCycleNumber (chip, wYResolution, lsLightSource);
else else
bDummyCycleNum = 1; bDummyCycleNum = 1;
@ -2224,7 +2203,7 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits,
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x00); Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x00);
} }
if (chip->lsLightSource == LS_REFLECTIVE) if (lsLightSource == SS_Reflective)
{ {
if (wXResolution > (SENSOR_DPI / 2)) if (wXResolution > (SENSOR_DPI / 2))
wCCD_PixelNumber = chip->Timing.wCCDPixelNumber_Full; wCCD_PixelNumber = chip->Timing.wCCDPixelNumber_Full;
@ -2305,7 +2284,7 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits,
SetScanMode (chip, bScanBits); SetScanMode (chip, bScanBits);
if (chip->lsLightSource == LS_REFLECTIVE) if (lsLightSource == SS_Reflective)
Mustek_SendData (chip, ES01_F8_WHITE_SHADING_DATA_FORMAT, Mustek_SendData (chip, ES01_F8_WHITE_SHADING_DATA_FORMAT,
SHADING_3_INT_13_DEC_ES01); SHADING_3_INT_13_DEC_ES01);
else else
@ -2454,27 +2433,6 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits,
return status; return status;
} }
static void
Asic_ResetADParameters (PAsic chip, LIGHTSOURCE lsLightSource)
{
DBG (DBG_ASIC, "Asic_ResetADParameters: Enter\n");
chip->lsLightSource = lsLightSource;
chip->dwBytesCountPerRow = 0;
chip->AD.DirectionR = DIR_POSITIVE;
chip->AD.DirectionG = DIR_POSITIVE;
chip->AD.DirectionB = DIR_POSITIVE;
chip->AD.GainR = 0;
chip->AD.GainG = 0;
chip->AD.GainB = 0;
chip->AD.OffsetR = 0;
chip->AD.OffsetG = 0;
chip->AD.OffsetB = 0;
DBG (DBG_ASIC, "Asic_ResetADParameters: Exit\n");
}
static SANE_Status static SANE_Status
Asic_ScanStart (PAsic chip) Asic_ScanStart (PAsic chip)
{ {

Wyświetl plik

@ -67,23 +67,24 @@
typedef enum typedef enum
{ {
FS_ATTACHED = 1, FS_ATTACHED,
FS_OPENED = 2, FS_OPENED,
FS_SCANNING = 3 FS_SCANNING
} FIRMWARESTATE; } FIRMWARESTATE;
typedef enum typedef enum
{ {
HT_USB10 = 0, HT_USB10,
HT_USB20 = 1 HT_USB20
} USBHOST; } USBHOST;
typedef enum typedef enum
{ {
LS_REFLECTIVE = 1, SS_Reflective,
LS_POSITIVE = 2, SS_Positive,
LS_NEGATIVE = 4 SS_Negative
} LIGHTSOURCE; } SCANSOURCE;
typedef struct typedef struct
{ {
@ -159,15 +160,9 @@ typedef struct
typedef struct typedef struct
{ {
SANE_Byte GainR; SANE_Byte Gain[3];
SANE_Byte GainG; SANE_Byte Offset[3];
SANE_Byte GainB; SANE_Bool Direction[3];
SANE_Byte OffsetR;
SANE_Byte OffsetG;
SANE_Byte OffsetB;
SANE_Bool DirectionR;
SANE_Bool DirectionG;
SANE_Bool DirectionB;
} ADConverter; } ADConverter;
typedef struct typedef struct
@ -177,7 +172,6 @@ typedef struct
FIRMWARESTATE firmwarestate; FIRMWARESTATE firmwarestate;
SANE_Bool isFirstOpenChip; /* == SANE_FALSE after first Asic_Open */ SANE_Bool isFirstOpenChip; /* == SANE_FALSE after first Asic_Open */
USBHOST UsbHost; USBHOST UsbHost;
LIGHTSOURCE lsLightSource;
unsigned int dwBytesCountPerRow; unsigned int dwBytesCountPerRow;
@ -1039,14 +1033,13 @@ static SANE_Status Asic_Close (PAsic chip);
static void Asic_Initialize (PAsic chip); static void Asic_Initialize (PAsic chip);
static SANE_Status Asic_TurnLamp (PAsic chip, SANE_Bool isLampOn); static SANE_Status Asic_TurnLamp (PAsic chip, SANE_Bool isLampOn);
static SANE_Status Asic_TurnTA (PAsic chip, SANE_Bool isTAOn); static SANE_Status Asic_TurnTA (PAsic chip, SANE_Bool isTAOn);
static SANE_Status Asic_SetWindow (PAsic chip, static SANE_Status Asic_SetWindow (PAsic chip, SCANSOURCE lsLightSource,
SANE_Byte bScanType, SANE_Byte bScanBits, SANE_Byte bScanType, SANE_Byte bScanBits,
unsigned short wXResolution, unsigned short wXResolution,
unsigned short wYResolution, unsigned short wYResolution,
unsigned short wX, unsigned short wY, unsigned short wX, unsigned short wY,
unsigned short wWidth, unsigned short wWidth,
unsigned short wLength); unsigned short wLength);
static void Asic_ResetADParameters (PAsic chip, LIGHTSOURCE lsLightSource);
static SANE_Status Asic_ScanStart (PAsic chip); static SANE_Status Asic_ScanStart (PAsic chip);
static SANE_Status Asic_ScanStop (PAsic chip); static SANE_Status Asic_ScanStop (PAsic chip);
static SANE_Status Asic_ReadImage (PAsic chip, SANE_Byte * pBuffer, static SANE_Status Asic_ReadImage (PAsic chip, SANE_Byte * pBuffer,

Wyświetl plik

@ -48,13 +48,6 @@
#ifndef MUSTEK_USB2_HIGH_H #ifndef MUSTEK_USB2_HIGH_H
#define MUSTEK_USB2_HIGH_H #define MUSTEK_USB2_HIGH_H
typedef enum
{
SS_Reflective,
SS_Positive,
SS_Negative
} SCANSOURCE;
typedef enum typedef enum
{ {
RO_RGB, RO_RGB,
@ -96,27 +89,11 @@ typedef struct
#define _MAX(a,b) ((a)>(b)?(a):(b)) #define _MAX(a,b) ((a)>(b)?(a):(b))
#define _MIN(a,b) ((a)<(b)?(a):(b)) #define _MIN(a,b) ((a)<(b)?(a):(b))
#define R_GAIN 0
#define G_GAIN 0
#define B_GAIN 0
#define R_DIRECTION DIR_POSITIVE
#define G_DIRECTION DIR_POSITIVE
#define B_DIRECTION DIR_POSITIVE
/* used for adjusting the AD offset */ /* used for adjusting the AD offset */
#define WHITE_MAX_LEVEL 220
/* for Reflective */ #define WHITE_MIN_LEVEL 210
#define REFL_WHITE_MAX_LEVEL 220 #define MAX_LEVEL_RANGE 210
#define REFL_WHITE_MIN_LEVEL 210 #define MIN_LEVEL_RANGE 190
#define REFL_MAX_LEVEL_RANGE 210
#define REFL_MIN_LEVEL_RANGE 190
/* for Transparent */
#define TRAN_WHITE_MAX_LEVEL 220
#define TRAN_WHITE_MIN_LEVEL 210
#define TRAN_MAX_LEVEL_RANGE 210
#define TRAN_MIN_LEVEL_RANGE 190
/* 600 dpi */ /* 600 dpi */
#define FIND_LEFT_TOP_WIDTH_IN_DIP 512 #define FIND_LEFT_TOP_WIDTH_IN_DIP 512
@ -161,6 +138,11 @@ static SANE_Bool MustScanner_GetRows (SANE_Byte * lpBlock,
unsigned short * Rows, unsigned short * Rows,
SANE_Bool isOrderInvert); SANE_Bool isOrderInvert);
static SANE_Bool MustScanner_Reset (SCANSOURCE ssScanSource); static SANE_Bool MustScanner_Reset (SCANSOURCE ssScanSource);
static SANE_Bool MustScanner_SetupScan (TARGETIMAGE *pTarget);
static SANE_Bool MustScanner_AdjustAD (void);
static SANE_Bool MustScanner_FindTopLeft (unsigned short * lpwStartX,
unsigned short * lpwStartY);
static SANE_Bool MustScanner_LineCalibration16Bits (void);
#endif #endif