• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* sane - Scanner Access Now Easy.
2 
3    Copyright (C) 2005 Mustek.
4    Originally maintained by Mustek
5    Author:Roy 2005.5.24
6 
7    This file is part of the SANE package.
8 
9    This program is free software; you can redistribute it and/or
10    modify it under the terms of the GNU General Public License as
11    published by the Free Software Foundation; either version 2 of the
12    License, or (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful, but
15    WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17    General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <https://www.gnu.org/licenses/>.
21 
22    As a special exception, the authors of SANE give permission for
23    additional uses of the libraries contained in this release of SANE.
24 
25    The exception is that, if you link a SANE library with other files
26    to produce an executable, this does not by itself cause the
27    resulting executable to be covered by the GNU General Public
28    License.  Your use of that executable is in no way restricted on
29    account of linking the SANE library code into it.
30 
31    This exception does not, however, invalidate any other reasons why
32    the executable file might be covered by the GNU General Public
33    License.
34 
35    If you submit changes to SANE to the maintainers to be included in
36    a subsequent release, you agree by submitting the changes that
37    those changes may be distributed with this exception intact.
38 
39    If you write modifications of your own for SANE, it is your choice
40    whether to permit this exception to apply to your modifications.
41    If you do not wish that, delete this exception notice.
42 
43    This file implements a SANE backend for the Mustek BearPaw 2448 TA Pro
44    and similar USB2 scanners. */
45 
46 #ifndef MUSTEK_USB2_ASIC_H
47 #define MUSTEK_USB2_ASIC_H
48 
49 #include "../include/sane/sanei_usb.h"
50 
51 /* ---------------------- low level asic defines -------------------------- */
52 
53 #define TRUE 1
54 #define FALSE 0
55 
56 #define _MAX(a,b) ((a)>(b)?(a):(b))
57 #define _MIN(a,b) ((a)<(b)?(a):(b))
58 
59 #ifndef LOBYTE
60 #define LOBYTE(w) (SANE_Byte)((unsigned short)(w) & 0x00ff)
61 #endif
62 
63 #ifndef HIBYTE
64 #define HIBYTE(w) (SANE_Byte)((unsigned short)(w)>>8 & 0x00ff)
65 #endif
66 
67 
68 typedef enum tagFIRMWARESTATE
69 {
70   FS_NULL = 0,
71   FS_ATTACHED = 1,
72   FS_OPENED = 2,
73   FS_SCANNING = 3
74 } FIRMWARESTATE, *LPFIRMWARESTATE;
75 
76 typedef enum tagMOTORSTATE
77 {
78   MS_STILL = 0,
79   MS_MOVED = 1
80 } MOTORSTATE, *LPMOTORSTATE;
81 
82 typedef enum tagUSBHOST
83 {
84   HT_USB10 = 0,
85   HT_USB20 = 1
86 } USBHOST;
87 
88 typedef enum tagLIGHTSOURCE
89 {
90   LS_REFLECTIVE = 1,
91   LS_POSITIVE = 2,
92   LS_NEGATIVE = 4
93 } LIGHTSOURCE;
94 
95 typedef struct
96 {
97   unsigned int LongX;
98   unsigned int PicWidth;
99   unsigned int PicHeight;
100 
101   unsigned int Top;
102   unsigned int Bottom;
103   unsigned int Left;
104   unsigned int Right;
105   unsigned int ScanMode;
106   unsigned int Dpi;
107   unsigned int TotalMotorSteps;
108 
109   unsigned int CCD_Pixel_Length;
110   SANE_Byte LineGap;
111   SANE_Byte TG_Pulse_Width_Pixel;
112   SANE_Byte TG_Wait_Width_Pixel;
113   unsigned short Multi_TG_Dummy_Pixel;
114   unsigned short CCD_Dummy_Pixel;
115   SANE_Byte Dummy_Cycle;
116   SANE_Byte TG_Times;
117 
118   double LineTime;
119 
120   unsigned short StartPixel;
121   unsigned short StartLine;
122 }
123 ScanParam;
124 
125 typedef struct
126 {
127   unsigned int Shading_Table_Size;
128   unsigned int Image_Buffer_Size;
129   unsigned int Full_Bank;
130   unsigned int Line_Pixel;
131   double Line_Time;
132   SANE_Byte LineGap;
133 }
134 Temps;
135 
136 typedef struct
137 {
138   /* AFE */
139   unsigned int AFE_ADCCLK_Timing;
140   unsigned int AFE_ADCVS_Timing;
141   unsigned int AFE_ADCRS_Timing;
142   unsigned short AFE_ChannelA_LatchPos;
143   unsigned short AFE_ChannelB_LatchPos;
144   unsigned short AFE_ChannelC_LatchPos;
145   unsigned short AFE_ChannelD_LatchPos;
146   SANE_Byte AFE_Secondary_FF_LatchPos;
147   /* Sensor */
148   unsigned int CCD_DummyCycleTiming;
149   SANE_Byte PHTG_PluseWidth;
150   SANE_Byte PHTG_WaitWidth;
151   unsigned short ChannelR_StartPixel;
152   unsigned short ChannelR_EndPixel;
153   unsigned short ChannelG_StartPixel;
154   unsigned short ChannelG_EndPixel;
155   unsigned short ChannelB_StartPixel;
156   unsigned short ChannelB_EndPixel;
157   SANE_Byte PHTG_TimingAdj;
158   SANE_Byte PHTG_TimingSetup;
159 
160   /*1200dpi */
161   unsigned int CCD_PHRS_Timing_1200;
162   unsigned int CCD_PHCP_Timing_1200;
163   unsigned int CCD_PH1_Timing_1200;
164   unsigned int CCD_PH2_Timing_1200;
165   SANE_Byte DE_CCD_SETUP_REGISTER_1200;
166   unsigned short wCCDPixelNumber_1200;
167 
168   /*600dpi */
169   unsigned int CCD_PHRS_Timing_600;
170   unsigned int CCD_PHCP_Timing_600;
171   unsigned int CCD_PH1_Timing_600;
172   unsigned int CCD_PH2_Timing_600;
173   SANE_Byte DE_CCD_SETUP_REGISTER_600;
174   unsigned short wCCDPixelNumber_600;
175 } Timings;
176 
177 
178 typedef struct tagADConverter
179 {
180   SANE_Byte GainR;
181   SANE_Byte GainG;
182   SANE_Byte GainB;
183   SANE_Byte OffsetR;
184   SANE_Byte OffsetG;
185   SANE_Byte OffsetB;
186   SANE_Bool DirectionR;
187   SANE_Bool DirectionG;
188   SANE_Bool DirectionB;
189 } ADConverter, LPADConverter;
190 
191 
192 
193 typedef struct
194 {
195   unsigned int Shading;
196   SANE_Byte Shading_0;
197   SANE_Byte Shading_1;
198   SANE_Byte Shading_2;
199 
200   unsigned int Motor;
201   SANE_Byte Motor_0;
202   SANE_Byte Motor_1;
203   SANE_Byte Motor_2;
204 
205   SANE_Byte ImageEndAddr_0;
206   SANE_Byte ImageEndAddr_1;
207   SANE_Byte ImageEndAddr_2;
208 
209   SANE_Byte ImageFullBank_0;
210   SANE_Byte ImageFullBank_1;
211 }
212 RamPosition;
213 
214 typedef enum tagTASSTATUS
215 {
216   TA_NOT_PLUGIN = 0,
217   TA_PLUGIN = 1,
218   TA_UNKNOW = 2
219 } TASTATUS;
220 
221 typedef struct
222 {
223   int fd;			/* File Description of Scanner */
224 
225   FIRMWARESTATE firmwarestate;	/* record firmware state */
226   MOTORSTATE motorstate;	/* record motor status */
227   SANE_Bool isFirstOpenChip;		/* If first open chip, is TRUE */
228   USBHOST UsbHost;		/* The type of USB port */
229   LIGHTSOURCE lsLightSource;	/* light source of scanner */
230   ScanParam Scan;		/* The parameters of Scan */
231 
232   unsigned int dwBytesCountPerRow;
233   unsigned int dwCalibrationBytesCountPerRow;
234 
235   Temps Temp;
236   Timings Timing;
237   ADConverter AD;
238 
239   SANE_Bool isHardwareShading;
240 
241   RamPosition RamPositions;
242 
243   unsigned short * lpGammaTable;
244   SANE_Byte isMotorMove;
245 
246   unsigned int ibase1;
247   unsigned int ibase2;
248 
249   unsigned short SWWidth;
250 
251   TASTATUS TA_Status;
252 
253   SANE_Byte isMotorGoToFirstLine;	/*Roy add */
254   SANE_Byte * lpShadingTable;	/*Roy add */
255   SANE_Byte isUniformSpeedToScan;
256 }
257 Asic, *PAsic;
258 
259 
260 /* For ScanObj */
261 typedef struct Point
262 {
263   unsigned int x;
264   unsigned int y;
265 }
266 Point;
267 
268 typedef struct Rect
269 {
270   unsigned int left;
271   unsigned int right;
272   unsigned int top;
273   unsigned int bottom;
274 }
275 Rect;
276 
277 typedef struct RGBColor
278 {
279   unsigned short Red;
280   unsigned short Green;
281   unsigned short Blue;
282 }
283 RGBColor;
284 
285 /* debug levels */
286 #define DBG_CRIT 	0	/* Critical errors thatshould be printed even
287 				   if user hasn't enabled debugging -- use
288 				   with care and only after sane_open has been
289 				   called */
290 #define DBG_ERR 	1	/* Other errors */
291 #define DBG_WARN 	2	/* unusual conditions that may not be fatal */
292 #define DBG_INFO 	3	/* information useful for the deucated user */
293 #define DBG_DET 	4	/* more detailed information */
294 #define DBG_FUNC 	5	/* start and exits of high level functions */
295 #define DBG_ASIC 	6	/* starts and exits of low level functions */
296 #define DBG_DBG 	10	/* useful only for tracing bugs */
297 
298 
299 #define		DPI_2400		0x8000
300 #define		DPI_1200		0x8000
301 #define		DPI_600			0x8000
302 #define		DPI_300			0x4000
303 #define		DPI_200			0x2aaa
304 #define		DPI_150			0x2000
305 #define		DPI_100			0x1555
306 #define		DPI_75			0x1000
307 #define     DPI_50          0xaaa
308 #define		PIXEL_TIME		333	/*unit : ms */
309 #define DRAM_1Mx16_SIZE				(1024*1024)	/*unit : word */
310 #define PackAreaStartAddress ((DRAM_1Mx16_SIZE/4)*3)
311 
312 #define TEMP_MEMORY_SIZE_64K 64*1024
313 
314 #define CALIBRATION_PIXEL_WIDTH			10240	/*need 512x */
315 #define	CALIBRATE_WHITE_LINECOUNT	40
316 #define	CALIBRATE_DARK_LINECOUNT	2
317 
318 #define ACTION_MODE_ACCDEC_MOVE 0
319 #define ACTION_MODE_UNIFORM_SPEED_MOVE 1
320 
321 #define ACTION_TYPE_BACKWARD 0
322 #define ACTION_TYPE_FORWARD  1
323 #define ACTION_TYPE_BACKTOHOME 2
324 #define ACTION_TYPE_TEST_MODE 3
325 
326 
327 #define SENSOR0_DETECTED 0x10
328 #define SENSOR1_DETECTED 0x20
329 #define SENSOR0AND1_DETECTED 0x30
330 
331 #define READ_RAM	0
332 #define WRITE_RAM	1
333 
334 #define EXTERNAL_RAM	0
335 #define ON_CHIP_PRE_GAMMA	1
336 #define ON_CHIP_FINAL_GAMMA	2
337 
338 #define MOTOR_TABLE_SIZE	512*8
339 
340 #define ValidPixelNumberFor600DPI 5100 + 50 + 250
341 #define ValidPixelNumberFor1200DPI 10200 + 100 + 500
342 
343 #define OverLapPixelNumber600 0
344 #define OverLapPixelNumber1200 0
345 #define SegmentGap 0
346 #define	BANK_SIZE	(64)
347 
348 #define WaitBufferOneLineSize 11000*6
349 
350 #define CCD_PIXEL_NUMBER   21600
351 #define CCD_Line_Spacing   24
352 #define CCD_EvneOdd_Spacing 2
353 
354 #define	ShadingTableSize(x)			( ((x + 10)*6) + ( ((x + 10)*6)/240)*16 )
355 #define ACC_DEC_STEP_TABLE_SIZE		(512)	/*unit : word */
356 #define TableBase(x)				((((x)+((1<<TABLE_OFFSET_BASE)-1))>>TABLE_OFFSET_BASE)<<TABLE_OFFSET_BASE)
357 #define NUM_OF_ACC_DEC_STEP_TABLE	(8)	/*unit : word */
358 #define TABLE_BASE_SIZE				(1024*2*2*2*2)	/*unit : word */
359 #define LAMP0_PWM_DEFAULT            255
360 #define LAMP1_PWM_DEFAULT            255
361 
362 #define TABLE_OFFSET_BASE			(14)	/*unit : word */
363 #define CHECK_HOME_SLEEP_TIME 100
364 
365 #define _MOTOR_MOVE_TYPE _4_TABLE_SPACE_FOR_FULL_STEP
366 
367 
368 #define TA_CAL_PIXELNUMBER 50000
369 
370 #define SENSOR_DPI  1200
371 #define TA_IMAGE_PIXELNUMBER 61000
372 #define MAX_PATH 256
373 
374 
375 /**************************** ASIC registers ***********************/
376 
377 /*ES01_XX = Easy Scan_01 register hex xx*/
378 #define		ES01_00_AFEReg0				0x00
379 #define		ES01_01_AFEReg1				0x01
380 #define		ES01_02_AFEReg2				0x02
381 #define		ES01_03_AFEReg3				0x03
382 #define		ES01_04_AFEReset			0x04
383 #define		ES01_05_AFEReg4				0x05
384 
385 #define		ES01_20_DACRed				0x20
386 #define		ES01_21_DACGreen			0x21
387 #define		ES01_22_DACBlue				0x22
388 #define		ES01_24_SignRed				0x24
389 #define		ES01_25_SignGreen			0x25
390 #define		ES01_26_SignBlue			0x26
391 #define		ES01_28_PGARed				0x28
392 #define		ES01_29_PGAGreen			0x29
393 #define		ES01_2A_PGABlue				0x2A
394 
395 #define		ES01_00_ADAFEConfiguration	0x00
396 #define		ES01_02_ADAFEMuxConfig		0x02
397 #define		ES01_04_ADAFEPGACH1			0x04
398 #define		ES01_06_ADAFEPGACH2			0x06
399 #define		ES01_08_ADAFEPGACH3			0x08
400 
401 #define		ES01_0C_ADAFEOffsetCH1P		0x0C
402 #define		ES01_0D_ADAFEOffsetCH1N		0x0D
403 #define		ES01_0E_ADAFEOffsetCH2P		0x0E
404 #define		ES01_0F_ADAFEOffsetCH2N		0x0F
405 #define		ES01_10_ADAFEOffsetCH3P		0x10
406 #define		ES01_11_ADAFEOffsetCH3N		0x11
407 
408 #define		ES01_00_AD9826Configuration	0x00
409 #define		ES01_02_AD9826MuxConfig		0x02
410 #define		ES01_04_AD9826PGARed		0x04
411 #define		ES01_06_AD9826PGAGreen		0x06
412 #define		ES01_08_AD9826PGABlue		0x08
413 #define		ES01_0A_AD9826OffsetRedP	0x0a
414 #define		ES01_0B_AD9826OffsetRedN	0x0b
415 #define		ES01_0C_AD9826OffsetGreenP	0x0c
416 #define		ES01_0D_AD9826OffsetGreenN	0x0d
417 #define		ES01_0E_AD9826OffsetBlueP	0x0e
418 #define		ES01_0F_AD9826OffsetBlueN	0x0f
419 
420 #define		ES02_50_MOTOR_CURRENT_CONTORL		0x50
421 			/* bit[0] */
422 #define	DOWN_LOAD_MOTOR_TABLE_DISABLE	0x00
423 #define	DOWN_LOAD_MOTOR_TABLE_ENABLE	0x01
424 			/* bit[3:1] */
425 #define	_4_TABLE_SPACE_FOR_FULL_STEP	0x00
426 #define	_8_TABLE_SPACE_FOR_1_DIV_2_STEP	0x02
427 #define	_16_TABLE_SPACE_FOR_1_DIV_4_STEP	0x06
428 #define	_32_TABLE_SPACE_FOR_1_DIV_8_STEP	0x0E
429 			/* bit[4] */
430 #define	MOTOR_TABLE_ADDR_SHOW_IN_FIRST_PIXEL_OF_LINE_DISABLE	0x00
431 #define	MOTOR_TABLE_ADDR_SHOW_IN_FIRST_PIXEL_OF_LINE_ENABLE		0x10
432 			/* bit[5] */
433 #define	MOTOR_CURRENT_TABLE_ADDRESS_BIT4_TO_BIT0_DISABLE	0x00
434 #define	MOTOR_CURRENT_TABLE_ADDRESS_BIT4_TO_BIT0_ENABLE		0x20
435 
436 #define		ES02_51_MOTOR_PHASE_TABLE_1			0x51
437 #define		ES02_52_MOTOR_CURRENT_TABLE_A		0x52
438 #define		ES02_53_MOTOR_CURRENT_TABLE_B		0x53
439 
440 #define		ES01_5F_REGISTER_BANK_SELECT	0x5F
441 		/* bit[1:0] */
442 #define		SELECT_REGISTER_BANK0	0x00
443 #define		SELECT_REGISTER_BANK1	0x01
444 #define		SELECT_REGISTER_BANK2	0x02
445 
446 /* AFE Auto Configuration Gain & Offset Register */
447 #define		ES01_60_AFE_AUTO_GAIN_OFFSET_RED_LB		0x60
448 #define		ES01_61_AFE_AUTO_GAIN_OFFSET_RED_HB		0x61
449 #define		ES01_62_AFE_AUTO_GAIN_OFFSET_GREEN_LB	0x62
450 #define		ES01_63_AFE_AUTO_GAIN_OFFSET_GREEN_HB	0x63
451 #define		ES01_64_AFE_AUTO_GAIN_OFFSET_BLUE_LB	0x64
452 #define		ES01_65_AFE_AUTO_GAIN_OFFSET_BLUE_HB	0x65
453 
454 #define	ES01_74_HARDWARE_SETTING	0x74
455 /* bit[0] */
456 #define	MOTOR1_SERIAL_INTERFACE_G10_8_ENABLE	0x01
457 #define	MOTOR1_SERIAL_INTERFACE_G10_8_DISABLE	0x00
458 /* bit[1]*/
459 #define LED_OUT_G11_ENABLE	0x02
460 #define LED_OUT_G11_DISABLE	0x00
461 		  /* bit[2] */
462 #define	SLAVE_SERIAL_INTERFACE_G15_14_ENABLE	0x04
463 #define	SLAVE_SERIAL_INTERFACE_G15_14_DISABLE	0x00
464 		  /* bit[3] */
465 #define	SHUTTLE_CCD_ENABLE	0x08
466 #define	SHUTTLE_CCD_DISABLE	0x00
467 		  /* bit[4] */
468 #define	HARDWARE_RESET_ESIC_AFE_ENABLE	0x10
469 #define	HARDWARE_RESET_ESIC_AFE_DISABLE	0x00
470 
471 #define		ES01_79_AFEMCLK_SDRAMCLK_DELAY_CONTROL		0x79
472 			/* bit[3:0] */
473 #define	AFEMCLK_DELAY_0_ns		0x00
474 #define	AFEMCLK_DELAY_2_ns		0x01
475 #define	AFEMCLK_DELAY_4_ns		0x02
476 #define	AFEMCLK_DELAY_6_ns		0x03
477 #define	AFEMCLK_DELAY_8_ns		0x04
478 #define	AFEMCLK_DELAY_10_ns		0x05
479 #define	AFEMCLK_DELAY_12_ns		0x06
480 #define	AFEMCLK_DELAY_14_ns		0x07
481 #define	AFEMCLK_DELAY_16_ns		0x08
482 #define	AFEMCLK_DELAY_18_ns		0x09
483 #define	AFEMCLK_DELAY_20_ns		0x0A
484 /* bit[7:4]*/
485 #define	SDRAMCLK_DELAY_0_ns		0x00
486 #define	SDRAMCLK_DELAY_2_ns		0x10
487 #define	SDRAMCLK_DELAY_4_ns		0x20
488 #define	SDRAMCLK_DELAY_6_ns		0x30
489 #define	SDRAMCLK_DELAY_8_ns		0x40
490 #define	SDRAMCLK_DELAY_10_ns	0x50
491 #define	SDRAMCLK_DELAY_12_ns	0x60
492 #define	SDRAMCLK_DELAY_14_ns	0x70
493 #define	SDRAMCLK_DELAY_16_ns	0x80
494 #define	SDRAMCLK_DELAY_18_ns	0x90
495 #define	SDRAMCLK_DELAY_20_ns	0xA0
496 
497 #define		ES01_82_AFE_ADCCLK_TIMING_ADJ_BYTE0		0x82
498 #define		ES01_83_AFE_ADCCLK_TIMING_ADJ_BYTE1		0x83
499 #define		ES01_84_AFE_ADCCLK_TIMING_ADJ_BYTE2		0x84
500 #define		ES01_85_AFE_ADCCLK_TIMING_ADJ_BYTE3		0x85
501 #define		ES01_86_DisableAllClockWhenIdle		0x86
502 			/* bit[0] */
503 #define		CLOSE_ALL_CLOCK_ENABLE	0x01
504 #define		CLOSE_ALL_CLOCK_DISABLE	0x00
505 #define		ES01_87_SDRAM_Timing				0x87
506 
507 #define		ES01_88_LINE_ART_THRESHOLD_HIGH_VALUE	0x88
508 #define		ES01_89_LINE_ART_THRESHOLD_LOW_VALUE	0x89
509 
510 #define ES01_8A_FixScanStepMSB			0x8a
511 #define ES01_8B_Status					0x8b
512 		/* bit[4:0] */
513 #define		H1H0L1L0_PS_MJ				0x00
514 #define		SCAN_STATE					0x01
515 #define		GPIO0_7						0x02
516 #define		GPIO8_15					0x03
517 #define		AVAILABLE_BANK_COUNT0_7		0x04
518 #define		AVAILABLE_BANK_COUNT8_15	0x05
519 #define		RAM_ADDRESS_POINTER0_7		0x06
520 #define		RAM_ADDRESS_POINTER8_15		0x07
521 #define		RAM_ADDRESS_POINTER16_19	0x08
522 #define		CARRIAGE_POS_DURING_SCAN0_7	0x09
523 #define		CARRIAGE_POS_DURING_SCAN8_15	0x0a
524 #define		CARRIAGE_POS_DURING_SCAN16_19	0x0b
525 #define		LINE_TIME0_7				0x0C
526 #define		LINE_TIME8_15				0x0d
527 #define		LINE_TIME16_19				0x0e
528 #define		LAST_COMMAND_ADDRESS		0x0f
529 #define		LAST_COMMAND_DATA			0x10
530 #define		SERIAL_READ_REGISTER_0		0x11
531 #define		SERIAL_READ_REGISTER_1		0x12
532 #define		SERIAL_READ_REGISTER_2		0x13
533 #define		SERIAL_READ_REGISTER_3		0x14
534 #define		MOTOR_STEP_TRIGER_POSITION7_0	0x15
535 #define		MOTOR_STEP_TRIGER_POSITION15_8	0x16
536 #define		MOTOR_STEP_TRIGER_POSITION23_16	0x17
537 #define		CHIP_STATUS_A				0x18	/*reserve */
538 #define		CHIP_STRING_0				0x19	/*0x45'E' */
539 #define		CHIP_STRING_1				0x1a	/*0x53'S' */
540 #define		CHIP_STRING_2				0x1b	/*0x43'C' */
541 #define		CHIP_STRING_3				0x1c	/*0x41'A' */
542 #define		CHIP_STRING_4				0x1d	/*0x4E'N' */
543 #define		CHIP_STRING_5				0x1e	/*0x30'0' */
544 #define		CHIP_STRING_6				0x1f	/*0x31'1' */
545 #define ES01_8C_RestartMotorSynPixelNumberM16LSB	0x8c
546 #define ES01_8D_RestartMotorSynPixelNumberM16MSB	0x8d
547 #define ES01_90_Lamp0PWM				0x90
548 #define ES01_91_Lamp1PWM				0x91
549 #define ES01_92_TimerPowerSaveTime		0x92
550 #define ES01_93_MotorWatchDogTime		0x93
551 #define ES01_94_PowerSaveControl		0x94
552 		/* bit[0] */
553 #define		TIMER_POWER_SAVE_ENABLE		0x01
554 #define		TIMER_POWER_SAVE_DISABLE	0x00
555 
556 /* bit[1]*/
557 #define		USB_POWER_SAVE_ENABLE		0x02
558 #define		USB_POWER_SAVE_DISABLE		0x00
559 /* bit[2]*/
560 #define		USB_REMOTE_WAKEUP_ENABLE	0x04
561 #define		USB_REMOTE_WAKEUP_DISABLE	0x00
562 /* bit[5:4]*/
563 #define		LED_MODE_ON					0x00
564 #define		LED_MODE_OFF				0x10
565 #define		LED_MODE_FLASH_SLOWLY		0x20
566 #define		LED_MODE_FLASH_QUICKLY		0x30
567 
568 
569 #define ES01_95_GPIOValue0_7			0x95
570 #define ES01_96_GPIOValue8_15			0x96
571 #define ES01_97_GPIOControl0_7			0x97
572 #define ES01_98_GPIOControl8_15			0x98
573 #define	ES01_99_LAMP_PWM_FREQ_CONTROL	0x99
574 #define ES01_9A_AFEControl				0x9a
575 		/*bit[0] */
576 #define ADAFE_AFE		0x00
577 #define AD9826_AFE		0x01
578 /*bit[1]*/
579 #define AUTO_CHANGE_AFE_GAIN_OFFSET_ENABLE 0x02
580 #define AUTO_CHANGE_AFE_GAIN_OFFSET_DISABLE 0x00
581 
582 #define	ES01_9B_ShadingTableAddrA14_A21		0x9B
583 #define ES01_9C_ShadingTableAddrODDA12_A19 0x9c
584 #define ES01_9D_MotorTableAddrA14_A21	0x9d
585 #define ES01_9E_HorizontalRatio1to15LSB 0x9e
586 #define ES01_9F_HorizontalRatio1to15MSB 0x9f
587 #define ES01_A0_HostStartAddr0_7		0xa0
588 #define ES01_A1_HostStartAddr8_15		0xa1
589 		/* bit[3] */
590 #define		ES01_ACCESS_PRE_GAMMA			0x08
591 #define		ES01_ACCESS_FINAL_GAMMA			0x00
592 #define ES01_A2_HostStartAddr16_21		0xa2
593 		/* bit[7] */
594 #define		ACCESS_DRAM	       			0x00
595 #define		ACCESS_GAMMA_RAM    		0x80
596 #define ES01_A3_HostEndAddr0_7			0xa3
597 #define ES01_A4_HostEndAddr8_15			0xa4
598 #define ES01_A5_HostEndAddr16_21		0xa5
599 
600 #define		ES01_A6_MotorOption				0xA6
601 		/* bit[0] */
602 #define		MOTOR_0_ENABLE				0x01
603 #define		MOTOR_0_DISABLE				0x00
604 /*	bit[1]*/
605 #define		MOTOR_1_ENABLE				0x02
606 #define		MOTOR_1_DISABLE				0x00
607 /* bit[3:2]*/
608 #define		HOME_SENSOR_0_ENABLE		0x00
609 #define		HOME_SENSOR_1_ENABLE		0x04
610 #define		HOME_SENSOR_BOTH_ENABLE		0x08
611 #define		HOME_SENSOR_0_INVERT_ENABLE	0x0c
612 /* bit[7:4]*/
613 #define		ES03_UNIPOLAR_FULL_STEP_2003	0x00
614 #define		ES03_BIPOLAR_FULL_2916			0x10
615 #define		ES03_BIPOLAR_FULL_3955_3966		0x20
616 #define		ES03_UNIPOLAR_PWM_2003			0x30
617 #define		ES03_BIPOLAR_3967				0x40
618 #define		ES03_TABLE_DEFINE				0x50
619 #define ES01_A7_MotorPWMOnTimePhasA		0xa7
620 #define ES01_A8_MotorPWMOnTimePhasB		0xa8
621 #define ES01_A9_MotorPWMOffTimePhasA	0xa9
622 #define ES01_AA_MotorPWMOffTimePhasB	0xaa
623 #define ES01_AB_PWM_CURRENT_CONTROL		0xab
624 
625 		/* bit[1:0] */
626 #define	MOTOR_PWM_CURRENT_0	0x00
627 #define	MOTOR_PWM_CURRENT_1	0x01
628 #define	MOTOR_PWM_CURRENT_2	0x02
629 #define	MOTOR_PWM_CURRENT_3	0x03
630 /* bit[3:2]*/
631 #define	MOTOR1_GPO_VALUE_0	0x00
632 #define	MOTOR1_GPO_VALUE_1	0x04
633 #define	MOTOR1_GPO_VALUE_2	0x08
634 #define	MOTOR1_GPO_VALUE_3	0x0c
635 /* bit[4]*/
636 #define	GPO_OUTPUT_ENABLE	0x10
637 #define	GPO_OUTPUT_DISABLE	0x00
638 /* bit[5]*/
639 #define	SERIAL_PORT_CONTINUOUS_OUTPUT_ENABLE	0x20
640 #define	SERIAL_PORT_CONTINUOUS_OUTPUT_DISABLE	0x00
641 #define ES01_AC_MotorPWMJamRangeLSB		0xac
642 #define ES01_AD_MotorPWMJamRangeMSB		0xad
643 #define ES01_AE_MotorSyncPixelNumberM16LSB	0xae
644 #define ES01_AF_MotorSyncPixelNumberM16MSB	0xaf
645 #define	ES01_B0_CCDPixelLSB					0xb0
646 #define	ES01_B1_CCDPixelMSB					0xb1
647 #define ES01_B2_PHTGPulseWidth				0xb2
648 #define ES01_B3_PHTGWaitWidth				0xb3
649 #define ES01_B4_StartPixelLSB				0xb4
650 #define ES01_B5_StartPixelMSB				0xb5
651 #define ES01_B6_LineWidthPixelLSB			0xb6
652 #define ES01_B7_LineWidthPixelMSB			0xb7
653 
654 #define ES01_B8_ChannelRedExpStartPixelLSB		0xb8
655 #define ES01_B9_ChannelRedExpStartPixelMSB		0xb9
656 #define ES01_BA_ChannelRedExpEndPixelLSB		0xba
657 #define ES01_BB_ChannelRedExpEndPixelMSB		0xbb
658 #define ES01_BC_ChannelGreenExpStartPixelLSB	0xbc
659 #define ES01_BD_ChannelGreenExpStartPixelMSB	0xbd
660 #define ES01_BE_ChannelGreenExpEndPixelLSB		0xbe
661 #define ES01_BF_ChannelGreenExpEndPixelMSB		0xbf
662 #define ES01_C0_ChannelBlueExpStartPixelLSB		0xc0
663 #define ES01_C1_ChannelBlueExpStartPixelMSB		0xc1
664 #define ES01_C2_ChannelBlueExpEndPixelLSB		0xc2
665 #define ES01_C3_ChannelBlueExpEndPixelMSB		0xc3
666 
667 
668 #define ES01_C4_MultiTGTimesRed				0xc4
669 #define ES01_C5_MultiTGTimesGreen			0xc5
670 #define ES01_C6_MultiTGTimesBlue			0xc6
671 #define ES01_C7_MultiTGDummyPixelNumberLSB	0xc7
672 #define ES01_C8_MultiTGDummyPixelNumberMSB	0xc8
673 #define ES01_C9_CCDDummyPixelNumberLSB		0xc9
674 #define ES01_CA_CCDDummyPixelNumberMSB		0xca
675 #define ES01_CB_CCDDummyCycleNumber			0xcb
676 #define ES01_CC_PHTGTimingAdjust			0xcc
677 		/*      bit[0] */
678 #define		PHTG_INVERT_OUTPUT_ENABLE			0x01
679 #define		PHTG_INVERT_OUTPUT_DISABLE			0x00
680 /*	bit[1]*/
681 #define		TWO_TG								0x01
682 #define		MULTI_TG							0x00
683 		  /*    bit[3:2] */
684 #define		CCD_PIXEL_MODE_RED					0x0c
685 #define		CCD_LINE_MOE_RED_00					0x00
686 #define		CCD_LINE_MOE_RED_01					0x04
687 #define		CCD_LINE_MOE_RED_10					0x08
688 /*	bit[5:4]*/
689 #define		CCD_PIXEL_MODE_GREEN				0x30
690 #define		CCD_LINE_MOE_GREEN_00				0x00
691 #define		CCD_LINE_MOE_GREEN_01				0x40
692 #define		CCD_LINE_MOE_GREEN_10				0x80
693 /*	bit[7:6]*/
694 #define		CCD_PIXEL_MODE_BLUE					0xc0
695 #define		CCD_LINE_MOE_BLUE_00				0x00
696 #define		CCD_LINE_MOE_BLUE_01				0x40
697 #define		CCD_LINE_MOE_BLUE_10				0x80
698 
699 #define		ES01_CD_TG_R_CONTROL					0xCD
700 #define		ES01_CE_TG_G_CONTROL					0xCE
701 #define		ES01_CF_TG_B_CONTROL					0xCF
702 
703 #define		ES01_D9_CLEAR_PULSE_WIDTH				0xD9
704 #define		ES01_DA_CLEAR_SIGNAL_INVERTING_OUTPUT	0xDA
705 #define		ES01_DB_PH_RESET_EDGE_TIMING_ADJUST		0xDB
706 #define		ES01_DC_CLEAR_EDGE_TO_PH_TG_EDGE_WIDTH	0xDC
707 #define		ES01_D0_PH1_0						0xD0
708 #define		ES01_D1_PH2_0						0xD1
709 #define		ES01_D2_PH1B_0						0xD2
710 #define		ES01_D4_PHRS_0						0xD4
711 #define		ES01_D5_PHCP_0						0xD5
712 #define		ES01_D6_AFE_VSAMP_0					0xD6
713 #define		ES01_D7_AFE_RSAMP_0					0xD7
714 
715 #define		ES01_D8_PHTG_EDGE_TIMING_ADJUST		0xD8
716 
717 #define ES01_CD_PH1_0						0xcd
718 #define ES01_CE_PH1_1						0xce
719 #define ES01_CF_PH2_0						0xcf
720 #define ES01_D0_PH2_1						0xd0
721 #define ES01_D1_PH1B_0						0xd1
722 #define ES01_D2_PH1B_1						0xd2
723 #define ES01_D3_PH2B_0						0xd3
724 #define ES01_D4_PH2B_1						0xd4
725 #define ES01_D5_PHRS_0						0xd5
726 #define ES01_D6_PHRS_1						0xd6
727 #define ES01_D7_PHCP_0						0xd7
728 #define ES01_D8_PHCP_1						0xd8
729 #define ES01_D9_AFE_VSAMP_0					0xd9
730 #define ES01_DA_AFE_VSAMP_1					0xda
731 #define ES01_DB_AFE_RSAMP_0					0xdb
732 #define ES01_DC_AFE_RSAMP_1					0xdc
733 #define ES01_DD_PH1234_IN_DUMMY_TG			0xdd
734 #define		ES01_DE_CCD_SETUP_REGISTER				0xDE
735 		/* bit[0] */
736 #define		ES01_LINE_SCAN_MODE_DISABLE		0x00
737 #define		ES01_LINE_SCAN_MODE_ENABLE		0x01
738 		/* bit[1] */
739 #define		ES01_CIS_SENSOR_MODE_DISABLE	0x00
740 #define		ES01_CIS_SENSOR_MODE_ENABLE		0x02
741 		/* bit[2] */
742 #define		ES01_CIS_LED_OUTPUT_RGB			0x00
743 #define		ES01_CIS_LED_OUTPUT_RtoGtoB		0x04
744 		/* bit[3] */
745 #define		ES01_CIS_LED_NORMAL_OUTPUT		0x00
746 #define		ES01_CIS_LED_INVERT_OUTPUT		0x08
747 		/* bit[4] */
748 #define		ES01_ACC_IN_IDLE_DISABLE		0x00
749 #define		ES01_ACC_IN_IDLE_ENABLE			0x10
750 		/* bit[5] */
751 #define		ES01_EVEN_ODD_DISABLE			0x00
752 #define		ES01_EVEN_ODD_ENABLE			0x20
753 		/* bit[6] */
754 #define		ES01_ALTERNATE_EVEN_ODD_DISABLE	0x00
755 #define		ES01_ALTERNATE_EVEN_ODD_ENABLE	0x40
756 		/* bit[7] */
757 #define		ES01_RESET_CCD_STATE_DISABLE	0x00
758 #define		ES01_RESET_CCD_STATE_ENABLE		0x80
759 
760 #define ES01_DF_ICG_CONTROL					0xdf
761 		/*      bit[2:0] */
762 #define	BEFORE_PHRS_0_ns		0x00
763 #define	BEFORE_PHRS_416_7t_ns	0x01
764 #define	BEFORE_PHRS_416_6t_ns	0x02
765 #define	BEFORE_PHRS_416_5t_ns	0x03
766 #define	BEFORE_PHRS_416_4t_ns	0x04
767 #define	BEFORE_PHRS_416_3t_ns	0x05
768 #define	BEFORE_PHRS_416_2t_ns	0x06
769 #define	BEFORE_PHRS_416_1t_ns	0x07
770 /*	bit[2:0]*/
771 #define	ICG_UNIT_1_PIXEL_TIME	0x00
772 #define	ICG_UNIT_4_PIXEL_TIME	0x10
773 #define	ICG_UNIT_8_PIXEL_TIME	0x20
774 #define	ICG_UNIT_16_PIXEL_TIME	0x30
775 #define	ICG_UNIT_32_PIXEL_TIME	0x40
776 #define	ICG_UNIT_64_PIXEL_TIME	0x50
777 #define	ICG_UNIT_128_PIXEL_TIME	0x60
778 #define	ICG_UNIT_256_PIXEL_TIME	0x70
779 
780 #define ES01_E0_MotorAccStep0_7				0xe0
781 #define ES01_E1_MotorAccStep8_8				0xe1
782 #define ES01_E2_MotorStepOfMaxSpeed0_7		0xe2
783 #define ES01_E3_MotorStepOfMaxSpeed8_15		0xe3
784 #define ES01_E4_MotorStepOfMaxSpeed16_19	0xe4
785 #define ES01_E5_MotorDecStep				0xe5
786 #define ES01_E6_ScanBackTrackingStepLSB		0xe6
787 #define ES01_E7_ScanBackTrackingStepMSB		0xe7
788 #define ES01_E8_ScanRestartStepLSB			0xe8
789 #define ES01_E9_ScanRestartStepMSB			0xe9
790 #define ES01_EA_ScanBackHomeExtStepLSB		0xea
791 #define ES01_EB_ScanBackHomeExtStepMSB		0xeb
792 #define ES01_EC_ScanAccStep0_7				0xec
793 #define ES01_ED_ScanAccStep8_8				0xed
794 #define ES01_EE_FixScanStepLSB				0xee
795 #define ES01_EF_ScanDecStep					0xef
796 #define ES01_F0_ScanImageStep0_7			0xf0
797 #define ES01_F1_ScanImageStep8_15			0xf1
798 #define ES01_F2_ScanImageStep16_19			0xf2
799 
800 #define ES01_F3_ActionOption				0xf3
801 		/*      bit[0] */
802 #define		MOTOR_MOVE_TO_FIRST_LINE_ENABLE			0x01
803 #define		MOTOR_MOVE_TO_FIRST_LINE_DISABLE		0x00
804 /*	bit[1]*/
805 #define		MOTOR_BACK_HOME_AFTER_SCAN_ENABLE		0x02
806 #define		MOTOR_BACK_HOME_AFTER_SCAN_DISABLE		0x00
807 /*	bit[2]*/
808 #define		SCAN_ENABLE								0x04
809 #define		SCAN_DISABLE							0x00
810 /*	bit[3]*/
811 #define		SCAN_BACK_TRACKING_ENABLE				0x08
812 #define		SCAN_BACK_TRACKING_DISABLE				0x00
813 /*	bit[4]*/
814 #define		INVERT_MOTOR_DIRECTION_ENABLE			0x10
815 #define		INVERT_MOTOR_DIRECTION_DISABLE			0x00
816 /*	bit[5]*/
817 #define		UNIFORM_MOTOR_AND_SCAN_SPEED_ENABLE		0x20
818 #define		UNIFORM_MOTOR_AND_SCAN_SPEED_DISABLE	0x00
819 
820 	 /* bit[6] */
821 #define     ES01_STATIC_SCAN_ENABLE                 0x40
822 #define     ES01_STATIC_SCAN_DISABLE                0x00
823 
824 /*	bit[7]*/
825 #define		MOTOR_TEST_LOOP_ENABLE					0x80
826 #define		MOTOR_TEST_LOOP_DISABLE					0x00
827 #define ES01_F4_ActiveTriger				0xf4
828 		/* bit[0] */
829 #define		ACTION_TRIGER_ENABLE			0x01
830 #define		ACTION_TRIGER_DISABLE			0x00
831 
832 #define		ES01_F5_ScanDataFormat				0xf5
833 			/* bit[0] */
834 #define		COLOR_ES02							0x00
835 #define		GRAY_ES02							0x01
836 /* bit[2:1]*/
837 #define		_8_BITS_ES02						0x00
838 #define		_16_BITS_ES02						0x02
839 #define		_1_BIT_ES02							0x04
840 /* bit[5:4]*/
841 #define		GRAY_RED_ES02						0x00
842 #define		GRAY_GREEN_ES02						0x10
843 #define		GRAY_BLUE_ES02						0x20
844 #define		GRAY_GREEN_BLUE_ES02				0x30
845 
846 #define ES01_F6_MorotControl1				0xf6
847 		/* bit[2:0] */
848 #define		SPEED_UNIT_1_PIXEL_TIME			0x00
849 #define		SPEED_UNIT_4_PIXEL_TIME			0x01
850 #define		SPEED_UNIT_8_PIXEL_TIME			0x02
851 #define		SPEED_UNIT_16_PIXEL_TIME		0x03
852 #define		SPEED_UNIT_32_PIXEL_TIME		0x04
853 #define		SPEED_UNIT_64_PIXEL_TIME		0x05
854 #define		SPEED_UNIT_128_PIXEL_TIME		0x06
855 #define		SPEED_UNIT_256_PIXEL_TIME		0x07
856 /* bit[5:4]*/
857 #define		MOTOR_SYNC_UNIT_1_PIXEL_TIME		0x00
858 #define		MOTOR_SYNC_UNIT_16_PIXEL_TIME		0x10
859 #define		MOTOR_SYNC_UNIT_64_PIXEL_TIME		0x20
860 #define		MOTOR_SYNC_UNIT_256_PIXEL_TIME		0x30
861 #define ES01_F7_DigitalControl							0xf7
862 		/* bit[0] */
863 #define		DIGITAL_REDUCE_ENABLE	0x01
864 #define		DIGITAL_REDUCE_DISABLE	0x00
865 /* bit[3:1]*/
866 #define		DIGITAL_REDUCE_1_1		0x00
867 #define		DIGITAL_REDUCE_1_2		0x02
868 #define		DIGITAL_REDUCE_1_4		0x04
869 #define		DIGITAL_REDUCE_1_8		0x06
870 #define		DIGITAL_REDUCE_1_16		0x08
871 
872 #define		ES01_F8_WHITE_SHADING_DATA_FORMAT		0xF8
873 			/* bit[1:0] */
874 #define		ES01_SHADING_2_INT_14_DEC		0x00
875 #define		ES01_SHADING_3_INT_13_DEC		0x01
876 #define		ES01_SHADING_4_INT_12_DEC		0x02
877 #define		ES01_SHADING_5_INT_11_DEC		0x03
878 #define ES01_F9_BufferFullSize16WordLSB		0xf9
879 #define ES01_FA_BufferFullSize16WordMSB		0xfa
880 #define ES01_FB_BufferEmptySize16WordLSB	0xfb
881 #define ES01_FC_BufferEmptySize16WordMSB	0xfc
882 #define ES01_FD_MotorFixedspeedLSB			0xfd
883 #define ES01_FE_MotorFixedspeedMSB			0xfe
884 #define		ES01_FF_TestControl				0xff
885 		/* bit[0] */
886 #define		OUTPUT_HORIZONTAL_PATTERN_ENABLE	0x01
887 #define		OUTPUT_HORIZONTAL_PATTERN_DISABLE	0x00
888 /* bit[1]*/
889 #define		OUTPUT_VERTICAL_PATTERN_ENABLE	0x02
890 #define		OUTPUT_VERTICAL_PATTERN_DISABLE	0x00
891 /* bit[2]*/
892 #define		BYPASS_DARK_SHADING_ENABLE	0x04
893 #define		BYPASS_DARK_SHADING_DISABLE	0x00
894 /* bit[3]*/
895 #define		BYPASS_WHITE_SHADING_ENABLE		0x08
896 #define		BYPASS_WHITE_SHADING_DISABLE	0x00
897 /* bit[4]*/
898 #define		BYPASS_PRE_GAMMA_ENABLE		0x10
899 #define		BYPASS_PRE_GAMMA_DISABLE	0x00
900 /* bit[5]*/
901 #define		BYPASS_CONVOLUTION_ENABLE	0x20
902 #define		BYPASS_CONVOLUTION_DISABLE	0x00
903 /* bit[6]*/
904 #define		BYPASS_MATRIX_ENABLE	0x40
905 #define		BYPASS_MATRIX_DISABLE	0x00
906 /* bit[7]*/
907 #define		BYPASS_GAMMA_ENABLE		0x80
908 #define		BYPASS_GAMMA_DISABLE	0x00
909 #define		ES01_FF_SCAN_IMAGE_OPTION				0xFF
910 		/* bit[0] */
911 #define		OUTPUT_HORIZONTAL_PATTERN_ENABLE	0x01
912 #define		OUTPUT_HORIZONTAL_PATTERN_DISABLE	0x00
913 /* bit[1]*/
914 #define		OUTPUT_VERTICAL_PATTERN_ENABLE	0x02
915 #define		OUTPUT_VERTICAL_PATTERN_DISABLE	0x00
916 /* bit[2]*/
917 #define		BYPASS_DARK_SHADING_ENABLE	0x04
918 #define		BYPASS_DARK_SHADING_DISABLE	0x00
919 /* bit[3]*/
920 #define		BYPASS_WHITE_SHADING_ENABLE		0x08
921 #define		BYPASS_WHITE_SHADING_DISABLE	0x00
922 /* bit[4]*/
923 #define		BYPASS_PRE_GAMMA_ENABLE		0x10
924 #define		BYPASS_PRE_GAMMA_DISABLE	0x00
925 /* bit[5]*/
926 #define		BYPASS_CONVOLUTION_ENABLE	0x20
927 #define		BYPASS_CONVOLUTION_DISABLE	0x00
928 /* bit[6]*/
929 #define		BYPASS_MATRIX_ENABLE	0x40
930 #define		BYPASS_MATRIX_DISABLE	0x00
931 /* bit[7]*/
932 #define		BYPASS_GAMMA_ENABLE		0x80
933 #define		BYPASS_GAMMA_DISABLE	0x00
934 
935 /*******************************************************************/
936 #define		ES01_160_CHANNEL_A_LATCH_POSITION_HB	0x160
937 #define		ES01_161_CHANNEL_A_LATCH_POSITION_LB	0x161
938 #define		ES01_162_CHANNEL_B_LATCH_POSITION_HB	0x162
939 #define		ES01_163_CHANNEL_B_LATCH_POSITION_LB	0x163
940 #define		ES01_164_CHANNEL_C_LATCH_POSITION_HB	0x164
941 #define		ES01_165_CHANNEL_C_LATCH_POSITION_LB	0x165
942 #define		ES01_166_CHANNEL_D_LATCH_POSITION_HB	0x166
943 #define		ES01_167_CHANNEL_D_LATCH_POSITION_LB	0x167
944 
945 #define		ES01_168_SECONDARY_FF_LATCH_POSITION	0x168
946 
947 #define		ES01_169_NUMBER_OF_SEGMENT_PIXEL_LB		0x169
948 #define		ES01_16A_NUMBER_OF_SEGMENT_PIXEL_HB		0x16A
949 
950 #define		ES01_16B_BETWEEN_SEGMENT_INVALID_PIXEL	0x16B
951 #define		ES01_16C_LINE_SHIFT_OUT_TIMES_DIRECTION	0x16C	/* bit[3:0] */
952 
953 /* segment start address */
954 #define		ES01_16D_EXPOSURE_CYCLE1_SEGMENT1_START_ADDR_BYTE0	0x16D
955 #define		ES01_16E_EXPOSURE_CYCLE1_SEGMENT1_START_ADDR_BYTE1	0x16E
956 #define		ES01_16F_EXPOSURE_CYCLE1_SEGMENT1_START_ADDR_BYTE2	0x16F	/* bit[3:0] */
957 
958 #define		ES01_170_EXPOSURE_CYCLE1_SEGMENT2_START_ADDR_BYTE0	0x170
959 #define		ES01_171_EXPOSURE_CYCLE1_SEGMENT2_START_ADDR_BYTE1	0x171
960 #define		ES01_172_EXPOSURE_CYCLE1_SEGMENT2_START_ADDR_BYTE2	0x172	/* bit[3:0] */
961 
962 #define		ES01_173_EXPOSURE_CYCLE1_SEGMENT3_START_ADDR_BYTE0	0x173
963 #define		ES01_174_EXPOSURE_CYCLE1_SEGMENT3_START_ADDR_BYTE1	0x174
964 #define		ES01_175_EXPOSURE_CYCLE1_SEGMENT3_START_ADDR_BYTE2	0x175	/* bit[3:0] */
965 
966 #define		ES01_176_EXPOSURE_CYCLE1_SEGMENT4_START_ADDR_BYTE0	0x176
967 #define		ES01_177_EXPOSURE_CYCLE1_SEGMENT4_START_ADDR_BYTE1	0x177
968 #define		ES01_178_EXPOSURE_CYCLE1_SEGMENT4_START_ADDR_BYTE2	0x178	/* bit[3:0] */
969 
970 #define		ES01_179_EXPOSURE_CYCLE2_SEGMENT1_START_ADDR_BYTE0	0x179
971 #define		ES01_17A_EXPOSURE_CYCLE2_SEGMENT1_START_ADDR_BYTE1	0x17A
972 #define		ES01_17B_EXPOSURE_CYCLE2_SEGMENT1_START_ADDR_BYTE2	0x17B	/* bit[3:0] */
973 
974 #define		ES01_17C_EXPOSURE_CYCLE2_SEGMENT2_START_ADDR_BYTE0	0x17C
975 #define		ES01_17D_EXPOSURE_CYCLE2_SEGMENT2_START_ADDR_BYTE1	0x17D
976 #define		ES01_17E_EXPOSURE_CYCLE2_SEGMENT2_START_ADDR_BYTE2	0x17E	/* bit[3:0] */
977 
978 #define		ES01_17F_EXPOSURE_CYCLE2_SEGMENT3_START_ADDR_BYTE0	0x17F
979 #define		ES01_180_EXPOSURE_CYCLE2_SEGMENT3_START_ADDR_BYTE1	0x180
980 #define		ES01_181_EXPOSURE_CYCLE2_SEGMENT3_START_ADDR_BYTE2	0x181	/* bit[3:0] */
981 
982 #define		ES01_182_EXPOSURE_CYCLE2_SEGMENT4_START_ADDR_BYTE0	0x182
983 #define		ES01_183_EXPOSURE_CYCLE2_SEGMENT4_START_ADDR_BYTE1	0x183
984 #define		ES01_184_EXPOSURE_CYCLE2_SEGMENT4_START_ADDR_BYTE2	0x184	/* bit[3:0] */
985 
986 #define		ES01_185_EXPOSURE_CYCLE3_SEGMENT1_START_ADDR_BYTE0	0x185
987 #define		ES01_186_EXPOSURE_CYCLE3_SEGMENT1_START_ADDR_BYTE1	0x186
988 #define		ES01_187_EXPOSURE_CYCLE3_SEGMENT1_START_ADDR_BYTE2	0x187	/* bit[3:0] */
989 
990 #define		ES01_188_EXPOSURE_CYCLE3_SEGMENT2_START_ADDR_BYTE0	0x188
991 #define		ES01_189_EXPOSURE_CYCLE3_SEGMENT2_START_ADDR_BYTE1	0x189
992 #define		ES01_18A_EXPOSURE_CYCLE3_SEGMENT2_START_ADDR_BYTE2	0x18A	/* bit[3:0] */
993 
994 #define		ES01_18B_EXPOSURE_CYCLE3_SEGMENT3_START_ADDR_BYTE0	0x18B
995 #define		ES01_18C_EXPOSURE_CYCLE3_SEGMENT3_START_ADDR_BYTE1	0x18C
996 #define		ES01_18D_EXPOSURE_CYCLE3_SEGMENT3_START_ADDR_BYTE2	0x18D	/* bit[3:0] */
997 
998 #define		ES01_18E_EXPOSURE_CYCLE3_SEGMENT4_START_ADDR_BYTE0	0x18E
999 #define		ES01_18F_EXPOSURE_CYCLE3_SEGMENT4_START_ADDR_BYTE1	0x18F
1000 #define		ES01_190_EXPOSURE_CYCLE3_SEGMENT4_START_ADDR_BYTE2	0x190	/* bit[3:0] */
1001 
1002 /* channel gap */
1003 #define		ES01_191_CHANNEL_GAP1_BYTE0	0x191
1004 #define		ES01_192_CHANNEL_GAP1_BYTE1	0x192
1005 #define		ES01_193_CHANNEL_GAP1_BYTE2	0x193	/* bit[3:0] */
1006 
1007 #define		ES01_194_CHANNEL_GAP2_BYTE0	0x194
1008 #define		ES01_195_CHANNEL_GAP2_BYTE1	0x195
1009 #define		ES01_196_CHANNEL_GAP2_BYTE2	0x196	/* bit[3:0] */
1010 
1011 #define		ES01_197_CHANNEL_GAP3_BYTE0	0x197
1012 #define		ES01_198_CHANNEL_GAP3_BYTE1	0x198
1013 #define		ES01_199_CHANNEL_GAP3_BYTE2	0x199	/* bit[3:0] */
1014 
1015 /* channel line gap */
1016 #define		ES01_19A_CHANNEL_LINE_GAP_LB	0x19A
1017 #define		ES01_19B_CHANNEL_LINE_GAP_HB	0x19B
1018 
1019 /* max pack line */
1020 #define		ES01_19C_MAX_PACK_LINE	0x19C	/* bit[5:0] */
1021 
1022 /*pack threshold */
1023 #define		ES01_19D_PACK_THRESHOLD_LINE	0x19D
1024 
1025 /* pack area start address */
1026 #define		ES01_19E_PACK_AREA_R_START_ADDR_BYTE0	0x19E
1027 #define		ES01_19F_PACK_AREA_R_START_ADDR_BYTE1	0x19F
1028 #define		ES01_1A0_PACK_AREA_R_START_ADDR_BYTE2	0x1A0	/* bit[3:0] */
1029 
1030 #define		ES01_1A1_PACK_AREA_G_START_ADDR_BYTE0	0x1A1
1031 #define		ES01_1A2_PACK_AREA_G_START_ADDR_BYTE1	0x1A2
1032 #define		ES01_1A3_PACK_AREA_G_START_ADDR_BYTE2	0x1A3	/* bit[3:0] */
1033 
1034 #define		ES01_1A4_PACK_AREA_B_START_ADDR_BYTE0	0x1A4
1035 #define		ES01_1A5_PACK_AREA_B_START_ADDR_BYTE1	0x1A5
1036 #define		ES01_1A6_PACK_AREA_B_START_ADDR_BYTE2	0x1A6	/* bit[3:0] */
1037 
1038 /* pack area end address */
1039 #define		ES01_1A7_PACK_AREA_R_END_ADDR_BYTE0	0x1A7
1040 #define		ES01_1A8_PACK_AREA_R_END_ADDR_BYTE1	0x1A8
1041 #define		ES01_1A9_PACK_AREA_R_END_ADDR_BYTE2	0x1A9	/* bit[3:0] */
1042 
1043 #define		ES01_1AA_PACK_AREA_G_END_ADDR_BYTE0	0x1AA
1044 #define		ES01_1AB_PACK_AREA_G_END_ADDR_BYTE1	0x1AB
1045 #define		ES01_1AC_PACK_AREA_G_END_ADDR_BYTE2	0x1AC	/* bit[3:0] */
1046 
1047 #define		ES01_1AD_PACK_AREA_B_END_ADDR_BYTE0	0x1AD
1048 #define		ES01_1AE_PACK_AREA_B_END_ADDR_BYTE1	0x1AE
1049 #define		ES01_1AF_PACK_AREA_B_END_ADDR_BYTE2	0x1AF	/* bit[3:0] */
1050 
1051 /* segment pixel number */
1052 #define		ES01_1B0_SEGMENT_PIXEL_NUMBER_LB	0x1B0
1053 #define		ES01_1B1_SEGMENT_PIXEL_NUMBER_HB	0x1B1
1054 
1055 /*overlap pixel number and hold pixel number */
1056 #define		ES01_1B2_OVERLAP_AND_HOLD_PIXEL_NUMBER	0x1B2
1057 
1058 /*convolution parameter */
1059 #define		ES01_1B3_CONVOLUTION_A	0x1B3
1060 #define		ES01_1B4_CONVOLUTION_B	0x1B4
1061 #define		ES01_1B5_CONVOLUTION_C	0x1B5
1062 #define		ES01_1B6_CONVOLUTION_D	0x1B6
1063 #define		ES01_1B7_CONVOLUTION_E	0x1B7
1064 #define		ES01_1B8_CONVOLUTION_F	0x1B8	/* bit[2:0] */
1065 
1066 /* line pixel number */
1067 #define		ES01_1B9_LINE_PIXEL_NUMBER_LB	0x1B9
1068 #define		ES01_1BA_LINE_PIXEL_NUMBER_HB	0x1BA
1069 
1070 /* matrix parameter */
1071 #define		ES01_1BB_MATRIX_A_LB	0x1BB
1072 #define		ES01_1BC_MATRIX_A_HB	0x1BC	/* bit[3:0] */
1073 
1074 #define		ES01_1BD_MATRIX_B_LB	0x1BD
1075 #define		ES01_1BE_MATRIX_B_HB	0x1BE	/* bit[3:0] */
1076 
1077 #define		ES01_1BF_MATRIX_C_LB	0x1BF
1078 #define		ES01_1C0_MATRIX_C_HB	0x1C0	/* bit[3:0] */
1079 
1080 #define		ES01_1C1_MATRIX_D_LB	0x1C1
1081 #define		ES01_1C2_MATRIX_D_HB	0x1C2	/* bit[3:0] */
1082 
1083 #define		ES01_1C3_MATRIX_E_LB	0x1C3
1084 #define		ES01_1C4_MATRIX_E_HB	0x1C4	/* bit[3:0] */
1085 
1086 #define		ES01_1C5_MATRIX_F_LB	0x1C5
1087 #define		ES01_1C6_MATRIX_F_HB	0x1C6	/* bit[3:0] */
1088 
1089 #define		ES01_1C7_MATRIX_G_LB	0x1C7
1090 #define		ES01_1C8_MATRIX_G_HB	0x1C8	/* bit[3:0] */
1091 
1092 #define		ES01_1C9_MATRIX_H_LB	0x1C9
1093 #define		ES01_1CA_MATRIX_H_HB	0x1CA	/* bit[3:0] */
1094 
1095 #define		ES01_1CB_MATRIX_I_LB	0x1CB
1096 #define		ES01_1CC_MATRIX_I_HB	0x1CC	/* bit[3:0] */
1097 
1098 /*dummy clock number */
1099 #define		ES01_1CD_DUMMY_CLOCK_NUMBER	0x1CD	/* bit[3:0] */
1100 
1101 /* line segment number */
1102 #define		ES01_1CE_LINE_SEGMENT_NUMBER 0x1CE
1103 
1104 /* dummy cycle timing */
1105 #define		ES01_1D0_DUMMY_CYCLE_TIMING_B0	0x1D0
1106 #define		ES01_1D1_DUMMY_CYCLE_TIMING_B1	0x1D1
1107 #define		ES01_1D2_DUMMY_CYCLE_TIMING_B2	0x1D2
1108 #define		ES01_1D3_DUMMY_CYCLE_TIMING_B3	0x1D3
1109 
1110 /* PH1 timing adjust register */
1111 #define		ES01_1D4_PH1_TIMING_ADJ_B0	0x1D4
1112 #define		ES01_1D5_PH1_TIMING_ADJ_B1	0x1D5
1113 #define		ES01_1D6_PH1_TIMING_ADJ_B2	0x1D6
1114 #define		ES01_1D7_PH1_TIMING_ADJ_B3	0x1D7
1115 
1116 /* PH2 timing adjust register */
1117 #define		ES01_1D8_PH2_TIMING_ADJ_B0	0x1D8
1118 #define		ES01_1D9_PH2_TIMING_ADJ_B1	0x1D9
1119 #define		ES01_1DA_PH2_TIMING_ADJ_B2	0x1DA
1120 #define		ES01_1DB_PH2_TIMING_ADJ_B3	0x1DB
1121 
1122 /* PH3 timing adjust register */
1123 #define		ES01_1DC_PH3_TIMING_ADJ_B0	0x1DC
1124 #define		ES01_1DD_PH3_TIMING_ADJ_B1	0x1DD
1125 #define		ES01_1DE_PH3_TIMING_ADJ_B2	0x1DE
1126 #define		ES01_1DF_PH3_TIMING_ADJ_B3	0x1DF
1127 
1128 /* PH4 timing adjust register */
1129 #define		ES01_1E0_PH4_TIMING_ADJ_B0	0x1E0
1130 #define		ES01_1E1_PH4_TIMING_ADJ_B1	0x1E1
1131 #define		ES01_1E2_PH4_TIMING_ADJ_B2	0x1E2
1132 #define		ES01_1E3_PH4_TIMING_ADJ_B3	0x1E3
1133 
1134 /*PHRS timing adjust register */
1135 #define		ES01_1E4_PHRS_TIMING_ADJ_B0	0x1E4
1136 #define		ES01_1E5_PHRS_TIMING_ADJ_B1	0x1E5
1137 #define		ES01_1E6_PHRS_TIMING_ADJ_B2	0x1E6
1138 #define		ES01_1E7_PHRS_TIMING_ADJ_B3	0x1E7
1139 
1140 /* PHCP timing adjust register */
1141 #define		ES01_1E8_PHCP_TIMING_ADJ_B0	0x1E8
1142 #define		ES01_1E9_PHCP_TIMING_ADJ_B1	0x1E9
1143 #define		ES01_1EA_PHCP_TIMING_ADJ_B2	0x1EA
1144 #define		ES01_1EB_PHCP_TIMING_ADJ_B3	0x1EB
1145 
1146 /*AFEVS timing adjust register */
1147 #define		ES01_1EC_AFEVS_TIMING_ADJ_B0	0x1EC
1148 #define		ES01_1ED_AFEVS_TIMING_ADJ_B1	0x1ED
1149 #define		ES01_1EE_AFEVS_TIMING_ADJ_B2	0x1EE
1150 #define		ES01_1EF_AFEVS_TIMING_ADJ_B3	0x1EF
1151 
1152 /*AFERS timing adjust register */
1153 #define		ES01_1F0_AFERS_TIMING_ADJ_B0	0x1F0
1154 #define		ES01_1F1_AFERS_TIMING_ADJ_B1	0x1F1
1155 #define		ES01_1F2_AFERS_TIMING_ADJ_B2	0x1F2
1156 #define		ES01_1F3_AFERS_TIMING_ADJ_B3	0x1F3
1157 
1158 /* read out pixel */
1159 #define		ES01_1F4_START_READ_OUT_PIXEL_LB	0x1F4
1160 #define		ES01_1F5_START_READ_OUT_PIXEL_HB	0x1F5
1161 #define		ES01_1F6_READ_OUT_PIXEL_LENGTH_LB	0x1F6
1162 #define		ES01_1F7_READ_OUT_PIXEL_LENGTH_HB	0x1F7
1163 
1164 /* pack channel setting */
1165 #define		ES01_1F8_PACK_CHANNEL_SELECT_B0	0x1F8
1166 #define		ES01_1F9_PACK_CHANNEL_SELECT_B1	0x1F9
1167 #define		ES01_1FA_PACK_CHANNEL_SELECT_B2	0x1FA
1168 #define		ES01_1FB_PACK_CHANNEL_SIZE_B0	0x1FB
1169 #define		ES01_1FC_PACK_CHANNEL_SIZE_B1	0x1FC
1170 #define		ES01_1FD_PACK_CHANNEL_SIZE_B2	0x1FD
1171 
1172 /* AFE gain offset control*/
1173   /* rom code ver 0.10  */
1174 #define		ES01_2A0_AFE_GAIN_OFFSET_CONTROL	0x2A0
1175 #define		ES01_2A1_AFE_AUTO_CONFIG_GAIN		0x2A1
1176 #define		ES01_2A2_AFE_AUTO_CONFIG_OFFSET		0x2A2
1177 
1178 #define		ES01_2B0_SEGMENT0_OVERLAP_SEGMENT1	0x2B0
1179 #define		ES01_2B1_SEGMENT1_OVERLAP_SEGMENT2	0x2B1
1180 #define		ES01_2B2_SEGMENT2_OVERLAP_SEGMENT3	0x2B2
1181 
1182 /* valid pixel parameter */
1183 #define		ES01_2C0_VALID_PIXEL_PARAMETER_OF_SEGMENT1	0x2C0
1184 #define		ES01_2C1_VALID_PIXEL_PARAMETER_OF_SEGMENT2	0x2C1
1185 #define		ES01_2C2_VALID_PIXEL_PARAMETER_OF_SEGMENT3	0x2C2
1186 #define		ES01_2C3_VALID_PIXEL_PARAMETER_OF_SEGMENT4	0x2C3
1187 #define		ES01_2C4_VALID_PIXEL_PARAMETER_OF_SEGMENT5	0x2C4
1188 #define		ES01_2C5_VALID_PIXEL_PARAMETER_OF_SEGMENT6	0x2C5
1189 #define		ES01_2C6_VALID_PIXEL_PARAMETER_OF_SEGMENT7	0x2C6
1190 #define		ES01_2C7_VALID_PIXEL_PARAMETER_OF_SEGMENT8	0x2C7
1191 #define		ES01_2C8_VALID_PIXEL_PARAMETER_OF_SEGMENT9	0x2C8
1192 #define		ES01_2C9_VALID_PIXEL_PARAMETER_OF_SEGMENT10	0x2C9
1193 #define		ES01_2CA_VALID_PIXEL_PARAMETER_OF_SEGMENT11	0x2CA
1194 #define		ES01_2CB_VALID_PIXEL_PARAMETER_OF_SEGMENT12	0x2CB
1195 #define		ES01_2CC_VALID_PIXEL_PARAMETER_OF_SEGMENT13	0x2CC
1196 #define		ES01_2CD_VALID_PIXEL_PARAMETER_OF_SEGMENT14	0x2CD
1197 #define		ES01_2CE_VALID_PIXEL_PARAMETER_OF_SEGMENT15	0x2CE
1198 #define		ES01_2CF_VALID_PIXEL_PARAMETER_OF_SEGMENT16	0x2CF
1199 
1200 /* forward declarations */
1201 static SANE_Status OpenScanChip (PAsic chip);
1202 static SANE_Status CloseScanChip (PAsic chip);
1203 static SANE_Status SafeInitialChip (PAsic chip);
1204 static SANE_Status DRAM_Test (PAsic chip);
1205 #if SANE_UNUSED
1206 static SANE_Status SetPowerSave (PAsic chip);
1207 #endif
1208 static SANE_Status SetLineTimeAndExposure (PAsic chip);
1209 static SANE_Status CCDTiming (PAsic chip);
1210 static SANE_Status IsCarriageHome (PAsic chip, SANE_Bool * LampHome, SANE_Bool * TAHome);
1211 static SANE_Status InitTiming (PAsic chip);
1212 static SANE_Status GetChipStatus (PAsic chip, SANE_Byte Selector, SANE_Byte * ChipStatus);
1213 static SANE_Status SetAFEGainOffset (PAsic chip);
1214 static SANE_Status SetLEDTime (PAsic chip);
1215 static SANE_Status SetScanMode (PAsic chip, SANE_Byte bScanBits);
1216 static SANE_Status SetPackAddress (PAsic chip, unsigned short wXResolution,
1217 				   unsigned short wWidth, unsigned short wX, double XRatioAdderDouble,
1218 				   double XRatioTypeDouble,
1219 				   SANE_Byte byClear_Pulse_Width,
1220 				   unsigned short * PValidPixelNumber);
1221 static SANE_Status SetExtraSetting (PAsic chip, unsigned short wXResolution,
1222 				    unsigned short wCCD_PixelNumber, SANE_Bool isCaribrate);
1223 
1224 
1225 /* Forward declarations */
1226 
1227 static SANE_Status Mustek_SendData (PAsic chip, unsigned short reg, SANE_Byte data);
1228 static SANE_Status Mustek_SendData2Byte (PAsic chip, unsigned short reg, SANE_Byte data);
1229 static SANE_Status Mustek_ReceiveData (PAsic chip, SANE_Byte * reg);
1230 static SANE_Status Mustek_WriteAddressLineForRegister (PAsic chip, SANE_Byte x);
1231 static SANE_Status WriteIOControl (PAsic chip, unsigned short wValue, unsigned short wIndex,
1232 				   unsigned short wLength, SANE_Byte * lpbuf);
1233 static SANE_Status ReadIOControl (PAsic chip, unsigned short wValue, unsigned short wIndex,
1234 				  unsigned short wLength, SANE_Byte * lpbuf);
1235 static SANE_Status Mustek_DMARead (PAsic chip, unsigned int size, SANE_Byte * lpdata);
1236 static SANE_Status Mustek_DMAWrite (PAsic chip, unsigned int size, SANE_Byte * lpdata);
1237 static SANE_Status Mustek_ClearFIFO (PAsic chip);
1238 static SANE_Status SetRWSize (PAsic chip, SANE_Byte ReadWrite, unsigned int size);
1239 
1240 /* Open Scanner by Scanner Name and return Chip Information */
1241 static SANE_Status Asic_Open (PAsic chip, SANE_Byte *pDeviceName);
1242 /* Close Scanner */
1243 static SANE_Status Asic_Close (PAsic chip);
1244 #if SANE_UNUSED
1245 /* Release Scanner Resource */
1246 static SANE_Status Asic_Release (PAsic chip);
1247 #endif
1248 /* Initialize Scanner Parameters */
1249 static SANE_Status Asic_Initialize (PAsic chip);
1250 /* Set Scan Window */
1251 static SANE_Status Asic_SetWindow (PAsic chip, SANE_Byte bScanBits,
1252 				   unsigned short wXResolution, unsigned short wYResolution,
1253 				   unsigned short wX, unsigned short wY, unsigned short wWidth, unsigned short wLength);
1254 /* Turn Lamp  ON or OFF */
1255 static SANE_Status Asic_TurnLamp (PAsic chip, SANE_Bool isLampOn);
1256 /* Turn TA ON or OFF */
1257 static SANE_Status Asic_TurnTA (PAsic chip, SANE_Bool isTAOn);
1258 /* Reset some parameter of asic */
1259 static SANE_Status Asic_Reset (PAsic chip);
1260 /* Set scan source */
1261 static SANE_Status Asic_SetSource (PAsic chip, LIGHTSOURCE lsLightSource);
1262 /* Start scanner to scan */
1263 static SANE_Status Asic_ScanStart (PAsic chip);
1264 /* Stop scanner to scan */
1265 static SANE_Status Asic_ScanStop (PAsic chip);
1266 /* Read One Scan Line When Scanning */
1267 static SANE_Status Asic_ReadImage (PAsic chip, SANE_Byte * pBuffer, unsigned short LinesCount);
1268 #if SANE_UNUSED
1269 /* To Check Hard Key */
1270 static SANE_Status Asic_CheckFunctionKey (PAsic chip, SANE_Byte * key);
1271 #endif
1272 /* To Check if TA id connected */
1273 static SANE_Status Asic_IsTAConnected (PAsic chip, SANE_Bool *hasTA);
1274 #if SANE_UNUSED
1275 /* Download GammaTable to Scanner */
1276 static SANE_Status Asic_DownloadGammaTable (PAsic chip, void * lpBuffer);
1277 #endif
1278 /* For AdjustAD Calculate Scanner*/
1279 static SANE_Status Asic_ReadCalibrationData (PAsic chip, void * pBuffer,
1280 					     unsigned int dwXferBytes, SANE_Byte bScanBits);
1281 /* Set motor move or not */
1282 static SANE_Status Asic_SetMotorType (PAsic chip, SANE_Bool isMotorMove, SANE_Bool isUniformSpeed);
1283 /* Move Motor Forward or Backward */
1284 static SANE_Status Asic_MotorMove (PAsic chip, SANE_Bool isForward, unsigned int dwTotalSteps);
1285 /* Move Motor to Home. */
1286 /* If isTA is TRUE, move TA to home, else move Lamp to home */
1287 static SANE_Status Asic_CarriageHome (PAsic chip, SANE_Bool isTA);
1288 /* For ShadingTable */
1289 static SANE_Status Asic_SetShadingTable (PAsic chip, unsigned short * lpWhiteShading,
1290 					 unsigned short * lpDarkShading,
1291 					 unsigned short wXResolution, unsigned short wWidth, unsigned short wX);
1292 /* Wait motor move to home. isTA no used */
1293 static SANE_Status Asic_WaitCarriageHome (PAsic chip, SANE_Bool isTA);
1294 /* Wait until asic idle */
1295 static SANE_Status Asic_WaitUnitReady (PAsic chip);
1296 /* Set Scan Parameter to Scanner */
1297 static SANE_Status Asic_SetCalibrate (PAsic chip, SANE_Byte bScanBits, unsigned short wXResolution,
1298 				      unsigned short wYResolution, unsigned short wX, unsigned short wY,
1299 				      unsigned short wWidth, unsigned short wLength, SANE_Bool isShading);
1300 /* Set AFE  Parameter to Scanner */
1301 static SANE_Status Asic_SetAFEGainOffset (PAsic chip);
1302 
1303 /* ---------------------- asic motor defines -------------------------- */
1304 
1305 
1306 #define ACTION_MODE_ACCDEC_MOVE 0
1307 #define ACTION_MODE_UNIFORM_SPEED_MOVE 1
1308 
1309 
1310 typedef struct tagMOTOR_CURRENT_AND_PHASE
1311 {
1312   SANE_Byte MoveType;
1313   SANE_Byte FillPhase;
1314   SANE_Byte MotorDriverIs3967;
1315   SANE_Byte MotorCurrentTableA[32];
1316   SANE_Byte MotorCurrentTableB[32];
1317   SANE_Byte MotorPhaseTable[32];
1318 } MOTOR_CURRENT_AND_PHASE, LPMOTOR_CURRENT_AND_PHASE;
1319 
1320 typedef struct tagLLF_RAMACCESS
1321 {
1322   SANE_Byte ReadWrite;
1323   SANE_Byte IsOnChipGamma;
1324   unsigned short LoStartAddress;
1325   unsigned short HiStartAddress;
1326   int RwSize;
1327   SANE_Byte DramDelayTime;
1328   SANE_Byte *BufferPtr;
1329 } LLF_RAMACCESS;
1330 
1331 typedef struct tagLLF_MOTOR_CURRENT_AND_PHASE
1332 {
1333   SANE_Byte MoveType;
1334   SANE_Byte FillPhase;
1335   SANE_Byte MotorDriverIs3967;
1336   SANE_Byte MotorCurrentTableA[32];
1337   SANE_Byte MotorCurrentTableB[32];
1338   SANE_Byte MotorPhaseTable[32];
1339 } LLF_MOTOR_CURRENT_AND_PHASE;
1340 
1341 typedef struct tagLLF_CALCULATEMOTORTABLE
1342 {
1343   unsigned short StartSpeed;
1344   unsigned short EndSpeed;
1345   unsigned short AccStepBeforeScan;
1346   SANE_Byte DecStepAfterScan;
1347   unsigned short * lpMotorTable;
1348 } LLF_CALCULATEMOTORTABLE;
1349 
1350 typedef struct tagLLF_SETMOTORTABLE
1351 {
1352   unsigned int TableSize;
1353   SANE_Byte MotorTableAddress;
1354   unsigned short *MotorTablePtr;
1355 } LLF_SETMOTORTABLE;
1356 
1357 typedef struct tagLLF_MOTORMOVE
1358 {
1359   SANE_Byte ActionMode;		/* 0: AccDec Mode, 1: Uniform Speed Mode, 2: Test Mode */
1360   SANE_Byte ActionType;		/* 0: Forward, 1: Backward, 2:Back To Home */
1361   SANE_Byte MotorSelect;		/* 0: Motor 0 only, 1: Motor 1 only, 2: Motor 0 & 1 */
1362   SANE_Byte HomeSensorSelect;	/* 0: Sensor 0, 1: Sensor 1, 2: Sensor 0 & 1, 3:Invert Sensor 1 */
1363   unsigned short FixMoveSpeed;
1364   unsigned int FixMoveSteps;		/* 3 bytes */
1365   SANE_Byte MotorSpeedUnit;
1366   SANE_Byte MotorSyncUnit;
1367   unsigned short AccStep;			/*Max = 511 */
1368   SANE_Byte DecStep;			/* Max = 255 */
1369   SANE_Byte MotorMoveUnit;
1370   SANE_Byte WaitOrNoWait;		/* 0: no wait, 1: wait */
1371   SANE_Byte Lamp0PwmFreq;		/* Lamp0 PWM freq */
1372   SANE_Byte Lamp1PwmFreq;		/* Lamp1 PWM freq */
1373 
1374   unsigned short wForwardSteps;
1375   unsigned short wScanAccSteps;
1376   SANE_Byte bScanDecSteps;
1377   unsigned short wFixScanSteps;
1378   unsigned short wScanBackTrackingSteps;
1379   unsigned short wScanRestartSteps;
1380   unsigned short wScanBackHomeExtSteps;
1381 } LLF_MOTORMOVE;
1382 
1383 static SANE_Status CalculateMotorTable (LLF_CALCULATEMOTORTABLE *
1384 					lpCalculateMotorTable, unsigned short wYResolution);
1385 static SANE_Status LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE *
1386 					   lpCalculateMotorTable);
1387 static SANE_Status LLFSetMotorCurrentAndPhase (PAsic chip,
1388 					       LLF_MOTOR_CURRENT_AND_PHASE *
1389 					       MotorCurrentAndPhase);
1390 static SANE_Status SetMotorStepTable (PAsic chip, LLF_MOTORMOVE * MotorStepsTable,
1391 				      unsigned short wStartY, unsigned int dwScanImageSteps,
1392 				      unsigned short wYResolution);
1393 static SANE_Status LLFSetMotorTable (PAsic chip,
1394 				     LLF_SETMOTORTABLE * LLF_SetMotorTable);
1395 static SANE_Status SetMotorCurrent (PAsic chip, unsigned short dwMotorSpeed,
1396 				    LLF_MOTOR_CURRENT_AND_PHASE * CurrentPhase);
1397 static SANE_Status LLFMotorMove (PAsic chip, LLF_MOTORMOVE * LLF_MotorMove);
1398 #if SANE_UNUSED
1399 static SANE_Status LLFStopMotorMove (PAsic chip);
1400 #endif
1401 static SANE_Status LLFSetRamAddress (PAsic chip, unsigned int dwStartAddr,
1402 				     unsigned int dwEndAddr, SANE_Byte byAccessTarget);
1403 static SANE_Status LLFRamAccess (PAsic chip, LLF_RAMACCESS * RamAccess);
1404 static SANE_Status MotorBackHome (PAsic chip, SANE_Byte WaitOrNoWait);
1405 
1406 #endif
1407