windows-nt/Source/XPSP1/NT/printscan/wia/test/devctrl/pmxe3.h
2020-09-26 16:20:57 +08:00

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