1141cc406Sopenharmony_ci/* @file plustek-pp_p12.c 2141cc406Sopenharmony_ci * @brief p12 and pt12 specific stuff 3141cc406Sopenharmony_ci * 4141cc406Sopenharmony_ci * based on sources acquired from Plustek Inc. 5141cc406Sopenharmony_ci * Copyright (C) 2000 Plustek Inc. 6141cc406Sopenharmony_ci * Copyright (C) 2001-2013 Gerhard Jaeger <gerhard@gjaeger.de> 7141cc406Sopenharmony_ci * 8141cc406Sopenharmony_ci * History: 9141cc406Sopenharmony_ci * - 0.38 - initial version 10141cc406Sopenharmony_ci * - 0.39 - added Genius Colorpage Vivid III V2 stuff 11141cc406Sopenharmony_ci * - 0.40 - no changes 12141cc406Sopenharmony_ci * - 0.41 - no changes 13141cc406Sopenharmony_ci * - 0.42 - removed setting of ps->sCaps.dwFlag in p12InitiateComponentModel() 14141cc406Sopenharmony_ci * - 0.43 - no changes 15141cc406Sopenharmony_ci * - 0.44 - fix format string issues, as Long types default to int32_t 16141cc406Sopenharmony_ci * now 17141cc406Sopenharmony_ci * . 18141cc406Sopenharmony_ci * <hr> 19141cc406Sopenharmony_ci * This file is part of the SANE package. 20141cc406Sopenharmony_ci * 21141cc406Sopenharmony_ci * This program is free software; you can redistribute it and/or 22141cc406Sopenharmony_ci * modify it under the terms of the GNU General Public License as 23141cc406Sopenharmony_ci * published by the Free Software Foundation; either version 2 of the 24141cc406Sopenharmony_ci * License, or (at your option) any later version. 25141cc406Sopenharmony_ci * 26141cc406Sopenharmony_ci * This program is distributed in the hope that it will be useful, but 27141cc406Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of 28141cc406Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 29141cc406Sopenharmony_ci * General Public License for more details. 30141cc406Sopenharmony_ci * 31141cc406Sopenharmony_ci * You should have received a copy of the GNU General Public License 32141cc406Sopenharmony_ci * along with this program. If not, see <https://www.gnu.org/licenses/>. 33141cc406Sopenharmony_ci * 34141cc406Sopenharmony_ci * As a special exception, the authors of SANE give permission for 35141cc406Sopenharmony_ci * additional uses of the libraries contained in this release of SANE. 36141cc406Sopenharmony_ci * 37141cc406Sopenharmony_ci * The exception is that, if you link a SANE library with other files 38141cc406Sopenharmony_ci * to produce an executable, this does not by itself cause the 39141cc406Sopenharmony_ci * resulting executable to be covered by the GNU General Public 40141cc406Sopenharmony_ci * License. Your use of that executable is in no way restricted on 41141cc406Sopenharmony_ci * account of linking the SANE library code into it. 42141cc406Sopenharmony_ci * 43141cc406Sopenharmony_ci * This exception does not, however, invalidate any other reasons why 44141cc406Sopenharmony_ci * the executable file might be covered by the GNU General Public 45141cc406Sopenharmony_ci * License. 46141cc406Sopenharmony_ci * 47141cc406Sopenharmony_ci * If you submit changes to SANE to the maintainers to be included in 48141cc406Sopenharmony_ci * a subsequent release, you agree by submitting the changes that 49141cc406Sopenharmony_ci * those changes may be distributed with this exception intact. 50141cc406Sopenharmony_ci * 51141cc406Sopenharmony_ci * If you write modifications of your own for SANE, it is your choice 52141cc406Sopenharmony_ci * whether to permit this exception to apply to your modifications. 53141cc406Sopenharmony_ci * If you do not wish that, delete this exception notice. 54141cc406Sopenharmony_ci * <hr> 55141cc406Sopenharmony_ci */ 56141cc406Sopenharmony_ci#include "plustek-pp_scan.h" 57141cc406Sopenharmony_ci 58141cc406Sopenharmony_ci/*************************** some local vars *********************************/ 59141cc406Sopenharmony_ci 60141cc406Sopenharmony_cistatic RegDef p12CcdStop[] = { 61141cc406Sopenharmony_ci {0x41, 0xff}, {0x42, 0xff}, {0x60, 0xff}, {0x61, 0xff}, 62141cc406Sopenharmony_ci {0x4b, 0xff}, {0x4c, 0xff}, {0x4d, 0xff}, {0x4e, 0xff}, 63141cc406Sopenharmony_ci {0x2a, 0x01}, {0x2b, 0x00}, {0x2d, 0x00}, {0x1b, 0x19}, {0x15, 0x00} 64141cc406Sopenharmony_ci}; 65141cc406Sopenharmony_ci 66141cc406Sopenharmony_ci/*************************** local functions *********************************/ 67141cc406Sopenharmony_ci 68141cc406Sopenharmony_ci/** init the stuff according to the buttons 69141cc406Sopenharmony_ci */ 70141cc406Sopenharmony_cistatic void p12ButtonSetup( pScanData ps, Byte nrOfButtons ) 71141cc406Sopenharmony_ci{ 72141cc406Sopenharmony_ci ps->Device.buttons = nrOfButtons; 73141cc406Sopenharmony_ci 74141cc406Sopenharmony_ci ps->Device.Model1Mono &= ~_BUTTON_MODE; 75141cc406Sopenharmony_ci ps->Device.Model1Color &= ~_BUTTON_MODE; 76141cc406Sopenharmony_ci 77141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType |= _BUTTON_DISABLE; 78141cc406Sopenharmony_ci ps->Scan.motorPower |= _BUTTON_DISABLE; 79141cc406Sopenharmony_ci} 80141cc406Sopenharmony_ci 81141cc406Sopenharmony_ci/** According to what we have detected, set the other stuff 82141cc406Sopenharmony_ci */ 83141cc406Sopenharmony_cistatic void p12InitiateComponentModel( pScanData ps ) 84141cc406Sopenharmony_ci{ 85141cc406Sopenharmony_ci /* preset some stuff and do the differences later */ 86141cc406Sopenharmony_ci ps->Device.buttons = 0; 87141cc406Sopenharmony_ci ps->Device.Model1Mono = _BUTTON_MODE + _CCD_SHIFT_GATE + _SCAN_GRAYTYPE; 88141cc406Sopenharmony_ci ps->Device.Model1Color = _BUTTON_MODE + _CCD_SHIFT_GATE; 89141cc406Sopenharmony_ci ps->Device.dwModelOriginY = 64; 90141cc406Sopenharmony_ci ps->Device.fTpa = _FALSE; 91141cc406Sopenharmony_ci ps->Device.ModelCtrl = (_LED_ACTIVITY | _LED_CONTROL); 92141cc406Sopenharmony_ci 93141cc406Sopenharmony_ci /* ps->sCaps.dwFlag should have been set correctly in models.c */ 94141cc406Sopenharmony_ci 95141cc406Sopenharmony_ci switch( ps->Device.bPCBID ) { 96141cc406Sopenharmony_ci 97141cc406Sopenharmony_ci case _PLUSTEK_SCANNER: 98141cc406Sopenharmony_ci DBG( DBG_LOW, "We have a Plustek Scanner\n" ); 99141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_P12; 100141cc406Sopenharmony_ci break; 101141cc406Sopenharmony_ci 102141cc406Sopenharmony_ci case _SCANNER_WITH_TPA: 103141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has TPA\n" ); 104141cc406Sopenharmony_ci ps->Device.fTpa = _TRUE; 105141cc406Sopenharmony_ci ps->sCaps.dwFlag |= SFLAG_TPA; 106141cc406Sopenharmony_ci break; 107141cc406Sopenharmony_ci 108141cc406Sopenharmony_ci case _SCANNER4Button: 109141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 4 Buttons\n" ); 110141cc406Sopenharmony_ci p12ButtonSetup( ps, 4 ); 111141cc406Sopenharmony_ci break; 112141cc406Sopenharmony_ci 113141cc406Sopenharmony_ci case _SCANNER4ButtonTPA: 114141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 4 Buttons & TPA\n" ); 115141cc406Sopenharmony_ci ps->Device.fTpa = _TRUE; 116141cc406Sopenharmony_ci ps->sCaps.dwFlag |= SFLAG_TPA; 117141cc406Sopenharmony_ci p12ButtonSetup( ps, 4 ); 118141cc406Sopenharmony_ci break; 119141cc406Sopenharmony_ci 120141cc406Sopenharmony_ci case _SCANNER5Button: 121141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 5 Buttons\n" ); 122141cc406Sopenharmony_ci ps->Device.dwModelOriginY = 64 + 20; 123141cc406Sopenharmony_ci p12ButtonSetup( ps, 5 ); 124141cc406Sopenharmony_ci break; 125141cc406Sopenharmony_ci 126141cc406Sopenharmony_ci case _SCANNER5ButtonTPA: 127141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 5 Buttons & TPA\n" ); 128141cc406Sopenharmony_ci ps->Device.dwModelOriginY = 64 + 20; 129141cc406Sopenharmony_ci ps->Device.fTpa = _TRUE; 130141cc406Sopenharmony_ci ps->sCaps.dwFlag |= SFLAG_TPA; 131141cc406Sopenharmony_ci p12ButtonSetup( ps, 5 ); 132141cc406Sopenharmony_ci break; 133141cc406Sopenharmony_ci 134141cc406Sopenharmony_ci case _SCANNER1Button: 135141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 1 Button\n" ); 136141cc406Sopenharmony_ci p12ButtonSetup( ps, 1 ); 137141cc406Sopenharmony_ci break; 138141cc406Sopenharmony_ci 139141cc406Sopenharmony_ci case _SCANNER1ButtonTPA: 140141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 1 Button & TPA\n" ); 141141cc406Sopenharmony_ci ps-> Device.fTpa = _TRUE; 142141cc406Sopenharmony_ci ps->sCaps.dwFlag |= SFLAG_TPA; 143141cc406Sopenharmony_ci p12ButtonSetup( ps, 1 ); 144141cc406Sopenharmony_ci break; 145141cc406Sopenharmony_ci 146141cc406Sopenharmony_ci case _AGFA_SCANNER: 147141cc406Sopenharmony_ci DBG( DBG_LOW, "Agfa Scanner\n" ); 148141cc406Sopenharmony_ci ps->Device.dwModelOriginY = 24; /* 1200 dpi */ 149141cc406Sopenharmony_ci break; 150141cc406Sopenharmony_ci 151141cc406Sopenharmony_ci case _SCANNER2Button: 152141cc406Sopenharmony_ci DBG( DBG_LOW, "Scanner has 2 Buttons\n" ); 153141cc406Sopenharmony_ci DBG( DBG_LOW, "Seems we have a Genius Colorpage Vivid III V2\n" ); 154141cc406Sopenharmony_ci ps->Device.dwModelOriginY = 64 - 33; 155141cc406Sopenharmony_ci p12ButtonSetup( ps, 2 ); 156141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_GEN_CPV2; 157141cc406Sopenharmony_ci break; 158141cc406Sopenharmony_ci 159141cc406Sopenharmony_ci default: 160141cc406Sopenharmony_ci DBG( DBG_LOW, "Default Model: P12\n" ); 161141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_P12; 162141cc406Sopenharmony_ci break; 163141cc406Sopenharmony_ci } 164141cc406Sopenharmony_ci 165141cc406Sopenharmony_ci if( _MOTOR0_2003 == ps->Device.bMotorID ) { 166141cc406Sopenharmony_ci ps->Device.f2003 = _TRUE; 167141cc406Sopenharmony_ci ps->Device.XStepMono = 10; 168141cc406Sopenharmony_ci ps->Device.XStepColor = 6; 169141cc406Sopenharmony_ci ps->Device.XStepBack = 5; 170141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType |= _MOTORR_STRONG; 171141cc406Sopenharmony_ci } else { 172141cc406Sopenharmony_ci ps->Device.f2003 = _FALSE; 173141cc406Sopenharmony_ci ps->Device.XStepMono = 8; 174141cc406Sopenharmony_ci ps->Device.XStepColor = 4; 175141cc406Sopenharmony_ci ps->Device.XStepBack = 5; 176141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType |= _MOTORR_WEAK; 177141cc406Sopenharmony_ci } 178141cc406Sopenharmony_ci} 179141cc406Sopenharmony_ci 180141cc406Sopenharmony_ci/*............................................................................. 181141cc406Sopenharmony_ci * prepare all the necessary variables - 182141cc406Sopenharmony_ci */ 183141cc406Sopenharmony_cistatic void p12SetupScannerVariables( pScanData ps ) 184141cc406Sopenharmony_ci{ 185141cc406Sopenharmony_ci DBG( DBG_LOW, "p12SetupScannerVariables()\n" ); 186141cc406Sopenharmony_ci 187141cc406Sopenharmony_ci /* 188141cc406Sopenharmony_ci * these values were originally altered by registry entries (NT-driver) 189141cc406Sopenharmony_ci * and used to adjust the picture position... 190141cc406Sopenharmony_ci */ 191141cc406Sopenharmony_ci ps->Device.lUpNormal = 0; 192141cc406Sopenharmony_ci ps->Device.lUpNegative = 20; 193141cc406Sopenharmony_ci ps->Device.lUpPositive = -30; 194141cc406Sopenharmony_ci 195141cc406Sopenharmony_ci ps->Device.lLeftNormal = 51; 196141cc406Sopenharmony_ci 197141cc406Sopenharmony_ci ps->OpenScanPath( ps ); 198141cc406Sopenharmony_ci ps->ReInitAsic( ps, _FALSE ); 199141cc406Sopenharmony_ci ps->CloseScanPath( ps ); 200141cc406Sopenharmony_ci} 201141cc406Sopenharmony_ci 202141cc406Sopenharmony_ci/*............................................................................. 203141cc406Sopenharmony_ci * 204141cc406Sopenharmony_ci */ 205141cc406Sopenharmony_cistatic void p12SetupScanningCondition( pScanData ps ) 206141cc406Sopenharmony_ci{ 207141cc406Sopenharmony_ci TimerDef timer; 208141cc406Sopenharmony_ci ULong channel; 209141cc406Sopenharmony_ci Byte bState; 210141cc406Sopenharmony_ci pUChar pState = ps->Bufs.b1.pReadBuf; 211141cc406Sopenharmony_ci 212141cc406Sopenharmony_ci DBG( DBG_LOW, "p12SetupScanningCondition()\n" ); 213141cc406Sopenharmony_ci 214141cc406Sopenharmony_ci P12SetGeneralRegister( ps ); 215141cc406Sopenharmony_ci 216141cc406Sopenharmony_ci IORegisterToScanner( ps, ps->RegResetMTSC ); 217141cc406Sopenharmony_ci 218141cc406Sopenharmony_ci /* ------- Setup MinRead/MaxRead Fifo size ------- */ 219141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType <= COLOR_TRUE24 ) { 220141cc406Sopenharmony_ci ps->Scan.dwMaxReadFifo = 221141cc406Sopenharmony_ci ps->Scan.dwMinReadFifo = ps->DataInf.dwAsicBytesPerPlane * 2; 222141cc406Sopenharmony_ci } else { 223141cc406Sopenharmony_ci ps->Scan.dwMaxReadFifo = 224141cc406Sopenharmony_ci ps->Scan.dwMinReadFifo = ps->DataInf.dwAppPixelsPerLine << 1; 225141cc406Sopenharmony_ci } 226141cc406Sopenharmony_ci 227141cc406Sopenharmony_ci if( ps->Scan.dwMinReadFifo < 1024) 228141cc406Sopenharmony_ci ps->Scan.dwMinReadFifo = ps->Scan.dwMaxReadFifo = 1024; 229141cc406Sopenharmony_ci 230141cc406Sopenharmony_ci ps->Scan.dwMaxReadFifo += (ps->DataInf.dwAsicBytesPerPlane / 2); 231141cc406Sopenharmony_ci 232141cc406Sopenharmony_ci 233141cc406Sopenharmony_ci DBG( DBG_LOW, "MinReadFifo=%u, MaxReadFifo=%u\n", 234141cc406Sopenharmony_ci ps->Scan.dwMinReadFifo, ps->Scan.dwMaxReadFifo ); 235141cc406Sopenharmony_ci 236141cc406Sopenharmony_ci /* ------- Set the max. read fifo to asic ------- */ 237141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType > COLOR_256GRAY ) { 238141cc406Sopenharmony_ci 239141cc406Sopenharmony_ci ps->Scan.bFifoSelect = ps->RegBFifoOffset; 240141cc406Sopenharmony_ci 241141cc406Sopenharmony_ci if( !ps->Scan.p48BitBuf.pb ) { 242141cc406Sopenharmony_ci 243141cc406Sopenharmony_ci Long lRed, lGreen; 244141cc406Sopenharmony_ci 245141cc406Sopenharmony_ci lRed = (_SIZE_REDFIFO - _SIZE_BLUEFIFO) / 246141cc406Sopenharmony_ci ps->DataInf.dwAsicBytesPerPlane - ps->Scan.bd_rk.wRedKeep; 247141cc406Sopenharmony_ci 248141cc406Sopenharmony_ci lGreen = (_SIZE_GREENFIFO - _SIZE_BLUEFIFO) / 249141cc406Sopenharmony_ci ps->DataInf.dwAsicBytesPerPlane - ps->Scan.gd_gk.wGreenKeep; 250141cc406Sopenharmony_ci 251141cc406Sopenharmony_ci if((lRed < 0) || (lGreen < 0)) { 252141cc406Sopenharmony_ci 253141cc406Sopenharmony_ci if( lRed < lGreen ) { 254141cc406Sopenharmony_ci channel = _RED_FULLSIZE << 16; 255141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize = _SIZE_REDFIFO; 256141cc406Sopenharmony_ci lGreen = lRed; 257141cc406Sopenharmony_ci } else { 258141cc406Sopenharmony_ci channel = _GREEN_FULLSIZE << 16; 259141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize = _SIZE_GREENFIFO; 260141cc406Sopenharmony_ci } 261141cc406Sopenharmony_ci 262141cc406Sopenharmony_ci lGreen = (ULong)(-lGreen * ps->DataInf.dwAsicBytesPerPlane); 263141cc406Sopenharmony_ci 264141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType > COLOR_TRUE24 ) 265141cc406Sopenharmony_ci lGreen >>= 1; 266141cc406Sopenharmony_ci 267141cc406Sopenharmony_ci ps->Scan.dwMinReadFifo += (ULong)lGreen; 268141cc406Sopenharmony_ci ps->Scan.dwMaxReadFifo += (ULong)lGreen; 269141cc406Sopenharmony_ci 270141cc406Sopenharmony_ci } else { 271141cc406Sopenharmony_ci channel = _BLUE_FULLSIZE << 16; 272141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize = _SIZE_BLUEFIFO; 273141cc406Sopenharmony_ci } 274141cc406Sopenharmony_ci } else { 275141cc406Sopenharmony_ci channel = _BLUE_FULLSIZE << 16; 276141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize = _SIZE_BLUEFIFO; 277141cc406Sopenharmony_ci } 278141cc406Sopenharmony_ci } else { 279141cc406Sopenharmony_ci ps->Scan.bFifoSelect = ps->RegGFifoOffset; 280141cc406Sopenharmony_ci channel = _GREEN_FULLSIZE << 16; 281141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize = _SIZE_GRAYFIFO; 282141cc406Sopenharmony_ci } 283141cc406Sopenharmony_ci 284141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize -= (ps->DataInf.dwAsicBytesPerPlane << 1); 285141cc406Sopenharmony_ci 286141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType > COLOR_TRUE24 ) 287141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize >>= 1; 288141cc406Sopenharmony_ci 289141cc406Sopenharmony_ci ps->AsicReg.RD_BufFullSize |= channel; 290141cc406Sopenharmony_ci 291141cc406Sopenharmony_ci ps->Scan.bRefresh = (Byte)(ps->Scan.dwInterval << 1); 292141cc406Sopenharmony_ci ps->AsicReg.RD_LineControl = (_LOBYTE (ps->Shade.wExposure)); 293141cc406Sopenharmony_ci ps->AsicReg.RD_ExtLineControl = (_HIBYTE (ps->Shade.wExposure)); 294141cc406Sopenharmony_ci ps->AsicReg.RD_XStepTime = (_LOBYTE (ps->Shade.wXStep)); 295141cc406Sopenharmony_ci ps->AsicReg.RD_ExtXStepTime = (_HIBYTE (ps->Shade.wXStep)); 296141cc406Sopenharmony_ci ps->AsicReg.RD_Motor0Control = _FORWARD_MOTOR; 297141cc406Sopenharmony_ci ps->AsicReg.RD_StepControl = _MOTOR0_SCANSTATE; 298141cc406Sopenharmony_ci ps->AsicReg.RD_ModeControl = (_ModeScan | _ModeFifoGSel); 299141cc406Sopenharmony_ci 300141cc406Sopenharmony_ci DBG( DBG_LOW, "bRefresh = %i\n", ps->Scan.bRefresh ); 301141cc406Sopenharmony_ci 302141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType == COLOR_BW ) { 303141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl = _SCAN_BITMODE; 304141cc406Sopenharmony_ci 305141cc406Sopenharmony_ci if( !(ps->DataInf.dwScanFlag & SCANDEF_Inverse)) 306141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl |= _P98_SCANDATA_INVERT; 307141cc406Sopenharmony_ci 308141cc406Sopenharmony_ci } else if( ps->DataInf.wPhyDataType <= COLOR_TRUE24 ) 309141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl = _SCAN_BYTEMODE; 310141cc406Sopenharmony_ci else { 311141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl = _SCAN_12BITMODE; 312141cc406Sopenharmony_ci 313141cc406Sopenharmony_ci if(!(ps->DataInf.dwScanFlag & SCANDEF_RightAlign)) 314141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl |= _BITALIGN_LEFT; 315141cc406Sopenharmony_ci 316141cc406Sopenharmony_ci if( ps->DataInf.dwScanFlag & SCANDEF_Inverse) 317141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl |= _P98_SCANDATA_INVERT; 318141cc406Sopenharmony_ci } 319141cc406Sopenharmony_ci 320141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl |= _SCAN_1ST_AVERAGE; 321141cc406Sopenharmony_ci IOSelectLampSource( ps ); 322141cc406Sopenharmony_ci 323141cc406Sopenharmony_ci DBG( DBG_LOW, "RD_ScanControl = 0x%02x\n", ps->AsicReg.RD_ScanControl ); 324141cc406Sopenharmony_ci 325141cc406Sopenharmony_ci ps->AsicReg.RD_MotorTotalSteps = (ULong)ps->DataInf.crImage.cy * 4 + 326141cc406Sopenharmony_ci ((ps->Device.f0_8_16) ? 32 : 16) + 327141cc406Sopenharmony_ci ((ps->Scan.bDiscardAll) ? 32 : 0); 328141cc406Sopenharmony_ci 329141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl1 = (_MTSC_ENABLE | _SCANSTOPONBUFFULL | 330141cc406Sopenharmony_ci _MFRC_RUNSCANSTATE | _MFRC_BY_XSTEP); 331141cc406Sopenharmony_ci 332141cc406Sopenharmony_ci ps->AsicReg.RD_Dpi = ps->DataInf.xyPhyDpi.x; 333141cc406Sopenharmony_ci 334141cc406Sopenharmony_ci if(!(ps->DataInf.dwScanFlag & SCANDEF_TPA )) { 335141cc406Sopenharmony_ci 336141cc406Sopenharmony_ci ps->AsicReg.RD_Origin = (UShort)(ps->Device.lLeftNormal * 2 + 337141cc406Sopenharmony_ci ps->Device.DataOriginX + 338141cc406Sopenharmony_ci ps->DataInf.crImage.x ); 339141cc406Sopenharmony_ci 340141cc406Sopenharmony_ci } else if( ps->DataInf.dwScanFlag & SCANDEF_Transparency ) { 341141cc406Sopenharmony_ci ps->AsicReg.RD_Origin = 342141cc406Sopenharmony_ci (UShort)(ps->Scan.posBegin + ps->DataInf.crImage.x); 343141cc406Sopenharmony_ci } else { 344141cc406Sopenharmony_ci ps->AsicReg.RD_Origin = 345141cc406Sopenharmony_ci (UShort)(ps->Scan.negBegin + ps->DataInf.crImage.x); 346141cc406Sopenharmony_ci } 347141cc406Sopenharmony_ci 348141cc406Sopenharmony_ci if( ps->Shade.bIntermediate & _ScanMode_AverageOut ) 349141cc406Sopenharmony_ci ps->AsicReg.RD_Origin >>= 1; 350141cc406Sopenharmony_ci 351141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType == COLOR_BW ) 352141cc406Sopenharmony_ci ps->AsicReg.RD_Pixels = (UShort)ps->DataInf.dwAsicBytesPerPlane; 353141cc406Sopenharmony_ci else 354141cc406Sopenharmony_ci ps->AsicReg.RD_Pixels = (UShort)ps->DataInf.dwAppPixelsPerLine; 355141cc406Sopenharmony_ci 356141cc406Sopenharmony_ci DBG( DBG_LOW, "RD_Origin = %u, RD_Pixels = %u\n", 357141cc406Sopenharmony_ci ps->AsicReg.RD_Origin, ps->AsicReg.RD_Pixels ); 358141cc406Sopenharmony_ci 359141cc406Sopenharmony_ci /* ------- Prepare scan states ------- */ 360141cc406Sopenharmony_ci memset( ps->a_nbNewAdrPointer, 0, _SCANSTATE_BYTES ); 361141cc406Sopenharmony_ci memset( ps->Bufs.b1.pReadBuf, 0, _NUMBER_OF_SCANSTEPS ); 362141cc406Sopenharmony_ci 363141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType <= COLOR_256GRAY ) 364141cc406Sopenharmony_ci bState = (_SS_MONO | _SS_STEP); 365141cc406Sopenharmony_ci else 366141cc406Sopenharmony_ci bState = (_SS_COLOR | _SS_STEP); 367141cc406Sopenharmony_ci 368141cc406Sopenharmony_ci for( channel = _NUMBER_OF_SCANSTEPS; 369141cc406Sopenharmony_ci channel; channel -= ps->Scan.dwInterval ) { 370141cc406Sopenharmony_ci *pState = bState; 371141cc406Sopenharmony_ci if( ps->Scan.dwInterlace ) 372141cc406Sopenharmony_ci pState[ ps->Scan.dwInterlace] = _SS_STEP; 373141cc406Sopenharmony_ci pState += ps->Scan.dwInterval; 374141cc406Sopenharmony_ci } 375141cc406Sopenharmony_ci for( channel = 0, pState = ps->Bufs.b1.pReadBuf; 376141cc406Sopenharmony_ci channel < _SCANSTATE_BYTES; channel++) { 377141cc406Sopenharmony_ci ps->a_nbNewAdrPointer[channel] = pState [0] | (pState [1] << 4); 378141cc406Sopenharmony_ci pState += 2; 379141cc406Sopenharmony_ci } 380141cc406Sopenharmony_ci 381141cc406Sopenharmony_ci /* ------- Wait for scan state stop ------- */ 382141cc406Sopenharmony_ci MiscStartTimer( &timer, _SECOND * 2 ); 383141cc406Sopenharmony_ci 384141cc406Sopenharmony_ci while(!(IOGetScanState( ps, _FALSE ) & _SCANSTATE_STOP) && 385141cc406Sopenharmony_ci !MiscCheckTimer(&timer)); 386141cc406Sopenharmony_ci 387141cc406Sopenharmony_ci/* CHECK: Replace by IOPutAll.... */ 388141cc406Sopenharmony_ci IODownloadScanStates( ps ); 389141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegLineControl, ps->AsicReg.RD_LineControl); 390141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegExtendedLineControl, 391141cc406Sopenharmony_ci ps->AsicReg.RD_ExtLineControl); 392141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegXStepTime, ps->AsicReg.RD_XStepTime); 393141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegExtendedXStep, ps->AsicReg.RD_ExtXStepTime); 394141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegMotorDriverType, 395141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType); 396141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegStepControl, ps->AsicReg.RD_StepControl); 397141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegMotor0Control, ps->AsicReg.RD_Motor0Control); 398141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegModelControl,ps->AsicReg.RD_ModelControl); 399141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegDpiLow, (_LOBYTE(ps->AsicReg.RD_Dpi))); 400141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegDpiHigh, (_HIBYTE(ps->AsicReg.RD_Dpi))); 401141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegScanPosLow, (_LOBYTE(ps->AsicReg.RD_Origin))); 402141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegScanPosHigh,(_HIBYTE(ps->AsicReg.RD_Origin))); 403141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegWidthPixelsLow, 404141cc406Sopenharmony_ci (_LOBYTE(ps->AsicReg.RD_Pixels))); 405141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegWidthPixelsHigh, 406141cc406Sopenharmony_ci (_HIBYTE(ps->AsicReg.RD_Pixels))); 407141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegThresholdLow, 408141cc406Sopenharmony_ci (_LOBYTE(ps->AsicReg.RD_ThresholdControl))); 409141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegThresholdHigh, 410141cc406Sopenharmony_ci (_HIBYTE(ps->AsicReg.RD_ThresholdControl))); 411141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegMotorTotalStep0, 412141cc406Sopenharmony_ci (_LOBYTE(ps->AsicReg.RD_MotorTotalSteps))); 413141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegMotorTotalStep1, 414141cc406Sopenharmony_ci (_HIBYTE(ps->AsicReg.RD_MotorTotalSteps))); 415141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegScanControl, ps->AsicReg.RD_ScanControl); 416141cc406Sopenharmony_ci 417141cc406Sopenharmony_ci IORegisterToScanner( ps, ps->RegInitDataFifo); 418141cc406Sopenharmony_ci} 419141cc406Sopenharmony_ci 420141cc406Sopenharmony_ci/*............................................................................. 421141cc406Sopenharmony_ci * program the CCD relevant stuff 422141cc406Sopenharmony_ci */ 423141cc406Sopenharmony_cistatic void p12ProgramCCD( pScanData ps) 424141cc406Sopenharmony_ci{ 425141cc406Sopenharmony_ci UShort w; 426141cc406Sopenharmony_ci pRegDef rp; 427141cc406Sopenharmony_ci 428141cc406Sopenharmony_ci DBG( DBG_IO, "p12ProgramCCD: 0x%08lx[%lu]\n", 429141cc406Sopenharmony_ci (unsigned long)ps->Device.pCCDRegisters, 430141cc406Sopenharmony_ci ((unsigned long)ps->Device.wNumCCDRegs * ps->Shade.bIntermediate)); 431141cc406Sopenharmony_ci 432141cc406Sopenharmony_ci DBG( DBG_IO, " %u regs * %u (intermediate)\n", 433141cc406Sopenharmony_ci ps->Device.wNumCCDRegs, ps->Shade.bIntermediate ); 434141cc406Sopenharmony_ci 435141cc406Sopenharmony_ci rp = ps->Device.pCCDRegisters + 436141cc406Sopenharmony_ci (ULong)ps->Device.wNumCCDRegs * ps->Shade.bIntermediate; 437141cc406Sopenharmony_ci 438141cc406Sopenharmony_ci for( w = ps->Device.wNumCCDRegs; w--; rp++ ) { 439141cc406Sopenharmony_ci 440141cc406Sopenharmony_ci DBG( DBG_IO, "[0x%02x] = 0x%02x\n", rp->bReg, rp->bParam ); 441141cc406Sopenharmony_ci IODataToRegister( ps, rp->bReg, rp->bParam ); 442141cc406Sopenharmony_ci } 443141cc406Sopenharmony_ci} 444141cc406Sopenharmony_ci 445141cc406Sopenharmony_ci/*............................................................................. 446141cc406Sopenharmony_ci * this initializes the ASIC and prepares the different functions for shading 447141cc406Sopenharmony_ci * and scanning 448141cc406Sopenharmony_ci */ 449141cc406Sopenharmony_cistatic void p12Init98003( pScanData ps, Bool shading ) 450141cc406Sopenharmony_ci{ 451141cc406Sopenharmony_ci DBG( DBG_LOW, "p12InitP98003(%d)\n", shading ); 452141cc406Sopenharmony_ci 453141cc406Sopenharmony_ci /* get DAC and motor stuff */ 454141cc406Sopenharmony_ci ps->Device.bDACType = IODataFromRegister( ps, ps->RegResetConfig ); 455141cc406Sopenharmony_ci ps->Device.bMotorID = (Byte)(ps->Device.bDACType & _MOTOR0_MASK); 456141cc406Sopenharmony_ci 457141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType = 458141cc406Sopenharmony_ci (Byte)((ps->Device.bDACType & _MOTOR0_MASK) >> 3); 459141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType |= 460141cc406Sopenharmony_ci (Byte)((ps->Device.bDACType & _MOTOR1_MASK) >> 1); 461141cc406Sopenharmony_ci 462141cc406Sopenharmony_ci 463141cc406Sopenharmony_ci ps->Scan.motorPower = ps->AsicReg.RD_MotorDriverType | _MOTORR_STRONG; 464141cc406Sopenharmony_ci 465141cc406Sopenharmony_ci ps->Device.bDACType &= _ADC_MASK; 466141cc406Sopenharmony_ci 467141cc406Sopenharmony_ci /*get CCD and PCB ID */ 468141cc406Sopenharmony_ci ps->Device.bPCBID = IODataFromRegister( ps, ps->RegConfiguration ); 469141cc406Sopenharmony_ci ps->Device.bCCDID = ps->Device.bPCBID & 0x07; 470141cc406Sopenharmony_ci ps->Device.bPCBID &= 0xf0; 471141cc406Sopenharmony_ci 472141cc406Sopenharmony_ci if( _AGFA_SCANNER == ps->Device.bPCBID ) 473141cc406Sopenharmony_ci ps->Device.bDACType = _DA_WOLFSON8141; 474141cc406Sopenharmony_ci 475141cc406Sopenharmony_ci DBG( DBG_LOW, "PCB-ID=0x%02x, CCD-ID=0x%02x, DAC-TYPE=0x%02x\n", 476141cc406Sopenharmony_ci ps->Device.bPCBID, ps->Device.bCCDID, ps->Device.bDACType ); 477141cc406Sopenharmony_ci 478141cc406Sopenharmony_ci p12InitiateComponentModel( ps ); 479141cc406Sopenharmony_ci 480141cc406Sopenharmony_ci /* encode the CCD-id into the flag parameter */ 481141cc406Sopenharmony_ci ps->sCaps.dwFlag |= ((ULong)(ps->Device.bCCDID | ps->Device.bPCBID) << 16); 482141cc406Sopenharmony_ci 483141cc406Sopenharmony_ci P12InitCCDandDAC( ps, shading ); 484141cc406Sopenharmony_ci 485141cc406Sopenharmony_ci if( ps->Shade.bIntermediate & _ScanMode_Mono ) 486141cc406Sopenharmony_ci ps->AsicReg.RD_Model1Control = ps->Device.Model1Mono; 487141cc406Sopenharmony_ci else 488141cc406Sopenharmony_ci ps->AsicReg.RD_Model1Control = ps->Device.Model1Color; 489141cc406Sopenharmony_ci 490141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegPllPredivider, 1 ); 491141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegPllMaindivider, 0x20 ); 492141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegPllPostdivider, 2 ); 493141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegClockSelector, 3 ); /* 2 */ 494141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegMotorDriverType, 495141cc406Sopenharmony_ci ps->AsicReg.RD_MotorDriverType ); 496141cc406Sopenharmony_ci 497141cc406Sopenharmony_ci /* this might be changed, def value is 11 */ 498141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegWaitStateInsert, 11 ); 499141cc406Sopenharmony_ci IODataToRegister( ps, ps->RegModel1Control, ps->AsicReg.RD_Model1Control ); 500141cc406Sopenharmony_ci 501141cc406Sopenharmony_ci p12ProgramCCD( ps ); 502141cc406Sopenharmony_ci} 503141cc406Sopenharmony_ci 504141cc406Sopenharmony_ci/*............................................................................. 505141cc406Sopenharmony_ci * initialize the register values for the 98003 asic and preset other stuff 506141cc406Sopenharmony_ci */ 507141cc406Sopenharmony_cistatic void p12InitializeAsicRegister( pScanData ps ) 508141cc406Sopenharmony_ci{ 509141cc406Sopenharmony_ci memset( &ps->AsicReg, 0, sizeof(RegData)); 510141cc406Sopenharmony_ci} 511141cc406Sopenharmony_ci 512141cc406Sopenharmony_ci/*............................................................................. 513141cc406Sopenharmony_ci * as the function name says 514141cc406Sopenharmony_ci */ 515141cc406Sopenharmony_cistatic void p12PutToIdleMode( pScanData ps ) 516141cc406Sopenharmony_ci{ 517141cc406Sopenharmony_ci ULong i; 518141cc406Sopenharmony_ci 519141cc406Sopenharmony_ci ps->OpenScanPath( ps ); 520141cc406Sopenharmony_ci 521141cc406Sopenharmony_ci DBG( DBG_IO, "CCD-Stop\n" ); 522141cc406Sopenharmony_ci 523141cc406Sopenharmony_ci for( i = 0; i < 13; i++ ) { 524141cc406Sopenharmony_ci 525141cc406Sopenharmony_ci DBG( DBG_IO, "[0x%02x] = 0x%02x\n", 526141cc406Sopenharmony_ci p12CcdStop[i].bReg, p12CcdStop[i].bParam ); 527141cc406Sopenharmony_ci 528141cc406Sopenharmony_ci IODataToRegister( ps, p12CcdStop[i].bReg, p12CcdStop[i].bParam ); 529141cc406Sopenharmony_ci } 530141cc406Sopenharmony_ci 531141cc406Sopenharmony_ci ps->CloseScanPath( ps ); 532141cc406Sopenharmony_ci} 533141cc406Sopenharmony_ci 534141cc406Sopenharmony_ci/*............................................................................. 535141cc406Sopenharmony_ci * here we simply call the WaitForShading function which performs this topic 536141cc406Sopenharmony_ci */ 537141cc406Sopenharmony_cistatic int p12Calibration( pScanData ps ) 538141cc406Sopenharmony_ci{ 539141cc406Sopenharmony_ci Bool result; 540141cc406Sopenharmony_ci 541141cc406Sopenharmony_ci DBG( DBG_LOW, "p12Calibration()\n" ); 542141cc406Sopenharmony_ci 543141cc406Sopenharmony_ci /* 544141cc406Sopenharmony_ci * wait for shading to be done 545141cc406Sopenharmony_ci */ 546141cc406Sopenharmony_ci ps->OpenScanPath( ps ); 547141cc406Sopenharmony_ci 548141cc406Sopenharmony_ci _ASSERT(ps->WaitForShading); 549141cc406Sopenharmony_ci result = ps->WaitForShading( ps ); 550141cc406Sopenharmony_ci ps->CloseScanPath( ps ); 551141cc406Sopenharmony_ci 552141cc406Sopenharmony_ci if( !result ) 553141cc406Sopenharmony_ci return _E_TIMEOUT; 554141cc406Sopenharmony_ci 555141cc406Sopenharmony_ci return _OK; 556141cc406Sopenharmony_ci} 557141cc406Sopenharmony_ci 558141cc406Sopenharmony_ci/************************ exported functions *********************************/ 559141cc406Sopenharmony_ci 560141cc406Sopenharmony_ci/*............................................................................. 561141cc406Sopenharmony_ci * initialize the register values and function calls for the 98003 asic 562141cc406Sopenharmony_ci */ 563141cc406Sopenharmony_ci_LOC int P12InitAsic( pScanData ps ) 564141cc406Sopenharmony_ci{ 565141cc406Sopenharmony_ci int result; 566141cc406Sopenharmony_ci 567141cc406Sopenharmony_ci DBG( DBG_LOW, "P12InitAsic()\n" ); 568141cc406Sopenharmony_ci 569141cc406Sopenharmony_ci /* 570141cc406Sopenharmony_ci * preset the asic shadow registers 571141cc406Sopenharmony_ci */ 572141cc406Sopenharmony_ci p12InitializeAsicRegister( ps ); 573141cc406Sopenharmony_ci 574141cc406Sopenharmony_ci ps->IO.bOpenCount = 0; 575141cc406Sopenharmony_ci 576141cc406Sopenharmony_ci /* 577141cc406Sopenharmony_ci * setup the register values 578141cc406Sopenharmony_ci */ 579141cc406Sopenharmony_ci ps->RegSwitchBus = 0; 580141cc406Sopenharmony_ci ps->RegEPPEnable = 1; 581141cc406Sopenharmony_ci ps->RegECPEnable = 2; 582141cc406Sopenharmony_ci ps->RegReadDataMode = 3; 583141cc406Sopenharmony_ci ps->RegWriteDataMode = 4; 584141cc406Sopenharmony_ci ps->RegInitDataFifo = 5; 585141cc406Sopenharmony_ci ps->RegForceStep = 6; 586141cc406Sopenharmony_ci ps->RegInitScanState = 7; 587141cc406Sopenharmony_ci ps->RegRefreshScanState = 8; 588141cc406Sopenharmony_ci ps->RegWaitStateInsert = 0x0a; 589141cc406Sopenharmony_ci ps->RegRFifoOffset = 0x0a; 590141cc406Sopenharmony_ci ps->RegGFifoOffset = 0x0b; 591141cc406Sopenharmony_ci ps->RegBFifoOffset = 0x0c; 592141cc406Sopenharmony_ci ps->RegBitDepth = 0x13; 593141cc406Sopenharmony_ci ps->RegStepControl = 0x14; 594141cc406Sopenharmony_ci ps->RegMotor0Control = 0x15; 595141cc406Sopenharmony_ci ps->RegXStepTime = 0x16; 596141cc406Sopenharmony_ci ps->RegGetScanState = 0x17; 597141cc406Sopenharmony_ci ps->RegAsicID = 0x18; 598141cc406Sopenharmony_ci ps->RegMemoryLow = 0x19; 599141cc406Sopenharmony_ci ps->RegMemoryHigh = 0x1a; 600141cc406Sopenharmony_ci ps->RegModeControl = 0x1b; 601141cc406Sopenharmony_ci ps->RegLineControl = 0x1c; 602141cc406Sopenharmony_ci ps->RegScanControl = 0x1d; 603141cc406Sopenharmony_ci ps->RegConfiguration = 0x1e; 604141cc406Sopenharmony_ci ps->RegModelControl = 0x1f; 605141cc406Sopenharmony_ci ps->RegModel1Control = 0x20; 606141cc406Sopenharmony_ci ps->RegDpiLow = 0x21; 607141cc406Sopenharmony_ci ps->RegDpiHigh = 0x22; 608141cc406Sopenharmony_ci ps->RegScanPosLow = 0x23; 609141cc406Sopenharmony_ci ps->RegScanPosHigh = 0x24; 610141cc406Sopenharmony_ci ps->RegWidthPixelsLow = 0x25; 611141cc406Sopenharmony_ci ps->RegWidthPixelsHigh = 0x26; 612141cc406Sopenharmony_ci ps->RegThresholdLow = 0x27; 613141cc406Sopenharmony_ci ps->RegThresholdHigh = 0x28; 614141cc406Sopenharmony_ci ps->RegThresholdGapControl = 0x29; 615141cc406Sopenharmony_ci ps->RegADCAddress = 0x2a; 616141cc406Sopenharmony_ci ps->RegADCData = 0x2b; 617141cc406Sopenharmony_ci ps->RegADCPixelOffset = 0x2c; 618141cc406Sopenharmony_ci ps->RegADCSerialOutStr = 0x2d; 619141cc406Sopenharmony_ci ps->RegResetConfig = 0x2e; 620141cc406Sopenharmony_ci ps->RegLensPosition = 0x2f; 621141cc406Sopenharmony_ci ps->RegStatus = 0x30; 622141cc406Sopenharmony_ci ps->RegScanStateControl = 0x31; 623141cc406Sopenharmony_ci ps->RegRedChDarkOffsetLow = 0x33; 624141cc406Sopenharmony_ci ps->RegRedChDarkOffsetHigh = 0x34; 625141cc406Sopenharmony_ci ps->RegGreenChDarkOffsetLow = 0x35; 626141cc406Sopenharmony_ci ps->RegGreenChDarkOffsetHigh= 0x36; 627141cc406Sopenharmony_ci ps->RegBlueChDarkOffsetLow = 0x37; 628141cc406Sopenharmony_ci ps->RegBlueChDarkOffsetHigh = 0x38; 629141cc406Sopenharmony_ci ps->RegResetPulse0 = 0x39; 630141cc406Sopenharmony_ci ps->RegResetPulse1 = 0x3a; 631141cc406Sopenharmony_ci ps->RegCCDClampTiming0 = 0x3b; 632141cc406Sopenharmony_ci ps->RegCCDClampTiming1 = 0x3c; 633141cc406Sopenharmony_ci ps->RegVSMPTiming0 = 0x41; 634141cc406Sopenharmony_ci ps->RegVSMPTiming1 = 0x42; 635141cc406Sopenharmony_ci ps->RegCCDQ1Timing0 = 0x43; 636141cc406Sopenharmony_ci ps->RegCCDQ1Timing1 = 0x44; 637141cc406Sopenharmony_ci ps->RegCCDQ1Timing2 = 0x45; 638141cc406Sopenharmony_ci ps->RegCCDQ1Timing3 = 0x46; 639141cc406Sopenharmony_ci ps->RegCCDQ2Timing0 = 0x47; 640141cc406Sopenharmony_ci ps->RegCCDQ2Timing1 = 0x48; 641141cc406Sopenharmony_ci ps->RegCCDQ2Timing2 = 0x49; 642141cc406Sopenharmony_ci ps->RegCCDQ2Timing3 = 0x4a; 643141cc406Sopenharmony_ci ps->RegADCclockTiming0 = 0x4b; 644141cc406Sopenharmony_ci ps->RegADCclockTiming1 = 0x4c; 645141cc406Sopenharmony_ci ps->RegADCclockTiming2 = 0x4d; 646141cc406Sopenharmony_ci ps->RegADCclockTiming3 = 0x4e; 647141cc406Sopenharmony_ci ps->RegADCDVTiming0 = 0x50; 648141cc406Sopenharmony_ci ps->RegADCDVTiming1 = 0x51; 649141cc406Sopenharmony_ci ps->RegADCDVTiming2 = 0x52; 650141cc406Sopenharmony_ci ps->RegADCDVTiming3 = 0x53; 651141cc406Sopenharmony_ci 652141cc406Sopenharmony_ci ps->RegFifoFullLength0 = 0x54; 653141cc406Sopenharmony_ci ps->RegFifoFullLength1 = 0x55; 654141cc406Sopenharmony_ci ps->RegFifoFullLength2 = 0x56; 655141cc406Sopenharmony_ci 656141cc406Sopenharmony_ci ps->RegMotorTotalStep0 = 0x57; 657141cc406Sopenharmony_ci ps->RegMotorTotalStep1 = 0x58; 658141cc406Sopenharmony_ci ps->RegMotorFreeRunCount0 = 0x59; 659141cc406Sopenharmony_ci ps->RegMotorFreeRunCount1 = 0x5a; 660141cc406Sopenharmony_ci ps->RegScanControl1 = 0x5b; 661141cc406Sopenharmony_ci ps->RegMotorFreeRunTrigger = 0x5c; 662141cc406Sopenharmony_ci 663141cc406Sopenharmony_ci ps->RegResetMTSC = 0x5d; 664141cc406Sopenharmony_ci 665141cc406Sopenharmony_ci ps->RegMotor1Control = 0x62; 666141cc406Sopenharmony_ci ps->RegMotor2Control = 0x63; 667141cc406Sopenharmony_ci ps->RegMotorDriverType = 0x64; 668141cc406Sopenharmony_ci 669141cc406Sopenharmony_ci ps->RegStatus2 = 0x66; 670141cc406Sopenharmony_ci 671141cc406Sopenharmony_ci ps->RegExtendedLineControl = 0x6d; 672141cc406Sopenharmony_ci ps->RegExtendedXStep = 0x6e; 673141cc406Sopenharmony_ci 674141cc406Sopenharmony_ci ps->RegPllPredivider = 0x71; 675141cc406Sopenharmony_ci ps->RegPllMaindivider = 0x72; 676141cc406Sopenharmony_ci ps->RegPllPostdivider = 0x73; 677141cc406Sopenharmony_ci ps->RegClockSelector = 0x74; 678141cc406Sopenharmony_ci ps->RegTestMode = 0xf0; 679141cc406Sopenharmony_ci 680141cc406Sopenharmony_ci /* 681141cc406Sopenharmony_ci * setup function calls 682141cc406Sopenharmony_ci */ 683141cc406Sopenharmony_ci ps->SetupScannerVariables = p12SetupScannerVariables; 684141cc406Sopenharmony_ci ps->SetupScanningCondition = p12SetupScanningCondition; 685141cc406Sopenharmony_ci ps->Calibration = p12Calibration; 686141cc406Sopenharmony_ci ps->PutToIdleMode = p12PutToIdleMode; 687141cc406Sopenharmony_ci ps->ReInitAsic = p12Init98003; 688141cc406Sopenharmony_ci 689141cc406Sopenharmony_ci ps->CtrlReadHighNibble = _CTRL_GENSIGNAL + _CTRL_AUTOLF + _CTRL_STROBE; 690141cc406Sopenharmony_ci ps->CtrlReadLowNibble = _CTRL_GENSIGNAL + _CTRL_AUTOLF; 691141cc406Sopenharmony_ci 692141cc406Sopenharmony_ci ps->IO.useEPPCmdMode = _FALSE; 693141cc406Sopenharmony_ci 694141cc406Sopenharmony_ci /* 695141cc406Sopenharmony_ci * initialize the other modules and set some 696141cc406Sopenharmony_ci * function pointer 697141cc406Sopenharmony_ci */ 698141cc406Sopenharmony_ci result = DacInitialize( ps ); 699141cc406Sopenharmony_ci if( _OK != result ) 700141cc406Sopenharmony_ci return result; 701141cc406Sopenharmony_ci 702141cc406Sopenharmony_ci result = ImageInitialize( ps ); 703141cc406Sopenharmony_ci if( _OK != result ) 704141cc406Sopenharmony_ci return result; 705141cc406Sopenharmony_ci 706141cc406Sopenharmony_ci result = IOFuncInitialize( ps ); 707141cc406Sopenharmony_ci if( _OK != result ) 708141cc406Sopenharmony_ci return result; 709141cc406Sopenharmony_ci 710141cc406Sopenharmony_ci result = IOInitialize( ps ); 711141cc406Sopenharmony_ci if( _OK != result ) 712141cc406Sopenharmony_ci return result; 713141cc406Sopenharmony_ci 714141cc406Sopenharmony_ci result = MotorInitialize( ps ); 715141cc406Sopenharmony_ci if( _OK != result ) 716141cc406Sopenharmony_ci return result; 717141cc406Sopenharmony_ci 718141cc406Sopenharmony_ci if( _FALSE == ps->OpenScanPath( ps )) { 719141cc406Sopenharmony_ci DBG( DBG_LOW, "P12InitAsic() failed.\n" ); 720141cc406Sopenharmony_ci return _E_NO_DEV; 721141cc406Sopenharmony_ci } 722141cc406Sopenharmony_ci 723141cc406Sopenharmony_ci /*get CCD and PCB ID */ 724141cc406Sopenharmony_ci ps->Device.bPCBID = IODataFromRegister( ps, ps->RegConfiguration ); 725141cc406Sopenharmony_ci ps->Device.bCCDID = ps->Device.bPCBID & 0x07; 726141cc406Sopenharmony_ci ps->Device.bPCBID &= 0xf0; 727141cc406Sopenharmony_ci 728141cc406Sopenharmony_ci DBG( DBG_LOW, "PCB-ID=0x%02x, CCD-ID=0x%02x\n", ps->Device.bPCBID, ps->Device.bCCDID ); 729141cc406Sopenharmony_ci 730141cc406Sopenharmony_ci /* get a more closer model description...*/ 731141cc406Sopenharmony_ci p12InitiateComponentModel( ps ); 732141cc406Sopenharmony_ci 733141cc406Sopenharmony_ci ps->CloseScanPath( ps ); 734141cc406Sopenharmony_ci 735141cc406Sopenharmony_ci /* here we check for the OpticWorks 2000, which is not supported */ 736141cc406Sopenharmony_ci if( _OPTICWORKS2000 == ps->Device.bPCBID ) { 737141cc406Sopenharmony_ci DBG( DBG_LOW, "OpticWorks 2000 not supported!\n" ); 738141cc406Sopenharmony_ci return _E_NOSUPP; 739141cc406Sopenharmony_ci } 740141cc406Sopenharmony_ci 741141cc406Sopenharmony_ci DBG( DBG_LOW, "P12InitAsic() done.\n" ); 742141cc406Sopenharmony_ci return _OK; 743141cc406Sopenharmony_ci} 744141cc406Sopenharmony_ci 745141cc406Sopenharmony_ci/*............................................................................. 746141cc406Sopenharmony_ci * set all necessary register contents 747141cc406Sopenharmony_ci */ 748141cc406Sopenharmony_ci_LOC void P12SetGeneralRegister( pScanData ps ) 749141cc406Sopenharmony_ci{ 750141cc406Sopenharmony_ci DBG( DBG_LOW, "P12SetGeneralRegister()\n" ); 751141cc406Sopenharmony_ci 752141cc406Sopenharmony_ci ps->Scan.fMotorBackward = _FALSE; 753141cc406Sopenharmony_ci ps->Scan.fRefreshState = _FALSE; 754141cc406Sopenharmony_ci 755141cc406Sopenharmony_ci if( COLOR_BW == ps->DataInf.wPhyDataType ) 756141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl = _SCAN_BITMODE; 757141cc406Sopenharmony_ci else { 758141cc406Sopenharmony_ci if( ps->DataInf.wPhyDataType <= COLOR_TRUE24 ) 759141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl = _SCAN_BYTEMODE; 760141cc406Sopenharmony_ci else 761141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl = _SCAN_12BITMODE; 762141cc406Sopenharmony_ci } 763141cc406Sopenharmony_ci 764141cc406Sopenharmony_ci IOSelectLampSource( ps ); 765141cc406Sopenharmony_ci 766141cc406Sopenharmony_ci if( ps->Shade.bIntermediate & _ScanMode_AverageOut ) 767141cc406Sopenharmony_ci ps->AsicReg.RD_ModelControl = ps->Device.ModelCtrl | _ModelDpi300; 768141cc406Sopenharmony_ci else 769141cc406Sopenharmony_ci ps->AsicReg.RD_ModelControl = ps->Device.ModelCtrl | _ModelDpi600; 770141cc406Sopenharmony_ci 771141cc406Sopenharmony_ci ps->AsicReg.RD_Motor0Control = _MotorOn | _MotorHQuarterStep | _MotorPowerEnable; 772141cc406Sopenharmony_ci ps->AsicReg.RD_ScanControl1 = _SCANSTOPONBUFFULL | _MFRC_BY_XSTEP; 773141cc406Sopenharmony_ci ps->AsicReg.RD_StepControl = _MOTOR0_SCANSTATE; 774141cc406Sopenharmony_ci} 775141cc406Sopenharmony_ci 776141cc406Sopenharmony_ci/* END PLUSTEK-PP_P12.C .....................................................*/ 777