kopia lustrzana https://gitlab.com/sane-project/backends
1089 wiersze
37 KiB
C
1089 wiersze
37 KiB
C
/* @file plustek-pp_p9636.c
|
||
* @brief here we have all functionality according to the p9636t
|
||
*
|
||
* based on sources acquired from Plustek Inc.
|
||
* Copyright (C) 1998 Plustek Inc.
|
||
* Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de>
|
||
* also based on the work done by Rick Bronson
|
||
*
|
||
* History:
|
||
* - 0.30 - initial version
|
||
* - 0.31 - Added some comments
|
||
* - 0.32 - minor bug-fixes
|
||
* - change p9636ReconnectScannerPath
|
||
* - moved function IOSetStartStopRegister into this file
|
||
* - 0.33 - went back to original three calls to p9636ReconnectScannerPath
|
||
* to make sure that HP-printers will not start to print during
|
||
* scan-process
|
||
* - removed function p9636PositionLamp()
|
||
* - 0.34 - no changes
|
||
* - 0.35 - no changes
|
||
* - 0.36 - changes, due to define renaming
|
||
* - 0.37 - move p9636OpenScanPath, p9636CloseScanPath
|
||
* and p9636RegisterToScanner to io.c
|
||
* - removed skipping of the memory test for OP9636P
|
||
* - removed // comments
|
||
* - 0.38 - added function p9636PutToIdleMode()
|
||
* - moved p9636ReadWriteTest to io.c
|
||
* - added function p9636Calibration
|
||
* - renamed function p9636SetP98001Init() to p9636InitP98001()
|
||
* - 0.39 - no changes
|
||
* - 0.40 - no changes
|
||
* - 0.41 - no changes
|
||
* - 0.42 - changed include names
|
||
* - 0.43 - no changes
|
||
* .
|
||
* <hr>
|
||
* This file is part of the SANE package.
|
||
*
|
||
* This program is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU General Public License as
|
||
* published by the Free Software Foundation; either version 2 of the
|
||
* License, or (at your option) any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful, but
|
||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
* along with this program; if not, write to the Free Software
|
||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||
* MA 02111-1307, USA.
|
||
*
|
||
* As a special exception, the authors of SANE give permission for
|
||
* additional uses of the libraries contained in this release of SANE.
|
||
*
|
||
* The exception is that, if you link a SANE library with other files
|
||
* to produce an executable, this does not by itself cause the
|
||
* resulting executable to be covered by the GNU General Public
|
||
* License. Your use of that executable is in no way restricted on
|
||
* account of linking the SANE library code into it.
|
||
*
|
||
* This exception does not, however, invalidate any other reasons why
|
||
* the executable file might be covered by the GNU General Public
|
||
* License.
|
||
*
|
||
* If you submit changes to SANE to the maintainers to be included in
|
||
* a subsequent release, you agree by submitting the changes that
|
||
* those changes may be distributed with this exception intact.
|
||
*
|
||
* If you write modifications of your own for SANE, it is your choice
|
||
* whether to permit this exception to apply to your modifications.
|
||
* If you do not wish that, delete this exception notice.
|
||
* <hr>
|
||
*/
|
||
#include "plustek-pp_scan.h"
|
||
|
||
/*************************** some definitions ********************************/
|
||
|
||
#define _NUM_OF_DACREGS_W8144 11
|
||
|
||
/*************************** some local vars *********************************/
|
||
|
||
static UShort P97ColorModeRegister[] = {
|
||
0x022C, 0x2A39, 0x0A3A, 0x373B, 0x163C, 0x0E41, 0x9042, 0x0143,
|
||
0x2744, 0x2745, 0x0146, 0x0347, 0x2748, 0x2F49, 0x094A, 0x034B,
|
||
0x074C, 0x054D, 0x064E, 0x0850, 0x0D51, 0x0C52, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x3D39, 0x043A, 0x463B, 0x063C, 0x1F41, 0x8C42, 0x0143,
|
||
0x1344, 0x1345, 0xF246, 0x0247, 0x1348, 0x1349, 0xFA4A, 0x004B,
|
||
0x074C, 0x054D, 0x0E4E, 0x0150, 0x0651, 0x1252, 0x0B53, 0x00F0,
|
||
|
||
0x002C, 0x1639, 0x033A, 0x1F3B, 0x073C, 0x0441, 0x1E42, 0x0143,
|
||
0x1344, 0x1345, 0xF146, 0x0247, 0x1348, 0x1349, 0xF94A, 0x044B,
|
||
0x074C, 0x054D, 0x034E, 0x0650, 0x0351, 0x0952, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x1839, 0x043A, 0x1D3B, 0x033C, 0x0C41, 0x8442, 0x0343,
|
||
0x0A44, 0x0845, 0xFA46, 0x0447, 0x0A48, 0x0849, 0xF24A, 0x024B,
|
||
0x034C, 0x024D, 0x0E4E, 0x0050, 0x0951, 0x0352, 0x0353, 0x00F0
|
||
};
|
||
|
||
static UShort P17ColorModeRegister[] = {
|
||
0x022C, 0x2C39, 0x053A, 0x3c3B, 0x0e3C, 0x0E41, 0x9042, 0x0143,
|
||
0x2744, 0x2745, 0x0146, 0x0247, 0x2748, 0x2F49, 0x094A, 0x054B,
|
||
0x074C, 0x054D, 0x064E, 0x0850, 0x0D51, 0x0C52, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x3D39, 0x043A, 0x463B, 0x063C, 0x1F41, 0x8C42, 0x0143,
|
||
0x1344, 0x1345, 0xF246, 0x0147, 0x1348, 0x1349, 0xFA4A, 0x004B,
|
||
0x074C, 0x054D, 0x0E4E, 0x0150, 0x0651, 0x1252, 0x0B53, 0x00F0,
|
||
|
||
0x002C, 0x1639, 0x023A, 0x1a3B, 0x053C, 0x0441, 0x1E42, 0x0143,
|
||
0x1344, 0x1345, 0xF146, 0x0147, 0x1348, 0x1349, 0xF94A, 0x044B,
|
||
0x074C, 0x054D, 0x034E, 0x0650, 0x0351, 0x0952, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x1839, 0x043A, 0x1D3B, 0x033C, 0x0C41, 0x8442, 0x0343,
|
||
0x0A44, 0x0845, 0xFA46, 0x0347, 0x0A48, 0x0849, 0xF24A, 0x024B,
|
||
0x034C, 0x024D, 0x0E4E, 0x0050, 0x0951, 0x0352, 0x0353, 0x00F0
|
||
};
|
||
|
||
static UShort P535ColorModeRegister[] = {
|
||
0x022C, 0x2F39, 0x883A, 0x403B, 0x0F3C, 0x0E41, 0x9042, 0x0143,
|
||
0x2744, 0x2745, 0x0146, 0x0147, 0x2748, 0x2F49, 0x094A, 0x034B,
|
||
0x074C, 0x054D, 0x064E, 0x0850, 0x0D51, 0x0C52, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x3D39, 0x843A, 0x463B, 0x063C, 0x1F41, 0x8C42, 0x0143,
|
||
0x1344, 0x1345, 0xF246, 0x0147, 0x1348, 0x1349, 0xFA4A, 0x014B,
|
||
0x074C, 0x054D, 0x0E4E, 0x0150, 0x0651, 0x1252, 0x0B53, 0x00F0,
|
||
|
||
0x002C, 0x1639, 0x833A, 0x1F3B, 0x073C, 0x0441, 0x1E42, 0x0143,
|
||
0x1344, 0x1345, 0xF146, 0x0147, 0x1348, 0x1349, 0xF94A, 0x044B,
|
||
0x074C, 0x054D, 0x034E, 0x0650, 0x0351, 0x0952, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x1639, 0x833A, 0x1D3B, 0x033C, 0x0C41, 0x8442, 0x0343,
|
||
0x0A44, 0x0845, 0xFA46, 0x0347, 0x0A48, 0x0849, 0xF24A, 0x024B,
|
||
0x034C, 0x024D, 0x0E4E, 0x0050, 0x0951, 0x0352, 0x0353, 0x00F0
|
||
};
|
||
|
||
static UShort P518ColorModeRegister[] = {
|
||
0x022C, 0x2F39, 0x883A, 0x403B, 0x0F3C, 0x0E41, 0x9042, 0x0143,
|
||
0x2744, 0x2745, 0x0146, 0x0147, 0x2748, 0x2F49, 0x094A, 0x034B,
|
||
0x074C, 0x054D, 0x064E, 0x0850, 0x0D51, 0x0C52, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x3D39, 0x843A, 0x463B, 0x063C, 0x1F41, 0x8C42, 0x0143,
|
||
0x1344, 0x1345, 0xF246, 0x0147, 0x1348, 0x1349, 0xFA4A, 0x014B,
|
||
0x074C, 0x054D, 0x0E4E, 0x0150, 0x0651, 0x1252, 0x0B53, 0x00F0,
|
||
|
||
0x002C, 0x1639, 0x853A, 0x1F3B, 0x073C, 0x0441, 0x1E42, 0x0143,
|
||
0x1344, 0x1345, 0xF146, 0x0147, 0x1348, 0x1349, 0xF94A, 0x044B,
|
||
0x074C, 0x054D, 0x034E, 0x0650, 0x0351, 0x0952, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x1639, 0x833A, 0x1D3B, 0x033C, 0x0C41, 0x8442, 0x0343,
|
||
0x0A44, 0x0845, 0xFA46, 0x0347, 0x0A48, 0x0849, 0xF24A, 0x024B,
|
||
0x034C, 0x024D, 0x0E4E, 0x0050, 0x0951, 0x0352, 0x0353, 0x00F0
|
||
};
|
||
|
||
static UShort P56ColorModeRegister[] = {
|
||
0x022C, 0x2F39, 0x043A, 0x363B, 0x033C, 0x0E41, 0x9042, 0x0143,
|
||
0x2744, 0x2745, 0x0146, 0x0247, 0x2748, 0x2F49, 0x094A, 0x034B,
|
||
0x074C, 0x054D, 0x064E, 0x0850, 0x0D51, 0x0C52, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x3D39, 0x033A, 0x443B, 0x033C, 0x1F41, 0x8C42, 0x0143,
|
||
0x1344, 0x1345, 0xF246, 0x0247, 0x1348, 0x1349, 0xFA4A, 0x004B,
|
||
0x074C, 0x054D, 0x0E4E, 0x0150, 0x0651, 0x1252, 0x0B53, 0x00F0,
|
||
|
||
0x002C, 0x1439, 0x033A, 0x1D3B, 0x033C, 0x0441, 0x1E42, 0x0143,
|
||
0x1344, 0x1345, 0xF146, 0x0247, 0x1348, 0x1349, 0xF94A, 0x044B,
|
||
0x074C, 0x054D, 0x034E, 0x0650, 0x0351, 0x0952, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x1639, 0x033A, 0x1B3B, 0x023C, 0x0C41, 0x8442, 0x0343,
|
||
0x0A44, 0x0845, 0xFA46, 0x0447, 0x0A48, 0x0849, 0xF24A, 0x024B,
|
||
0x034C, 0x024D, 0x0E4E, 0x0050, 0x0951, 0x0352, 0x0353, 0x00F0
|
||
};
|
||
|
||
static UShort P539ColorModeRegister[] = {
|
||
0x022C, 0x2F39, 0x883A, 0x403B, 0x0F3C, 0x0E41, 0x9042, 0x0143,
|
||
0x2744, 0x2745, 0x0146, 0x0147, 0x2748, 0x2F49, 0x094A, 0x034B,
|
||
0x074C, 0x054D, 0x064E, 0x0850, 0x0D51, 0x0C52, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x3D39, 0x843A, 0x463B, 0x063C, 0x1F41, 0x8C42, 0x0143,
|
||
0x1344, 0x1345, 0xF246, 0x0147, 0x1348, 0x1349, 0xFA4A, 0x014B,
|
||
0x074C, 0x054D, 0x0E4E, 0x0150, 0x0651, 0x1252, 0x0B53, 0x00F0,
|
||
|
||
0x002C, 0x1639, 0x833A, 0x1F3B, 0x073C, 0x0441, 0x1E42, 0x0143,
|
||
0x1344, 0x1345, 0xF146, 0x0147, 0x1348, 0x1349, 0xF94A, 0x044B,
|
||
0x074C, 0x054D, 0x034E, 0x0650, 0x0351, 0x0952, 0x0B53, 0x00F0,
|
||
|
||
0x022C, 0x1639, 0x833A, 0x1D3B, 0x033C, 0x0C41, 0x8442, 0x0343,
|
||
0x0A44, 0x0845, 0xFA46, 0x0347, 0x0A48, 0x0849, 0xF24A, 0x024B,
|
||
0x034C, 0x024D, 0x0E4E, 0x0050, 0x0951, 0x0352, 0x0353, 0x00F0
|
||
};
|
||
|
||
static RegDef WolfsonDAC8144[_NUM_OF_DACREGS_W8144] = {
|
||
{0x01, 0x01}, {0x02, 0x04}, {0x03, 0x42}, {0x05, 0x10}, {0x20, 0xd0},
|
||
{0x21, 0xd0}, {0x22, 0xd0}, {0x24, 0x00}, {0x25, 0x00}, {0x26, 0x00},
|
||
{0x02, 0x04}
|
||
};
|
||
|
||
static RegDef ccdStop[] = {
|
||
{0x41, 0xff}, {0x42, 0xff}, {0x4b, 0xff}, {0x4c, 0xff},
|
||
{0x4d, 0xff}, {0x4e, 0xff}, {0x2a, 0x01}, {0x2b, 0x00},
|
||
{0x2d, 0x00}, {0x1b, 0x19}, {0x14, 0xff}, {0x15, 0x00}
|
||
};
|
||
|
||
static DACTblDef shadingVar = {
|
||
{{100, 100, 94}}, {{0x20, 0x20, 0x20}},
|
||
{{0x10, 0x10, 0x10}}, {{0x00, 0x00, 0x00}}, {{0xd0, 0xd0, 0xd0}}, 0
|
||
};
|
||
|
||
/*************************** local functions *********************************/
|
||
|
||
/*.............................................................................
|
||
* initialize the register values for the 98001 asic
|
||
*/
|
||
static void p9636InitializeAsicRegister( pScanData ps )
|
||
{
|
||
memset( &ps->AsicReg, 0, sizeof(RegData));
|
||
ps->AsicReg.RD_ScanControl = _SCAN_1ST_AVERAGE + _SCAN_BYTEMODE;
|
||
ps->Scan.bFifoSelect = ps->RegGFifoOffset;
|
||
}
|
||
|
||
/*.............................................................................
|
||
* 1) Setup the registers of asic.
|
||
* 2) Determine which type of CCD we are using
|
||
* 3) According to the CCD, prepare the CCD dependent veriables
|
||
* SONY CCD:
|
||
* The color exposure sequence: Red, Green (after 11 red lines),
|
||
* Blue (after 8 green lines)
|
||
* TOSHIBA CCD:
|
||
* The color exposure sequence: Red, Blue (after 11 red lines),
|
||
* Green (after 8 blue lines)
|
||
*/
|
||
static void p9636Init98001( pScanData ps, Bool shading )
|
||
{
|
||
Byte bData;
|
||
UShort w;
|
||
ULong dwID;
|
||
DataType Data;
|
||
pUShort pw;
|
||
|
||
DBG( DBG_LOW, "p9636InitP98001(%d)\n", shading );
|
||
|
||
bData = IODataRegisterFromScanner( ps, ps->RegConfiguration );
|
||
|
||
ps->Device.bCCDID = bData;
|
||
ps->Device.bCCDID &= _P98_CCD_TYPE_ID;
|
||
DBG( DBG_HIGH, "bData = 0x%04X, PCB-ID = 0x%02X\n", bData, (bData >> 4));
|
||
|
||
/* encode the CCD-id into the flag parameter */
|
||
dwID = (ULong)ps->Device.bCCDID;
|
||
dwID = dwID << 16;
|
||
ps->sCaps.dwFlag |= dwID;
|
||
|
||
/* do the defaults here and the differences below */
|
||
ps->Device.f0_8_16 = _FALSE;
|
||
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x30;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x30;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x20;
|
||
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x10;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x10;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x10;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xd0;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xd0;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xd0;
|
||
|
||
/*
|
||
* yes, I know this function is rather ugly to read, but depending
|
||
* on the scan-settings and the detected CCD-chip it prepares the
|
||
* settings for the DAC
|
||
*/
|
||
ps->Device.dwModelOriginY = 0x50;
|
||
ps->Device.wNumDACRegs = _NUM_OF_DACREGS_W8144;
|
||
|
||
switch( ps->Device.bCCDID ) {
|
||
|
||
case _CCD_3797:
|
||
DBG( DBG_HIGH, "CCD-ID = 0x%02X = _CCD_3797\n", ps->Device.bCCDID );
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 96;
|
||
|
||
if( ps->DataInf.dwScanFlag & SCANDEF_TPA ) {
|
||
if (ps->DataInf.dwScanFlag & SCANDEF_Transparency) {
|
||
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 130;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 110;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 112;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xcc;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xcc;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xcc;
|
||
|
||
ps->bsPreRedDAC = ps->bsPreGreenDAC = ps->bsPreBlueDAC = 0xcc;
|
||
|
||
ps->wsDACCompareHighRed = 0x0B0;
|
||
ps->wsDACCompareLowRed = 0x0A0;
|
||
ps->wsDACCompareHighGreen = 0x90;
|
||
ps->wsDACCompareLowGreen = 0x80;
|
||
ps->wsDACCompareHighBlue = 0x90;
|
||
ps->wsDACCompareLowBlue = 0x80;
|
||
ps->wsDACOffsetRed =
|
||
ps->wsDACOffsetGreen = ps->wsDACOffsetBlue = 0x30;
|
||
} else {
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 97;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 82;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 100;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x80;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x80;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x80;
|
||
|
||
ps->bsPreRedDAC = ps->bsPreGreenDAC = ps->bsPreBlueDAC = 0x80;
|
||
|
||
ps->wsDACCompareHighRed = 0x90;
|
||
ps->wsDACCompareLowRed = 0x80;
|
||
ps->wsDACCompareHighGreen = 0x1a0;
|
||
ps->wsDACCompareLowGreen = 0x190;
|
||
ps->wsDACCompareHighBlue = 0x260;
|
||
ps->wsDACCompareLowBlue = 0x250;
|
||
ps->wsDACOffsetRed =
|
||
ps->wsDACOffsetGreen = ps->wsDACOffsetBlue = 0x20;
|
||
}
|
||
} else {
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x50;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x40;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x38;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x28;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x28;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x18;
|
||
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x30;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x18;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x08;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xf0;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xcc;
|
||
if (ps->bSetScanModeFlag & _ScanMode_Mono) {
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green =
|
||
((ps->bSetScanModeFlag & _ScanMode_AverageOut)? 0xa0:0x68);
|
||
} else {
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xcc;
|
||
}
|
||
}
|
||
|
||
if ((ps->bSetScanModeFlag & _ScanMode_Mono) ||
|
||
(ps->DataInf.dwScanFlag & SCANDEF_Negative)) {
|
||
WolfsonDAC8144[3].bParam = 0x12;
|
||
} else {
|
||
WolfsonDAC8144[3].bParam = 0x10;
|
||
}
|
||
|
||
pw = P97ColorModeRegister;
|
||
break;
|
||
|
||
case _CCD_3717:
|
||
DBG( DBG_HIGH, "CCD-ID = 0x%02X = _CCD_3717\n", ps->Device.bCCDID );
|
||
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 96;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 97;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 100;
|
||
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x15;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x05;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x10;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x01;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x10;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x01;
|
||
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x28;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x14;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x10;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green =
|
||
((ps->bSetScanModeFlag&_ScanMode_Mono)?0xd0:0xd6);
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xdd;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xd9;
|
||
ps->Device.f0_8_16 = _TRUE;
|
||
pw = P17ColorModeRegister;
|
||
break;
|
||
|
||
case _CCD_535:
|
||
DBG( DBG_HIGH, "CCD-ID = 0x%02X = _CCD_535\n", ps->Device.bCCDID );
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 95;
|
||
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x2e;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x20;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x28;
|
||
|
||
ps->wMinCmpDpi = 75;
|
||
ps->lpEppColorHomePos->wMaxSteps = 890;
|
||
ps->lpBppColorHomePos->wMaxSteps = 890;
|
||
ps->lpSppColorHomePos->wMaxSteps = 890;
|
||
/*
|
||
* for less 75 Dpi Motor can't moveable in Some machine
|
||
* ps->lpEppColorHomePos->bExposureTime = 48;
|
||
*/
|
||
ps->lpEppColorHomePos->bExposureTime = 64;
|
||
ps->a_tabDiffParam[_ColorEpp60].bStepSpeed = 8;
|
||
ps->a_ColorSettings [1].bExposureTime = 64;
|
||
ps->a_tabDiffParam[_ColorEpp100_1400].bStepSpeed = 16;
|
||
ps->lpBppColorHomePos->bExposureTime = 96;
|
||
ps->lpSppColorHomePos->bExposureTime = 96;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xf0;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xdf;
|
||
|
||
if (ps->bSetScanModeFlag & _ScanMode_Mono) {
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 110;
|
||
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x20;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xf0;
|
||
} else {
|
||
if (ps->bSetScanModeFlag & _ScanMode_AverageOut) {
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xf6;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xe5;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xe4;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x18;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0;
|
||
} else {
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xf0;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xe1;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xdf;
|
||
}
|
||
}
|
||
pw = P535ColorModeRegister;
|
||
break;
|
||
|
||
case _CCD_2556:
|
||
DBG( DBG_HIGH, "CCD-ID = 0x%02X = _CCD_2556\n", ps->Device.bCCDID );
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 100;
|
||
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x10;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x10;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x10;
|
||
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0;
|
||
|
||
pw = P56ColorModeRegister;
|
||
break;
|
||
|
||
case _CCD_518:
|
||
DBG( DBG_HIGH, "CCD-ID = 0x%02X = _CCD_518\n", ps->Device.bCCDID );
|
||
ps->Device.dwModelOriginY = 0x50-3; /* 0x50-13 */
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 98;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 98;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 98;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xcc;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xcc;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xcc;
|
||
|
||
if (ps->bSetScanModeFlag & _ScanMode_Mono) {
|
||
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
|
||
}
|
||
|
||
if( ps->DataInf.dwScanFlag & SCANDEF_TPA ) {
|
||
if( ps->DataInf.dwScanFlag & SCANDEF_Transparency ) {
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 104;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 92;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 96;
|
||
ps->bsPreRedDAC = ps->bsPreGreenDAC = ps->bsPreBlueDAC = 0xcc;
|
||
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x10;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x10;
|
||
ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x20;
|
||
ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x10;
|
||
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0;
|
||
ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0;
|
||
|
||
ps->wsDACCompareHighRed = 0x80; /* 0x35 */
|
||
ps->wsDACCompareLowRed = 0x70; /* 0x25 */
|
||
ps->wsDACCompareHighGreen = 0x80; /* 0x46 */
|
||
ps->wsDACCompareLowGreen = 0x70; /* 0x36 */
|
||
ps->wsDACCompareHighBlue = 0x80; /* 0x54 */
|
||
ps->wsDACCompareLowBlue = 0x70; /* 0x44 */
|
||
ps->wsDACOffsetRed =
|
||
ps->wsDACOffsetGreen = ps->wsDACOffsetBlue = 0; /* 0x70 */
|
||
} else {
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 94;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 80;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 78;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x80;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x80;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x80;
|
||
|
||
ps->bsPreRedDAC = ps->bsPreGreenDAC = ps->bsPreBlueDAC = 0x80;
|
||
|
||
ps->wsDACCompareHighRed = 0x90;
|
||
ps->wsDACCompareLowRed = 0x80;
|
||
ps->wsDACCompareHighGreen = 0x1a0;
|
||
ps->wsDACCompareLowGreen = 0x190;
|
||
ps->wsDACCompareHighBlue = 0x160;
|
||
ps->wsDACCompareLowBlue = 0x150;
|
||
ps->wsDACOffsetRed = 0xb0; /* 0x180 */
|
||
ps->wsDACOffsetGreen = 0xcc; /* 0x180 */
|
||
ps->wsDACOffsetBlue = 0xe2; /* 0x240 */
|
||
}
|
||
}
|
||
|
||
if ((ps->bSetScanModeFlag & _ScanMode_Mono) ||
|
||
(ps->DataInf.dwScanFlag & SCANDEF_Negative)) {
|
||
WolfsonDAC8144[3].bParam = 0x12;
|
||
} else {
|
||
WolfsonDAC8144[3].bParam = 0x10;
|
||
}
|
||
ps->Device.f0_8_16 = _TRUE;
|
||
pw = P518ColorModeRegister;
|
||
break;
|
||
|
||
/*
|
||
* CCD_539
|
||
*/
|
||
default:
|
||
DBG( DBG_HIGH, "CCD-ID = 0x%02X = _CCD_539\n", ps->Device.bCCDID );
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 100;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 98;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xcc;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xcc;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xcc;
|
||
|
||
if( ps->DataInf.dwScanFlag & SCANDEF_TPA ) {
|
||
if( ps->DataInf.dwScanFlag & SCANDEF_Transparency ) {
|
||
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 80;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 80;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 80;
|
||
ps->bsPreRedDAC = 0xcc;
|
||
ps->bsPreGreenDAC = 0xcc;
|
||
ps->bsPreBlueDAC = 0xcc;
|
||
ps->wsDACCompareHighRed = 0x90;
|
||
ps->wsDACCompareLowRed = 0x80;
|
||
ps->wsDACCompareHighGreen = 0x90;
|
||
ps->wsDACCompareLowGreen = 0x80;
|
||
ps->wsDACCompareHighBlue = 0x90;
|
||
ps->wsDACCompareLowBlue = 0x80;
|
||
ps->wsDACOffsetRed =
|
||
ps->wsDACOffsetGreen = ps->wsDACOffsetBlue = 0x70;
|
||
} else {
|
||
ps->Shade.pCcdDac->GainResize.Colors.Red = 80;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Green = 96;
|
||
ps->Shade.pCcdDac->GainResize.Colors.Blue = 95;
|
||
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x90;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x90;
|
||
ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x90;
|
||
|
||
ps->bsPreRedDAC = ps->bsPreGreenDAC = ps->bsPreBlueDAC = 0x90;
|
||
ps->wsDACCompareHighRed = 0xd0; /* 0x90 */
|
||
ps->wsDACCompareLowRed = 0xc0; /* 0x80 */
|
||
ps->wsDACCompareHighGreen = 0x110; /* 0x1a0 */
|
||
ps->wsDACCompareLowGreen = 0x100; /* 0x190 */
|
||
ps->wsDACCompareHighBlue = 0x130; /* 0x260 */
|
||
ps->wsDACCompareLowBlue = 0x120; /* 0x250 */
|
||
ps->wsDACOffsetRed = 0x70; /* 0x70 */
|
||
ps->wsDACOffsetGreen = 0x70; /* 0x180 */
|
||
ps->wsDACOffsetBlue = 0x70; /* 0x240 */
|
||
}
|
||
}
|
||
|
||
if (ps->bSetScanModeFlag & _ScanMode_Mono ||
|
||
(ps->DataInf.dwScanFlag & SCANDEF_Negative)) {
|
||
WolfsonDAC8144[3].bParam = 0x12;
|
||
} else {
|
||
WolfsonDAC8144[3].bParam = 0x10;
|
||
}
|
||
ps->Device.f0_8_16 = _TRUE;
|
||
pw = P539ColorModeRegister;
|
||
break;
|
||
}
|
||
|
||
if( ps->bSetScanModeFlag == _ScanMode_Color )
|
||
WolfsonDAC8144[2].bParam = 0x52;
|
||
else
|
||
WolfsonDAC8144[2].bParam = 0x42;
|
||
|
||
if( ps->bSetScanModeFlag == _ScanMode_Mono )
|
||
WolfsonDAC8144[0].bParam = 7;
|
||
else
|
||
WolfsonDAC8144[0].bParam = 3;
|
||
|
||
ps->OpenScanPath( ps );
|
||
|
||
/*
|
||
* base init of the DAC
|
||
*/
|
||
DBG( DBG_IO, "Programming DAC (%u regs)\n", ps->Device.wNumDACRegs );
|
||
|
||
for( w = 0; w < ps->Device.wNumDACRegs; w++) {
|
||
|
||
DBG( DBG_IO, "*[0x%02x] = 0x%02x\n",
|
||
WolfsonDAC8144[w].bReg, WolfsonDAC8144[w].bParam );
|
||
IODataRegisterToDAC( ps,
|
||
WolfsonDAC8144[w].bReg, WolfsonDAC8144[w].bParam );
|
||
}
|
||
|
||
if( ps->bSetScanModeFlag & _ScanMode_Mono ) {
|
||
ps->AsicReg.RD_Model1Control = _MOTOR_2916 + _BUTTON_MODE +
|
||
_CCD_SHIFT_GATE + _SCAN_GRAYTYPE;
|
||
} else {
|
||
ps->AsicReg.RD_Model1Control = _MOTOR_2916 +
|
||
_BUTTON_MODE + _CCD_SHIFT_GATE;
|
||
}
|
||
IODataToRegister( ps, ps->RegModel1Control, ps->AsicReg.RD_Model1Control );
|
||
|
||
/* Check: THIS IS 11 on the 98003 */
|
||
IODataToRegister( ps, ps->RegWaitStateInsert, 6 );
|
||
|
||
/*
|
||
* according to the scan mode, program the CCD
|
||
*/
|
||
pw = pw + (ULong)ps->bSetScanModeFlag * 24;
|
||
DBG( DBG_LOW, "bSetScanModeFlag = %u\n", ps->bSetScanModeFlag );
|
||
|
||
for( w = 24; w--; pw++) {
|
||
Data.wValue = *pw;
|
||
IODataToRegister( ps, Data.wOverlap.b1st, Data.wOverlap.b2nd );
|
||
}
|
||
|
||
ps->CloseScanPath( ps );
|
||
}
|
||
|
||
/*.............................................................................
|
||
* call the InitAsic function
|
||
* set LineControl and stop motor
|
||
*/
|
||
static void p9636SetupScannerVariables( pScanData ps )
|
||
{
|
||
ps->ReInitAsic( ps, _FALSE );
|
||
|
||
IOCmdRegisterToScanner(ps, ps->RegLineControl, ps-> AsicReg.RD_LineControl);
|
||
|
||
memset( ps->a_nbNewAdrPointer, 0, _SCANSTATE_BYTES);
|
||
IOSetToMotorRegister( ps );
|
||
}
|
||
|
||
/*.............................................................................
|
||
* set all necessary register contents
|
||
*/
|
||
static void p9636SetGeneralRegister( pScanData ps )
|
||
{
|
||
DBG( DBG_LOW, "p9636SetGeneralRegister()\n" );
|
||
|
||
ps->AsicReg.RD_StepControl = _MOTOR0_SCANSTATE + _MOTOR0_ONESTEP;
|
||
ps->AsicReg.RD_ModeControl = _ModeScan + _ModeFifoRSel;
|
||
ps->AsicReg.RD_Motor1Control = _MotorOn + _MotorDirForward;
|
||
ps->AsicReg.RD_Motor0Control = ps->bHpMotor | (_MotorOn+_MotorDirForward);
|
||
ps->AsicReg.RD_XStepTime = ps->bStepSpeed;
|
||
|
||
if( COLOR_BW == ps->DataInf.wPhyDataType ) {
|
||
|
||
ps->AsicReg.RD_ScanControl = _SCAN_BITMODE;
|
||
|
||
if( !(ps->DataInf.dwScanFlag & SCANDEF_Inverse))
|
||
ps->AsicReg.RD_ScanControl |= _P98_SCANDATA_INVERT;
|
||
|
||
} else {
|
||
|
||
if (COLOR_TRUE48 == ps->DataInf.wPhyDataType) {
|
||
ps->AsicReg.RD_ScanControl = _SCAN_12BITMODE;
|
||
|
||
if (!(ps->DataInf.dwScanFlag & SCANDEF_RightAlign))
|
||
ps->AsicReg.RD_ScanControl |= _BITALIGN_LEFT;
|
||
} else
|
||
ps->AsicReg.RD_ScanControl = _SCAN_BYTEMODE;
|
||
|
||
if( ps->DataInf.dwScanFlag & SCANDEF_Inverse )
|
||
ps->AsicReg.RD_ScanControl |= _P98_SCANDATA_INVERT;
|
||
}
|
||
|
||
ps->AsicReg.RD_ScanControl |= _SCAN_1ST_AVERAGE;
|
||
IOSelectLampSource( ps );
|
||
}
|
||
|
||
/*.............................................................................
|
||
* tell the scanner/ASIC where to start scanning and how many pixels
|
||
*/
|
||
static void p9636SetStartStopRegister( pScanData ps )
|
||
{
|
||
ps->AsicReg.RD_Origin = (UShort)(ps->dwOffset70 + ps->Device.DataOriginX +
|
||
ps->DataInf.crImage.x);
|
||
|
||
DBG( DBG_LOW, "p9636SetStartStopRegister()\n" );
|
||
|
||
if (ps->bSetScanModeFlag & _ScanMode_AverageOut )
|
||
|
||
ps->AsicReg.RD_Origin = ps->AsicReg.RD_Origin >> 1;
|
||
|
||
if (ps->DataInf.wPhyDataType < COLOR_256GRAY) {
|
||
ps->AsicReg.RD_Pixels = (UShort)ps->DataInf.dwAsicBytesPerLine;
|
||
} else {
|
||
ps->AsicReg.RD_Pixels = (UShort)ps->DataInf.dwAsicPixelsPerPlane;
|
||
}
|
||
|
||
DBG( DBG_LOW, "RD_Origin = %u, RD_Pixels = %u\n",
|
||
ps->AsicReg.RD_Origin, ps->AsicReg.RD_Pixels );
|
||
}
|
||
|
||
/*.............................................................................
|
||
*
|
||
*/
|
||
static void p9636SetupScanningCondition( pScanData ps )
|
||
{
|
||
ULong dw;
|
||
|
||
IORegisterDirectToScanner( ps, ps->RegInitDataFifo );
|
||
|
||
ps->InitialSetCurrentSpeed( ps );
|
||
|
||
if (ps->DataInf.wPhyDataType > COLOR_TRUE24) {
|
||
if (ps->DataInf.dwAsicBytesPerPlane < 1024)
|
||
ps->Scan.dwMinReadFifo = 1024;
|
||
else
|
||
ps->Scan.dwMinReadFifo = ps->DataInf.dwAsicBytesPerPlane;
|
||
} else {
|
||
if (ps->DataInf.dwAsicBytesPerPlane * 2 < 1024)
|
||
ps->Scan.dwMinReadFifo = 1024;
|
||
else
|
||
ps->Scan.dwMinReadFifo = ps->DataInf.dwAsicBytesPerPlane * 2;
|
||
}
|
||
|
||
p9636SetGeneralRegister( ps );
|
||
|
||
IORegisterDirectToScanner( ps, ps->RegInitDataFifo );
|
||
|
||
ps->SetupMotorRunTable( ps );
|
||
|
||
ps->AsicReg.RD_Dpi = ps->DataInf.xyPhyDpi.x;
|
||
|
||
p9636SetStartStopRegister( ps );
|
||
IOSetToMotorRegister ( ps );
|
||
|
||
ps->bCurrentLineCount = 0;
|
||
IOCmdRegisterToScanner(ps, ps->RegScanControl, ps->AsicReg.RD_ScanControl);
|
||
|
||
IOPutOnAllRegisters( ps );
|
||
|
||
ps->OpenScanPath( ps );
|
||
|
||
ps->AsicReg.RD_ModeControl &= ~_ModeIdle;
|
||
IODataToRegister( ps, ps->RegModeControl, ps->AsicReg.RD_ModeControl);
|
||
|
||
ps->AsicReg.RD_ModeControl = _ModeScan + _ModeFifoRSel;
|
||
IODataToRegister( ps, ps->RegModeControl, ps->AsicReg.RD_ModeControl);
|
||
|
||
IORegisterToScanner( ps, ps->RegInitDataFifo );
|
||
|
||
ps->CloseScanPath( ps );
|
||
|
||
if (ps->DataInf.wPhyDataType >= COLOR_TRUE24) {
|
||
|
||
dw = ps->DataInf.dwAsicPixelsPerPlane;
|
||
ps->dwMaxReadFifoData = _SIZE_COLORFIFO -
|
||
ps->DataInf.dwAsicBytesPerPlane * 64UL /
|
||
(ULong)ps->bCurrentSpeed - dw;
|
||
} else {
|
||
dw = ps->DataInf.dwAsicBytesPerPlane;
|
||
ps->dwMaxReadFifoData = _SIZE_GRAYFIFO -
|
||
ps->DataInf.dwAsicBytesPerPlane * 64UL /
|
||
(ULong)ps->bCurrentSpeed - dw;
|
||
}
|
||
|
||
if ((dw = dw * 4UL) > ps->dwMaxReadFifoData) {
|
||
ps->dwSizeMustProcess = ps->dwMaxReadFifoData;
|
||
} else {
|
||
ps->dwSizeMustProcess = dw;
|
||
}
|
||
|
||
if (ps->DataInf.wPhyDataType >= COLOR_TRUE24) {
|
||
|
||
if (ps->DataInf.xyPhyDpi.y <= 150) {
|
||
dw = ps->DataInf.dwAsicPixelsPerPlane;
|
||
} else {
|
||
if (ps->DataInf.xyPhyDpi.y <= 300) {
|
||
dw = ps->DataInf.dwAsicPixelsPerPlane * 2;
|
||
} else {
|
||
if (ps->DataInf.xyPhyDpi.y <= 600) {
|
||
dw = ps->DataInf.dwAsicPixelsPerPlane * 4;
|
||
} else {
|
||
dw = ps->DataInf.dwAsicPixelsPerPlane * 8;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (ps->Device.f0_8_16 && (ps->DataInf.xyPhyDpi.y >= 150))
|
||
dw <<= 1;
|
||
|
||
ps->dwSizeMustProcess += dw;
|
||
ps->Scan.dwMinReadFifo += dw;
|
||
ps->dwMaxReadFifoData += dw;
|
||
}
|
||
}
|
||
|
||
/*.............................................................................
|
||
* switch the scanner into idle mode
|
||
*/
|
||
static void p9636PutToIdleMode( pScanData ps )
|
||
{
|
||
int i;
|
||
|
||
DBG( DBG_LOW, "Putting Scanner (ASIC 98001) into Idle-Mode\n" );
|
||
|
||
/*
|
||
* turn off motor
|
||
*/
|
||
IOCmdRegisterToScanner( ps, ps->RegMotor0Control, 0x00 );
|
||
IOCmdRegisterToScanner( ps, ps->RegLineControl,ps->AsicReg.RD_LineControl);
|
||
|
||
IOCmdRegisterToScanner( ps, ps->RegModeControl,
|
||
(_ModeIdle + _ModeFifoClose));
|
||
|
||
ps->OpenScanPath(ps);
|
||
|
||
DBG( DBG_IO, "CCD-Stop\n" );
|
||
|
||
for( i = 0; i < 12; i++ ) {
|
||
|
||
DBG(DBG_IO, "*[0x%02x] = 0x%02x\n",ccdStop[i].bReg, ccdStop[i].bParam);
|
||
IODataToRegister( ps, ccdStop[i].bReg, ccdStop[i].bParam );
|
||
}
|
||
|
||
IODataRegisterToDAC( ps, 0x01, 0x00 ); /* Close ADC */
|
||
|
||
ps->CloseScanPath(ps);
|
||
}
|
||
|
||
/*.............................................................................
|
||
* do all the preliminary stuff here (calibrate the scanner and move the
|
||
* sensor to it<69>s start position, also setup the driver for the
|
||
* current run)
|
||
*/
|
||
static int p9636Calibration( pScanData ps )
|
||
{
|
||
DBG( DBG_LOW, "p9636Calibration()\n" );
|
||
|
||
ps->Scan.bFifoSelect = ps->RegGFifoOffset;
|
||
|
||
/*
|
||
* wait for shading to be done
|
||
*/
|
||
_ASSERT(ps->WaitForShading);
|
||
if( !ps->WaitForShading( ps ))
|
||
return _E_TIMEOUT;
|
||
|
||
IOCmdRegisterToScanner( ps, ps->RegLineControl, _DEFAULT_LINESCANTIME );
|
||
|
||
/*
|
||
* move sensor and setup scanner for grabbing the picture
|
||
*/
|
||
_ASSERT(ps->WaitForPositionY);
|
||
ps->WaitForPositionY( ps );
|
||
|
||
IOCmdRegisterToScanner( ps, ps->RegLineControl,
|
||
ps->AsicReg.RD_LineControl );
|
||
|
||
ps->fDoFilter = ps->fFilterFirstLine = _FALSE;
|
||
ps->dwDivFilter = ps->dwMul = 53;
|
||
ps->bOffsetFilter = 12;
|
||
|
||
if (COLOR_256GRAY == ps->DataInf.wPhyDataType) {
|
||
ps->fDoFilter = _TRUE;
|
||
ps->pFilterBuf = ps->pGet1 = ps->pProcessingBuf;
|
||
ps->pGet2 = ps->pGet1 + 5120;
|
||
ps->pGet3 = ps->pGet2 + 5120;
|
||
ps->pEndBuf = ps->pGet3 + 5120;
|
||
|
||
ps->fFilterFirstLine = _TRUE;
|
||
ps->dwLinesFilter = ps->DataInf.dwAppLinesPerArea;
|
||
}
|
||
|
||
ps->bCurrentLineCount = 0x3f;
|
||
_DODELAY(1);
|
||
|
||
return _OK;
|
||
}
|
||
|
||
/************************ exported functions *********************************/
|
||
|
||
/*.............................................................................
|
||
* initialize the register values and function calls for the 98001 asic
|
||
*/
|
||
_LOC int P9636InitAsic( pScanData ps )
|
||
{
|
||
int result;
|
||
|
||
DBG( DBG_LOW, "P9636InitAsic()\n" );
|
||
|
||
/*
|
||
* preset the asic shadow registers
|
||
*/
|
||
p9636InitializeAsicRegister( ps );
|
||
|
||
ps->IO.bOpenCount = 0;
|
||
|
||
/*
|
||
* setup the register values
|
||
*/
|
||
ps->RegSwitchBus = 0;
|
||
ps->RegEPPEnable = 1;
|
||
ps->RegECPEnable = 2;
|
||
ps->RegReadDataMode = 3;
|
||
ps->RegWriteDataMode = 4;
|
||
ps->RegInitDataFifo = 5;
|
||
ps->RegForceStep = 6;
|
||
ps->RegInitScanState = 7;
|
||
ps->RegRefreshScanState = 8;
|
||
ps->RegWaitStateInsert = 0x0a;
|
||
ps->RegRFifoOffset = 0x0a;
|
||
ps->RegGFifoOffset = 0x0b;
|
||
ps->RegBFifoOffset = 0x0c;
|
||
ps->RegBitDepth = 0x13;
|
||
ps->RegStepControl = 0x14;
|
||
ps->RegMotor0Control = 0x15;
|
||
ps->RegXStepTime = 0x16;
|
||
ps->RegGetScanState = 0x17;
|
||
ps->RegAsicID = 0x18;
|
||
ps->RegMemoryLow = 0x19;
|
||
ps->RegMemoryHigh = 0x1a;
|
||
ps->RegModeControl = 0x1b;
|
||
ps->RegLineControl = 0x1c;
|
||
ps->RegScanControl = 0x1d;
|
||
ps->RegConfiguration = 0x1e;
|
||
ps->RegModelControl = 0x1f;
|
||
ps->RegModel1Control = 0x20;
|
||
ps->RegDpiLow = 0x21;
|
||
ps->RegDpiHigh = 0x22;
|
||
ps->RegScanPosLow = 0x23;
|
||
ps->RegScanPosHigh = 0x24;
|
||
ps->RegWidthPixelsLow = 0x25;
|
||
ps->RegWidthPixelsHigh = 0x26;
|
||
ps->RegThresholdLow = 0x27;
|
||
ps->RegThresholdHigh = 0x28;
|
||
ps->RegThresholdGapControl = 0x29;
|
||
ps->RegADCAddress = 0x2a;
|
||
ps->RegADCData = 0x2b;
|
||
ps->RegADCPixelOffset = 0x2c;
|
||
ps->RegADCSerialOutStr = 0x2d;
|
||
ps->RegResetConfig = 0x2e;
|
||
ps->RegLensPosition = 0x2f;
|
||
ps->RegStatus = 0x30;
|
||
ps->RegScanStateControl = 0x31;
|
||
ps->RegRedChDarkOffsetLow = 0x33;
|
||
ps->RegRedChDarkOffsetHigh = 0x34;
|
||
ps->RegGreenChDarkOffsetLow = 0x35;
|
||
ps->RegGreenChDarkOffsetHigh= 0x36;
|
||
ps->RegBlueChDarkOffsetLow = 0x37;
|
||
ps->RegBlueChDarkOffsetHigh = 0x38;
|
||
ps->RegResetPulse0 = 0x39;
|
||
ps->RegResetPulse1 = 0x3a;
|
||
ps->RegCCDClampTiming0 = 0x3b;
|
||
ps->RegCCDClampTiming1 = 0x3c;
|
||
ps->RegVSMPTiming0 = 0x41;
|
||
ps->RegVSMPTiming1 = 0x42;
|
||
ps->RegCCDQ1Timing0 = 0x43;
|
||
ps->RegCCDQ1Timing1 = 0x44;
|
||
ps->RegCCDQ1Timing2 = 0x45;
|
||
ps->RegCCDQ1Timing3 = 0x46;
|
||
ps->RegCCDQ2Timing0 = 0x47;
|
||
ps->RegCCDQ2Timing1 = 0x48;
|
||
ps->RegCCDQ2Timing2 = 0x49;
|
||
ps->RegCCDQ2Timing3 = 0x4a;
|
||
ps->RegADCclockTiming0 = 0x4b;
|
||
ps->RegADCclockTiming1 = 0x4c;
|
||
ps->RegADCclockTiming2 = 0x4d;
|
||
ps->RegADCclockTiming3 = 0x4e;
|
||
ps->RegADCDVTiming0 = 0x50;
|
||
ps->RegADCDVTiming1 = 0x51;
|
||
ps->RegADCDVTiming2 = 0x52;
|
||
ps->RegADCDVTiming3 = 0x53;
|
||
|
||
/*
|
||
* setup function calls
|
||
*/
|
||
ps->SetupScannerVariables = p9636SetupScannerVariables;
|
||
ps->SetupScanningCondition = p9636SetupScanningCondition;
|
||
ps->ReInitAsic = p9636Init98001;
|
||
ps->PutToIdleMode = p9636PutToIdleMode;
|
||
ps->Calibration = p9636Calibration;
|
||
|
||
/*
|
||
* setup misc
|
||
*/
|
||
ps->CtrlReadHighNibble = _CTRL_GENSIGNAL + _CTRL_AUTOLF + _CTRL_STROBE;
|
||
ps->CtrlReadLowNibble = _CTRL_GENSIGNAL + _CTRL_AUTOLF;
|
||
|
||
ps->f97003 = _FALSE;
|
||
ps->IO.useEPPCmdMode = _FALSE;
|
||
ps->Scan.fRefreshState = _TRUE;
|
||
ps->wMinCmpDpi = 60;
|
||
ps->Scan.fMotorBackward = _FALSE;
|
||
|
||
IOSetXStepLineScanTime( ps, _DEFAULT_LINESCANTIME );
|
||
|
||
ps->Shade.pCcdDac = &shadingVar;
|
||
ps->bFastMoveFlag = _FastMove_Low_C75_G150;
|
||
ps->dwOffset70 = _P98_OFFSET70;
|
||
|
||
/*
|
||
* initialize the other modules and set some
|
||
* function pointer
|
||
*/
|
||
result = DacInitialize( ps );
|
||
if( _OK != result )
|
||
return result;
|
||
|
||
result = ImageInitialize( ps );
|
||
if( _OK != result )
|
||
return result;
|
||
|
||
result = IOFuncInitialize( ps );
|
||
if( _OK != result )
|
||
return result;
|
||
|
||
result = IOInitialize( ps );
|
||
if( _OK != result )
|
||
return result;
|
||
|
||
result = MotorInitialize( ps );
|
||
if( _OK != result )
|
||
return result;
|
||
|
||
/*
|
||
* in debug version, check all function pointers
|
||
*/
|
||
#ifdef DEBUG
|
||
if( _FALSE == MiscAllPointersSet( ps ))
|
||
return _E_INTERNAL;
|
||
#endif
|
||
|
||
DBG( DBG_LOW, "0x%02x\n", ps->sCaps.AsicID );
|
||
|
||
if( _FALSE == ps->OpenScanPath( ps )) {
|
||
DBG( DBG_LOW, "P9636InitAsic() failed.\n" );
|
||
return _E_NO_DEV;
|
||
}
|
||
|
||
/*get CCD ID */
|
||
ps->Device.bCCDID = IODataFromRegister( ps, ps->RegConfiguration );
|
||
ps->Device.bCCDID &= _P98_CCD_TYPE_ID;
|
||
DBG( DBG_HIGH, "CCID = 0x%02X\n", ps->Device.bCCDID);
|
||
|
||
ps->CloseScanPath( ps );
|
||
|
||
/* as the program parts concerning some CCDs don't handle TPA stuff,
|
||
* I assume that these devices won't have TPA functionality
|
||
*/
|
||
switch( ps->Device.bCCDID ) {
|
||
|
||
case _CCD_3717:
|
||
case _CCD_535:
|
||
case _CCD_2556:
|
||
DBG( DBG_HIGH, "Seems we have a 9636P\n" );
|
||
ps->sCaps.Model = MODEL_OP_9636PP;
|
||
ps->sCaps.dwFlag &= ~SFLAG_TPA;
|
||
break;
|
||
}
|
||
|
||
DBG( DBG_LOW, "P9636InitAsic() done.\n" );
|
||
return _OK;
|
||
}
|
||
|
||
/* END PLUSTEK-PP_P9636.C ...................................................*/
|