diff options
Diffstat (limited to 'backend/mustek_usb2_asic.h')
-rw-r--r-- | backend/mustek_usb2_asic.h | 1421 |
1 files changed, 1421 insertions, 0 deletions
diff --git a/backend/mustek_usb2_asic.h b/backend/mustek_usb2_asic.h new file mode 100644 index 0000000..ffc92ff --- /dev/null +++ b/backend/mustek_usb2_asic.h @@ -0,0 +1,1421 @@ +/* sane - Scanner Access Now Easy. + + Copyright (C) 2005 Mustek. + Originally maintained by Mustek + Author:Roy 2005.5.24 + + This file is part of the SANE package. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + As a special exception, the authors of SANE give permission for + additional uses of the libraries contained in this release of SANE. + + The exception is that, if you link a SANE library with other files + to produce an executable, this does not by itself cause the + resulting executable to be covered by the GNU General Public + License. Your use of that executable is in no way restricted on + account of linking the SANE library code into it. + + This exception does not, however, invalidate any other reasons why + the executable file might be covered by the GNU General Public + License. + + If you submit changes to SANE to the maintainers to be included in + a subsequent release, you agree by submitting the changes that + those changes may be distributed with this exception intact. + + If you write modifications of your own for SANE, it is your choice + whether to permit this exception to apply to your modifications. + If you do not wish that, delete this exception notice. + + This file implements a SANE backend for the Mustek BearPaw 2448 TA Pro + and similar USB2 scanners. */ + +#ifndef MUSTEK_USB2_ASIC_H +#define MUSTEK_USB2_ASIC_H + +#include "../include/sane/sanei_usb.h" + +/* ---------------------- low level asic defines -------------------------- */ + +#define TRUE 1 +#define FALSE 0 + +#define _MAX(a,b) ((a)>(b)?(a):(b)) +#define _MIN(a,b) ((a)<(b)?(a):(b)) + +#ifndef LOBYTE +#define LOBYTE(w) (SANE_Byte)((unsigned short)(w) & 0x00ff) +#endif + +#ifndef HIBYTE +#define HIBYTE(w) (SANE_Byte)((unsigned short)(w)>>8 & 0x00ff) +#endif + + +typedef enum tagFIRMWARESTATE +{ + FS_NULL = 0, + FS_ATTACHED = 1, + FS_OPENED = 2, + FS_SCANNING = 3 +} FIRMWARESTATE, *LPFIRMWARESTATE; + +typedef enum tagMOTORSTATE +{ + MS_STILL = 0, + MS_MOVED = 1 +} MOTORSTATE, *LPMOTORSTATE; + +typedef enum tagUSBHOST +{ + HT_USB10 = 0, + HT_USB20 = 1 +} USBHOST; + +typedef enum tagLIGHTSOURCE +{ + LS_REFLECTIVE = 1, + LS_POSITIVE = 2, + LS_NEGATIVE = 4 +} LIGHTSOURCE; + +typedef struct +{ + unsigned int LongX; + unsigned int PicWidth; + unsigned int PicHeight; + + unsigned int Top; + unsigned int Bottom; + unsigned int Left; + unsigned int Right; + unsigned int ScanMode; + unsigned int Dpi; + unsigned int TotalMotorSteps; + + unsigned int CCD_Pixel_Length; + SANE_Byte LineGap; + SANE_Byte TG_Pulse_Width_Pixel; + SANE_Byte TG_Wait_Width_Pixel; + unsigned short Multi_TG_Dummy_Pixel; + unsigned short CCD_Dummy_Pixel; + SANE_Byte Dummy_Cycle; + SANE_Byte TG_Times; + + double LineTime; + + unsigned short StartPixel; + unsigned short StartLine; +} +ScanParam; + +typedef struct +{ + unsigned int Shading_Table_Size; + unsigned int Image_Buffer_Size; + unsigned int Full_Bank; + unsigned int Line_Pixel; + double Line_Time; + SANE_Byte LineGap; +} +Temps; + +typedef struct +{ + /* AFE */ + unsigned int AFE_ADCCLK_Timing; + unsigned int AFE_ADCVS_Timing; + unsigned int AFE_ADCRS_Timing; + unsigned short AFE_ChannelA_LatchPos; + unsigned short AFE_ChannelB_LatchPos; + unsigned short AFE_ChannelC_LatchPos; + unsigned short AFE_ChannelD_LatchPos; + SANE_Byte AFE_Secondary_FF_LatchPos; + /* Sensor */ + unsigned int CCD_DummyCycleTiming; + SANE_Byte PHTG_PluseWidth; + SANE_Byte PHTG_WaitWidth; + unsigned short ChannelR_StartPixel; + unsigned short ChannelR_EndPixel; + unsigned short ChannelG_StartPixel; + unsigned short ChannelG_EndPixel; + unsigned short ChannelB_StartPixel; + unsigned short ChannelB_EndPixel; + SANE_Byte PHTG_TimingAdj; + SANE_Byte PHTG_TimingSetup; + + /*1200dpi */ + unsigned int CCD_PHRS_Timing_1200; + unsigned int CCD_PHCP_Timing_1200; + unsigned int CCD_PH1_Timing_1200; + unsigned int CCD_PH2_Timing_1200; + SANE_Byte DE_CCD_SETUP_REGISTER_1200; + unsigned short wCCDPixelNumber_1200; + + /*600dpi */ + unsigned int CCD_PHRS_Timing_600; + unsigned int CCD_PHCP_Timing_600; + unsigned int CCD_PH1_Timing_600; + unsigned int CCD_PH2_Timing_600; + SANE_Byte DE_CCD_SETUP_REGISTER_600; + unsigned short wCCDPixelNumber_600; +} Timings; + + +typedef struct tagADConverter +{ + SANE_Byte GainR; + SANE_Byte GainG; + SANE_Byte GainB; + SANE_Byte OffsetR; + SANE_Byte OffsetG; + SANE_Byte OffsetB; + SANE_Bool DirectionR; + SANE_Bool DirectionG; + SANE_Bool DirectionB; +} ADConverter, LPADConverter; + + + +typedef struct +{ + unsigned int Shading; + SANE_Byte Shading_0; + SANE_Byte Shading_1; + SANE_Byte Shading_2; + + unsigned int Motor; + SANE_Byte Motor_0; + SANE_Byte Motor_1; + SANE_Byte Motor_2; + + SANE_Byte ImageEndAddr_0; + SANE_Byte ImageEndAddr_1; + SANE_Byte ImageEndAddr_2; + + SANE_Byte ImageFullBank_0; + SANE_Byte ImageFullBank_1; +} +RamPosition; + +typedef enum tagTASSTATUS +{ + TA_NOT_PLUGIN = 0, + TA_PLUGIN = 1, + TA_UNKNOW = 2 +} TASTATUS; + +typedef struct +{ + int fd; /* File Description of Scanner */ + + FIRMWARESTATE firmwarestate; /* record firmware state */ + MOTORSTATE motorstate; /* record motor status */ + SANE_Bool isFirstOpenChip; /* If first open chip, is TRUE */ + USBHOST UsbHost; /* The type of USB port */ + LIGHTSOURCE lsLightSource; /* light source of scanner */ + ScanParam Scan; /* The parameters of Scan */ + + unsigned int dwBytesCountPerRow; + unsigned int dwCalibrationBytesCountPerRow; + + Temps Temp; + Timings Timing; + ADConverter AD; + + SANE_Bool isHardwareShading; + + RamPosition RamPositions; + + unsigned short * lpGammaTable; + SANE_Byte isMotorMove; + + unsigned int ibase1; + unsigned int ibase2; + + unsigned short SWWidth; + + TASTATUS TA_Status; + + SANE_Byte isMotorGoToFirstLine; /*Roy add */ + SANE_Byte * lpShadingTable; /*Roy add */ + SANE_Byte isUniformSpeedToScan; +} +Asic, *PAsic; + +typedef enum +{ + STATUS_GOOD = 0, + STATUS_CANCELLED, + STATUS_EOF, + STATUS_DEVICE_BUSY, + STATUS_INVAL, + STATUS_MEM_ERROR, + STATUS_IO_ERROR, + STATUS_ACCESS_ERROR +} +STATUS; + + +/* For ScanObj */ +typedef struct Point +{ + unsigned int x; + unsigned int y; +} +Point; + +typedef struct Rect +{ + unsigned int left; + unsigned int right; + unsigned int top; + unsigned int bottom; +} +Rect; + +typedef struct RGBColor +{ + unsigned short Red; + unsigned short Green; + unsigned short Blue; +} +RGBColor; + +/* debug levels */ +#define DBG_CRIT 0 /* Critical errors thatshould be printed even + if user hasn't enabled debugging -- use + with care and only after sane_open has been + called */ +#define DBG_ERR 1 /* Other errors */ +#define DBG_WARN 2 /* unusual conditions that may not be fatal */ +#define DBG_INFO 3 /* information useful for the deucated user */ +#define DBG_DET 4 /* more detailed information */ +#define DBG_FUNC 5 /* start and exits of high level functions */ +#define DBG_ASIC 6 /* starts and exits of low level functions */ +#define DBG_DBG 10 /* usefull only for tracing bugs */ + + +#define DPI_2400 0x8000 +#define DPI_1200 0x8000 +#define DPI_600 0x8000 +#define DPI_300 0x4000 +#define DPI_200 0x2aaa +#define DPI_150 0x2000 +#define DPI_100 0x1555 +#define DPI_75 0x1000 +#define DPI_50 0xaaa +#define PIXEL_TIME 333 /*unit : ms */ +#define DRAM_1Mx16_SIZE (1024*1024) /*unit : word */ +#define PackAreaStartAddress ((DRAM_1Mx16_SIZE/4)*3) + +#define TEMP_MEMORY_SIZE_64K 64*1024 + +#define CALIBRATION_PIXEL_WIDTH 10240 /*need 512x */ +#define CALIBRATE_WHITE_LINECOUNT 40 +#define CALIBRATE_DARK_LINECOUNT 2 + +#define ACTION_MODE_ACCDEC_MOVE 0 +#define ACTION_MODE_UNIFORM_SPEED_MOVE 1 + +#define ACTION_TYPE_BACKWARD 0 +#define ACTION_TYPE_FORWARD 1 +#define ACTION_TYPE_BACKTOHOME 2 +#define ACTION_TYPE_TEST_MODE 3 + + +#define SENSOR0_DETECTED 0x10 +#define SENSOR1_DETECTED 0x20 +#define SENSOR0AND1_DETECTED 0x30 + +#define READ_RAM 0 +#define WRITE_RAM 1 + +#define EXTERNAL_RAM 0 +#define ON_CHIP_PRE_GAMMA 1 +#define ON_CHIP_FINAL_GAMMA 2 + +#define MOTOR_TABLE_SIZE 512*8 + +#define ValidPixelNumberFor600DPI 5100 + 50 + 250 +#define ValidPixelNumberFor1200DPI 10200 + 100 + 500 + +#define OverLapPixelNumber600 0 +#define OverLapPixelNumber1200 0 +#define SegmentGap 0 +#define BANK_SIZE (64) + +#define WaitBufferOneLineSize 11000*6 + +#define CCD_PIXEL_NUMBER 21600 +#define CCD_Line_Spacing 24 +#define CCD_EvneOdd_Spacing 2 + +#define ShadingTableSize(x) ( ((x + 10)*6) + ( ((x + 10)*6)/240)*16 ) +#define ACC_DEC_STEP_TABLE_SIZE (512) /*unit : word */ +#define TableBase(x) ((((x)+((1<<TABLE_OFFSET_BASE)-1))>>TABLE_OFFSET_BASE)<<TABLE_OFFSET_BASE) +#define NUM_OF_ACC_DEC_STEP_TABLE (8) /*unit : word */ +#define TABLE_BASE_SIZE (1024*2*2*2*2) /*unit : word */ +#define LAMP0_PWM_DEFAULT 255 +#define LAMP1_PWM_DEFAULT 255 + +#define TABLE_OFFSET_BASE (14) /*unit : word */ +#define CHECK_HOME_SLEEP_TIME 100 + +#define _MOTOR_MOVE_TYPE _4_TABLE_SPACE_FOR_FULL_STEP + + +#define TA_CAL_PIXELNUMBER 50000 + +#define SENSOR_DPI 1200 +#define TA_IMAGE_PIXELNUMBER 61000 +#define MAX_PATH 256 + + +/**************************** ASIC registers ***********************/ + +/*ES01_XX = Easy Scan_01 register hex xx*/ +#define ES01_00_AFEReg0 0x00 +#define ES01_01_AFEReg1 0x01 +#define ES01_02_AFEReg2 0x02 +#define ES01_03_AFEReg3 0x03 +#define ES01_04_AFEReset 0x04 +#define ES01_05_AFEReg4 0x05 + +#define ES01_20_DACRed 0x20 +#define ES01_21_DACGreen 0x21 +#define ES01_22_DACBlue 0x22 +#define ES01_24_SignRed 0x24 +#define ES01_25_SignGreen 0x25 +#define ES01_26_SignBlue 0x26 +#define ES01_28_PGARed 0x28 +#define ES01_29_PGAGreen 0x29 +#define ES01_2A_PGABlue 0x2A + +#define ES01_00_ADAFEConfiguration 0x00 +#define ES01_02_ADAFEMuxConfig 0x02 +#define ES01_04_ADAFEPGACH1 0x04 +#define ES01_06_ADAFEPGACH2 0x06 +#define ES01_08_ADAFEPGACH3 0x08 + +#define ES01_0C_ADAFEOffsetCH1P 0x0C +#define ES01_0D_ADAFEOffsetCH1N 0x0D +#define ES01_0E_ADAFEOffsetCH2P 0x0E +#define ES01_0F_ADAFEOffsetCH2N 0x0F +#define ES01_10_ADAFEOffsetCH3P 0x10 +#define ES01_11_ADAFEOffsetCH3N 0x11 + +#define ES01_00_AD9826Configuration 0x00 +#define ES01_02_AD9826MuxConfig 0x02 +#define ES01_04_AD9826PGARed 0x04 +#define ES01_06_AD9826PGAGreen 0x06 +#define ES01_08_AD9826PGABlue 0x08 +#define ES01_0A_AD9826OffsetRedP 0x0a +#define ES01_0B_AD9826OffsetRedN 0x0b +#define ES01_0C_AD9826OffsetGreenP 0x0c +#define ES01_0D_AD9826OffsetGreenN 0x0d +#define ES01_0E_AD9826OffsetBlueP 0x0e +#define ES01_0F_AD9826OffsetBlueN 0x0f + +#define ES02_50_MOTOR_CURRENT_CONTORL 0x50 + /* bit[0] */ +#define DOWN_LOAD_MOTOR_TABLE_DISABLE 0x00 +#define DOWN_LOAD_MOTOR_TABLE_ENABLE 0x01 + /* bit[3:1] */ +#define _4_TABLE_SPACE_FOR_FULL_STEP 0x00 +#define _8_TABLE_SPACE_FOR_1_DIV_2_STEP 0x02 +#define _16_TABLE_SPACE_FOR_1_DIV_4_STEP 0x06 +#define _32_TABLE_SPACE_FOR_1_DIV_8_STEP 0x0E + /* bit[4] */ +#define MOTOR_TABLE_ADDR_SHOW_IN_FIRST_PIXEL_OF_LINE_DISABLE 0x00 +#define MOTOR_TABLE_ADDR_SHOW_IN_FIRST_PIXEL_OF_LINE_ENABLE 0x10 + /* bit[5] */ +#define MOTOR_CURRENT_TABLE_ADDRESS_BIT4_TO_BIT0_DISABLE 0x00 +#define MOTOR_CURRENT_TABLE_ADDRESS_BIT4_TO_BIT0_ENABLE 0x20 + +#define ES02_51_MOTOR_PHASE_TABLE_1 0x51 +#define ES02_52_MOTOR_CURRENT_TABLE_A 0x52 +#define ES02_53_MOTOR_CURRENT_TABLE_B 0x53 + +#define ES01_5F_REGISTER_BANK_SELECT 0x5F + /* bit[1:0] */ +#define SELECT_REGISTER_BANK0 0x00 +#define SELECT_REGISTER_BANK1 0x01 +#define SELECT_REGISTER_BANK2 0x02 + +/* AFE Auto Configuration Gain & Offset Register */ +#define ES01_60_AFE_AUTO_GAIN_OFFSET_RED_LB 0x60 +#define ES01_61_AFE_AUTO_GAIN_OFFSET_RED_HB 0x61 +#define ES01_62_AFE_AUTO_GAIN_OFFSET_GREEN_LB 0x62 +#define ES01_63_AFE_AUTO_GAIN_OFFSET_GREEN_HB 0x63 +#define ES01_64_AFE_AUTO_GAIN_OFFSET_BLUE_LB 0x64 +#define ES01_65_AFE_AUTO_GAIN_OFFSET_BLUE_HB 0x65 + +#define ES01_74_HARDWARE_SETTING 0x74 +/* bit[0] */ +#define MOTOR1_SERIAL_INTERFACE_G10_8_ENABLE 0x01 +#define MOTOR1_SERIAL_INTERFACE_G10_8_DISABLE 0x00 +/* bit[1]*/ +#define LED_OUT_G11_ENABLE 0x02 +#define LED_OUT_G11_DISABLE 0x00 + /* bit[2] */ +#define SLAVE_SERIAL_INTERFACE_G15_14_ENABLE 0x04 +#define SLAVE_SERIAL_INTERFACE_G15_14_DISABLE 0x00 + /* bit[3] */ +#define SHUTTLE_CCD_ENABLE 0x08 +#define SHUTTLE_CCD_DISABLE 0x00 + /* bit[4] */ +#define HARDWARE_RESET_ESIC_AFE_ENABLE 0x10 +#define HARDWARE_RESET_ESIC_AFE_DISABLE 0x00 + +#define ES01_79_AFEMCLK_SDRAMCLK_DELAY_CONTROL 0x79 + /* bit[3:0] */ +#define AFEMCLK_DELAY_0_ns 0x00 +#define AFEMCLK_DELAY_2_ns 0x01 +#define AFEMCLK_DELAY_4_ns 0x02 +#define AFEMCLK_DELAY_6_ns 0x03 +#define AFEMCLK_DELAY_8_ns 0x04 +#define AFEMCLK_DELAY_10_ns 0x05 +#define AFEMCLK_DELAY_12_ns 0x06 +#define AFEMCLK_DELAY_14_ns 0x07 +#define AFEMCLK_DELAY_16_ns 0x08 +#define AFEMCLK_DELAY_18_ns 0x09 +#define AFEMCLK_DELAY_20_ns 0x0A +/* bit[7:4]*/ +#define SDRAMCLK_DELAY_0_ns 0x00 +#define SDRAMCLK_DELAY_2_ns 0x10 +#define SDRAMCLK_DELAY_4_ns 0x20 +#define SDRAMCLK_DELAY_6_ns 0x30 +#define SDRAMCLK_DELAY_8_ns 0x40 +#define SDRAMCLK_DELAY_10_ns 0x50 +#define SDRAMCLK_DELAY_12_ns 0x60 +#define SDRAMCLK_DELAY_14_ns 0x70 +#define SDRAMCLK_DELAY_16_ns 0x80 +#define SDRAMCLK_DELAY_18_ns 0x90 +#define SDRAMCLK_DELAY_20_ns 0xA0 + +#define ES01_82_AFE_ADCCLK_TIMING_ADJ_BYTE0 0x82 +#define ES01_83_AFE_ADCCLK_TIMING_ADJ_BYTE1 0x83 +#define ES01_84_AFE_ADCCLK_TIMING_ADJ_BYTE2 0x84 +#define ES01_85_AFE_ADCCLK_TIMING_ADJ_BYTE3 0x85 +#define ES01_86_DisableAllClockWhenIdle 0x86 + /* bit[0] */ +#define CLOSE_ALL_CLOCK_ENABLE 0x01 +#define CLOSE_ALL_CLOCK_DISABLE 0x00 +#define ES01_87_SDRAM_Timing 0x87 + +#define ES01_88_LINE_ART_THRESHOLD_HIGH_VALUE 0x88 +#define ES01_89_LINE_ART_THRESHOLD_LOW_VALUE 0x89 + +#define ES01_8A_FixScanStepMSB 0x8a +#define ES01_8B_Status 0x8b + /* bit[4:0] */ +#define H1H0L1L0_PS_MJ 0x00 +#define SCAN_STATE 0x01 +#define GPIO0_7 0x02 +#define GPIO8_15 0x03 +#define AVAILABLE_BANK_COUNT0_7 0x04 +#define AVAILABLE_BANK_COUNT8_15 0x05 +#define RAM_ADDRESS_POINTER0_7 0x06 +#define RAM_ADDRESS_POINTER8_15 0x07 +#define RAM_ADDRESS_POINTER16_19 0x08 +#define CARRIAGE_POS_DURING_SCAN0_7 0x09 +#define CARRIAGE_POS_DURING_SCAN8_15 0x0a +#define CARRIAGE_POS_DURING_SCAN16_19 0x0b +#define LINE_TIME0_7 0x0C +#define LINE_TIME8_15 0x0d +#define LINE_TIME16_19 0x0e +#define LAST_COMMAND_ADDRESS 0x0f +#define LAST_COMMAND_DATA 0x10 +#define SERIAL_READ_REGISTER_0 0x11 +#define SERIAL_READ_REGISTER_1 0x12 +#define SERIAL_READ_REGISTER_2 0x13 +#define SERIAL_READ_REGISTER_3 0x14 +#define MOTOR_STEP_TRIGER_POSITION7_0 0x15 +#define MOTOR_STEP_TRIGER_POSITION15_8 0x16 +#define MOTOR_STEP_TRIGER_POSITION23_16 0x17 +#define CHIP_STATUS_A 0x18 /*reserve */ +#define CHIP_STRING_0 0x19 /*0x45'E' */ +#define CHIP_STRING_1 0x1a /*0x53'S' */ +#define CHIP_STRING_2 0x1b /*0x43'C' */ +#define CHIP_STRING_3 0x1c /*0x41'A' */ +#define CHIP_STRING_4 0x1d /*0x4E'N' */ +#define CHIP_STRING_5 0x1e /*0x30'0' */ +#define CHIP_STRING_6 0x1f /*0x31'1' */ +#define ES01_8C_RestartMotorSynPixelNumberM16LSB 0x8c +#define ES01_8D_RestartMotorSynPixelNumberM16MSB 0x8d +#define ES01_90_Lamp0PWM 0x90 +#define ES01_91_Lamp1PWM 0x91 +#define ES01_92_TimerPowerSaveTime 0x92 +#define ES01_93_MotorWatchDogTime 0x93 +#define ES01_94_PowerSaveControl 0x94 + /* bit[0] */ +#define TIMER_POWER_SAVE_ENABLE 0x01 +#define TIMER_POWER_SAVE_DISABLE 0x00 + +/* bit[1]*/ +#define USB_POWER_SAVE_ENABLE 0x02 +#define USB_POWER_SAVE_DISABLE 0x00 +/* bit[2]*/ +#define USB_REMOTE_WAKEUP_ENABLE 0x04 +#define USB_REMOTE_WAKEUP_DISABLE 0x00 +/* bit[5:4]*/ +#define LED_MODE_ON 0x00 +#define LED_MODE_OFF 0x10 +#define LED_MODE_FLASH_SLOWLY 0x20 +#define LED_MODE_FLASH_QUICKLY 0x30 + + +#define ES01_95_GPIOValue0_7 0x95 +#define ES01_96_GPIOValue8_15 0x96 +#define ES01_97_GPIOControl0_7 0x97 +#define ES01_98_GPIOControl8_15 0x98 +#define ES01_99_LAMP_PWM_FREQ_CONTROL 0x99 +#define ES01_9A_AFEControl 0x9a + /*bit[0] */ +#define ADAFE_AFE 0x00 +#define AD9826_AFE 0x01 +/*bit[1]*/ +#define AUTO_CHANGE_AFE_GAIN_OFFSET_ENABLE 0x02 +#define AUTO_CHANGE_AFE_GAIN_OFFSET_DISABLE 0x00 + +#define ES01_9B_ShadingTableAddrA14_A21 0x9B +#define ES01_9C_ShadingTableAddrODDA12_A19 0x9c +#define ES01_9D_MotorTableAddrA14_A21 0x9d +#define ES01_9E_HorizontalRatio1to15LSB 0x9e +#define ES01_9F_HorizontalRatio1to15MSB 0x9f +#define ES01_A0_HostStartAddr0_7 0xa0 +#define ES01_A1_HostStartAddr8_15 0xa1 + /* bit[3] */ +#define ES01_ACCESS_PRE_GAMMA 0x08 +#define ES01_ACCESS_FINAL_GAMMA 0x00 +#define ES01_A2_HostStartAddr16_21 0xa2 + /* bit[7] */ +#define ACCESS_DRAM 0x00 +#define ACCESS_GAMMA_RAM 0x80 +#define ES01_A3_HostEndAddr0_7 0xa3 +#define ES01_A4_HostEndAddr8_15 0xa4 +#define ES01_A5_HostEndAddr16_21 0xa5 + +#define ES01_A6_MotorOption 0xA6 + /* bit[0] */ +#define MOTOR_0_ENABLE 0x01 +#define MOTOR_0_DISABLE 0x00 +/* bit[1]*/ +#define MOTOR_1_ENABLE 0x02 +#define MOTOR_1_DISABLE 0x00 +/* bit[3:2]*/ +#define HOME_SENSOR_0_ENABLE 0x00 +#define HOME_SENSOR_1_ENABLE 0x04 +#define HOME_SENSOR_BOTH_ENABLE 0x08 +#define HOME_SENSOR_0_INVERT_ENABLE 0x0c +/* bit[7:4]*/ +#define ES03_UNIPOLAR_FULL_STEP_2003 0x00 +#define ES03_BIPOLAR_FULL_2916 0x10 +#define ES03_BIPOLAR_FULL_3955_3966 0x20 +#define ES03_UNIPOLAR_PWM_2003 0x30 +#define ES03_BIPOLAR_3967 0x40 +#define ES03_TABLE_DEFINE 0x50 +#define ES01_A7_MotorPWMOnTimePhasA 0xa7 +#define ES01_A8_MotorPWMOnTimePhasB 0xa8 +#define ES01_A9_MotorPWMOffTimePhasA 0xa9 +#define ES01_AA_MotorPWMOffTimePhasB 0xaa +#define ES01_AB_PWM_CURRENT_CONTROL 0xab + + /* bit[1:0] */ +#define MOTOR_PWM_CURRENT_0 0x00 +#define MOTOR_PWM_CURRENT_1 0x01 +#define MOTOR_PWM_CURRENT_2 0x02 +#define MOTOR_PWM_CURRENT_3 0x03 +/* bit[3:2]*/ +#define MOTOR1_GPO_VALUE_0 0x00 +#define MOTOR1_GPO_VALUE_1 0x04 +#define MOTOR1_GPO_VALUE_2 0x08 +#define MOTOR1_GPO_VALUE_3 0x0c +/* bit[4]*/ +#define GPO_OUTPUT_ENABLE 0x10 +#define GPO_OUTPUT_DISABLE 0x00 +/* bit[5]*/ +#define SERIAL_PORT_CONTINUOUS_OUTPUT_ENABLE 0x20 +#define SERIAL_PORT_CONTINUOUS_OUTPUT_DISABLE 0x00 +#define ES01_AC_MotorPWMJamRangeLSB 0xac +#define ES01_AD_MotorPWMJamRangeMSB 0xad +#define ES01_AE_MotorSyncPixelNumberM16LSB 0xae +#define ES01_AF_MotorSyncPixelNumberM16MSB 0xaf +#define ES01_B0_CCDPixelLSB 0xb0 +#define ES01_B1_CCDPixelMSB 0xb1 +#define ES01_B2_PHTGPulseWidth 0xb2 +#define ES01_B3_PHTGWaitWidth 0xb3 +#define ES01_B4_StartPixelLSB 0xb4 +#define ES01_B5_StartPixelMSB 0xb5 +#define ES01_B6_LineWidthPixelLSB 0xb6 +#define ES01_B7_LineWidthPixelMSB 0xb7 + +#define ES01_B8_ChannelRedExpStartPixelLSB 0xb8 +#define ES01_B9_ChannelRedExpStartPixelMSB 0xb9 +#define ES01_BA_ChannelRedExpEndPixelLSB 0xba +#define ES01_BB_ChannelRedExpEndPixelMSB 0xbb +#define ES01_BC_ChannelGreenExpStartPixelLSB 0xbc +#define ES01_BD_ChannelGreenExpStartPixelMSB 0xbd +#define ES01_BE_ChannelGreenExpEndPixelLSB 0xbe +#define ES01_BF_ChannelGreenExpEndPixelMSB 0xbf +#define ES01_C0_ChannelBlueExpStartPixelLSB 0xc0 +#define ES01_C1_ChannelBlueExpStartPixelMSB 0xc1 +#define ES01_C2_ChannelBlueExpEndPixelLSB 0xc2 +#define ES01_C3_ChannelBlueExpEndPixelMSB 0xc3 + + +#define ES01_C4_MultiTGTimesRed 0xc4 +#define ES01_C5_MultiTGTimesGreen 0xc5 +#define ES01_C6_MultiTGTimesBlue 0xc6 +#define ES01_C7_MultiTGDummyPixelNumberLSB 0xc7 +#define ES01_C8_MultiTGDummyPixelNumberMSB 0xc8 +#define ES01_C9_CCDDummyPixelNumberLSB 0xc9 +#define ES01_CA_CCDDummyPixelNumberMSB 0xca +#define ES01_CB_CCDDummyCycleNumber 0xcb +#define ES01_CC_PHTGTimingAdjust 0xcc + /* bit[0] */ +#define PHTG_INVERT_OUTPUT_ENABLE 0x01 +#define PHTG_INVERT_OUTPUT_DISABLE 0x00 +/* bit[1]*/ +#define TWO_TG 0x01 +#define MULTI_TG 0x00 + /* bit[3:2] */ +#define CCD_PIXEL_MODE_RED 0x0c +#define CCD_LINE_MOE_RED_00 0x00 +#define CCD_LINE_MOE_RED_01 0x04 +#define CCD_LINE_MOE_RED_10 0x08 +/* bit[5:4]*/ +#define CCD_PIXEL_MODE_GREEN 0x30 +#define CCD_LINE_MOE_GREEN_00 0x00 +#define CCD_LINE_MOE_GREEN_01 0x40 +#define CCD_LINE_MOE_GREEN_10 0x80 +/* bit[7:6]*/ +#define CCD_PIXEL_MODE_BLUE 0xc0 +#define CCD_LINE_MOE_BLUE_00 0x00 +#define CCD_LINE_MOE_BLUE_01 0x40 +#define CCD_LINE_MOE_BLUE_10 0x80 + +#define ES01_CD_TG_R_CONTROL 0xCD +#define ES01_CE_TG_G_CONTROL 0xCE +#define ES01_CF_TG_B_CONTROL 0xCF + +#define ES01_D9_CLEAR_PULSE_WIDTH 0xD9 +#define ES01_DA_CLEAR_SIGNAL_INVERTING_OUTPUT 0xDA +#define ES01_DB_PH_RESET_EDGE_TIMING_ADJUST 0xDB +#define ES01_DC_CLEAR_EDGE_TO_PH_TG_EDGE_WIDTH 0xDC +#define ES01_D0_PH1_0 0xD0 +#define ES01_D1_PH2_0 0xD1 +#define ES01_D2_PH1B_0 0xD2 +#define ES01_D4_PHRS_0 0xD4 +#define ES01_D5_PHCP_0 0xD5 +#define ES01_D6_AFE_VSAMP_0 0xD6 +#define ES01_D7_AFE_RSAMP_0 0xD7 + +#define ES01_D8_PHTG_EDGE_TIMING_ADJUST 0xD8 + +#define ES01_CD_PH1_0 0xcd +#define ES01_CE_PH1_1 0xce +#define ES01_CF_PH2_0 0xcf +#define ES01_D0_PH2_1 0xd0 +#define ES01_D1_PH1B_0 0xd1 +#define ES01_D2_PH1B_1 0xd2 +#define ES01_D3_PH2B_0 0xd3 +#define ES01_D4_PH2B_1 0xd4 +#define ES01_D5_PHRS_0 0xd5 +#define ES01_D6_PHRS_1 0xd6 +#define ES01_D7_PHCP_0 0xd7 +#define ES01_D8_PHCP_1 0xd8 +#define ES01_D9_AFE_VSAMP_0 0xd9 +#define ES01_DA_AFE_VSAMP_1 0xda +#define ES01_DB_AFE_RSAMP_0 0xdb +#define ES01_DC_AFE_RSAMP_1 0xdc +#define ES01_DD_PH1234_IN_DUMMY_TG 0xdd +#define ES01_DE_CCD_SETUP_REGISTER 0xDE + /* bit[0] */ +#define ES01_LINE_SCAN_MODE_DISABLE 0x00 +#define ES01_LINE_SCAN_MODE_ENABLE 0x01 + /* bit[1] */ +#define ES01_CIS_SENSOR_MODE_DISABLE 0x00 +#define ES01_CIS_SENSOR_MODE_ENABLE 0x02 + /* bit[2] */ +#define ES01_CIS_LED_OUTPUT_RGB 0x00 +#define ES01_CIS_LED_OUTPUT_RtoGtoB 0x04 + /* bit[3] */ +#define ES01_CIS_LED_NORMAL_OUTPUT 0x00 +#define ES01_CIS_LED_INVERT_OUTPUT 0x08 + /* bit[4] */ +#define ES01_ACC_IN_IDLE_DISABLE 0x00 +#define ES01_ACC_IN_IDLE_ENABLE 0x10 + /* bit[5] */ +#define ES01_EVEN_ODD_DISABLE 0x00 +#define ES01_EVEN_ODD_ENABLE 0x20 + /* bit[6] */ +#define ES01_ALTERNATE_EVEN_ODD_DISABLE 0x00 +#define ES01_ALTERNATE_EVEN_ODD_ENABLE 0x40 + /* bit[7] */ +#define ES01_RESET_CCD_STATE_DISABLE 0x00 +#define ES01_RESET_CCD_STATE_ENABLE 0x80 + +#define ES01_DF_ICG_CONTROL 0xdf + /* bit[2:0] */ +#define BEFORE_PHRS_0_ns 0x00 +#define BEFORE_PHRS_416_7t_ns 0x01 +#define BEFORE_PHRS_416_6t_ns 0x02 +#define BEFORE_PHRS_416_5t_ns 0x03 +#define BEFORE_PHRS_416_4t_ns 0x04 +#define BEFORE_PHRS_416_3t_ns 0x05 +#define BEFORE_PHRS_416_2t_ns 0x06 +#define BEFORE_PHRS_416_1t_ns 0x07 +/* bit[2:0]*/ +#define ICG_UNIT_1_PIXEL_TIME 0x00 +#define ICG_UNIT_4_PIXEL_TIME 0x10 +#define ICG_UNIT_8_PIXEL_TIME 0x20 +#define ICG_UNIT_16_PIXEL_TIME 0x30 +#define ICG_UNIT_32_PIXEL_TIME 0x40 +#define ICG_UNIT_64_PIXEL_TIME 0x50 +#define ICG_UNIT_128_PIXEL_TIME 0x60 +#define ICG_UNIT_256_PIXEL_TIME 0x70 + +#define ES01_E0_MotorAccStep0_7 0xe0 +#define ES01_E1_MotorAccStep8_8 0xe1 +#define ES01_E2_MotorStepOfMaxSpeed0_7 0xe2 +#define ES01_E3_MotorStepOfMaxSpeed8_15 0xe3 +#define ES01_E4_MotorStepOfMaxSpeed16_19 0xe4 +#define ES01_E5_MotorDecStep 0xe5 +#define ES01_E6_ScanBackTrackingStepLSB 0xe6 +#define ES01_E7_ScanBackTrackingStepMSB 0xe7 +#define ES01_E8_ScanRestartStepLSB 0xe8 +#define ES01_E9_ScanRestartStepMSB 0xe9 +#define ES01_EA_ScanBackHomeExtStepLSB 0xea +#define ES01_EB_ScanBackHomeExtStepMSB 0xeb +#define ES01_EC_ScanAccStep0_7 0xec +#define ES01_ED_ScanAccStep8_8 0xed +#define ES01_EE_FixScanStepLSB 0xee +#define ES01_EF_ScanDecStep 0xef +#define ES01_F0_ScanImageStep0_7 0xf0 +#define ES01_F1_ScanImageStep8_15 0xf1 +#define ES01_F2_ScanImageStep16_19 0xf2 + +#define ES01_F3_ActionOption 0xf3 + /* bit[0] */ +#define MOTOR_MOVE_TO_FIRST_LINE_ENABLE 0x01 +#define MOTOR_MOVE_TO_FIRST_LINE_DISABLE 0x00 +/* bit[1]*/ +#define MOTOR_BACK_HOME_AFTER_SCAN_ENABLE 0x02 +#define MOTOR_BACK_HOME_AFTER_SCAN_DISABLE 0x00 +/* bit[2]*/ +#define SCAN_ENABLE 0x04 +#define SCAN_DISABLE 0x00 +/* bit[3]*/ +#define SCAN_BACK_TRACKING_ENABLE 0x08 +#define SCAN_BACK_TRACKING_DISABLE 0x00 +/* bit[4]*/ +#define INVERT_MOTOR_DIRECTION_ENABLE 0x10 +#define INVERT_MOTOR_DIRECTION_DISABLE 0x00 +/* bit[5]*/ +#define UNIFORM_MOTOR_AND_SCAN_SPEED_ENABLE 0x20 +#define UNIFORM_MOTOR_AND_SCAN_SPEED_DISABLE 0x00 + + /* bit[6] */ +#define ES01_STATIC_SCAN_ENABLE 0x40 +#define ES01_STATIC_SCAN_DISABLE 0x00 + +/* bit[7]*/ +#define MOTOR_TEST_LOOP_ENABLE 0x80 +#define MOTOR_TEST_LOOP_DISABLE 0x00 +#define ES01_F4_ActiveTriger 0xf4 + /* bit[0] */ +#define ACTION_TRIGER_ENABLE 0x01 +#define ACTION_TRIGER_DISABLE 0x00 + +#define ES01_F5_ScanDataFormat 0xf5 + /* bit[0] */ +#define COLOR_ES02 0x00 +#define GRAY_ES02 0x01 +/* bit[2:1]*/ +#define _8_BITS_ES02 0x00 +#define _16_BITS_ES02 0x02 +#define _1_BIT_ES02 0x04 +/* bit[5:4]*/ +#define GRAY_RED_ES02 0x00 +#define GRAY_GREEN_ES02 0x10 +#define GRAY_BLUE_ES02 0x20 +#define GRAY_GREEN_BLUE_ES02 0x30 + +#define ES01_F6_MorotControl1 0xf6 + /* bit[2:0] */ +#define SPEED_UNIT_1_PIXEL_TIME 0x00 +#define SPEED_UNIT_4_PIXEL_TIME 0x01 +#define SPEED_UNIT_8_PIXEL_TIME 0x02 +#define SPEED_UNIT_16_PIXEL_TIME 0x03 +#define SPEED_UNIT_32_PIXEL_TIME 0x04 +#define SPEED_UNIT_64_PIXEL_TIME 0x05 +#define SPEED_UNIT_128_PIXEL_TIME 0x06 +#define SPEED_UNIT_256_PIXEL_TIME 0x07 +/* bit[5:4]*/ +#define MOTOR_SYNC_UNIT_1_PIXEL_TIME 0x00 +#define MOTOR_SYNC_UNIT_16_PIXEL_TIME 0x10 +#define MOTOR_SYNC_UNIT_64_PIXEL_TIME 0x20 +#define MOTOR_SYNC_UNIT_256_PIXEL_TIME 0x30 +#define ES01_F7_DigitalControl 0xf7 + /* bit[0] */ +#define DIGITAL_REDUCE_ENABLE 0x01 +#define DIGITAL_REDUCE_DISABLE 0x00 +/* bit[3:1]*/ +#define DIGITAL_REDUCE_1_1 0x00 +#define DIGITAL_REDUCE_1_2 0x02 +#define DIGITAL_REDUCE_1_4 0x04 +#define DIGITAL_REDUCE_1_8 0x06 +#define DIGITAL_REDUCE_1_16 0x08 + +#define ES01_F8_WHITE_SHADING_DATA_FORMAT 0xF8 + /* bit[1:0] */ +#define ES01_SHADING_2_INT_14_DEC 0x00 +#define ES01_SHADING_3_INT_13_DEC 0x01 +#define ES01_SHADING_4_INT_12_DEC 0x02 +#define ES01_SHADING_5_INT_11_DEC 0x03 +#define ES01_F9_BufferFullSize16WordLSB 0xf9 +#define ES01_FA_BufferFullSize16WordMSB 0xfa +#define ES01_FB_BufferEmptySize16WordLSB 0xfb +#define ES01_FC_BufferEmptySize16WordMSB 0xfc +#define ES01_FD_MotorFixedspeedLSB 0xfd +#define ES01_FE_MotorFixedspeedMSB 0xfe +#define ES01_FF_TestControl 0xff + /* bit[0] */ +#define OUTPUT_HORIZONTAL_PATTERN_ENABLE 0x01 +#define OUTPUT_HORIZONTAL_PATTERN_DISABLE 0x00 +/* bit[1]*/ +#define OUTPUT_VERTICAL_PATTERN_ENABLE 0x02 +#define OUTPUT_VERTICAL_PATTERN_DISABLE 0x00 +/* bit[2]*/ +#define BYPASS_DARK_SHADING_ENABLE 0x04 +#define BYPASS_DARK_SHADING_DISABLE 0x00 +/* bit[3]*/ +#define BYPASS_WHITE_SHADING_ENABLE 0x08 +#define BYPASS_WHITE_SHADING_DISABLE 0x00 +/* bit[4]*/ +#define BYPASS_PRE_GAMMA_ENABLE 0x10 +#define BYPASS_PRE_GAMMA_DISABLE 0x00 +/* bit[5]*/ +#define BYPASS_CONVOLUTION_ENABLE 0x20 +#define BYPASS_CONVOLUTION_DISABLE 0x00 +/* bit[6]*/ +#define BYPASS_MATRIX_ENABLE 0x40 +#define BYPASS_MATRIX_DISABLE 0x00 +/* bit[7]*/ +#define BYPASS_GAMMA_ENABLE 0x80 +#define BYPASS_GAMMA_DISABLE 0x00 +#define ES01_FF_SCAN_IMAGE_OPTION 0xFF + /* bit[0] */ +#define OUTPUT_HORIZONTAL_PATTERN_ENABLE 0x01 +#define OUTPUT_HORIZONTAL_PATTERN_DISABLE 0x00 +/* bit[1]*/ +#define OUTPUT_VERTICAL_PATTERN_ENABLE 0x02 +#define OUTPUT_VERTICAL_PATTERN_DISABLE 0x00 +/* bit[2]*/ +#define BYPASS_DARK_SHADING_ENABLE 0x04 +#define BYPASS_DARK_SHADING_DISABLE 0x00 +/* bit[3]*/ +#define BYPASS_WHITE_SHADING_ENABLE 0x08 +#define BYPASS_WHITE_SHADING_DISABLE 0x00 +/* bit[4]*/ +#define BYPASS_PRE_GAMMA_ENABLE 0x10 +#define BYPASS_PRE_GAMMA_DISABLE 0x00 +/* bit[5]*/ +#define BYPASS_CONVOLUTION_ENABLE 0x20 +#define BYPASS_CONVOLUTION_DISABLE 0x00 +/* bit[6]*/ +#define BYPASS_MATRIX_ENABLE 0x40 +#define BYPASS_MATRIX_DISABLE 0x00 +/* bit[7]*/ +#define BYPASS_GAMMA_ENABLE 0x80 +#define BYPASS_GAMMA_DISABLE 0x00 + +/*******************************************************************/ +#define ES01_160_CHANNEL_A_LATCH_POSITION_HB 0x160 +#define ES01_161_CHANNEL_A_LATCH_POSITION_LB 0x161 +#define ES01_162_CHANNEL_B_LATCH_POSITION_HB 0x162 +#define ES01_163_CHANNEL_B_LATCH_POSITION_LB 0x163 +#define ES01_164_CHANNEL_C_LATCH_POSITION_HB 0x164 +#define ES01_165_CHANNEL_C_LATCH_POSITION_LB 0x165 +#define ES01_166_CHANNEL_D_LATCH_POSITION_HB 0x166 +#define ES01_167_CHANNEL_D_LATCH_POSITION_LB 0x167 + +#define ES01_168_SECONDARY_FF_LATCH_POSITION 0x168 + +#define ES01_169_NUMBER_OF_SEGMENT_PIXEL_LB 0x169 +#define ES01_16A_NUMBER_OF_SEGMENT_PIXEL_HB 0x16A + +#define ES01_16B_BETWEEN_SEGMENT_INVALID_PIXEL 0x16B +#define ES01_16C_LINE_SHIFT_OUT_TIMES_DIRECTION 0x16C /* bit[3:0] */ + +/* segment start address */ +#define ES01_16D_EXPOSURE_CYCLE1_SEGMENT1_START_ADDR_BYTE0 0x16D +#define ES01_16E_EXPOSURE_CYCLE1_SEGMENT1_START_ADDR_BYTE1 0x16E +#define ES01_16F_EXPOSURE_CYCLE1_SEGMENT1_START_ADDR_BYTE2 0x16F /* bit[3:0] */ + +#define ES01_170_EXPOSURE_CYCLE1_SEGMENT2_START_ADDR_BYTE0 0x170 +#define ES01_171_EXPOSURE_CYCLE1_SEGMENT2_START_ADDR_BYTE1 0x171 +#define ES01_172_EXPOSURE_CYCLE1_SEGMENT2_START_ADDR_BYTE2 0x172 /* bit[3:0] */ + +#define ES01_173_EXPOSURE_CYCLE1_SEGMENT3_START_ADDR_BYTE0 0x173 +#define ES01_174_EXPOSURE_CYCLE1_SEGMENT3_START_ADDR_BYTE1 0x174 +#define ES01_175_EXPOSURE_CYCLE1_SEGMENT3_START_ADDR_BYTE2 0x175 /* bit[3:0] */ + +#define ES01_176_EXPOSURE_CYCLE1_SEGMENT4_START_ADDR_BYTE0 0x176 +#define ES01_177_EXPOSURE_CYCLE1_SEGMENT4_START_ADDR_BYTE1 0x177 +#define ES01_178_EXPOSURE_CYCLE1_SEGMENT4_START_ADDR_BYTE2 0x178 /* bit[3:0] */ + +#define ES01_179_EXPOSURE_CYCLE2_SEGMENT1_START_ADDR_BYTE0 0x179 +#define ES01_17A_EXPOSURE_CYCLE2_SEGMENT1_START_ADDR_BYTE1 0x17A +#define ES01_17B_EXPOSURE_CYCLE2_SEGMENT1_START_ADDR_BYTE2 0x17B /* bit[3:0] */ + +#define ES01_17C_EXPOSURE_CYCLE2_SEGMENT2_START_ADDR_BYTE0 0x17C +#define ES01_17D_EXPOSURE_CYCLE2_SEGMENT2_START_ADDR_BYTE1 0x17D +#define ES01_17E_EXPOSURE_CYCLE2_SEGMENT2_START_ADDR_BYTE2 0x17E /* bit[3:0] */ + +#define ES01_17F_EXPOSURE_CYCLE2_SEGMENT3_START_ADDR_BYTE0 0x17F +#define ES01_180_EXPOSURE_CYCLE2_SEGMENT3_START_ADDR_BYTE1 0x180 +#define ES01_181_EXPOSURE_CYCLE2_SEGMENT3_START_ADDR_BYTE2 0x181 /* bit[3:0] */ + +#define ES01_182_EXPOSURE_CYCLE2_SEGMENT4_START_ADDR_BYTE0 0x182 +#define ES01_183_EXPOSURE_CYCLE2_SEGMENT4_START_ADDR_BYTE1 0x183 +#define ES01_184_EXPOSURE_CYCLE2_SEGMENT4_START_ADDR_BYTE2 0x184 /* bit[3:0] */ + +#define ES01_185_EXPOSURE_CYCLE3_SEGMENT1_START_ADDR_BYTE0 0x185 +#define ES01_186_EXPOSURE_CYCLE3_SEGMENT1_START_ADDR_BYTE1 0x186 +#define ES01_187_EXPOSURE_CYCLE3_SEGMENT1_START_ADDR_BYTE2 0x187 /* bit[3:0] */ + +#define ES01_188_EXPOSURE_CYCLE3_SEGMENT2_START_ADDR_BYTE0 0x188 +#define ES01_189_EXPOSURE_CYCLE3_SEGMENT2_START_ADDR_BYTE1 0x189 +#define ES01_18A_EXPOSURE_CYCLE3_SEGMENT2_START_ADDR_BYTE2 0x18A /* bit[3:0] */ + +#define ES01_18B_EXPOSURE_CYCLE3_SEGMENT3_START_ADDR_BYTE0 0x18B +#define ES01_18C_EXPOSURE_CYCLE3_SEGMENT3_START_ADDR_BYTE1 0x18C +#define ES01_18D_EXPOSURE_CYCLE3_SEGMENT3_START_ADDR_BYTE2 0x18D /* bit[3:0] */ + +#define ES01_18E_EXPOSURE_CYCLE3_SEGMENT4_START_ADDR_BYTE0 0x18E +#define ES01_18F_EXPOSURE_CYCLE3_SEGMENT4_START_ADDR_BYTE1 0x18F +#define ES01_190_EXPOSURE_CYCLE3_SEGMENT4_START_ADDR_BYTE2 0x190 /* bit[3:0] */ + +/* channel gap */ +#define ES01_191_CHANNEL_GAP1_BYTE0 0x191 +#define ES01_192_CHANNEL_GAP1_BYTE1 0x192 +#define ES01_193_CHANNEL_GAP1_BYTE2 0x193 /* bit[3:0] */ + +#define ES01_194_CHANNEL_GAP2_BYTE0 0x194 +#define ES01_195_CHANNEL_GAP2_BYTE1 0x195 +#define ES01_196_CHANNEL_GAP2_BYTE2 0x196 /* bit[3:0] */ + +#define ES01_197_CHANNEL_GAP3_BYTE0 0x197 +#define ES01_198_CHANNEL_GAP3_BYTE1 0x198 +#define ES01_199_CHANNEL_GAP3_BYTE2 0x199 /* bit[3:0] */ + +/* channel line gap */ +#define ES01_19A_CHANNEL_LINE_GAP_LB 0x19A +#define ES01_19B_CHANNEL_LINE_GAP_HB 0x19B + +/* max pack line */ +#define ES01_19C_MAX_PACK_LINE 0x19C /* bit[5:0] */ + +/*pack threshold */ +#define ES01_19D_PACK_THRESHOLD_LINE 0x19D + +/* pack area start address */ +#define ES01_19E_PACK_AREA_R_START_ADDR_BYTE0 0x19E +#define ES01_19F_PACK_AREA_R_START_ADDR_BYTE1 0x19F +#define ES01_1A0_PACK_AREA_R_START_ADDR_BYTE2 0x1A0 /* bit[3:0] */ + +#define ES01_1A1_PACK_AREA_G_START_ADDR_BYTE0 0x1A1 +#define ES01_1A2_PACK_AREA_G_START_ADDR_BYTE1 0x1A2 +#define ES01_1A3_PACK_AREA_G_START_ADDR_BYTE2 0x1A3 /* bit[3:0] */ + +#define ES01_1A4_PACK_AREA_B_START_ADDR_BYTE0 0x1A4 +#define ES01_1A5_PACK_AREA_B_START_ADDR_BYTE1 0x1A5 +#define ES01_1A6_PACK_AREA_B_START_ADDR_BYTE2 0x1A6 /* bit[3:0] */ + +/* pack area end address */ +#define ES01_1A7_PACK_AREA_R_END_ADDR_BYTE0 0x1A7 +#define ES01_1A8_PACK_AREA_R_END_ADDR_BYTE1 0x1A8 +#define ES01_1A9_PACK_AREA_R_END_ADDR_BYTE2 0x1A9 /* bit[3:0] */ + +#define ES01_1AA_PACK_AREA_G_END_ADDR_BYTE0 0x1AA +#define ES01_1AB_PACK_AREA_G_END_ADDR_BYTE1 0x1AB +#define ES01_1AC_PACK_AREA_G_END_ADDR_BYTE2 0x1AC /* bit[3:0] */ + +#define ES01_1AD_PACK_AREA_B_END_ADDR_BYTE0 0x1AD +#define ES01_1AE_PACK_AREA_B_END_ADDR_BYTE1 0x1AE +#define ES01_1AF_PACK_AREA_B_END_ADDR_BYTE2 0x1AF /* bit[3:0] */ + +/* segment pixel number */ +#define ES01_1B0_SEGMENT_PIXEL_NUMBER_LB 0x1B0 +#define ES01_1B1_SEGMENT_PIXEL_NUMBER_HB 0x1B1 + +/*overlap pixel number and hold pixel number */ +#define ES01_1B2_OVERLAP_AND_HOLD_PIXEL_NUMBER 0x1B2 + +/*convolution parameter */ +#define ES01_1B3_CONVOLUTION_A 0x1B3 +#define ES01_1B4_CONVOLUTION_B 0x1B4 +#define ES01_1B5_CONVOLUTION_C 0x1B5 +#define ES01_1B6_CONVOLUTION_D 0x1B6 +#define ES01_1B7_CONVOLUTION_E 0x1B7 +#define ES01_1B8_CONVOLUTION_F 0x1B8 /* bit[2:0] */ + +/* line pixel number */ +#define ES01_1B9_LINE_PIXEL_NUMBER_LB 0x1B9 +#define ES01_1BA_LINE_PIXEL_NUMBER_HB 0x1BA + +/* matrix parameter */ +#define ES01_1BB_MATRIX_A_LB 0x1BB +#define ES01_1BC_MATRIX_A_HB 0x1BC /* bit[3:0] */ + +#define ES01_1BD_MATRIX_B_LB 0x1BD +#define ES01_1BE_MATRIX_B_HB 0x1BE /* bit[3:0] */ + +#define ES01_1BF_MATRIX_C_LB 0x1BF +#define ES01_1C0_MATRIX_C_HB 0x1C0 /* bit[3:0] */ + +#define ES01_1C1_MATRIX_D_LB 0x1C1 +#define ES01_1C2_MATRIX_D_HB 0x1C2 /* bit[3:0] */ + +#define ES01_1C3_MATRIX_E_LB 0x1C3 +#define ES01_1C4_MATRIX_E_HB 0x1C4 /* bit[3:0] */ + +#define ES01_1C5_MATRIX_F_LB 0x1C5 +#define ES01_1C6_MATRIX_F_HB 0x1C6 /* bit[3:0] */ + +#define ES01_1C7_MATRIX_G_LB 0x1C7 +#define ES01_1C8_MATRIX_G_HB 0x1C8 /* bit[3:0] */ + +#define ES01_1C9_MATRIX_H_LB 0x1C9 +#define ES01_1CA_MATRIX_H_HB 0x1CA /* bit[3:0] */ + +#define ES01_1CB_MATRIX_I_LB 0x1CB +#define ES01_1CC_MATRIX_I_HB 0x1CC /* bit[3:0] */ + +/*dummy clock number */ +#define ES01_1CD_DUMMY_CLOCK_NUMBER 0x1CD /* bit[3:0] */ + +/* line segment number */ +#define ES01_1CE_LINE_SEGMENT_NUMBER 0x1CE + +/* dummy cycle timing */ +#define ES01_1D0_DUMMY_CYCLE_TIMING_B0 0x1D0 +#define ES01_1D1_DUMMY_CYCLE_TIMING_B1 0x1D1 +#define ES01_1D2_DUMMY_CYCLE_TIMING_B2 0x1D2 +#define ES01_1D3_DUMMY_CYCLE_TIMING_B3 0x1D3 + +/* PH1 timing adjust register */ +#define ES01_1D4_PH1_TIMING_ADJ_B0 0x1D4 +#define ES01_1D5_PH1_TIMING_ADJ_B1 0x1D5 +#define ES01_1D6_PH1_TIMING_ADJ_B2 0x1D6 +#define ES01_1D7_PH1_TIMING_ADJ_B3 0x1D7 + +/* PH2 timing adjust register */ +#define ES01_1D8_PH2_TIMING_ADJ_B0 0x1D8 +#define ES01_1D9_PH2_TIMING_ADJ_B1 0x1D9 +#define ES01_1DA_PH2_TIMING_ADJ_B2 0x1DA +#define ES01_1DB_PH2_TIMING_ADJ_B3 0x1DB + +/* PH3 timing adjust register */ +#define ES01_1DC_PH3_TIMING_ADJ_B0 0x1DC +#define ES01_1DD_PH3_TIMING_ADJ_B1 0x1DD +#define ES01_1DE_PH3_TIMING_ADJ_B2 0x1DE +#define ES01_1DF_PH3_TIMING_ADJ_B3 0x1DF + +/* PH4 timing adjust register */ +#define ES01_1E0_PH4_TIMING_ADJ_B0 0x1E0 +#define ES01_1E1_PH4_TIMING_ADJ_B1 0x1E1 +#define ES01_1E2_PH4_TIMING_ADJ_B2 0x1E2 +#define ES01_1E3_PH4_TIMING_ADJ_B3 0x1E3 + +/*PHRS timing adjust register */ +#define ES01_1E4_PHRS_TIMING_ADJ_B0 0x1E4 +#define ES01_1E5_PHRS_TIMING_ADJ_B1 0x1E5 +#define ES01_1E6_PHRS_TIMING_ADJ_B2 0x1E6 +#define ES01_1E7_PHRS_TIMING_ADJ_B3 0x1E7 + +/* PHCP timing adjust register */ +#define ES01_1E8_PHCP_TIMING_ADJ_B0 0x1E8 +#define ES01_1E9_PHCP_TIMING_ADJ_B1 0x1E9 +#define ES01_1EA_PHCP_TIMING_ADJ_B2 0x1EA +#define ES01_1EB_PHCP_TIMING_ADJ_B3 0x1EB + +/*AFEVS timing adjust register */ +#define ES01_1EC_AFEVS_TIMING_ADJ_B0 0x1EC +#define ES01_1ED_AFEVS_TIMING_ADJ_B1 0x1ED +#define ES01_1EE_AFEVS_TIMING_ADJ_B2 0x1EE +#define ES01_1EF_AFEVS_TIMING_ADJ_B3 0x1EF + +/*AFERS timing adjust register */ +#define ES01_1F0_AFERS_TIMING_ADJ_B0 0x1F0 +#define ES01_1F1_AFERS_TIMING_ADJ_B1 0x1F1 +#define ES01_1F2_AFERS_TIMING_ADJ_B2 0x1F2 +#define ES01_1F3_AFERS_TIMING_ADJ_B3 0x1F3 + +/* read out pixel */ +#define ES01_1F4_START_READ_OUT_PIXEL_LB 0x1F4 +#define ES01_1F5_START_READ_OUT_PIXEL_HB 0x1F5 +#define ES01_1F6_READ_OUT_PIXEL_LENGTH_LB 0x1F6 +#define ES01_1F7_READ_OUT_PIXEL_LENGTH_HB 0x1F7 + +/* pack channel setting */ +#define ES01_1F8_PACK_CHANNEL_SELECT_B0 0x1F8 +#define ES01_1F9_PACK_CHANNEL_SELECT_B1 0x1F9 +#define ES01_1FA_PACK_CHANNEL_SELECT_B2 0x1FA +#define ES01_1FB_PACK_CHANNEL_SIZE_B0 0x1FB +#define ES01_1FC_PACK_CHANNEL_SIZE_B1 0x1FC +#define ES01_1FD_PACK_CHANNEL_SIZE_B2 0x1FD + +/* AFE gain offset control*/ + /* rom code ver 0.10 */ +#define ES01_2A0_AFE_GAIN_OFFSET_CONTROL 0x2A0 +#define ES01_2A1_AFE_AUTO_CONFIG_GAIN 0x2A1 +#define ES01_2A2_AFE_AUTO_CONFIG_OFFSET 0x2A2 + +#define ES01_2B0_SEGMENT0_OVERLAP_SEGMENT1 0x2B0 +#define ES01_2B1_SEGMENT1_OVERLAP_SEGMENT2 0x2B1 +#define ES01_2B2_SEGMENT2_OVERLAP_SEGMENT3 0x2B2 + +/* valid pixel parameter */ +#define ES01_2C0_VALID_PIXEL_PARAMETER_OF_SEGMENT1 0x2C0 +#define ES01_2C1_VALID_PIXEL_PARAMETER_OF_SEGMENT2 0x2C1 +#define ES01_2C2_VALID_PIXEL_PARAMETER_OF_SEGMENT3 0x2C2 +#define ES01_2C3_VALID_PIXEL_PARAMETER_OF_SEGMENT4 0x2C3 +#define ES01_2C4_VALID_PIXEL_PARAMETER_OF_SEGMENT5 0x2C4 +#define ES01_2C5_VALID_PIXEL_PARAMETER_OF_SEGMENT6 0x2C5 +#define ES01_2C6_VALID_PIXEL_PARAMETER_OF_SEGMENT7 0x2C6 +#define ES01_2C7_VALID_PIXEL_PARAMETER_OF_SEGMENT8 0x2C7 +#define ES01_2C8_VALID_PIXEL_PARAMETER_OF_SEGMENT9 0x2C8 +#define ES01_2C9_VALID_PIXEL_PARAMETER_OF_SEGMENT10 0x2C9 +#define ES01_2CA_VALID_PIXEL_PARAMETER_OF_SEGMENT11 0x2CA +#define ES01_2CB_VALID_PIXEL_PARAMETER_OF_SEGMENT12 0x2CB +#define ES01_2CC_VALID_PIXEL_PARAMETER_OF_SEGMENT13 0x2CC +#define ES01_2CD_VALID_PIXEL_PARAMETER_OF_SEGMENT14 0x2CD +#define ES01_2CE_VALID_PIXEL_PARAMETER_OF_SEGMENT15 0x2CE +#define ES01_2CF_VALID_PIXEL_PARAMETER_OF_SEGMENT16 0x2CF + +/* forward declarations */ +static STATUS OpenScanChip (PAsic chip); +static STATUS CloseScanChip (PAsic chip); +static STATUS SafeInitialChip (PAsic chip); +static STATUS DRAM_Test (PAsic chip); +#if SANE_UNUSED +static STATUS SetPowerSave (PAsic chip); +#endif +static STATUS SetLineTimeAndExposure (PAsic chip); +static STATUS CCDTiming (PAsic chip); +static STATUS IsCarriageHome (PAsic chip, SANE_Bool * LampHome, SANE_Bool * TAHome); +static STATUS InitTiming (PAsic chip); +static STATUS GetChipStatus (PAsic chip, SANE_Byte Selector, SANE_Byte * ChipStatus); +static STATUS SetAFEGainOffset (PAsic chip); +static STATUS SetLEDTime (PAsic chip); +static STATUS SetScanMode (PAsic chip, SANE_Byte bScanBits); +static STATUS SetPackAddress (PAsic chip, unsigned short wXResolution, + unsigned short wWidth, unsigned short wX, double XRatioAdderDouble, + double XRatioTypeDouble, + SANE_Byte byClear_Pulse_Width, + unsigned short * PValidPixelNumber); +static STATUS SetExtraSetting (PAsic chip, unsigned short wXResolution, + unsigned short wCCD_PixelNumber, SANE_Bool isCaribrate); + + +/* Forward declarations */ + +static STATUS Mustek_SendData (PAsic chip, unsigned short reg, SANE_Byte data); +static STATUS Mustek_SendData2Byte (PAsic chip, unsigned short reg, SANE_Byte data); +static STATUS Mustek_ReceiveData (PAsic chip, SANE_Byte * reg); +static STATUS Mustek_WriteAddressLineForRegister (PAsic chip, SANE_Byte x); +static STATUS WriteIOControl (PAsic chip, unsigned short wValue, unsigned short wIndex, + unsigned short wLength, SANE_Byte * lpbuf); +static STATUS ReadIOControl (PAsic chip, unsigned short wValue, unsigned short wIndex, + unsigned short wLength, SANE_Byte * lpbuf); +static STATUS Mustek_DMARead (PAsic chip, unsigned int size, SANE_Byte * lpdata); +static STATUS Mustek_DMAWrite (PAsic chip, unsigned int size, SANE_Byte * lpdata); +static STATUS Mustek_ClearFIFO (PAsic chip); +static STATUS SetRWSize (PAsic chip, SANE_Byte ReadWrite, unsigned int size); + +/* Open Scanner by Scanner Name and return Chip Information */ +static STATUS Asic_Open (PAsic chip, SANE_Byte *pDeviceName); +/* Close Scanner */ +static STATUS Asic_Close (PAsic chip); +#if SANE_UNUSED +/* Release Scanner Resource */ +static STATUS Asic_Release (PAsic chip); +#endif +/* Initialize Scanner Parameters */ +static STATUS Asic_Initialize (PAsic chip); +/* Set Scan Window */ +static STATUS Asic_SetWindow (PAsic chip, SANE_Byte bScanBits, + unsigned short wXResolution, unsigned short wYResolution, + unsigned short wX, unsigned short wY, unsigned short wWidth, unsigned short wLength); +/* Turn Lamp ON or OFF */ +static STATUS Asic_TurnLamp (PAsic chip, SANE_Bool isLampOn); +/* Turn TA ON or OFF */ +static STATUS Asic_TurnTA (PAsic chip, SANE_Bool isTAOn); +/* Reset some parameter of asic */ +static STATUS Asic_Reset (PAsic chip); +/* Set scan source */ +static STATUS Asic_SetSource (PAsic chip, LIGHTSOURCE lsLightSource); +/* Start scanner to scan */ +static STATUS Asic_ScanStart (PAsic chip); +/* Stop scanner to scan */ +static STATUS Asic_ScanStop (PAsic chip); +/* Read One Scan Line When Scanning */ +static STATUS Asic_ReadImage (PAsic chip, SANE_Byte * pBuffer, unsigned short LinesCount); +#if SANE_UNUSED +/* To Check Hard Key */ +static STATUS Asic_CheckFunctionKey (PAsic chip, SANE_Byte * key); +#endif +/* To Check if TA id connected */ +static STATUS Asic_IsTAConnected (PAsic chip, SANE_Bool *hasTA); +#if SANE_UNUSED +/* Download GammaTable to Scanner */ +static STATUS Asic_DownloadGammaTable (PAsic chip, void * lpBuffer); +#endif +/* For AdjustAD Calculate Scanner*/ +static STATUS Asic_ReadCalibrationData (PAsic chip, void * pBuffer, + unsigned int dwXferBytes, SANE_Byte bScanBits); +/* Set motor move or not */ +static STATUS Asic_SetMotorType (PAsic chip, SANE_Bool isMotorMove, SANE_Bool isUniformSpeed); +/* Move Motor Forward or Backword */ +static STATUS Asic_MotorMove (PAsic chip, SANE_Bool isForward, unsigned int dwTotalSteps); +/* Move Motor to Home. */ +/* If isTA is TRUE, move TA to home, else move Lamp to home */ +static STATUS Asic_CarriageHome (PAsic chip, SANE_Bool isTA); +/* For ShadingTable */ +static STATUS Asic_SetShadingTable (PAsic chip, unsigned short * lpWhiteShading, + unsigned short * lpDarkShading, + unsigned short wXResolution, unsigned short wWidth, unsigned short wX); +/* Wait motor move to home. isTA no used */ +static STATUS Asic_WaitCarriageHome (PAsic chip, SANE_Bool isTA); +/* Wait until asic idle */ +static STATUS Asic_WaitUnitReady (PAsic chip); +/* Set Scan Parameter to Scanner */ +static STATUS Asic_SetCalibrate (PAsic chip, SANE_Byte bScanBits, unsigned short wXResolution, + unsigned short wYResolution, unsigned short wX, unsigned short wY, + unsigned short wWidth, unsigned short wLength, SANE_Bool isShading); +/* Set AFE Parameter to Scanner */ +static STATUS Asic_SetAFEGainOffset (PAsic chip); + +/* ---------------------- asic motor defines -------------------------- */ + + +#define ACTION_MODE_ACCDEC_MOVE 0 +#define ACTION_MODE_UNIFORM_SPEED_MOVE 1 + + +typedef struct tagMOTOR_CURRENT_AND_PHASE +{ + SANE_Byte MoveType; + SANE_Byte FillPhase; + SANE_Byte MotorDriverIs3967; + SANE_Byte MotorCurrentTableA[32]; + SANE_Byte MotorCurrentTableB[32]; + SANE_Byte MotorPhaseTable[32]; +} MOTOR_CURRENT_AND_PHASE, LPMOTOR_CURRENT_AND_PHASE; + +typedef struct tagLLF_RAMACCESS +{ + SANE_Byte ReadWrite; + SANE_Byte IsOnChipGamma; + unsigned short LoStartAddress; + unsigned short HiStartAddress; + int RwSize; + SANE_Byte DramDelayTime; + SANE_Byte *BufferPtr; +} LLF_RAMACCESS; + +typedef struct tagLLF_MOTOR_CURRENT_AND_PHASE +{ + SANE_Byte MoveType; + SANE_Byte FillPhase; + SANE_Byte MotorDriverIs3967; + SANE_Byte MotorCurrentTableA[32]; + SANE_Byte MotorCurrentTableB[32]; + SANE_Byte MotorPhaseTable[32]; +} LLF_MOTOR_CURRENT_AND_PHASE; + +typedef struct tagLLF_CALCULATEMOTORTABLE +{ + unsigned short StartSpeed; + unsigned short EndSpeed; + unsigned short AccStepBeforeScan; + SANE_Byte DecStepAfterScan; + unsigned short * lpMotorTable; +} LLF_CALCULATEMOTORTABLE; + +typedef struct tagLLF_SETMOTORTABLE +{ + unsigned int TableSize; + SANE_Byte MotorTableAddress; + unsigned short *MotorTablePtr; +} LLF_SETMOTORTABLE; + +typedef struct tagLLF_MOTORMOVE +{ + SANE_Byte ActionMode; /* 0: AccDec Mode, 1: Uniform Speed Mode, 2: Test Mode */ + SANE_Byte ActionType; /* 0: Forward, 1: Backward, 2:Back To Home */ + SANE_Byte MotorSelect; /* 0: Motor 0 only, 1: Motor 1 only, 2: Motor 0 & 1 */ + SANE_Byte HomeSensorSelect; /* 0: Sensor 0, 1: Sensor 1, 2: Sensor 0 & 1, 3:Invert Sensor 1 */ + unsigned short FixMoveSpeed; + unsigned int FixMoveSteps; /* 3 bytes */ + SANE_Byte MotorSpeedUnit; + SANE_Byte MotorSyncUnit; + unsigned short AccStep; /*Max = 511 */ + SANE_Byte DecStep; /* Max = 255 */ + SANE_Byte MotorMoveUnit; + SANE_Byte WaitOrNoWait; /* 0: no wait, 1: wait */ + SANE_Byte Lamp0PwmFreq; /* Lamp0 PWM freq */ + SANE_Byte Lamp1PwmFreq; /* Lamp1 PWM freq */ + + unsigned short wForwardSteps; + unsigned short wScanAccSteps; + SANE_Byte bScanDecSteps; + unsigned short wFixScanSteps; + unsigned short wScanBackTrackingSteps; + unsigned short wScanRestartSteps; + unsigned short wScanBackHomeExtSteps; +} LLF_MOTORMOVE; + +static STATUS CalculateMotorTable (LLF_CALCULATEMOTORTABLE * + lpCalculateMotorTable, unsigned short wYResolution); +static STATUS LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE * + lpCalculateMotorTable); +static STATUS LLFSetMotorCurrentAndPhase (PAsic chip, + LLF_MOTOR_CURRENT_AND_PHASE * + MotorCurrentAndPhase); +static STATUS SetMotorStepTable (PAsic chip, LLF_MOTORMOVE * MotorStepsTable, + unsigned short wStartY, unsigned int dwScanImageSteps, + unsigned short wYResolution); +static STATUS LLFSetMotorTable (PAsic chip, + LLF_SETMOTORTABLE * LLF_SetMotorTable); +static STATUS SetMotorCurrent (PAsic chip, unsigned short dwMotorSpeed, + LLF_MOTOR_CURRENT_AND_PHASE * CurrentPhase); +static STATUS LLFMotorMove (PAsic chip, LLF_MOTORMOVE * LLF_MotorMove); +#if SANE_UNUSED +static STATUS LLFStopMotorMove (PAsic chip); +#endif +static STATUS LLFSetRamAddress (PAsic chip, unsigned int dwStartAddr, + unsigned int dwEndAddr, SANE_Byte byAccessTarget); +static STATUS LLFRamAccess (PAsic chip, LLF_RAMACCESS * RamAccess); +static STATUS MotorBackHome (PAsic chip, SANE_Byte WaitOrNoWait); + +#endif |