328 lines
9.5 KiB
C++
328 lines
9.5 KiB
C++
#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 |