kopia lustrzana https://gitlab.com/sane-project/backends
First attempt at merging Asic_SetCalibrate into Asic_SetWindow.
rodzic
033ebe6d9b
commit
3c87b646b5
|
@ -711,8 +711,6 @@ SetMotorStepTable (PAsic chip, LLF_MOTORMOVE * MotorStepsTable,
|
|||
dwScanImageSteps += bScanDecSteps;
|
||||
dwScanImageSteps += 2;
|
||||
|
||||
MotorStepsTable->AccStep = wAccSteps;
|
||||
MotorStepsTable->DecStep = bDecSteps;
|
||||
MotorStepsTable->wScanAccSteps = wScanAccSteps;
|
||||
MotorStepsTable->bScanDecSteps = bScanDecSteps;
|
||||
|
||||
|
@ -761,7 +759,56 @@ SetMotorStepTable (PAsic chip, LLF_MOTORMOVE * MotorStepsTable,
|
|||
}
|
||||
|
||||
static void
|
||||
CalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
||||
SetMotorStepTableForCalibration (PAsic chip, LLF_MOTORMOVE * MotorStepsTable,
|
||||
unsigned int dwScanImageSteps)
|
||||
{
|
||||
unsigned short wScanAccSteps = 1;
|
||||
SANE_Byte bScanDecSteps = 1;
|
||||
unsigned short wFixScanSteps = 0;
|
||||
unsigned short wScanBackTrackingSteps = 20;
|
||||
|
||||
DBG (DBG_ASIC, "SetMotorStepTableForCalibration: Enter\n");
|
||||
|
||||
chip->isMotorMoveToFirstLine = 0;
|
||||
|
||||
dwScanImageSteps += wScanAccSteps;
|
||||
dwScanImageSteps += wFixScanSteps;
|
||||
dwScanImageSteps += bScanDecSteps;
|
||||
|
||||
MotorStepsTable->wScanAccSteps = wScanAccSteps;
|
||||
MotorStepsTable->bScanDecSteps = bScanDecSteps;
|
||||
|
||||
/* state 4 */
|
||||
Mustek_SendData (chip, ES01_AE_MotorSyncPixelNumberM16LSB, 0);
|
||||
Mustek_SendData (chip, ES01_AF_MotorSyncPixelNumberM16MSB, 0);
|
||||
/* state 5 */
|
||||
Mustek_SendData (chip, ES01_EC_ScanAccStep0_7, LOBYTE (wScanAccSteps));
|
||||
Mustek_SendData (chip, ES01_ED_ScanAccStep8_8, HIBYTE (wScanAccSteps));
|
||||
/* state 6 */
|
||||
Mustek_SendData (chip, ES01_EE_FixScanStepLSB, LOBYTE (wFixScanSteps));
|
||||
Mustek_SendData (chip, ES01_8A_FixScanStepMSB, HIBYTE (wFixScanSteps));
|
||||
/* state 8 */
|
||||
Mustek_SendData (chip, ES01_EF_ScanDecStep, bScanDecSteps);
|
||||
/* state 10 */
|
||||
Mustek_SendData (chip, ES01_E6_ScanBackTrackingStepLSB,
|
||||
LOBYTE (wScanBackTrackingSteps));
|
||||
Mustek_SendData (chip, ES01_E7_ScanBackTrackingStepMSB,
|
||||
HIBYTE (wScanBackTrackingSteps));
|
||||
/* state 15 */
|
||||
Mustek_SendData (chip, ES01_E8_ScanRestartStepLSB,
|
||||
LOBYTE (wScanBackTrackingSteps));
|
||||
Mustek_SendData (chip, ES01_E9_ScanRestartStepMSB,
|
||||
HIBYTE (wScanBackTrackingSteps));
|
||||
|
||||
Mustek_SendData (chip, ES01_F0_ScanImageStep0_7, BYTE0 (dwScanImageSteps));
|
||||
Mustek_SendData (chip, ES01_F1_ScanImageStep8_15, BYTE1 (dwScanImageSteps));
|
||||
Mustek_SendData (chip, ES01_F2_ScanImageStep16_19, BYTE2 (dwScanImageSteps));
|
||||
|
||||
DBG (DBG_ASIC, "SetMotorStepTableForCalibration: Exit\n");
|
||||
}
|
||||
|
||||
static void
|
||||
CalculateScanMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
||||
{
|
||||
unsigned short wEndSpeed, wStartSpeed;
|
||||
unsigned short wScanAccSteps;
|
||||
|
@ -770,7 +817,7 @@ CalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
|||
long double y;
|
||||
unsigned short i;
|
||||
|
||||
DBG (DBG_ASIC, "CalculateMotorTable: Enter\n");
|
||||
DBG (DBG_ASIC, "CalculateScanMotorTable: Enter\n");
|
||||
|
||||
wStartSpeed = lpCalculateMotorTable->StartSpeed;
|
||||
wEndSpeed = lpCalculateMotorTable->EndSpeed;
|
||||
|
@ -827,11 +874,11 @@ CalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
|||
lpMotorTable[i + 512 * 5] = wStartSpeed; /* T5 */
|
||||
}
|
||||
|
||||
DBG (DBG_ASIC, "CalculateMotorTable: Exit\n");
|
||||
DBG (DBG_ASIC, "CalculateScanMotorTable: Exit\n");
|
||||
}
|
||||
|
||||
static void
|
||||
LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
||||
CalculateMoveMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
||||
{
|
||||
unsigned short wEndSpeed, wStartSpeed;
|
||||
unsigned short wScanAccSteps;
|
||||
|
@ -839,7 +886,7 @@ LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
|||
long double y;
|
||||
unsigned short i;
|
||||
|
||||
DBG (DBG_ASIC, "LLFCalculateMotorTable: Enter\n");
|
||||
DBG (DBG_ASIC, "CalculateMoveMotorTable: Enter\n");
|
||||
|
||||
wStartSpeed = lpCalculateMotorTable->StartSpeed;
|
||||
wEndSpeed = lpCalculateMotorTable->EndSpeed;
|
||||
|
@ -876,7 +923,7 @@ LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable)
|
|||
lpMotorTable[i + 512 * 2] = (unsigned short) y;
|
||||
}
|
||||
|
||||
DBG (DBG_ASIC, "LLFCalculateMotorTable: Exit\n");
|
||||
DBG (DBG_ASIC, "CalculateMoveMotorTable: Exit\n");
|
||||
}
|
||||
|
||||
static SANE_Byte
|
||||
|
@ -911,7 +958,7 @@ MotorBackHome (PAsic chip)
|
|||
CalMotorTable.EndSpeed = 1200;
|
||||
CalMotorTable.AccStepBeforeScan = 511;
|
||||
CalMotorTable.lpMotorTable = BackHomeMotorTable;
|
||||
LLFCalculateMotorTable (&CalMotorTable);
|
||||
CalculateMoveMotorTable (&CalMotorTable);
|
||||
|
||||
CurrentPhase.MoveType = _4_TABLE_SPACE_FOR_FULL_STEP;
|
||||
CurrentPhase.MotorDriverIs3967 = 0;
|
||||
|
@ -1963,7 +2010,6 @@ Asic_Initialize (PAsic chip)
|
|||
|
||||
chip->UsbHost = HT_USB10;
|
||||
chip->dwBytesCountPerRow = 0;
|
||||
chip->isMotorMove = MOTOR_0_ENABLE;
|
||||
chip->isMotorMoveToFirstLine = MOTOR_MOVE_TO_FIRST_LINE_ENABLE;
|
||||
chip->lpShadingTable = NULL;
|
||||
|
||||
|
@ -1976,7 +2022,7 @@ Asic_Initialize (PAsic chip)
|
|||
}
|
||||
|
||||
static STATUS
|
||||
Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
||||
Asic_SetWindow (PAsic chip, SANE_Byte bScanType, SANE_Byte bScanBits,
|
||||
unsigned short wXResolution, unsigned short wYResolution,
|
||||
unsigned short wX, unsigned short wY,
|
||||
unsigned short wWidth, unsigned short wLength)
|
||||
|
@ -2001,6 +2047,7 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
LLF_MOTOR_CURRENT_AND_PHASE CurrentPhase;
|
||||
LLF_RAMACCESS RamAccess;
|
||||
unsigned int dwTableBaseAddr, dwShadingTableAddr, dwEndAddr;
|
||||
SANE_Byte isMotorMove = MOTOR_0_ENABLE;
|
||||
SANE_Byte isMotorMoveToFirstLine = chip->isMotorMoveToFirstLine;
|
||||
SANE_Byte isUniformSpeedToScan = 0;
|
||||
SANE_Byte isScanBackTracking = SCAN_BACK_TRACKING_ENABLE;
|
||||
|
@ -2010,9 +2057,10 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
unsigned short wFullBank;
|
||||
|
||||
DBG (DBG_ASIC, "Asic_SetWindow: Enter\n");
|
||||
DBG (DBG_ASIC, "bScanBits=%d,wXResolution=%d,wYResolution=%d,wX=%d,wY=%d," \
|
||||
"wWidth=%d,wLength=%d\n",
|
||||
bScanBits, wXResolution, wYResolution, wX, wY, wWidth, wLength);
|
||||
DBG (DBG_ASIC, "bScanType=%d,bScanBits=%d,wXResolution=%d,wYResolution=%d," \
|
||||
"wX=%d,wY=%d,wWidth=%d,wLength=%d\n",
|
||||
bScanType, bScanBits, wXResolution, wYResolution, wX, wY, wWidth,
|
||||
wLength);
|
||||
|
||||
if (chip->firmwarestate != FS_OPENED)
|
||||
{
|
||||
|
@ -2066,67 +2114,74 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
chip->dwBytesCountPerRow);
|
||||
|
||||
bDummyCycleNum = 0;
|
||||
if (chip->lsLightSource == LS_REFLECTIVE)
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
{
|
||||
if (chip->UsbHost == HT_USB10)
|
||||
if (chip->lsLightSource == LS_REFLECTIVE)
|
||||
{
|
||||
switch (wYResolution)
|
||||
if (chip->UsbHost == HT_USB10)
|
||||
{
|
||||
case 2400:
|
||||
case 1200:
|
||||
if (chip->dwBytesCountPerRow > 22000)
|
||||
bDummyCycleNum = 4;
|
||||
else if (chip->dwBytesCountPerRow > 15000)
|
||||
bDummyCycleNum = 3;
|
||||
else if (chip->dwBytesCountPerRow > 10000)
|
||||
bDummyCycleNum = 2;
|
||||
else if (chip->dwBytesCountPerRow > 5000)
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
case 600:
|
||||
case 300:
|
||||
case 150:
|
||||
case 100:
|
||||
if (chip->dwBytesCountPerRow > 21000)
|
||||
bDummyCycleNum = 7;
|
||||
else if (chip->dwBytesCountPerRow > 18000)
|
||||
bDummyCycleNum = 6;
|
||||
else if (chip->dwBytesCountPerRow > 15000)
|
||||
bDummyCycleNum = 5;
|
||||
else if (chip->dwBytesCountPerRow > 12000)
|
||||
bDummyCycleNum = 4;
|
||||
else if (chip->dwBytesCountPerRow > 9000)
|
||||
bDummyCycleNum = 3;
|
||||
else if (chip->dwBytesCountPerRow > 6000)
|
||||
bDummyCycleNum = 2;
|
||||
else if (chip->dwBytesCountPerRow > 3000)
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
case 75:
|
||||
case 50:
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
default:
|
||||
bDummyCycleNum = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (wYResolution)
|
||||
{
|
||||
case 2400:
|
||||
case 1200:
|
||||
case 75:
|
||||
case 50:
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
default:
|
||||
bDummyCycleNum = 0;
|
||||
break;
|
||||
switch (wYResolution)
|
||||
{
|
||||
case 2400:
|
||||
case 1200:
|
||||
if (chip->dwBytesCountPerRow > 22000)
|
||||
bDummyCycleNum = 4;
|
||||
else if (chip->dwBytesCountPerRow > 15000)
|
||||
bDummyCycleNum = 3;
|
||||
else if (chip->dwBytesCountPerRow > 10000)
|
||||
bDummyCycleNum = 2;
|
||||
else if (chip->dwBytesCountPerRow > 5000)
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
case 600:
|
||||
case 300:
|
||||
case 150:
|
||||
case 100:
|
||||
if (chip->dwBytesCountPerRow > 21000)
|
||||
bDummyCycleNum = 7;
|
||||
else if (chip->dwBytesCountPerRow > 18000)
|
||||
bDummyCycleNum = 6;
|
||||
else if (chip->dwBytesCountPerRow > 15000)
|
||||
bDummyCycleNum = 5;
|
||||
else if (chip->dwBytesCountPerRow > 12000)
|
||||
bDummyCycleNum = 4;
|
||||
else if (chip->dwBytesCountPerRow > 9000)
|
||||
bDummyCycleNum = 3;
|
||||
else if (chip->dwBytesCountPerRow > 6000)
|
||||
bDummyCycleNum = 2;
|
||||
else if (chip->dwBytesCountPerRow > 3000)
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
case 75:
|
||||
case 50:
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
default:
|
||||
bDummyCycleNum = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (wYResolution)
|
||||
{
|
||||
case 2400:
|
||||
case 1200:
|
||||
case 75:
|
||||
case 50:
|
||||
bDummyCycleNum = 1;
|
||||
break;
|
||||
default:
|
||||
bDummyCycleNum = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bDummyCycleNum = 1;
|
||||
}
|
||||
|
||||
CCDTiming (chip);
|
||||
|
||||
|
@ -2154,19 +2209,23 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
wThinkCCDResolution = SENSOR_DPI;
|
||||
Mustek_SendData (chip, ES01_98_GPIOControl8_15, 0x01);
|
||||
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x01);
|
||||
wCCD_PixelNumber = TA_IMAGE_PIXELNUMBER;
|
||||
}
|
||||
else
|
||||
{
|
||||
wThinkCCDResolution = SENSOR_DPI / 2;
|
||||
Mustek_SendData (chip, ES01_98_GPIOControl8_15, 0x01);
|
||||
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x00);
|
||||
wCCD_PixelNumber = TA_IMAGE_PIXELNUMBER;
|
||||
}
|
||||
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
wCCD_PixelNumber = TA_IMAGE_PIXELNUMBER;
|
||||
else
|
||||
wCCD_PixelNumber = TA_CAL_PIXELNUMBER;
|
||||
}
|
||||
|
||||
SetLineTimeAndExposure (chip);
|
||||
Mustek_SendData (chip, ES01_CB_CCDDummyCycleNumber, bDummyCycleNum);
|
||||
if ((bScanType == SCAN_TYPE_NORMAL) || (wYResolution == 600))
|
||||
Mustek_SendData (chip, ES01_CB_CCDDummyCycleNumber, bDummyCycleNum);
|
||||
SetLEDTime (chip);
|
||||
|
||||
/* SetADConverter */
|
||||
|
@ -2175,9 +2234,12 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
|
||||
/* set AFE */
|
||||
Mustek_SendData (chip, ES01_9A_AFEControl, AD9826_AFE);
|
||||
status = SetAFEGainOffset (chip);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
{
|
||||
status = SetAFEGainOffset (chip);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
}
|
||||
|
||||
Mustek_SendData (chip, ES01_F7_DigitalControl, 0);
|
||||
|
||||
|
@ -2198,15 +2260,17 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
"XRatioTypeDouble=%.2f,XRatioAdderDouble=%.2f,XRatioTypeWord=%d\n",
|
||||
XRatioTypeDouble, XRatioAdderDouble, XRatioTypeWord);
|
||||
|
||||
/* SetMotorType */
|
||||
Mustek_SendData (chip, ES01_A6_MotorOption, MOTOR_0_ENABLE |
|
||||
HOME_SENSOR_0_ENABLE | TABLE_DEFINE_ES03);
|
||||
/* set motor type */
|
||||
if (bScanType == SCAN_TYPE_CALIBRATE_DARK)
|
||||
isMotorMove = 0;
|
||||
Mustek_SendData (chip, ES01_A6_MotorOption,
|
||||
isMotorMove | HOME_SENSOR_0_ENABLE | TABLE_DEFINE_ES03);
|
||||
|
||||
Mustek_SendData (chip, ES01_F6_MotorControl1, SPEED_UNIT_1_PIXEL_TIME |
|
||||
MOTOR_SYNC_UNIT_1_PIXEL_TIME);
|
||||
Mustek_SendData (chip, ES01_F6_MotorControl1,
|
||||
SPEED_UNIT_1_PIXEL_TIME | MOTOR_SYNC_UNIT_1_PIXEL_TIME);
|
||||
|
||||
/* set motor movement type */
|
||||
if (wYResolution >= 1200)
|
||||
if ((bScanType == SCAN_TYPE_NORMAL) && (wYResolution >= 1200))
|
||||
bMotorMoveType = _8_TABLE_SPACE_FOR_1_DIV_2_STEP;
|
||||
|
||||
switch (bMotorMoveType)
|
||||
|
@ -2239,51 +2303,75 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
|
||||
SetPackAddress (chip, wWidth, wX, XRatioAdderDouble,
|
||||
XRatioTypeDouble, 0, &ValidPixelNumber);
|
||||
SetExtraSetting (chip, wXResolution, wCCD_PixelNumber, SANE_FALSE);
|
||||
SetExtraSetting (chip, wXResolution, wCCD_PixelNumber,
|
||||
(bScanType == SCAN_TYPE_NORMAL) ? SANE_FALSE : SANE_TRUE);
|
||||
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
{
|
||||
SetMotorStepTable (chip, &lpMotorStepsTable, wY,
|
||||
wLength * SENSOR_DPI / wYResolution * wMultiMotorStep,
|
||||
wYResolution);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetMotorStepTableForCalibration (chip, &lpMotorStepsTable,
|
||||
wLength * SENSOR_DPI / wYResolution * wMultiMotorStep);
|
||||
}
|
||||
|
||||
/* calculate line time */
|
||||
dwLinePixelReport = (2 + (chip->Timing.PHTG_PulseWidth + 1) +
|
||||
(chip->Timing.PHTG_WaitWidth + 1) +
|
||||
(wCCD_PixelNumber + 1)) * (bDummyCycleNum + 1);
|
||||
|
||||
DBG (DBG_ASIC, "Motor Time = %d\n",
|
||||
(dwLinePixelReport * wYResolution / SENSOR_DPI) / wMultiMotorStep);
|
||||
if ((dwLinePixelReport * wYResolution / SENSOR_DPI) / wMultiMotorStep >
|
||||
64000)
|
||||
{
|
||||
DBG (DBG_ASIC, "Motor Time overflow!\n");
|
||||
}
|
||||
|
||||
EndSpeed = (unsigned short) ((dwLinePixelReport * wYResolution / SENSOR_DPI) /
|
||||
wMultiMotorStep);
|
||||
SetMotorStepTable (chip, &lpMotorStepsTable, wY,
|
||||
wLength * SENSOR_DPI / wYResolution * wMultiMotorStep,
|
||||
wYResolution);
|
||||
DBG (DBG_ASIC, "Motor Time = %d\n", EndSpeed);
|
||||
if (EndSpeed > 64000)
|
||||
DBG (DBG_ASIC, "Motor Time overflow!\n");
|
||||
|
||||
if (EndSpeed >= 20000)
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
{
|
||||
status = Asic_MotorMove (chip, 1, wY / wMultiMotorStep);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
if (EndSpeed >= 20000)
|
||||
{
|
||||
status = Asic_MotorMove (chip, 1, wY / wMultiMotorStep);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
|
||||
isUniformSpeedToScan = UNIFORM_MOTOR_AND_SCAN_SPEED_ENABLE;
|
||||
isScanBackTracking = 0;
|
||||
isMotorMoveToFirstLine = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
isUniformSpeedToScan = UNIFORM_MOTOR_AND_SCAN_SPEED_ENABLE;
|
||||
isScanBackTracking = 0;
|
||||
isMotorMoveToFirstLine = 0;
|
||||
}
|
||||
|
||||
Mustek_SendData (chip, ES01_F3_ActionOption, isMotorMoveToFirstLine |
|
||||
SCAN_ENABLE | isScanBackTracking | isUniformSpeedToScan);
|
||||
|
||||
if (EndSpeed > 8000)
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
{
|
||||
StartSpeed = EndSpeed;
|
||||
if (EndSpeed > 8000)
|
||||
{
|
||||
StartSpeed = EndSpeed;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (EndSpeed <= 1000)
|
||||
StartSpeed = EndSpeed + 4500;
|
||||
else
|
||||
StartSpeed = EndSpeed + 3500;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (EndSpeed <= 1000)
|
||||
StartSpeed = EndSpeed + 4500;
|
||||
/* TODO: this is equivalent to the above, except in TA mode */
|
||||
if (wXResolution > 600)
|
||||
StartSpeed = EndSpeed;
|
||||
else
|
||||
StartSpeed = EndSpeed + 3500;
|
||||
StartSpeed = EndSpeed + 3500;
|
||||
}
|
||||
DBG (DBG_ASIC, "StartSpeed=%d, EndSpeed=%d\n", StartSpeed, EndSpeed);
|
||||
|
||||
|
@ -2303,11 +2391,17 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
CalMotorTable.AccStepBeforeScan = lpMotorStepsTable.wScanAccSteps;
|
||||
CalMotorTable.DecStepAfterScan = lpMotorStepsTable.bScanDecSteps;
|
||||
CalMotorTable.lpMotorTable = lpMotorTable;
|
||||
CalculateMotorTable (&CalMotorTable);
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
CalculateScanMotorTable (&CalMotorTable);
|
||||
else
|
||||
CalculateMoveMotorTable (&CalMotorTable);
|
||||
|
||||
CurrentPhase.MoveType = bMotorMoveType;
|
||||
CurrentPhase.MotorDriverIs3967 = 0;
|
||||
CurrentPhase.MotorCurrent = CalculateMotorCurrent (EndSpeed);
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
CurrentPhase.MotorCurrent = CalculateMotorCurrent (EndSpeed);
|
||||
else
|
||||
CurrentPhase.MotorCurrent = 200;
|
||||
LLFSetMotorCurrentAndPhase (chip, &CurrentPhase);
|
||||
|
||||
DBG (DBG_ASIC, "MotorCurrent=%d, LinePixelReport=%d\n",
|
||||
|
@ -2331,33 +2425,40 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
|||
(SANE_Byte) (dwTableBaseAddr >> TABLE_OFFSET_BASE));
|
||||
|
||||
|
||||
/* set image buffer range and write shading table */
|
||||
RealTableSize = (ACC_DEC_STEP_TABLE_SIZE * NUM_OF_ACC_DEC_STEP_TABLE) +
|
||||
ShadingTableSize (ValidPixelNumber);
|
||||
dwShadingTableAddr = PackAreaStartAddress -
|
||||
(((RealTableSize + (TABLE_BASE_SIZE - 1))
|
||||
>> TABLE_OFFSET_BASE) << TABLE_OFFSET_BASE);
|
||||
dwEndAddr = dwShadingTableAddr - 1;
|
||||
if (bScanType == SCAN_TYPE_NORMAL)
|
||||
{
|
||||
/* set image buffer range and write shading table */
|
||||
RealTableSize = (ACC_DEC_STEP_TABLE_SIZE * NUM_OF_ACC_DEC_STEP_TABLE) +
|
||||
ShadingTableSize (ValidPixelNumber);
|
||||
dwShadingTableAddr = PackAreaStartAddress -
|
||||
(((RealTableSize + (TABLE_BASE_SIZE - 1))
|
||||
>> TABLE_OFFSET_BASE) << TABLE_OFFSET_BASE);
|
||||
dwEndAddr = dwShadingTableAddr - 1;
|
||||
|
||||
if (wXResolution > 600)
|
||||
dbXRatioAdderDouble = 1200 / wXResolution;
|
||||
if (wXResolution > 600)
|
||||
dbXRatioAdderDouble = 1200 / wXResolution;
|
||||
else
|
||||
dbXRatioAdderDouble = 600 / wXResolution;
|
||||
|
||||
RamAccess.ReadWrite = WRITE_RAM;
|
||||
RamAccess.IsOnChipGamma = EXTERNAL_RAM;
|
||||
RamAccess.StartAddress = dwShadingTableAddr;
|
||||
RamAccess.RwSize =
|
||||
ShadingTableSize ((int) ((wWidth + 4) * dbXRatioAdderDouble)) *
|
||||
sizeof (unsigned short);
|
||||
RamAccess.BufferPtr = (SANE_Byte *) chip->lpShadingTable;
|
||||
status = LLFRamAccess (chip, &RamAccess);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
|
||||
/* tell scan chip the shading table address, unit is 2^15 bytes */
|
||||
Mustek_SendData (chip, ES01_9B_ShadingTableAddrA14_A21,
|
||||
(SANE_Byte) (dwShadingTableAddr >> TABLE_OFFSET_BASE));
|
||||
}
|
||||
else
|
||||
dbXRatioAdderDouble = 600 / wXResolution;
|
||||
|
||||
RamAccess.ReadWrite = WRITE_RAM;
|
||||
RamAccess.IsOnChipGamma = EXTERNAL_RAM;
|
||||
RamAccess.StartAddress = dwShadingTableAddr;
|
||||
RamAccess.RwSize =
|
||||
ShadingTableSize ((int) ((wWidth + 4) * dbXRatioAdderDouble)) *
|
||||
sizeof (unsigned short);
|
||||
RamAccess.BufferPtr = (SANE_Byte *) chip->lpShadingTable;
|
||||
status = LLFRamAccess (chip, &RamAccess);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
|
||||
/* tell scan chip the shading table address, unit is 2^15 bytes */
|
||||
Mustek_SendData (chip, ES01_9B_ShadingTableAddrA14_A21,
|
||||
(SANE_Byte) (dwShadingTableAddr >> TABLE_OFFSET_BASE));
|
||||
{
|
||||
dwEndAddr = PackAreaStartAddress - RealTableSize - 1;
|
||||
}
|
||||
|
||||
/* empty bank */
|
||||
Mustek_SendData (chip, ES01_FB_BufferEmptySize16WordLSB,
|
||||
|
@ -2672,17 +2773,6 @@ Asic_ReadCalibrationData (PAsic chip, SANE_Byte * pBuffer,
|
|||
return status;
|
||||
}
|
||||
|
||||
static void
|
||||
Asic_SetMotorType (PAsic chip, SANE_Bool isMotorMove)
|
||||
{
|
||||
DBG (DBG_ASIC, "Asic_SetMotorType: Enter\n");
|
||||
|
||||
chip->isMotorMove = isMotorMove ? MOTOR_0_ENABLE : 0;
|
||||
|
||||
DBG (DBG_ASIC, "isMotorMove=%d\n", chip->isMotorMove);
|
||||
DBG (DBG_ASIC, "Asic_SetMotorType: Exit\n");
|
||||
}
|
||||
|
||||
static STATUS
|
||||
Asic_MotorMove (PAsic chip, SANE_Bool isForward, unsigned int dwTotalSteps)
|
||||
{
|
||||
|
@ -2711,7 +2801,7 @@ Asic_MotorMove (PAsic chip, SANE_Bool isForward, unsigned int dwTotalSteps)
|
|||
CalMotorTable.EndSpeed = 1800;
|
||||
CalMotorTable.AccStepBeforeScan = 511;
|
||||
CalMotorTable.lpMotorTable = NormalMoveMotorTable;
|
||||
LLFCalculateMotorTable (&CalMotorTable);
|
||||
CalculateMoveMotorTable (&CalMotorTable);
|
||||
|
||||
CurrentPhase.MoveType = _4_TABLE_SPACE_FOR_FULL_STEP;
|
||||
CurrentPhase.MotorDriverIs3967 = 0;
|
||||
|
@ -2841,301 +2931,3 @@ Asic_SetShadingTable (PAsic chip, unsigned short * lpWhiteShading,
|
|||
DBG (DBG_ASIC, "Asic_SetShadingTable: Exit\n");
|
||||
return STATUS_GOOD;
|
||||
}
|
||||
|
||||
static STATUS
|
||||
Asic_SetCalibrate (PAsic chip, SANE_Byte bScanBits,
|
||||
unsigned short wXResolution, unsigned short wYResolution,
|
||||
unsigned short wX, unsigned short wY,
|
||||
unsigned short wWidth, unsigned short wLength)
|
||||
{
|
||||
STATUS status;
|
||||
|
||||
unsigned short BytePerPixel;
|
||||
unsigned short wThinkCCDResolution;
|
||||
unsigned short wCCD_PixelNumber;
|
||||
unsigned short XRatioTypeWord;
|
||||
double XRatioTypeDouble;
|
||||
double XRatioAdderDouble;
|
||||
|
||||
unsigned short wScanAccSteps = 1;
|
||||
SANE_Byte bScanDecSteps = 1;
|
||||
unsigned short BeforeScanFixSpeedStep = 0;
|
||||
unsigned short BackTrackFixSpeedStep = 20;
|
||||
unsigned int TotalStep;
|
||||
unsigned int dwLinePixelReport;
|
||||
unsigned short StartSpeed, EndSpeed;
|
||||
LLF_CALCULATEMOTORTABLE CalMotorTable;
|
||||
LLF_MOTOR_CURRENT_AND_PHASE CurrentPhase;
|
||||
LLF_RAMACCESS RamAccess;
|
||||
unsigned int dwTableBaseAddr, dwEndAddr;
|
||||
unsigned short * lpMotorTable;
|
||||
unsigned short wFullBank;
|
||||
|
||||
DBG (DBG_ASIC, "Asic_SetCalibrate: Enter\n");
|
||||
DBG (DBG_ASIC, "bScanBits=%d,wXResolution=%d,wYResolution=%d,wX=%d,wY=%d," \
|
||||
"wWidth=%d,wLength=%d\n",
|
||||
bScanBits, wXResolution, wYResolution, wX, wY, wWidth, wLength);
|
||||
|
||||
if (chip->firmwarestate != FS_OPENED)
|
||||
{
|
||||
DBG (DBG_ERR, "Asic_SetCalibrate: Scanner is not opened or busy\n");
|
||||
return STATUS_INVAL;
|
||||
}
|
||||
|
||||
Mustek_SendData (chip, ES01_F3_ActionOption, 0);
|
||||
Mustek_SendData (chip, ES01_86_DisableAllClockWhenIdle, 0);
|
||||
Mustek_SendData (chip, ES01_F4_ActiveTrigger, 0);
|
||||
|
||||
status = Asic_WaitUnitReady (chip);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
|
||||
Mustek_SendData (chip, ES01_1CD_DUMMY_CLOCK_NUMBER, 0);
|
||||
|
||||
/* LED flash */
|
||||
Mustek_SendData (chip, ES01_94_PowerSaveControl,
|
||||
TIMER_POWER_SAVE_ENABLE |
|
||||
USB_POWER_SAVE_ENABLE | USB_REMOTE_WAKEUP_ENABLE |
|
||||
LED_MODE_FLASH_SLOWLY | 0x40 | 0x80);
|
||||
|
||||
/* calculate byte per line */
|
||||
if (bScanBits > 24)
|
||||
{
|
||||
BytePerPixel = 6;
|
||||
chip->dwBytesCountPerRow = (unsigned int) wWidth * 6;
|
||||
}
|
||||
else if (bScanBits == 24)
|
||||
{
|
||||
BytePerPixel = 3;
|
||||
chip->dwBytesCountPerRow = (unsigned int) wWidth * 3;
|
||||
}
|
||||
else if ((bScanBits > 8) && (bScanBits <= 16))
|
||||
{
|
||||
BytePerPixel = 2;
|
||||
chip->dwBytesCountPerRow = (unsigned int) wWidth * 2;
|
||||
}
|
||||
else if (bScanBits == 8)
|
||||
{
|
||||
BytePerPixel = 1;
|
||||
chip->dwBytesCountPerRow = (unsigned int) wWidth;
|
||||
}
|
||||
else /* bScanBits < 8 */
|
||||
{
|
||||
BytePerPixel = 1;
|
||||
chip->dwBytesCountPerRow = (unsigned int) wWidth;
|
||||
}
|
||||
DBG (DBG_ASIC, "BytePerPixel=%d,dwBytesCountPerRow=%d\n", BytePerPixel,
|
||||
chip->dwBytesCountPerRow);
|
||||
|
||||
CCDTiming (chip);
|
||||
|
||||
if (chip->lsLightSource == LS_REFLECTIVE)
|
||||
{
|
||||
if (wXResolution > (SENSOR_DPI / 2))
|
||||
{ /* full CCD resolution 1200 dpi */
|
||||
wThinkCCDResolution = SENSOR_DPI;
|
||||
Mustek_SendData (chip, ES01_98_GPIOControl8_15, 0x01);
|
||||
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x01);
|
||||
wCCD_PixelNumber = chip->Timing.wCCDPixelNumber_1200;
|
||||
}
|
||||
else
|
||||
{ /* 600 dpi */
|
||||
wThinkCCDResolution = SENSOR_DPI / 2;
|
||||
Mustek_SendData (chip, ES01_98_GPIOControl8_15, 0x01);
|
||||
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x00);
|
||||
wCCD_PixelNumber = chip->Timing.wCCDPixelNumber_600;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wXResolution > (SENSOR_DPI / 2))
|
||||
{
|
||||
wThinkCCDResolution = SENSOR_DPI;
|
||||
Mustek_SendData (chip, ES01_98_GPIOControl8_15, 0x01);
|
||||
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x01);
|
||||
wCCD_PixelNumber = TA_CAL_PIXELNUMBER;
|
||||
}
|
||||
else
|
||||
{
|
||||
wThinkCCDResolution = SENSOR_DPI / 2;
|
||||
Mustek_SendData (chip, ES01_98_GPIOControl8_15, 0x01);
|
||||
Mustek_SendData (chip, ES01_96_GPIOValue8_15, 0x00);
|
||||
wCCD_PixelNumber = TA_CAL_PIXELNUMBER;
|
||||
}
|
||||
}
|
||||
|
||||
SetLineTimeAndExposure (chip);
|
||||
if (wYResolution == 600)
|
||||
Mustek_SendData (chip, ES01_CB_CCDDummyCycleNumber, 1);
|
||||
SetLEDTime (chip);
|
||||
|
||||
/* SetADConverter */
|
||||
Mustek_SendData (chip, ES01_74_HARDWARE_SETTING,
|
||||
MOTOR1_SERIAL_INTERFACE_G10_8_ENABLE);
|
||||
|
||||
Mustek_SendData (chip, ES01_9A_AFEControl, AD9826_AFE);
|
||||
Mustek_SendData (chip, ES01_F7_DigitalControl, 0);
|
||||
|
||||
/* calculate X ratio */
|
||||
XRatioTypeDouble = wXResolution;
|
||||
XRatioTypeDouble /= wThinkCCDResolution;
|
||||
XRatioTypeWord = (unsigned short) (XRatioTypeDouble * 32768); /* x 2^15 */
|
||||
|
||||
XRatioAdderDouble = (double) (XRatioTypeWord) / 32768;
|
||||
XRatioAdderDouble = 1 / XRatioAdderDouble;
|
||||
|
||||
/* 0x8000 = 1.00000 -> get all pixel */
|
||||
Mustek_SendData (chip, ES01_9E_HorizontalRatio1to15LSB,
|
||||
LOBYTE (XRatioTypeWord));
|
||||
Mustek_SendData (chip, ES01_9F_HorizontalRatio1to15MSB,
|
||||
HIBYTE (XRatioTypeWord));
|
||||
DBG (DBG_ASIC,
|
||||
"XRatioTypeDouble=%.2f,XRatioAdderDouble=%.2f,XRatioTypeWord=%d\n",
|
||||
XRatioTypeDouble, XRatioAdderDouble, XRatioTypeWord);
|
||||
|
||||
/* SetMotorType */
|
||||
Mustek_SendData (chip, ES01_A6_MotorOption, chip->isMotorMove |
|
||||
HOME_SENSOR_0_ENABLE | TABLE_DEFINE_ES03);
|
||||
DBG (DBG_ASIC, "isMotorMove=%d\n", chip->isMotorMove);
|
||||
|
||||
Mustek_SendData (chip, ES01_F6_MotorControl1, SPEED_UNIT_1_PIXEL_TIME |
|
||||
MOTOR_SYNC_UNIT_1_PIXEL_TIME);
|
||||
|
||||
/* SetScanStepTable */
|
||||
Mustek_SendData (chip, ES01_AE_MotorSyncPixelNumberM16LSB, 0);
|
||||
Mustek_SendData (chip, ES01_AF_MotorSyncPixelNumberM16MSB, 0);
|
||||
DBG (DBG_ASIC, "MotorSyncPixelNumber=0\n");
|
||||
|
||||
Mustek_SendData (chip, ES01_EC_ScanAccStep0_7, LOBYTE (wScanAccSteps));
|
||||
Mustek_SendData (chip, ES01_ED_ScanAccStep8_8, HIBYTE (wScanAccSteps));
|
||||
DBG (DBG_ASIC, "wScanAccSteps=%d\n", wScanAccSteps);
|
||||
|
||||
Mustek_SendData (chip, ES01_EE_FixScanStepLSB,
|
||||
LOBYTE (BeforeScanFixSpeedStep));
|
||||
Mustek_SendData (chip, ES01_8A_FixScanStepMSB,
|
||||
HIBYTE (BeforeScanFixSpeedStep));
|
||||
DBG (DBG_ASIC, "BeforeScanFixSpeedStep=%d\n", BeforeScanFixSpeedStep);
|
||||
|
||||
Mustek_SendData (chip, ES01_EF_ScanDecStep, bScanDecSteps);
|
||||
DBG (DBG_ASIC, "bScanDecSteps=%d\n", bScanDecSteps);
|
||||
|
||||
Mustek_SendData (chip, ES01_E6_ScanBackTrackingStepLSB,
|
||||
LOBYTE (BackTrackFixSpeedStep));
|
||||
Mustek_SendData (chip, ES01_E7_ScanBackTrackingStepMSB,
|
||||
HIBYTE (BackTrackFixSpeedStep));
|
||||
DBG (DBG_ASIC, "BackTrackFixSpeedStep=%d\n", BackTrackFixSpeedStep);
|
||||
|
||||
Mustek_SendData (chip, ES01_E8_ScanRestartStepLSB,
|
||||
LOBYTE (BackTrackFixSpeedStep));
|
||||
Mustek_SendData (chip, ES01_E9_ScanRestartStepMSB,
|
||||
HIBYTE (BackTrackFixSpeedStep));
|
||||
|
||||
TotalStep = wScanAccSteps + BeforeScanFixSpeedStep +
|
||||
(wLength * SENSOR_DPI / wYResolution) + bScanDecSteps;
|
||||
DBG (DBG_ASIC, "TotalStep=%d\n", TotalStep);
|
||||
|
||||
Mustek_SendData (chip, ES01_F0_ScanImageStep0_7, BYTE0 (TotalStep));
|
||||
Mustek_SendData (chip, ES01_F1_ScanImageStep8_15, BYTE1 (TotalStep));
|
||||
Mustek_SendData (chip, ES01_F2_ScanImageStep16_19, BYTE2 (TotalStep));
|
||||
|
||||
SetScanMode (chip, bScanBits);
|
||||
|
||||
Mustek_SendData (chip, ES01_F3_ActionOption,
|
||||
SCAN_ENABLE | UNIFORM_MOTOR_AND_SCAN_SPEED_ENABLE);
|
||||
|
||||
/* set white shading int and dec */
|
||||
if (chip->lsLightSource == LS_REFLECTIVE)
|
||||
Mustek_SendData (chip, ES01_F8_WHITE_SHADING_DATA_FORMAT,
|
||||
SHADING_3_INT_13_DEC_ES01);
|
||||
else
|
||||
Mustek_SendData (chip, ES01_F8_WHITE_SHADING_DATA_FORMAT,
|
||||
SHADING_4_INT_12_DEC_ES01);
|
||||
|
||||
SetPackAddress (chip, wWidth, wX, XRatioAdderDouble,
|
||||
XRatioTypeDouble, 0, NULL);
|
||||
SetExtraSetting (chip, wXResolution, wCCD_PixelNumber, SANE_TRUE);
|
||||
|
||||
/* calculate line time */
|
||||
dwLinePixelReport = (2 + (chip->Timing.PHTG_PulseWidth + 1) +
|
||||
(chip->Timing.PHTG_WaitWidth + 1) +
|
||||
(wCCD_PixelNumber + 1)) * 2;
|
||||
|
||||
DBG (DBG_ASIC, "Motor Time = %d\n",
|
||||
(dwLinePixelReport * wYResolution / SENSOR_DPI));
|
||||
if ((dwLinePixelReport * wYResolution / SENSOR_DPI) > 64000)
|
||||
{
|
||||
DBG (DBG_ASIC, "Motor Time overflow!\n");
|
||||
}
|
||||
|
||||
EndSpeed = (unsigned short) (dwLinePixelReport / (SENSOR_DPI / wYResolution));
|
||||
if (wXResolution > 600)
|
||||
StartSpeed = EndSpeed;
|
||||
else
|
||||
StartSpeed = EndSpeed + 3500;
|
||||
DBG (DBG_ASIC, "StartSpeed=%d, EndSpeed=%d\n", StartSpeed, EndSpeed);
|
||||
|
||||
Mustek_SendData (chip, ES01_FD_MotorFixedspeedLSB, LOBYTE (EndSpeed));
|
||||
Mustek_SendData (chip, ES01_FE_MotorFixedspeedMSB, HIBYTE (EndSpeed));
|
||||
|
||||
lpMotorTable = malloc (512 * 8 * 2);
|
||||
if (!lpMotorTable)
|
||||
{
|
||||
DBG (DBG_ERR, "Asic_SetCalibrate: lpMotorTable == NULL\n");
|
||||
return STATUS_MEM_ERROR;
|
||||
}
|
||||
memset (lpMotorTable, 0, 512 * 8 * sizeof (unsigned short));
|
||||
|
||||
CalMotorTable.StartSpeed = StartSpeed;
|
||||
CalMotorTable.EndSpeed = EndSpeed;
|
||||
CalMotorTable.AccStepBeforeScan = wScanAccSteps;
|
||||
CalMotorTable.DecStepAfterScan = bScanDecSteps; /* TODO: correct? */
|
||||
CalMotorTable.lpMotorTable = lpMotorTable;
|
||||
LLFCalculateMotorTable (&CalMotorTable);
|
||||
|
||||
CurrentPhase.MoveType = _4_TABLE_SPACE_FOR_FULL_STEP;
|
||||
CurrentPhase.MotorDriverIs3967 = 0;
|
||||
CurrentPhase.MotorCurrent = 200;
|
||||
LLFSetMotorCurrentAndPhase (chip, &CurrentPhase);
|
||||
|
||||
/* write motor table */
|
||||
dwTableBaseAddr = PackAreaStartAddress - (512 * 8);
|
||||
|
||||
RamAccess.ReadWrite = WRITE_RAM;
|
||||
RamAccess.IsOnChipGamma = EXTERNAL_RAM;
|
||||
RamAccess.StartAddress = dwTableBaseAddr;
|
||||
RamAccess.RwSize = 512 * 8 * 2;
|
||||
RamAccess.BufferPtr = (SANE_Byte *) lpMotorTable;
|
||||
status = LLFRamAccess (chip, &RamAccess);
|
||||
free (lpMotorTable);
|
||||
if (status != STATUS_GOOD)
|
||||
return status;
|
||||
|
||||
Mustek_SendData (chip, ES01_9D_MotorTableAddrA14_A21,
|
||||
(SANE_Byte) (dwTableBaseAddr >> TABLE_OFFSET_BASE));
|
||||
|
||||
dwEndAddr = PackAreaStartAddress - (512 * 8) - 1;
|
||||
|
||||
/* empty bank */
|
||||
Mustek_SendData (chip, ES01_FB_BufferEmptySize16WordLSB,
|
||||
LOBYTE (WaitBufferOneLineSize >> 4));
|
||||
Mustek_SendData (chip, ES01_FC_BufferEmptySize16WordMSB,
|
||||
HIBYTE (WaitBufferOneLineSize >> 4));
|
||||
|
||||
/* full bank */
|
||||
wFullBank = (unsigned short)
|
||||
((dwEndAddr - (((wWidth * BytePerPixel) / 2) * 3)) / BANK_SIZE);
|
||||
Mustek_SendData (chip, ES01_F9_BufferFullSize16WordLSB, LOBYTE (wFullBank));
|
||||
Mustek_SendData (chip, ES01_FA_BufferFullSize16WordMSB, HIBYTE (wFullBank));
|
||||
|
||||
Mustek_SendData (chip, ES01_DB_PH_RESET_EDGE_TIMING_ADJUST, 0x00);
|
||||
|
||||
status = LLFSetRamAddress (chip, 0, dwEndAddr, EXTERNAL_RAM);
|
||||
|
||||
Mustek_SendData (chip, ES01_DC_CLEAR_EDGE_TO_PH_TG_EDGE_WIDTH, 0);
|
||||
|
||||
Mustek_SendData (chip, ES01_00_ADAFEConfiguration, 0x70);
|
||||
Mustek_SendData (chip, ES01_02_ADAFEMuxConfig, 0x80);
|
||||
|
||||
DBG (DBG_ASIC, "Asic_SetCalibrate: Exit\n");
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -147,7 +147,6 @@ typedef struct
|
|||
Timings Timing;
|
||||
ADConverter AD;
|
||||
|
||||
SANE_Byte isMotorMove;
|
||||
SANE_Byte isMotorMoveToFirstLine;
|
||||
unsigned short * lpShadingTable;
|
||||
} Asic, *PAsic;
|
||||
|
@ -196,6 +195,10 @@ typedef enum
|
|||
#define ON_CHIP_PRE_GAMMA 1
|
||||
#define ON_CHIP_FINAL_GAMMA 2
|
||||
|
||||
#define SCAN_TYPE_NORMAL 0
|
||||
#define SCAN_TYPE_CALIBRATE_LIGHT 1
|
||||
#define SCAN_TYPE_CALIBRATE_DARK 2
|
||||
|
||||
#define BANK_SIZE (64)
|
||||
|
||||
#define WaitBufferOneLineSize 11000*6
|
||||
|
@ -967,9 +970,12 @@ static STATUS SwitchBank (PAsic chip, unsigned short reg);
|
|||
static STATUS Asic_Open (PAsic chip);
|
||||
static STATUS Asic_Close (PAsic chip);
|
||||
static void Asic_Initialize (PAsic chip);
|
||||
static STATUS Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
|
||||
unsigned short wXResolution, unsigned short wYResolution,
|
||||
unsigned short wX, unsigned short wY, unsigned short wWidth, unsigned short wLength);
|
||||
static STATUS Asic_SetWindow (PAsic chip,
|
||||
SANE_Byte bScanType, SANE_Byte bScanBits,
|
||||
unsigned short wXResolution,
|
||||
unsigned short wYResolution,
|
||||
unsigned short wX, unsigned short wY,
|
||||
unsigned short wWidth, unsigned short wLength);
|
||||
static STATUS Asic_TurnLamp (PAsic chip, SANE_Bool isLampOn);
|
||||
static STATUS Asic_TurnTA (PAsic chip, SANE_Bool isTAOn);
|
||||
static void Asic_ResetADParameters (PAsic chip, LIGHTSOURCE lsLightSource);
|
||||
|
@ -986,18 +992,12 @@ static STATUS Asic_IsTAConnected (PAsic chip, SANE_Bool *hasTA);
|
|||
static STATUS Asic_ReadCalibrationData (PAsic chip, SANE_Byte * pBuffer,
|
||||
unsigned int dwXferBytes, SANE_Byte bScanBits);
|
||||
|
||||
/* enable/disable motor movement */
|
||||
static void Asic_SetMotorType (PAsic chip, SANE_Bool isMotorMove);
|
||||
|
||||
static STATUS Asic_MotorMove (PAsic chip, SANE_Bool isForward, unsigned int dwTotalSteps);
|
||||
static STATUS Asic_CarriageHome (PAsic chip);
|
||||
static STATUS Asic_SetShadingTable (PAsic chip, unsigned short * lpWhiteShading,
|
||||
unsigned short * lpDarkShading,
|
||||
unsigned short wXResolution, unsigned short wWidth);
|
||||
static STATUS Asic_WaitUnitReady (PAsic chip);
|
||||
static STATUS Asic_SetCalibrate (PAsic chip, SANE_Byte bScanBits, unsigned short wXResolution,
|
||||
unsigned short wYResolution, unsigned short wX, unsigned short wY,
|
||||
unsigned short wWidth, unsigned short wLength);
|
||||
|
||||
|
||||
/* ---------------------- ASIC motor defines -------------------------- */
|
||||
|
@ -1041,10 +1041,10 @@ typedef struct
|
|||
} LLF_MOTORMOVE;
|
||||
|
||||
|
||||
static void CalculateMotorTable (LLF_CALCULATEMOTORTABLE *
|
||||
lpCalculateMotorTable);
|
||||
static void LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE *
|
||||
lpCalculateMotorTable);
|
||||
static void CalculateScanMotorTable (LLF_CALCULATEMOTORTABLE *
|
||||
lpCalculateMotorTable);
|
||||
static void CalculateMoveMotorTable (LLF_CALCULATEMOTORTABLE *
|
||||
lpCalculateMotorTable);
|
||||
static void LLFSetMotorCurrentAndPhase (PAsic chip,
|
||||
LLF_MOTOR_CURRENT_AND_PHASE *
|
||||
MotorCurrentAndPhase);
|
||||
|
@ -1052,6 +1052,9 @@ static void SetMotorStepTable (PAsic chip, LLF_MOTORMOVE * MotorStepsTable,
|
|||
unsigned short wStartY,
|
||||
unsigned int dwScanImageSteps,
|
||||
unsigned short wYResolution);
|
||||
static void SetMotorStepTableForCalibration (PAsic chip,
|
||||
LLF_MOTORMOVE * MotorStepsTable,
|
||||
unsigned int dwScanImageSteps);
|
||||
static STATUS LLFSetMotorTable (PAsic chip, unsigned short *MotorTablePtr);
|
||||
static SANE_Byte CalculateMotorCurrent (unsigned short dwMotorSpeed);
|
||||
static STATUS LLFMotorMove (PAsic chip, LLF_MOTORMOVE * LLF_MotorMove);
|
||||
|
|
|
@ -322,8 +322,8 @@ Reflective_SetupScan (COLORMODE ColorMode,
|
|||
}
|
||||
g_Y = 300;
|
||||
|
||||
Asic_SetWindow (&g_chip, g_bScanBits, g_XDpi, g_YDpi, g_X, g_Y, g_Width,
|
||||
g_Height);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_NORMAL, g_bScanBits, g_XDpi, g_YDpi,
|
||||
g_X, g_Y, g_Width, g_Height);
|
||||
|
||||
DBG (DBG_FUNC, "Reflective_SetupScan: leave Reflective_SetupScan\n");
|
||||
return MustScanner_PrepareScan ();
|
||||
|
@ -396,10 +396,8 @@ Reflective_AdjustAD (void)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Asic_SetMotorType (&g_chip, FALSE);
|
||||
|
||||
Asic_SetCalibrate (&g_chip, 24, wAdjustADResolution, wAdjustADResolution, 0,
|
||||
0, wCalWidth, 1);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_DARK, 24,
|
||||
wAdjustADResolution, wAdjustADResolution, 0, 0, wCalWidth, 1);
|
||||
MustScanner_PrepareCalculateMaxMin (wAdjustADResolution);
|
||||
nTimesOfCal = 0;
|
||||
|
||||
|
@ -900,9 +898,8 @@ Reflective_FindTopLeft (unsigned short * lpwStartX, unsigned short * lpwStartY)
|
|||
dwTotalSize = wCalWidth * wCalHeight;
|
||||
nScanBlock = (int) (dwTotalSize / g_dwCalibrationSize);
|
||||
|
||||
Asic_SetMotorType (&g_chip, TRUE);
|
||||
Asic_SetCalibrate (&g_chip, 8, wXResolution, wYResolution, 0, 0, wCalWidth,
|
||||
wCalHeight);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_LIGHT, 8,
|
||||
wXResolution, wYResolution, 0, 0, wCalWidth, wCalHeight);
|
||||
SetAFEGainOffset (&g_chip);
|
||||
if (Asic_ScanStart (&g_chip) != STATUS_GOOD)
|
||||
{
|
||||
|
@ -1097,15 +1094,13 @@ Reflective_LineCalibration16Bits (void)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Asic_SetMotorType (&g_chip, TRUE);
|
||||
SetAFEGainOffset (&g_chip);
|
||||
status =
|
||||
Asic_SetCalibrate (&g_chip, 48, g_XDpi, 600, g_X, 0, wCalWidth,
|
||||
wCalHeight);
|
||||
status = Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_LIGHT, 48, g_XDpi, 600,
|
||||
g_X, 0, wCalWidth, wCalHeight);
|
||||
if (status != STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_FUNC,
|
||||
"Reflective_LineCalibration16Bits: Asic_SetCalibrate return error\n");
|
||||
"Reflective_LineCalibration16Bits: Asic_SetWindow return error\n");
|
||||
|
||||
free (lpWhiteData);
|
||||
|
||||
|
@ -1136,15 +1131,12 @@ Reflective_LineCalibration16Bits (void)
|
|||
Asic_ScanStop (&g_chip);
|
||||
|
||||
/*Read dark level data */
|
||||
Asic_SetMotorType (&g_chip, FALSE);
|
||||
|
||||
status =
|
||||
Asic_SetCalibrate (&g_chip, 48, g_XDpi, 600, g_X, 0, wCalWidth,
|
||||
wCalHeight);
|
||||
status = Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_DARK, 48, g_XDpi, 600,
|
||||
g_X, 0, wCalWidth, wCalHeight);
|
||||
if (status != STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_FUNC,
|
||||
"Reflective_LineCalibration16Bits: Asic_SetCalibrate return error\n");
|
||||
"Reflective_LineCalibration16Bits: Asic_SetWindow return error\n");
|
||||
|
||||
free (lpWhiteData);
|
||||
free (lpDarkData);
|
||||
|
|
|
@ -305,8 +305,8 @@ Transparent_SetupScan (COLORMODE ColorMode,
|
|||
Asic_MotorMove (&g_chip, TRUE, g_Y - 360);
|
||||
g_Y = 360;
|
||||
|
||||
Asic_SetWindow (&g_chip, g_bScanBits, g_XDpi, g_YDpi, g_X, g_Y, g_Width,
|
||||
g_Height);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_NORMAL, g_bScanBits, g_XDpi, g_YDpi,
|
||||
g_X, g_Y, g_Width, g_Height);
|
||||
|
||||
DBG (DBG_FUNC, "Transparent_SetupScan: leave Transparent_SetupScan\n");
|
||||
return MustScanner_PrepareScan ();
|
||||
|
@ -377,10 +377,8 @@ Transparent_AdjustAD (void)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Asic_SetMotorType (&g_chip, FALSE);
|
||||
|
||||
Asic_SetCalibrate (&g_chip, 24, wAdjustADResolution, wAdjustADResolution, 0,
|
||||
0, wCalWidth, 1);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_DARK, 24,
|
||||
wAdjustADResolution, wAdjustADResolution, 0, 0, wCalWidth, 1);
|
||||
MustScanner_PrepareCalculateMaxMin (wAdjustADResolution);
|
||||
nTimesOfCal = 0;
|
||||
|
||||
|
@ -860,9 +858,8 @@ Transparent_FindTopLeft (unsigned short * lpwStartX, unsigned short * lpwStartY)
|
|||
dwTotalSize = wCalWidth * wCalHeight;
|
||||
nScanBlock = (int) (dwTotalSize / g_dwCalibrationSize);
|
||||
|
||||
Asic_SetMotorType (&g_chip, TRUE);
|
||||
Asic_SetCalibrate (&g_chip, 8, wXResolution, wYResolution, 0, 0, wCalWidth,
|
||||
wCalHeight);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_LIGHT, 8,
|
||||
wXResolution, wYResolution, 0, 0, wCalWidth, wCalHeight);
|
||||
SetAFEGainOffset (&g_chip);
|
||||
Asic_ScanStart (&g_chip);
|
||||
|
||||
|
@ -1025,10 +1022,9 @@ Transparent_LineCalibration16Bits (unsigned short wTAShadingMinus)
|
|||
}
|
||||
|
||||
/*Read white level data */
|
||||
Asic_SetMotorType (&g_chip, TRUE);
|
||||
SetAFEGainOffset (&g_chip);
|
||||
Asic_SetCalibrate (&g_chip, 48, g_XDpi, 600, g_X, 0, wCalWidth,
|
||||
wCalHeight);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_LIGHT, 48, g_XDpi, 600, g_X, 0,
|
||||
wCalWidth, wCalHeight);
|
||||
Asic_ScanStart (&g_chip);
|
||||
|
||||
/* Read Data */
|
||||
|
@ -1037,10 +1033,9 @@ Transparent_LineCalibration16Bits (unsigned short wTAShadingMinus)
|
|||
|
||||
|
||||
/* Read dark level data */
|
||||
Asic_SetMotorType (&g_chip, FALSE);
|
||||
SetAFEGainOffset (&g_chip);
|
||||
Asic_SetCalibrate (&g_chip, 48, g_XDpi, 600, g_X, 0, wCalWidth,
|
||||
wCalHeight);
|
||||
Asic_SetWindow (&g_chip, SCAN_TYPE_CALIBRATE_DARK, 48, g_XDpi, 600, g_X, 0,
|
||||
wCalWidth, wCalHeight);
|
||||
|
||||
Asic_TurnLamp (&g_chip, FALSE);
|
||||
Asic_TurnTA (&g_chip, FALSE);
|
||||
|
|
Ładowanie…
Reference in New Issue