|
|
#ifndef _PMXE3_H
#define _PMXE3_H
#include "devio.h"
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Notes:
//
// To control the Visioneer scanners, you need to create two handles. One is the standard
// CreateFile handle, (\\.\USBSCAN0), and the other is a "\2" added value. (ex. \\.\USBSCAN0\2)
// All reading of values and data is done with "\\.\USBSCAN0\2", and writing values is done with
// "\\.\USBSCAN0".
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// common defines
//
//////////////////////////////////////////
// Taken from NTDDK.H //
//////////////////////////////////////////
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe
#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ )
//////////////////////////////////////////
// Taken from USBSCAN.H //
//////////////////////////////////////////
#define FILE_DEVICE_USB_SCAN 0x8000
#define IOCTL_INDEX 0x0800
#define IOCTL_GET_VERSION CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_CANCEL_IO CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+1, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_WAIT_ON_DEVICE_EVENT CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+2, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_READ_REGISTERS CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+3, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_WRITE_REGISTERS CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+4, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_GET_CHANNEL_ALIGN_RQST CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+5, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_GET_DEVICE_DESCRIPTOR CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+6, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_RESET_PIPE CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+7, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_GET_USB_DESCRIPTOR CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+8, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SEND_USB_REQUEST CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+9, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_GET_PIPE_CONFIGURATION CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+10,METHOD_BUFFERED,FILE_ANY_ACCESS)
typedef struct _IO_BLOCK { IN unsigned uOffset; IN unsigned uLength; IN OUT PUCHAR pbyData; IN unsigned uIndex; } IO_BLOCK, *PIO_BLOCK;
///////////////////////////////////////////
#define IOCTL_GET_DEVICE_INFO 0x0
#define IOCTL_GET_DEVICE_STATUS 0x1
#define IOCTL_READ_WRITE_DATA 0x82
#define IOCTL_EPP_ADDR 0x83
#define IOCTL_EPP_READ 0x84
#define IOCTL_EPP_WRITE 0x85
#define IOCTL_SPP_STATUS 0x86
#define IOCTL_SPP_CONTROL 0x87
#define IOCTL_SPP_DATA_BUS 0x88
#define IOCTL_GPIO_OE 0x89
#define IOCTL_GPIO_READ 0x8A
#define IOCTL_GPIO_WRITE 0x8B
#define CARRIAGE_HOME 0x04
#define MOTOR_BUSY 0x08
#define CALIBRATION_STEPSIZE 103
#define SCAN_STARTPOS_STEPSIZE 100
#define CCD_LINEOFFSET 4
#define scFirstCompositionMode 0
#define scLineArt 0
#define scHalftone 1
#define scGrayScale 1
#define scBilevelColor 3
#define scFullColor 4
#define scPreview 5
#define sc36BitsColor 6 // 36 bits color mode, for 600 dpi scanner
#define sc30BitsColor 7 // 30 bits color mode, for 300 dpi scanner
#define sc12BitsGray 8
#define sc12BitsLineArt 9
#define sc42BitsColor 10
#define sc14BitsGray 11
#define sc14BitsLineArt 12
#define scLastCompositionMode 13
//
// BYTE operation codes
//
#define CMD_READ 0x00
#define CMD_WRITE 0x01
#define CMD_WRITE_WM 0x03
#define CMD_GETIMAGE 0x05
#define CMD_STOPIMAGE 0x06
//
// Register structures
//
typedef struct _E3_REG0 { BYTE AsicID :8; }E3_REG0;
typedef struct _E3_REG3 { BYTE SystemReset :1; BYTE FifoReset :1; BYTE EppUsb :1; BYTE WatchDog :1; BYTE SelfTest :1; BYTE ScanSpeed :3; }E3_REG3;
typedef struct _E3_REG4 { BYTE AsicTest :1; BYTE YTable :1; BYTE Refresh :1; BYTE RefreshForever :1; BYTE WaitDelay :2; BYTE ScanMode :2; }E3_REG4;
typedef struct _E3_REG5 { BYTE Sensor :2; BYTE Sensor_Res :2; BYTE Afe :3; BYTE Adc1210 :1; }E3_REG5;
typedef struct _E3_REG6 { BYTE MotorPower :1; BYTE FullHalf :1; BYTE Operation :3; BYTE LineOffset :3; }E3_REG6;
typedef struct _E3_REG12 { BYTE MotorMove :1; BYTE MotorStop :1; BYTE HomeSensor :1; BYTE FinishFlag :1; BYTE FifoEmpty :1; BYTE HwSelfTest :1; BYTE ScanStatus :1; BYTE Lamp :1; }E3_REG12;
typedef struct _E3_REG13 { BYTE Sdi :1; BYTE Sdo :1; BYTE Sclk :1; BYTE Cs :1; BYTE Reserved :1; BYTE WmVsamp :3; }E3_REG13;
typedef struct _E3_REG20 { BYTE AreaStart :6; BYTE Reserved :2; }E3_REG20;
typedef struct _E3_REG21 { BYTE AreaStart :8; }E3_REG21;
typedef struct _E3_REG22 { BYTE AreaWidth :6; BYTE Reserved :2; }E3_REG22;
typedef struct _E3_REG23 { BYTE AreaWidth :8; }E3_REG23;
typedef struct _E3_REG26 { BYTE Stop :4; BYTE Start :4; }E3_REG26;
typedef struct _E3_REG27 { BYTE YRes :2; BYTE Reserved :1; BYTE AutoPattern :1; BYTE XRes :2; BYTE Reserved2 :1; BYTE True16Bits :1; }E3_REG27;
typedef struct _E3_REG28 { BYTE XRes :8; }E3_REG28;
typedef struct _E3_REG29 { BYTE YRes :8; }E3_REG29;
typedef struct _E3_REG31 { BYTE Key0 :1; BYTE Key1 :1; BYTE Key2 :1; BYTE Key3 :1; BYTE Key4 :1; BYTE Key5 :1; BYTE Key6 :1; BYTE Key7 :1; }E3_REG31;
class CPMXE3 { public: CPMXE3(PDEVCTRL pDeviceControl); ~CPMXE3();
// overides
BOOL SetXRes(LONG xRes); BOOL SetYRes(LONG yRes); BOOL SetXPos(LONG xPos); BOOL SetYPos(LONG yPos); BOOL SetXExt(LONG xExt); BOOL SetYExt(LONG yExt); BOOL SetDataType(LONG DataType); BOOL Scan();
PDEVCTRL m_pDeviceControl;
long m_xres; long m_yres; long m_xpos; long m_ypos; long m_xext; long m_yext; long m_datatype;
BOOL RawWrite(LONG lPipeNum,BYTE *pbuffer,LONG lbuffersize,LONG lTimeout); BOOL RawRead(LONG lPipeNum,BYTE *pbuffer,LONG lbuffersize,LONG *plbytesread,LONG lTimeout);
//
// device specific helpers
//
long m_scanmode; // pPrimax specific member
VOID InitializeRegisters(); BOOL WriteRegister(INT RegisterNumber, BYTE Value); BOOL WriteRegisterEx(INT RegisterNumber, BYTE Value); BOOL ReadRegister(INT RegisterNumber, BYTE *pValue); BOOL ReadRegisterEx(INT RegisterNumber, BYTE *pValue); BOOL WriteStopImageRegister(); INT GetScanSpeed(); BOOL Lamp(BOOL bON); BOOL IsCarriageHOME(); BOOL IsMotorBusy(); BOOL IsLampON(); BOOL HomeCarriage(); BOOL StopMode(); BOOL SetMotorSpeed(INT TriggerPeriod, INT ScanSpeed); BOOL MoveCarriage(BOOL bForward, INT Steps); BOOL Motor(BOOL bON); BOOL StopScan(); BOOL GetButtonStatus(PBYTE pButtons); BOOL ClearButtonPress(); BOOL WakeupScanner(); BOOL SleepScanner(); BOOL ResetFIFO(); BOOL InitADC(); BOOL StartScan();
VOID DebugDumpRegisters(); VOID Trace(LPCTSTR format,...);
BOOL SetXandYResolution(); BOOL SetScanWindow();
//
// simple image processing
//
VOID GrayScaleToThreshold(LPBYTE lpSrc, LPBYTE lpDst, LONG RowBytes);
//
// internal registers, for device communication
//
BYTE Register0; // -- Asic ID
BYTE Register3; // -- reset (System,FIFO), selftest, scan speed, eppusb, watchdog?
BYTE Register4; // -- AsicTest, YTable, refresh DRAM, waitdelay, and scanmode
BYTE Register5; // -- Asic description, Sensor type, sensor resolution, Afe, Adc1210
BYTE Register6; // -- Motor power,motor operations,line offsets
BYTE Register7; // -- carriage step high byte
BYTE Register8; // -- carriage step low byte
BYTE Register9; // -- carriage backstep
BYTE Register10; // -- trigger period high byte
BYTE Register11; // -- trigger period low byte
BYTE Register12; // -- Motor (move/stop), selftest, Lamp, FIFO status, and Scan status
BYTE Register13; // -- Sdi,Sdo,Sclk,Cs,WmVSamp
BYTE Register20; // -- scan area start high byte
BYTE Register21; // -- scan area start low byte
BYTE Register22; // -- scan area width high byte
BYTE Register23; // -- scan area width low byte
BYTE Register25; // -- ?
BYTE Register26; // --
BYTE Register27; // -- (X,Y Resolution setting high byte(use regsiters(27,28)))
BYTE Register28; // -- X Resolution (low byte)
BYTE Register29; // -- Y Resolution (low byte)
BYTE Register31; // -- Button press information
protected:
};
#endif
|