1141cc406Sopenharmony_ci/* @file plustek-pp_models.c 2141cc406Sopenharmony_ci * @brief model specific stuff 3141cc406Sopenharmony_ci * 4141cc406Sopenharmony_ci * based on sources acquired from Plustek Inc. 5141cc406Sopenharmony_ci * Copyright (C) 1998 Plustek Inc. 6141cc406Sopenharmony_ci * Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de> 7141cc406Sopenharmony_ci * also based on the work done by Rick Bronson 8141cc406Sopenharmony_ci * 9141cc406Sopenharmony_ci * History: 10141cc406Sopenharmony_ci * - 0.30 - initial version 11141cc406Sopenharmony_ci * - 0.31 - no changes 12141cc406Sopenharmony_ci * - 0.32 - no changes 13141cc406Sopenharmony_ci * - 0.33 - no changes 14141cc406Sopenharmony_ci * - 0.34 - no changes 15141cc406Sopenharmony_ci * - 0.35 - added some comments 16141cc406Sopenharmony_ci * - did some fine tuning on the 9630P and 12000P/9600P models 17141cc406Sopenharmony_ci * - moved function initPageSettings() to this module 18141cc406Sopenharmony_ci * - 0.36 - as the ps->MaxWideLineBlks and ps->MaxWideLineLen are only used 19141cc406Sopenharmony_ci * for the OP 4800, it has been removed from pScanData 20141cc406Sopenharmony_ci * - changed settings of OP600 according to the Primax Direct 4800 tests 21141cc406Sopenharmony_ci * - removed dwPreferSize from struct ScannerCaps 22141cc406Sopenharmony_ci * - fixed the 5seconds bed-hit problem for ASIC 96001/3 based models 23141cc406Sopenharmony_ci * - changes, due to define renaming 24141cc406Sopenharmony_ci * - 0.37 - added ButtonCount init 25141cc406Sopenharmony_ci * - added A3I model 26141cc406Sopenharmony_ci * - added functions modelInitCaps(), modelInitMotor() and 27141cc406Sopenharmony_ci * modelSetBufferSizes() 28141cc406Sopenharmony_ci * - 0.38 - added P12 stuff 29141cc406Sopenharmony_ci * - code cleanup 30141cc406Sopenharmony_ci * - 0.39 - no changes 31141cc406Sopenharmony_ci * - 0.40 - changed back to build 0.39-3 (disabled A3I stuff) 32141cc406Sopenharmony_ci * - 0.41 - added _OVR_PLUSTEK_4800P switch 33141cc406Sopenharmony_ci * - 0.42 - added SFLAG_CUSTOM_GAMMA to capabilities 34141cc406Sopenharmony_ci * - added _OVR_PRIMAX_4800D30 switch 35141cc406Sopenharmony_ci * - changed include names 36141cc406Sopenharmony_ci * - 0.43 - no changes 37141cc406Sopenharmony_ci * . 38141cc406Sopenharmony_ci * <hr> 39141cc406Sopenharmony_ci * This file is part of the SANE package. 40141cc406Sopenharmony_ci * 41141cc406Sopenharmony_ci * This program is free software; you can redistribute it and/or 42141cc406Sopenharmony_ci * modify it under the terms of the GNU General Public License as 43141cc406Sopenharmony_ci * published by the Free Software Foundation; either version 2 of the 44141cc406Sopenharmony_ci * License, or (at your option) any later version. 45141cc406Sopenharmony_ci * 46141cc406Sopenharmony_ci * This program is distributed in the hope that it will be useful, but 47141cc406Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of 48141cc406Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 49141cc406Sopenharmony_ci * General Public License for more details. 50141cc406Sopenharmony_ci * 51141cc406Sopenharmony_ci * You should have received a copy of the GNU General Public License 52141cc406Sopenharmony_ci * along with this program. If not, see <https://www.gnu.org/licenses/>. 53141cc406Sopenharmony_ci * 54141cc406Sopenharmony_ci * As a special exception, the authors of SANE give permission for 55141cc406Sopenharmony_ci * additional uses of the libraries contained in this release of SANE. 56141cc406Sopenharmony_ci * 57141cc406Sopenharmony_ci * The exception is that, if you link a SANE library with other files 58141cc406Sopenharmony_ci * to produce an executable, this does not by itself cause the 59141cc406Sopenharmony_ci * resulting executable to be covered by the GNU General Public 60141cc406Sopenharmony_ci * License. Your use of that executable is in no way restricted on 61141cc406Sopenharmony_ci * account of linking the SANE library code into it. 62141cc406Sopenharmony_ci * 63141cc406Sopenharmony_ci * This exception does not, however, invalidate any other reasons why 64141cc406Sopenharmony_ci * the executable file might be covered by the GNU General Public 65141cc406Sopenharmony_ci * License. 66141cc406Sopenharmony_ci * 67141cc406Sopenharmony_ci * If you submit changes to SANE to the maintainers to be included in 68141cc406Sopenharmony_ci * a subsequent release, you agree by submitting the changes that 69141cc406Sopenharmony_ci * those changes may be distributed with this exception intact. 70141cc406Sopenharmony_ci * 71141cc406Sopenharmony_ci * If you write modifications of your own for SANE, it is your choice 72141cc406Sopenharmony_ci * whether to permit this exception to apply to your modifications. 73141cc406Sopenharmony_ci * If you do not wish that, delete this exception notice. 74141cc406Sopenharmony_ci * <hr> 75141cc406Sopenharmony_ci */ 76141cc406Sopenharmony_ci#include "plustek-pp_scan.h" 77141cc406Sopenharmony_ci 78141cc406Sopenharmony_ci/*************************** local functions *********************************/ 79141cc406Sopenharmony_ci 80141cc406Sopenharmony_ci/*............................................................................. 81141cc406Sopenharmony_ci * initialize the extension according to the page size... 82141cc406Sopenharmony_ci */ 83141cc406Sopenharmony_cistatic void modelInitPageSettings( pScanData ps ) 84141cc406Sopenharmony_ci{ 85141cc406Sopenharmony_ci DBG(DBG_LOW, "modelInitPageSettings()\n" ); 86141cc406Sopenharmony_ci 87141cc406Sopenharmony_ci if( MODEL_OP_9630PL == ps->sCaps.Model ) 88141cc406Sopenharmony_ci ps->dwScannerSize = _SCANSIZE_LEGAL; 89141cc406Sopenharmony_ci else if( MODEL_OP_A3I == ps->sCaps.Model ) 90141cc406Sopenharmony_ci ps->dwScannerSize = _SCANSIZE_A3; 91141cc406Sopenharmony_ci else 92141cc406Sopenharmony_ci ps->dwScannerSize = _SCANSIZE_A4; 93141cc406Sopenharmony_ci 94141cc406Sopenharmony_ci /* default width for all but A3 - 8.5"* 300dpi (_MEASURE_BASE) */ 95141cc406Sopenharmony_ci ps->sCaps.wMaxExtentX = 2550; 96141cc406Sopenharmony_ci 97141cc406Sopenharmony_ci /* this applies to all scanners but the A3 model */ 98141cc406Sopenharmony_ci ps->LensInf.rExtentX.wMin = 150; 99141cc406Sopenharmony_ci ps->LensInf.rExtentX.wDef = 2550; 100141cc406Sopenharmony_ci ps->LensInf.rExtentX.wMax = 2550; 101141cc406Sopenharmony_ci ps->LensInf.rExtentX.wPhyMax = 2500; 102141cc406Sopenharmony_ci 103141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMin = 150; 104141cc406Sopenharmony_ci 105141cc406Sopenharmony_ci ps->LensInf.wBeginX = 0; 106141cc406Sopenharmony_ci ps->LensInf.wBeginY = 0; 107141cc406Sopenharmony_ci 108141cc406Sopenharmony_ci switch( ps->dwScannerSize ) { 109141cc406Sopenharmony_ci 110141cc406Sopenharmony_ci case _SCANSIZE_A4: 111141cc406Sopenharmony_ci /* 11.69 inches */ 112141cc406Sopenharmony_ci DBG( DBG_LOW, "A4 set\n" ); 113141cc406Sopenharmony_ci ps->sCaps.wMaxExtentY = 114141cc406Sopenharmony_ci ps->LensInf.rExtentY.wDef = 115141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax = 116141cc406Sopenharmony_ci ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 11.6934; 117141cc406Sopenharmony_ci break; 118141cc406Sopenharmony_ci 119141cc406Sopenharmony_ci case _SCANSIZE_A3: 120141cc406Sopenharmony_ci /* 17 inches */ 121141cc406Sopenharmony_ci DBG( DBG_LOW, "A3 set\n" ); 122141cc406Sopenharmony_ci ps->sCaps.wMaxExtentY = 123141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax = 124141cc406Sopenharmony_ci ps->LensInf.rExtentY.wDef = 125141cc406Sopenharmony_ci ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 17; 126141cc406Sopenharmony_ci 127141cc406Sopenharmony_ci /* _MEASURE_BASE * 11.69 */ 128141cc406Sopenharmony_ci ps->sCaps.wMaxExtentX = 129141cc406Sopenharmony_ci ps->LensInf.rExtentX.wDef = 130141cc406Sopenharmony_ci ps->LensInf.rExtentX.wMax = 3507; 131141cc406Sopenharmony_ci ps->LensInf.rExtentX.wPhyMax = 3500; 132141cc406Sopenharmony_ci break; 133141cc406Sopenharmony_ci 134141cc406Sopenharmony_ci case _SCANSIZE_LETTER: 135141cc406Sopenharmony_ci /* 11 inches */ 136141cc406Sopenharmony_ci DBG( DBG_LOW, "Letter set\n" ); 137141cc406Sopenharmony_ci ps->sCaps.wMaxExtentY = 138141cc406Sopenharmony_ci ps->LensInf.rExtentY.wDef = 139141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax = 140141cc406Sopenharmony_ci ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 11; 141141cc406Sopenharmony_ci break; 142141cc406Sopenharmony_ci 143141cc406Sopenharmony_ci case _SCANSIZE_LEGAL: 144141cc406Sopenharmony_ci /* 14 inches */ 145141cc406Sopenharmony_ci DBG( DBG_LOW, "Legal set\n" ); 146141cc406Sopenharmony_ci ps->sCaps.wMaxExtentY = 147141cc406Sopenharmony_ci ps->LensInf.rExtentY.wDef = 148141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax = 149141cc406Sopenharmony_ci ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 14; 150141cc406Sopenharmony_ci } 151141cc406Sopenharmony_ci 152141cc406Sopenharmony_ci /* 153141cc406Sopenharmony_ci * add this value to avoid the problems in binary mode 154141cc406Sopenharmony_ci */ 155141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax += 64; 156141cc406Sopenharmony_ci 157141cc406Sopenharmony_ci /* set the DPI stuff */ 158141cc406Sopenharmony_ci ps->LensInf.rDpiX.wMin = 16; 159141cc406Sopenharmony_ci ps->LensInf.rDpiX.wDef = 50; 160141cc406Sopenharmony_ci ps->LensInf.rDpiX.wMax = (ps->PhysicalDpi * 16); 161141cc406Sopenharmony_ci ps->LensInf.rDpiX.wPhyMax = ps->PhysicalDpi; 162141cc406Sopenharmony_ci ps->LensInf.rDpiY.wMin = 16; 163141cc406Sopenharmony_ci ps->LensInf.rDpiY.wDef = 50; 164141cc406Sopenharmony_ci ps->LensInf.rDpiY.wMax = (ps->PhysicalDpi * 16); 165141cc406Sopenharmony_ci ps->LensInf.rDpiY.wPhyMax = (ps->PhysicalDpi * 2); 166141cc406Sopenharmony_ci} 167141cc406Sopenharmony_ci 168141cc406Sopenharmony_ci/*............................................................................. 169141cc406Sopenharmony_ci * set the scanner capabilities 170141cc406Sopenharmony_ci */ 171141cc406Sopenharmony_cistatic void modelInitCaps( pScanData ps ) 172141cc406Sopenharmony_ci{ 173141cc406Sopenharmony_ci ps->sCaps.wIOBase = _NO_BASE; 174141cc406Sopenharmony_ci ps->sCaps.dwFlag = SFLAG_CUSTOM_GAMMA; 175141cc406Sopenharmony_ci} 176141cc406Sopenharmony_ci 177141cc406Sopenharmony_ci/*............................................................................. 178141cc406Sopenharmony_ci * set the motor stuff 179141cc406Sopenharmony_ci */ 180141cc406Sopenharmony_cistatic void modelInitMotor( pScanData ps ) 181141cc406Sopenharmony_ci{ 182141cc406Sopenharmony_ci if( _ASIC_IS_96001 == ps->sCaps.AsicID ) { 183141cc406Sopenharmony_ci ps->FullStep = _MotorFullStep96001; 184141cc406Sopenharmony_ci ps->MotorOn = _MotorOn96001; 185141cc406Sopenharmony_ci ps->IgnorePF = _MotorIgnorePF96001; 186141cc406Sopenharmony_ci ps->StepMask = ~ps->FullStep; 187141cc406Sopenharmony_ci } else { 188141cc406Sopenharmony_ci ps->FullStep = _Motor1FullStep; 189141cc406Sopenharmony_ci ps->MotorOn = _MotorOn; 190141cc406Sopenharmony_ci ps->IgnorePF = _MotorIgnorePF; 191141cc406Sopenharmony_ci ps->StepMask = _MotorStepMask; 192141cc406Sopenharmony_ci } 193141cc406Sopenharmony_ci 194141cc406Sopenharmony_ci ps->BackwardSteps = 4000; 195141cc406Sopenharmony_ci} 196141cc406Sopenharmony_ci 197141cc406Sopenharmony_ci/*............................................................................. 198141cc406Sopenharmony_ci * according to the models' capabilities, set the buffer stuff 199141cc406Sopenharmony_ci */ 200141cc406Sopenharmony_cistatic void modelSetBufferSizes( pScanData ps ) 201141cc406Sopenharmony_ci{ 202141cc406Sopenharmony_ci /* should depend on the scan-area !!!! */ 203141cc406Sopenharmony_ci if( 400 == ps->PhysicalDpi ) { 204141cc406Sopenharmony_ci 205141cc406Sopenharmony_ci /* assuming a A3I */ 206141cc406Sopenharmony_ci ps->BufferSizeBase = 3517; 207141cc406Sopenharmony_ci ps->BufferForColorRunTable = (5500 * 4); /* might be 17" * 800dpi !!! */ 208141cc406Sopenharmony_ci 209141cc406Sopenharmony_ci } else if( 600 == ps->PhysicalDpi ) { 210141cc406Sopenharmony_ci 211141cc406Sopenharmony_ci ps->BufferSizeBase = 2560; 212141cc406Sopenharmony_ci ps->BufferForColorRunTable = (5500 * 4); 213141cc406Sopenharmony_ci 214141cc406Sopenharmony_ci } else { 215141cc406Sopenharmony_ci ps->BufferSizeBase = 1280; 216141cc406Sopenharmony_ci ps->BufferForColorRunTable = 9000; 217141cc406Sopenharmony_ci } 218141cc406Sopenharmony_ci 219141cc406Sopenharmony_ci ps->BufferSizePerModel = ps->BufferSizeBase * 2; 220141cc406Sopenharmony_ci ps->BufferForDataRead1 = ps->BufferSizePerModel * 3; 221141cc406Sopenharmony_ci 222141cc406Sopenharmony_ci /* patch that for the 600 DPI models OP9630 etc.*/ 223141cc406Sopenharmony_ci if(( 300 != ps->PhysicalDpi) && (_ASIC_IS_96003 == ps->sCaps.AsicID)) 224141cc406Sopenharmony_ci ps->BufferForDataRead1 += 300; 225141cc406Sopenharmony_ci 226141cc406Sopenharmony_ci ps->BufferFor1stColor = (ps->BufferSizePerModel * 17); 227141cc406Sopenharmony_ci ps->BufferFor2ndColor = (ps->BufferSizePerModel * 9); 228141cc406Sopenharmony_ci ps->TotalBufferRequire = (ps->BufferFor1stColor + 229141cc406Sopenharmony_ci ps->BufferFor2ndColor + 230141cc406Sopenharmony_ci ps->BufferForDataRead1 + 231141cc406Sopenharmony_ci ps->BufferForColorRunTable ); 232141cc406Sopenharmony_ci} 233141cc406Sopenharmony_ci 234141cc406Sopenharmony_ci/************************ exported functions *********************************/ 235141cc406Sopenharmony_ci 236141cc406Sopenharmony_ci/*............................................................................. 237141cc406Sopenharmony_ci * set the model to 4800 238141cc406Sopenharmony_ci */ 239141cc406Sopenharmony_ci_LOC void ModelSet4800( pScanData ps ) 240141cc406Sopenharmony_ci{ 241141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet4800()\n" ); 242141cc406Sopenharmony_ci 243141cc406Sopenharmony_ci /* has 96001 ASIC */ 244141cc406Sopenharmony_ci ps->sCaps.AsicID = _ASIC_IS_96001; 245141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_4800P; 246141cc406Sopenharmony_ci ps->Device.buttons = 0; 247141cc406Sopenharmony_ci ps->Device.ModelCtrl = (_ModelDpi300 | _ModelMemSize32k96001 | _ModelWhiteIs0); 248141cc406Sopenharmony_ci ps->Device.DataOriginX = 72; 249141cc406Sopenharmony_ci 250141cc406Sopenharmony_ci ps->PhysicalDpi = 300; 251141cc406Sopenharmony_ci ps->TimePerLine = 0x30; 252141cc406Sopenharmony_ci ps->Offset70 = 70; 253141cc406Sopenharmony_ci 254141cc406Sopenharmony_ci modelSetBufferSizes( ps ); 255141cc406Sopenharmony_ci 256141cc406Sopenharmony_ci ps->a_wGrayInitTime[0] = 220; /* _EppTimeForOthers */ 257141cc406Sopenharmony_ci ps->a_wGrayInitTime[1] = 720; /* _SppTimeForOthers */ 258141cc406Sopenharmony_ci ps->a_wGrayInitTime[2] = 360; /* _BidirTimeForOthers */ 259141cc406Sopenharmony_ci ps->a_wColorInitTime[0] = 500; /* _EppTimeForColor */ 260141cc406Sopenharmony_ci ps->a_wColorInitTime[1] = 1680; /* _SppTimeForColor */ 261141cc406Sopenharmony_ci ps->a_wColorInitTime[2] = 1100; /* _BidirTimeForColor */ 262141cc406Sopenharmony_ci 263141cc406Sopenharmony_ci ps->AsicRedColor = _ASIC_REDCOLOR; 264141cc406Sopenharmony_ci ps->AsicGreenColor = _ASIC_GREENCOLOR; 265141cc406Sopenharmony_ci ps->RedDataReady = _RED_DATA_READY; 266141cc406Sopenharmony_ci ps->GreenDataReady = _GREEN_DATA_READY; 267141cc406Sopenharmony_ci 268141cc406Sopenharmony_ci /* 269141cc406Sopenharmony_ci * used for shading stuff (see dac.c) 270141cc406Sopenharmony_ci */ 271141cc406Sopenharmony_ci ps->FBKScanLineBlks = 5; 272141cc406Sopenharmony_ci ps->FBKScanLineLenBase = 1024; 273141cc406Sopenharmony_ci ps->FBKScanLineLen = (ps->FBKScanLineLenBase * 3); 274141cc406Sopenharmony_ci 275141cc406Sopenharmony_ci ps->ShadingBufferSize = ps->FBKScanLineLen; 276141cc406Sopenharmony_ci ps->ShadingBankSize = (ps->FBKScanLineLenBase * 4); 277141cc406Sopenharmony_ci ps->ShadingBankRed = (_MemBankSize4k96001 | 0x3a); 278141cc406Sopenharmony_ci ps->ShadingBankGreen = (_MemBankSize4k96001 | 0x3e); 279141cc406Sopenharmony_ci ps->ShadingBankBlue = (_MemBankSize4k96001 | 0x3c); 280141cc406Sopenharmony_ci ps->ShadingScanLineBlks = 6; 281141cc406Sopenharmony_ci ps->ShadingScanLineLen = (ps->BufferSizeBase * 3); 282141cc406Sopenharmony_ci ps->OneScanLineLen = (ps->BufferSizePerModel * 3); 283141cc406Sopenharmony_ci 284141cc406Sopenharmony_ci modelInitMotor( ps ); 285141cc406Sopenharmony_ci modelInitCaps ( ps ); 286141cc406Sopenharmony_ci modelInitPageSettings( ps ); 287141cc406Sopenharmony_ci 288141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet4800() done.\n" ); 289141cc406Sopenharmony_ci} 290141cc406Sopenharmony_ci 291141cc406Sopenharmony_ci/*............................................................................. 292141cc406Sopenharmony_ci * set the model to 4830 293141cc406Sopenharmony_ci */ 294141cc406Sopenharmony_ci_LOC void ModelSet4830( pScanData ps ) 295141cc406Sopenharmony_ci{ 296141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet4830()\n" ); 297141cc406Sopenharmony_ci 298141cc406Sopenharmony_ci /* has 96003 ASIC */ 299141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_4830P; 300141cc406Sopenharmony_ci if( _OVR_PRIMAX_4800D30 == ps->ModelOverride ) { 301141cc406Sopenharmony_ci DBG( DBG_LOW, "Model Override --> Primax 4800D 30\n" ); 302141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_PMX_4800D3; 303141cc406Sopenharmony_ci } 304141cc406Sopenharmony_ci ps->sCaps.AsicID = _ASIC_IS_96003; 305141cc406Sopenharmony_ci ps->Device.buttons = 1; 306141cc406Sopenharmony_ci ps->Device.ModelCtrl = (_ModelDpi300 | _ModelMemSize32k3 | _ModelWhiteIs0); 307141cc406Sopenharmony_ci ps->Device.DataOriginX = 72; 308141cc406Sopenharmony_ci 309141cc406Sopenharmony_ci ps->PhysicalDpi = 300; 310141cc406Sopenharmony_ci ps->TimePerLine = 0x30; 311141cc406Sopenharmony_ci ps->Offset70 = 70; 312141cc406Sopenharmony_ci 313141cc406Sopenharmony_ci modelSetBufferSizes( ps ); 314141cc406Sopenharmony_ci 315141cc406Sopenharmony_ci ps->a_wGrayInitTime[0] = 220; /* _EppTimeForOthers */ 316141cc406Sopenharmony_ci ps->a_wGrayInitTime[1] = 720; /* _SppTimeForOthers */ 317141cc406Sopenharmony_ci ps->a_wGrayInitTime[2] = 360; /* _BidirTimeForOthers */ 318141cc406Sopenharmony_ci ps->a_wColorInitTime[0] = 500; /* _EppTimeForColor */ 319141cc406Sopenharmony_ci ps->a_wColorInitTime[1] = 1680; /* _SppTimeForColor */ 320141cc406Sopenharmony_ci ps->a_wColorInitTime[2] = 1100; /* _BidirTimeForColor */ 321141cc406Sopenharmony_ci 322141cc406Sopenharmony_ci ps->AsicRedColor = _ASIC_REDCOLOR; 323141cc406Sopenharmony_ci ps->AsicGreenColor = _ASIC_GREENCOLOR; 324141cc406Sopenharmony_ci ps->RedDataReady = _RED_DATA_READY; 325141cc406Sopenharmony_ci ps->GreenDataReady = _GREEN_DATA_READY; 326141cc406Sopenharmony_ci 327141cc406Sopenharmony_ci /* 328141cc406Sopenharmony_ci * used for shading stuff (see dac.c) 329141cc406Sopenharmony_ci */ 330141cc406Sopenharmony_ci ps->FBKScanLineBlks = 5; 331141cc406Sopenharmony_ci ps->FBKScanLineLenBase = 1024; 332141cc406Sopenharmony_ci ps->FBKScanLineLen = (ps->FBKScanLineLenBase * 3); 333141cc406Sopenharmony_ci 334141cc406Sopenharmony_ci ps->ShadingBufferSize = ps->FBKScanLineLen; 335141cc406Sopenharmony_ci ps->ShadingBankSize = (ps->FBKScanLineLenBase * 4); 336141cc406Sopenharmony_ci ps->ShadingBankRed = (_MemBankSize4k | 0x3a); 337141cc406Sopenharmony_ci ps->ShadingBankGreen = (_MemBankSize4k | 0x3e); 338141cc406Sopenharmony_ci ps->ShadingBankBlue = (_MemBankSize4k | 0x3c); 339141cc406Sopenharmony_ci ps->ShadingScanLineBlks = 6; 340141cc406Sopenharmony_ci ps->ShadingScanLineLen = (ps->BufferSizeBase * 3); 341141cc406Sopenharmony_ci ps->OneScanLineLen = (ps->BufferSizePerModel * 3); 342141cc406Sopenharmony_ci 343141cc406Sopenharmony_ci modelInitMotor( ps ); 344141cc406Sopenharmony_ci modelInitCaps ( ps ); 345141cc406Sopenharmony_ci modelInitPageSettings( ps ); 346141cc406Sopenharmony_ci 347141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet4830() done.\n" ); 348141cc406Sopenharmony_ci} 349141cc406Sopenharmony_ci 350141cc406Sopenharmony_ci/*............................................................................. 351141cc406Sopenharmony_ci * set the model to 600, tested on a Primax Direct 4800 and OP600 352141cc406Sopenharmony_ci */ 353141cc406Sopenharmony_ci_LOC void ModelSet600( pScanData ps ) 354141cc406Sopenharmony_ci{ 355141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet600()\n" ); 356141cc406Sopenharmony_ci 357141cc406Sopenharmony_ci /* 358141cc406Sopenharmony_ci * set to 4830 first, then do the differences 359141cc406Sopenharmony_ci */ 360141cc406Sopenharmony_ci ModelSet4830( ps ); 361141cc406Sopenharmony_ci ps->Device.buttons = 0; 362141cc406Sopenharmony_ci 363141cc406Sopenharmony_ci if( _OVR_PLUSTEK_4800P == ps->ModelOverride ) { 364141cc406Sopenharmony_ci 365141cc406Sopenharmony_ci DBG( DBG_LOW, "Model Override --> OpticPro4800\n" ); 366141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_4800P; 367141cc406Sopenharmony_ci 368141cc406Sopenharmony_ci } else if( _OVR_PRIMAX_4800D == ps->ModelOverride ) { 369141cc406Sopenharmony_ci 370141cc406Sopenharmony_ci DBG( DBG_LOW, "Model Override --> Primax 4800D\n" ); 371141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_PMX_4800D; 372141cc406Sopenharmony_ci 373141cc406Sopenharmony_ci } else { 374141cc406Sopenharmony_ci 375141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_600P; 376141cc406Sopenharmony_ci 377141cc406Sopenharmony_ci /* for Plustek OpticPro 600P it's necessary to swap Red and Green 378141cc406Sopenharmony_ci * changed by mh moloch@nikocity.de 379141cc406Sopenharmony_ci */ 380141cc406Sopenharmony_ci ps->AsicRedColor = _ASIC_GREENCOLOR; 381141cc406Sopenharmony_ci ps->AsicGreenColor = _ASIC_REDCOLOR; 382141cc406Sopenharmony_ci } 383141cc406Sopenharmony_ci 384141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet600() done.\n" ); 385141cc406Sopenharmony_ci} 386141cc406Sopenharmony_ci 387141cc406Sopenharmony_ci/*............................................................................. 388141cc406Sopenharmony_ci * set the model to 12000P, 96000P (tested on a OP96000P) 389141cc406Sopenharmony_ci */ 390141cc406Sopenharmony_ci_LOC void ModelSet12000( pScanData ps ) 391141cc406Sopenharmony_ci{ 392141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet12000()\n" ); 393141cc406Sopenharmony_ci 394141cc406Sopenharmony_ci /* 395141cc406Sopenharmony_ci * set to 9630 first, then do the differences 396141cc406Sopenharmony_ci */ 397141cc406Sopenharmony_ci ModelSet9630( ps ); 398141cc406Sopenharmony_ci ps->Device.buttons = 0; 399141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_12000P; 400141cc406Sopenharmony_ci 401141cc406Sopenharmony_ci /* 402141cc406Sopenharmony_ci * swapped Red and Green for 12000P/96000P 403141cc406Sopenharmony_ci */ 404141cc406Sopenharmony_ci ps->AsicRedColor = _ASIC_GREENCOLOR; 405141cc406Sopenharmony_ci ps->AsicGreenColor = _ASIC_REDCOLOR; 406141cc406Sopenharmony_ci ps->RedDataReady = _GREEN_DATA_READY; 407141cc406Sopenharmony_ci ps->GreenDataReady = _RED_DATA_READY; 408141cc406Sopenharmony_ci 409141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet12000() done.\n" ); 410141cc406Sopenharmony_ci} 411141cc406Sopenharmony_ci 412141cc406Sopenharmony_ci/*............................................................................. 413141cc406Sopenharmony_ci * set the model to A3I 414141cc406Sopenharmony_ci */ 415141cc406Sopenharmony_ci_LOC void ModelSetA3I( pScanData ps ) 416141cc406Sopenharmony_ci{ 417141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSetA3I()\n" ); 418141cc406Sopenharmony_ci 419141cc406Sopenharmony_ci /* 420141cc406Sopenharmony_ci * has 96003 ASIC 421141cc406Sopenharmony_ci */ 422141cc406Sopenharmony_ci ps->Device.buttons = 1; 423141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_A3I; 424141cc406Sopenharmony_ci ps->sCaps.AsicID = _ASIC_IS_96003; 425141cc406Sopenharmony_ci 426141cc406Sopenharmony_ci ps->Device.ModelCtrl = (_ModelDpi400 | _ModelMemSize128k4 | _ModelWhiteIs0); 427141cc406Sopenharmony_ci ps->Device.DataOriginX = 164; 428141cc406Sopenharmony_ci 429141cc406Sopenharmony_ci ps->PhysicalDpi = 400; 430141cc406Sopenharmony_ci ps->TimePerLine = 0x50; 431141cc406Sopenharmony_ci ps->Offset70 = 145; 432141cc406Sopenharmony_ci 433141cc406Sopenharmony_ci modelSetBufferSizes( ps ); 434141cc406Sopenharmony_ci 435141cc406Sopenharmony_ci ps->a_wGrayInitTime[0] = 133; /* _EppTimeForOthers */ 436141cc406Sopenharmony_ci ps->a_wGrayInitTime[1] = 720; /* _SppTimeForOthers */ 437141cc406Sopenharmony_ci ps->a_wGrayInitTime[2] = 300; /* _BidirTimeForOthers */ 438141cc406Sopenharmony_ci ps->a_wColorInitTime[0] = 400; /* _EppTimeForColor */ 439141cc406Sopenharmony_ci ps->a_wColorInitTime[1] = 1800; /* _SppTimeForColor */ 440141cc406Sopenharmony_ci ps->a_wColorInitTime[2] = 800; /* _BidirTimeForColor */ 441141cc406Sopenharmony_ci 442141cc406Sopenharmony_ci ps->AsicRedColor = _ASIC_GREENCOLOR; 443141cc406Sopenharmony_ci ps->AsicGreenColor = _ASIC_REDCOLOR; 444141cc406Sopenharmony_ci ps->RedDataReady = _GREEN_DATA_READY; 445141cc406Sopenharmony_ci ps->GreenDataReady = _RED_DATA_READY; 446141cc406Sopenharmony_ci 447141cc406Sopenharmony_ci ps->FBKScanLineBlks = 10; 448141cc406Sopenharmony_ci ps->FBKScanLineLenBase = 2048; 449141cc406Sopenharmony_ci ps->FBKScanLineLen = (ps->FBKScanLineLenBase * 3); 450141cc406Sopenharmony_ci 451141cc406Sopenharmony_ci ps->ShadingBufferSize = (1024 * 7); 452141cc406Sopenharmony_ci ps->ShadingBankSize = 8192; 453141cc406Sopenharmony_ci ps->ShadingBankRed = (_MemBankSize8k | 0x34); 454141cc406Sopenharmony_ci ps->ShadingBankGreen = (_MemBankSize8k | 0x3c); 455141cc406Sopenharmony_ci ps->ShadingBankBlue = (_MemBankSize8k | 0x38); 456141cc406Sopenharmony_ci ps->ShadingScanLineBlks = 10; 457141cc406Sopenharmony_ci ps->ShadingScanLineLen = (ps->BufferSizeBase * 3); 458141cc406Sopenharmony_ci ps->OneScanLineLen = (ps->ShadingScanLineLen * 2); 459141cc406Sopenharmony_ci 460141cc406Sopenharmony_ci modelInitMotor( ps ); 461141cc406Sopenharmony_ci ps->BackwardSteps = 9000; 462141cc406Sopenharmony_ci 463141cc406Sopenharmony_ci modelInitCaps( ps ); 464141cc406Sopenharmony_ci modelInitPageSettings( ps ); 465141cc406Sopenharmony_ci 466141cc406Sopenharmony_ci /* 467141cc406Sopenharmony_ci * need to double the vals 468141cc406Sopenharmony_ci */ 469141cc406Sopenharmony_ci ps->LensInf.rExtentX.wMax *= 2; 470141cc406Sopenharmony_ci ps->LensInf.rExtentX.wPhyMax *= 2; 471141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax *= 2; 472141cc406Sopenharmony_ci ps->LensInf.rExtentY.wPhyMax *= 2; 473141cc406Sopenharmony_ci 474141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSetA3I() done.\n" ); 475141cc406Sopenharmony_ci} 476141cc406Sopenharmony_ci 477141cc406Sopenharmony_ci/*............................................................................. 478141cc406Sopenharmony_ci * set the model to 9630 479141cc406Sopenharmony_ci */ 480141cc406Sopenharmony_ci_LOC void ModelSet9630( pScanData ps ) 481141cc406Sopenharmony_ci{ 482141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet9360()\n" ); 483141cc406Sopenharmony_ci 484141cc406Sopenharmony_ci /* 485141cc406Sopenharmony_ci * has 96003 ASIC 486141cc406Sopenharmony_ci */ 487141cc406Sopenharmony_ci if( _OVR_PLUSTEK_9630PL == ps->ModelOverride ) { 488141cc406Sopenharmony_ci DBG( DBG_LOW, "Model Override --> 9630PL\n" ); 489141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_9630PL; 490141cc406Sopenharmony_ci } else { 491141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_9630P; 492141cc406Sopenharmony_ci } 493141cc406Sopenharmony_ci 494141cc406Sopenharmony_ci ps->Device.buttons = 1; 495141cc406Sopenharmony_ci ps->sCaps.AsicID = _ASIC_IS_96003; 496141cc406Sopenharmony_ci 497141cc406Sopenharmony_ci ps->Device.ModelCtrl = (_ModelDpi600 | _ModelMemSize128k4 | _ModelWhiteIs0); 498141cc406Sopenharmony_ci ps->Device.DataOriginX = 64; 499141cc406Sopenharmony_ci 500141cc406Sopenharmony_ci ps->PhysicalDpi = 600; 501141cc406Sopenharmony_ci ps->TimePerLine = 0x5a; 502141cc406Sopenharmony_ci ps->Offset70 = 95; 503141cc406Sopenharmony_ci 504141cc406Sopenharmony_ci modelSetBufferSizes( ps ); 505141cc406Sopenharmony_ci 506141cc406Sopenharmony_ci ps->a_wGrayInitTime[0] = 133; /* _EppTimeForOthers */ 507141cc406Sopenharmony_ci ps->a_wGrayInitTime[1] = 720; /* _SppTimeForOthers */ 508141cc406Sopenharmony_ci ps->a_wGrayInitTime[2] = 300; /* _BidirTimeForOthers */ 509141cc406Sopenharmony_ci ps->a_wColorInitTime[0] = 400; /* _EppTimeForColor */ 510141cc406Sopenharmony_ci ps->a_wColorInitTime[1] = 1800; /* _SppTimeForColor */ 511141cc406Sopenharmony_ci ps->a_wColorInitTime[2] = 800; /* _BidirTimeForColor */ 512141cc406Sopenharmony_ci 513141cc406Sopenharmony_ci ps->AsicRedColor = _ASIC_REDCOLOR; 514141cc406Sopenharmony_ci ps->AsicGreenColor = _ASIC_GREENCOLOR; 515141cc406Sopenharmony_ci ps->RedDataReady = _RED_DATA_READY; 516141cc406Sopenharmony_ci ps->GreenDataReady = _GREEN_DATA_READY; 517141cc406Sopenharmony_ci 518141cc406Sopenharmony_ci ps->ShadingBufferSize = (1024 * 7); 519141cc406Sopenharmony_ci ps->ShadingBankSize = 8192; 520141cc406Sopenharmony_ci ps->ShadingBankRed = (_MemBankSize8k | 0x34); 521141cc406Sopenharmony_ci ps->ShadingBankGreen = (_MemBankSize8k | 0x3c); 522141cc406Sopenharmony_ci ps->ShadingBankBlue = (_MemBankSize8k | 0x38); 523141cc406Sopenharmony_ci ps->ShadingScanLineBlks = 10; 524141cc406Sopenharmony_ci ps->ShadingScanLineLen = (2560 * 3); 525141cc406Sopenharmony_ci 526141cc406Sopenharmony_ci ps->FBKScanLineBlks = 10; 527141cc406Sopenharmony_ci ps->FBKScanLineLenBase = 2048; 528141cc406Sopenharmony_ci ps->FBKScanLineLen = (ps->FBKScanLineLenBase * 6); 529141cc406Sopenharmony_ci 530141cc406Sopenharmony_ci ps->OneScanLineLen = (5120 * 3); 531141cc406Sopenharmony_ci 532141cc406Sopenharmony_ci modelInitMotor( ps ); 533141cc406Sopenharmony_ci ps->BackwardSteps = 9000; 534141cc406Sopenharmony_ci 535141cc406Sopenharmony_ci modelInitCaps( ps ); 536141cc406Sopenharmony_ci modelInitPageSettings( ps ); 537141cc406Sopenharmony_ci 538141cc406Sopenharmony_ci /* 539141cc406Sopenharmony_ci * need to double the vals 540141cc406Sopenharmony_ci */ 541141cc406Sopenharmony_ci ps->LensInf.rExtentX.wMax *= 2; 542141cc406Sopenharmony_ci ps->LensInf.rExtentX.wPhyMax *= 2; 543141cc406Sopenharmony_ci ps->LensInf.rExtentY.wMax *= 2; 544141cc406Sopenharmony_ci ps->LensInf.rExtentY.wPhyMax *= 2; 545141cc406Sopenharmony_ci 546141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet9630() done.\n" ); 547141cc406Sopenharmony_ci} 548141cc406Sopenharmony_ci 549141cc406Sopenharmony_ci/*............................................................................. 550141cc406Sopenharmony_ci * set the model to 9636 (ASIC 98001 models) 551141cc406Sopenharmony_ci * works for 9636P Turbo and 9636T /12000T 552141cc406Sopenharmony_ci */ 553141cc406Sopenharmony_ci_LOC void ModelSet9636( pScanData ps ) 554141cc406Sopenharmony_ci{ 555141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet9636()\n" ); 556141cc406Sopenharmony_ci 557141cc406Sopenharmony_ci /* 558141cc406Sopenharmony_ci *set to 9630 first, then do the differences 559141cc406Sopenharmony_ci */ 560141cc406Sopenharmony_ci ModelSet9630( ps ); 561141cc406Sopenharmony_ci ps->Device.buttons = 0; 562141cc406Sopenharmony_ci 563141cc406Sopenharmony_ci /* 564141cc406Sopenharmony_ci * has 98001 ASIC 565141cc406Sopenharmony_ci */ 566141cc406Sopenharmony_ci if( _OVR_PLUSTEK_9636 == ps->ModelOverride ) { 567141cc406Sopenharmony_ci DBG( DBG_LOW, "Model Override --> 9636P+/Turbo\n" ); 568141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_9636PP; 569141cc406Sopenharmony_ci } else if( _OVR_PLUSTEK_9636P == ps->ModelOverride ) { 570141cc406Sopenharmony_ci DBG( DBG_LOW, "Model Override --> 9636P\n" ); 571141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_9636P; 572141cc406Sopenharmony_ci } else { 573141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_9636T; 574141cc406Sopenharmony_ci ps->sCaps.dwFlag |= SFLAG_TPA; 575141cc406Sopenharmony_ci } 576141cc406Sopenharmony_ci 577141cc406Sopenharmony_ci ps->Device.DataOriginX = 72; 578141cc406Sopenharmony_ci ps->sCaps.AsicID = _ASIC_IS_98001; 579141cc406Sopenharmony_ci 580141cc406Sopenharmony_ci ps->TotalBufferRequire = _LINE_BUFSIZE * 2 + _LINE_BUFSIZE1 + 581141cc406Sopenharmony_ci ps->BufferForColorRunTable + _PROCESS_BUFSIZE; 582141cc406Sopenharmony_ci 583141cc406Sopenharmony_ci /* do it again, as ModelSet9630() changes the result of this function !*/ 584141cc406Sopenharmony_ci modelInitPageSettings( ps ); 585141cc406Sopenharmony_ci 586141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSet9636() done.\n" ); 587141cc406Sopenharmony_ci} 588141cc406Sopenharmony_ci 589141cc406Sopenharmony_ci/*............................................................................. 590141cc406Sopenharmony_ci * set the model to P12 (ASIC 98003 models) 591141cc406Sopenharmony_ci */ 592141cc406Sopenharmony_ci_LOC void ModelSetP12( pScanData ps ) 593141cc406Sopenharmony_ci{ 594141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSetP12()\n" ); 595141cc406Sopenharmony_ci 596141cc406Sopenharmony_ci /* 597141cc406Sopenharmony_ci * set to 9630 first, then do the differences 598141cc406Sopenharmony_ci */ 599141cc406Sopenharmony_ci ModelSet9630( ps ); 600141cc406Sopenharmony_ci ps->Device.DataOriginX = 72; 601141cc406Sopenharmony_ci ps->sCaps.Model = MODEL_OP_PT12; 602141cc406Sopenharmony_ci ps->sCaps.AsicID = _ASIC_IS_98003; 603141cc406Sopenharmony_ci 604141cc406Sopenharmony_ci ps->TotalBufferRequire = _SizeTotalBufTpa; 605141cc406Sopenharmony_ci 606141cc406Sopenharmony_ci /* do it again, as ModelSet9630() changes the result of this function !*/ 607141cc406Sopenharmony_ci modelInitPageSettings( ps ); 608141cc406Sopenharmony_ci 609141cc406Sopenharmony_ci DBG( DBG_LOW, "ModelSetP12() done.\n" ); 610141cc406Sopenharmony_ci} 611141cc406Sopenharmony_ci 612141cc406Sopenharmony_ci/* END PLUSTEK-PP_MODEL.C ...................................................*/ 613