kopia lustrzana https://gitlab.com/sane-project/backends
Made PS/2 bidirectional mode work.
rodzic
ccb3053773
commit
4a31f9681a
|
@ -490,7 +490,7 @@ _LOC int DetectScanner( pScanData ps, int mode )
|
|||
} else {
|
||||
|
||||
/* this will be called each time before operating on a previously
|
||||
* detected device, to make sure we're already operating on the same one
|
||||
* detected device, to make sure we are still operating on the same one
|
||||
*/
|
||||
if( _ASIC_IS_98001 == mode ) {
|
||||
|
||||
|
|
|
@ -203,18 +203,19 @@
|
|||
/*
|
||||
* for Asic I/O signal control
|
||||
*/
|
||||
#define _CTRL_GENSIGNAL (_CTRL_RESERVED + _CTRL_NOT_INIT) /* 0xc4 */
|
||||
#define _CTRL_NORMAL _CTRL_GENSIGNAL
|
||||
#define _CTRL_SIGNAL_REGWRITE (_CTRL_GENSIGNAL + _CTRL_SELECT_IN) /* 0xcc */
|
||||
#define _CTRL_END_REGWRITE (_CTRL_GENSIGNAL) /* 0xc4 */
|
||||
#define _CTRL_SIGNAL_DATAWRITE (_CTRL_GENSIGNAL + _CTRL_AUTOLF) /* 0xc6 */
|
||||
#define _CTRL_END_DATAWRITE (_CTRL_GENSIGNAL) /* 0xc4 */
|
||||
#define _CTRL_EPPSIGNAL_WRITE (_CTRL_GENSIGNAL + _CTRL_STROBE) /* 0xc5 */
|
||||
#define _CTRL_GENSIGNAL (_CTRL_RESERVED + _CTRL_NOT_INIT) /* 0xc4 */
|
||||
|
||||
#define _CTRL_START_REGWRITE (_CTRL_GENSIGNAL + _CTRL_SELECT_IN) /* 0xcc */
|
||||
#define _CTRL_END_REGWRITE (_CTRL_GENSIGNAL) /* 0xc4 */
|
||||
|
||||
#define _CTRL_START_DATAWRITE (_CTRL_GENSIGNAL + _CTRL_AUTOLF) /* 0xc6 */
|
||||
#define _CTRL_END_DATAWRITE (_CTRL_GENSIGNAL) /* 0xc4 */
|
||||
|
||||
#define _CTRL_EPPSIGNAL_WRITE (_CTRL_GENSIGNAL + _CTRL_STROBE) /* 0xc5 */
|
||||
#define _CTRL_EPPTRIG_REGWRITE (_CTRL_GENSIGNAL + _CTRL_SELECT_IN + _CTRL_STROBE)
|
||||
|
||||
#define _CTRL_END_DATAREAD (_CTRL_GENSIGNAL) /* 0xc4 */
|
||||
#define _CTRL_SIGNAL_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION + _CTRL_AUTOLF)
|
||||
#define _CTRL_END_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION) /* 0xe4 */
|
||||
#define _CTRL_START_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION + _CTRL_AUTOLF)
|
||||
#define _CTRL_END_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION) /* 0xe4 */
|
||||
|
||||
|
||||
typedef struct
|
||||
|
|
|
@ -73,10 +73,15 @@ static Bool fnEPPRead ( pScanData ps, pUChar pBuffer, ULong ulSize );
|
|||
static Bool fnSPPRead ( pScanData ps, pUChar pBuffer, ULong ulSize );
|
||||
static Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize );
|
||||
|
||||
static pFnReadData ioReadFunc[3] = {
|
||||
fnEPPRead,
|
||||
fnSPPRead,
|
||||
fnBiDirRead
|
||||
typedef struct {
|
||||
pFnReadData func;
|
||||
char *name;
|
||||
} ioReadFuncDef;
|
||||
|
||||
static ioReadFuncDef ioReadFunc[3] = {
|
||||
{ fnEPPRead, "fnEPPRead" },
|
||||
{ fnSPPRead, "fnSPPRead" },
|
||||
{ fnBiDirRead, "fnBiDirRead" }
|
||||
};
|
||||
|
||||
/*************************** some definitions ********************************/
|
||||
|
@ -216,51 +221,8 @@ static UChar ioDataFromSPPSlowest( pScanData ps )
|
|||
return bData;
|
||||
}
|
||||
|
||||
/** Using buffered I/O to read data from EPP Data Port
|
||||
*/
|
||||
static Bool fnEPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
||||
{
|
||||
register ULong i;
|
||||
|
||||
if( _IS_ASIC98(ps->sCaps.AsicID)) {
|
||||
|
||||
#ifndef __KERNEL__
|
||||
if( sanei_pp_uses_directio()) {
|
||||
_OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
|
||||
_DO_UDELAY( 1 );
|
||||
} else {
|
||||
sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAIN );
|
||||
}
|
||||
#else
|
||||
_OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
|
||||
_DO_UDELAY( 1 );
|
||||
#endif
|
||||
for( i = 0; i < ulSize; i++ )
|
||||
pBuffer[i] = _INB_EPPDATA( ps );
|
||||
|
||||
#ifndef __KERNEL__
|
||||
if( sanei_pp_uses_directio()) {
|
||||
_OUTB_CTRL( ps, _CTRL_GENSIGNAL );
|
||||
_DO_UDELAY( 1 );
|
||||
} else {
|
||||
sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAOUT );
|
||||
}
|
||||
#else
|
||||
_OUTB_CTRL( ps, _CTRL_GENSIGNAL );
|
||||
_DO_UDELAY( 1 );
|
||||
#endif
|
||||
} else {
|
||||
|
||||
for( i = 0; i < ulSize; i++ )
|
||||
pBuffer[i] = _INB_EPPDATA( ps );
|
||||
}
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Read data from STATUS port. We have to read twice and combine two nibble
|
||||
* data to one byte
|
||||
/** Read data from STATUS port. We have to read twice and combine two nibble
|
||||
* data to one byte.
|
||||
*/
|
||||
static Bool fnSPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
||||
{
|
||||
|
@ -290,33 +252,80 @@ static Bool fnSPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
|||
return _TRUE;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
*
|
||||
|
||||
/** Using buffered I/O to read data from EPP Data Port
|
||||
*/
|
||||
static Bool fnEPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
||||
{
|
||||
register ULong i;
|
||||
|
||||
if( _IS_ASIC98(ps->sCaps.AsicID)) {
|
||||
|
||||
#ifndef __KERNEL__
|
||||
sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAIN );
|
||||
#else
|
||||
_OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
|
||||
_DO_UDELAY( 1 );
|
||||
#endif
|
||||
for( i = 0; i < ulSize; i++ )
|
||||
pBuffer[i] = _INB_EPPDATA( ps );
|
||||
|
||||
#ifndef __KERNEL__
|
||||
sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAOUT );
|
||||
#else
|
||||
_OUTB_CTRL( ps, _CTRL_GENSIGNAL );
|
||||
_DO_UDELAY( 1 );
|
||||
#endif
|
||||
} else {
|
||||
|
||||
for( i = 0; i < ulSize; i++ )
|
||||
pBuffer[i] = _INB_EPPDATA( ps );
|
||||
}
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
static Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
||||
{
|
||||
if( _IS_ASIC98(ps->sCaps.AsicID))
|
||||
UChar start, end;
|
||||
|
||||
start = _CTRL_START_BIDIREAD;
|
||||
end = _CTRL_END_BIDIREAD;
|
||||
|
||||
#ifndef __KERNEL__
|
||||
sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAIN );
|
||||
|
||||
if( !sanei_pp_uses_directio()) {
|
||||
start &= ~_CTRL_DIRECTION;
|
||||
end &= ~_CTRL_DIRECTION;
|
||||
}
|
||||
#else
|
||||
if( _IS_ASIC98(ps->sCaps.AsicID)) {
|
||||
_OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
|
||||
}
|
||||
#endif
|
||||
|
||||
switch( ps->IO.delay ) {
|
||||
|
||||
case 0:
|
||||
for(; ulSize; ulSize--, pBuffer++ ) {
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_BIDIREAD); /* 0xe6 */
|
||||
for( ; ulSize; ulSize--, pBuffer++ ) {
|
||||
_OUTB_CTRL( ps, start );
|
||||
*pBuffer = _INB_DATA( ps );
|
||||
_OUTB_CTRL( ps, _CTRL_END_BIDIREAD ); /* 0xe4 */
|
||||
_OUTB_CTRL( ps, end );
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
_DO_UDELAY( 1 );
|
||||
for(; ulSize; ulSize--, pBuffer++ ) {
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_BIDIREAD); /* 0xe6 */
|
||||
_OUTB_CTRL( ps, start );
|
||||
_DO_UDELAY( 1 );
|
||||
|
||||
*pBuffer = _INB_DATA( ps );
|
||||
|
||||
_OUTB_CTRL( ps, _CTRL_END_BIDIREAD ); /* 0xe4 */
|
||||
_OUTB_CTRL( ps, end );
|
||||
_DO_UDELAY( 1 );
|
||||
}
|
||||
break;
|
||||
|
@ -324,55 +333,53 @@ static Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
|||
default:
|
||||
_DO_UDELAY( 2 );
|
||||
for(; ulSize; ulSize--, pBuffer++ ) {
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_BIDIREAD); /* 0xe6 */
|
||||
_OUTB_CTRL( ps, start );
|
||||
_DO_UDELAY( 2 );
|
||||
|
||||
*pBuffer = _INB_DATA( ps );
|
||||
|
||||
_OUTB_CTRL( ps, _CTRL_END_BIDIREAD ); /* 0xe4 */
|
||||
_OUTB_CTRL( ps, end );
|
||||
_DO_UDELAY( 2 );
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if( _IS_ASIC98(ps->sCaps.AsicID))
|
||||
_OUTB_CTRL( ps, _CTRL_END_DATAREAD ); /* 0xc4 */
|
||||
|
||||
return _TRUE;
|
||||
#ifndef __KERNEL__
|
||||
sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAOUT );
|
||||
#else
|
||||
if( _IS_ASIC98(ps->sCaps.AsicID)) {
|
||||
_OUTB_CTRL( ps, _CTRL_GENSIGNAL );
|
||||
}
|
||||
#endif
|
||||
return _TRUE;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* as the name says, we switch to SPP mode
|
||||
/** as the name says, we switch to SPP mode
|
||||
*/
|
||||
static void ioSwitchToSPPMode( pScanData ps )
|
||||
{
|
||||
/*
|
||||
* save the control and data port value
|
||||
/* save the control and data port value
|
||||
*/
|
||||
ps->IO.bOldControlValue = _INB_CTRL( ps );
|
||||
ps->IO.bOldDataValue = _INB_DATA( ps );
|
||||
|
||||
_OUTB_CTRL( ps, _CTRL_NORMAL ); /* 0xc4 */
|
||||
_DO_UDELAY( 2 );
|
||||
_OUTB_CTRL( ps, _CTRL_GENSIGNAL ); /* 0xc4 */
|
||||
_DO_UDELAY( 2 );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* restore the settings
|
||||
/** restore the port settings
|
||||
*/
|
||||
static void ioRestoreParallelMode( pScanData ps )
|
||||
{
|
||||
_OUTB_CTRL( ps, ps->IO.bOldControlValue & 0x3f );
|
||||
_DO_UDELAY( 1 );
|
||||
_DO_UDELAY( 1 );
|
||||
|
||||
_OUTB_DATA( ps, ps->IO.bOldDataValue );
|
||||
_DO_UDELAY( 1 );
|
||||
_DO_UDELAY( 1 );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* try to connect to scanner
|
||||
*/
|
||||
/*static void ioP98001EstablishScannerConnection( pScanData, ULong );
|
||||
/** try to connect to scanner (ASIC 9600x and 98001)
|
||||
*/
|
||||
_LOC _INL void ioP98001EstablishScannerConnection( pScanData ps, ULong delTime )
|
||||
{
|
||||
|
@ -392,8 +399,24 @@ _LOC _INL void ioP98001EstablishScannerConnection( pScanData ps, ULong delTime )
|
|||
_DO_UDELAY( delTime );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* switch the printer interface to scanner
|
||||
/** try to connect to scanner (ASIC 98003)
|
||||
*/
|
||||
static void ioP98003EstablishScannerConnection( pScanData ps, ULong delTime )
|
||||
{
|
||||
_OUTB_DATA( ps, _ID1ST );
|
||||
_DO_UDELAY( delTime );
|
||||
|
||||
_OUTB_DATA( ps, _ID2ND );
|
||||
_DO_UDELAY( delTime );
|
||||
|
||||
_OUTB_DATA( ps, _ID3RD );
|
||||
_DO_UDELAY( delTime );
|
||||
|
||||
_OUTB_DATA( ps, _ID4TH );
|
||||
_DO_UDELAY( delTime );
|
||||
}
|
||||
|
||||
/** switch the printer interface to scanner
|
||||
*/
|
||||
static Bool ioP96OpenScanPath( pScanData ps )
|
||||
{
|
||||
|
@ -419,23 +442,7 @@ static Bool ioP96OpenScanPath( pScanData ps )
|
|||
return _TRUE;
|
||||
}
|
||||
|
||||
static void ioP98003EstablishScannerConnection( pScanData ps, ULong delTime )
|
||||
{
|
||||
_OUTB_DATA( ps, _ID1ST );
|
||||
_DO_UDELAY( delTime );
|
||||
|
||||
_OUTB_DATA( ps, _ID2ND );
|
||||
_DO_UDELAY( delTime );
|
||||
|
||||
_OUTB_DATA( ps, _ID3RD );
|
||||
_DO_UDELAY( delTime );
|
||||
|
||||
_OUTB_DATA( ps, _ID4TH );
|
||||
_DO_UDELAY( delTime );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* try to connect to scanner
|
||||
/** try to connect to scanner
|
||||
*/
|
||||
static Bool ioP98OpenScanPath( pScanData ps )
|
||||
{
|
||||
|
@ -463,8 +470,8 @@ static Bool ioP98OpenScanPath( pScanData ps )
|
|||
ioP98003EstablishScannerConnection( ps, dw );
|
||||
}
|
||||
|
||||
_INB_STATUS( ps );
|
||||
tmp = _INB_STATUS( ps );
|
||||
_INB_STATUS( ps );
|
||||
tmp = _INB_STATUS( ps );
|
||||
|
||||
if( 0x50 == ( tmp & 0xf0 )) {
|
||||
|
||||
|
@ -490,8 +497,7 @@ static Bool ioP98OpenScanPath( pScanData ps )
|
|||
return _TRUE;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Switch back to printer mode
|
||||
/** Switch back to printer mode.
|
||||
* Restore the printer control/data port value.
|
||||
*/
|
||||
static void ioCloseScanPath( pScanData ps )
|
||||
|
@ -499,7 +505,7 @@ static void ioCloseScanPath( pScanData ps )
|
|||
if( ps->IO.bOpenCount && !(--ps->IO.bOpenCount)) {
|
||||
|
||||
#ifdef DEBUG
|
||||
ps->IO.bOpenCount = 1;
|
||||
ps->IO.bOpenCount = 1;
|
||||
#endif
|
||||
IORegisterToScanner( ps, 0xff );
|
||||
|
||||
|
@ -516,9 +522,8 @@ static void ioCloseScanPath( pScanData ps )
|
|||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* check the memory to see that the data-transfers will work
|
||||
* ASIC 9800x only
|
||||
/** check the memory to see that the data-transfers will work.
|
||||
* (ASIC 9800x only)
|
||||
*/
|
||||
static int ioP98ReadWriteTest( pScanData ps )
|
||||
{
|
||||
|
@ -531,7 +536,6 @@ static int ioP98ReadWriteTest( pScanData ps )
|
|||
|
||||
/* _MEMTEST_SIZE: Read, _MEMTEST_SIZE:Write */
|
||||
buffer = _KALLOC( sizeof(UChar) * _MEMTEST_SIZE*2, GFP_KERNEL );
|
||||
|
||||
if( NULL == buffer )
|
||||
return _E_ALLOC;
|
||||
|
||||
|
@ -545,7 +549,7 @@ static int ioP98ReadWriteTest( pScanData ps )
|
|||
tmp = ps->bLastLampStatus + _SCAN_BYTEMODE;
|
||||
IODataToRegister( ps, ps->RegScanControl, tmp );
|
||||
|
||||
IODataToRegister( ps, ps->RegModelControl, (_LED_ACTIVITY | _LED_CONTROL));
|
||||
IODataToRegister( ps, ps->RegModelControl, (_LED_ACTIVITY | _LED_CONTROL));
|
||||
|
||||
IODataToRegister( ps, ps->RegModeControl, _ModeMappingMem );
|
||||
IODataToRegister( ps, ps->RegMemoryLow, 0 );
|
||||
|
@ -560,19 +564,17 @@ static int ioP98ReadWriteTest( pScanData ps )
|
|||
IODataToRegister( ps, ps->RegWidthPixelsLow, 0 );
|
||||
IODataToRegister( ps, ps->RegWidthPixelsHigh, 5 );
|
||||
|
||||
ps->AsicReg.RD_ModeControl = _ModeReadMappingMem;
|
||||
ps->AsicReg.RD_ModeControl = _ModeReadMappingMem;
|
||||
|
||||
if( _ASIC_IS_98001 == ps->sCaps.AsicID )
|
||||
ps->CloseScanPath( ps );
|
||||
if( _ASIC_IS_98001 == ps->sCaps.AsicID )
|
||||
ps->CloseScanPath( ps );
|
||||
|
||||
IOReadScannerImageData( ps, buffer + _MEMTEST_SIZE, _MEMTEST_SIZE );
|
||||
|
||||
if( _ASIC_IS_98003 == ps->sCaps.AsicID )
|
||||
ps->CloseScanPath( ps );
|
||||
if( _ASIC_IS_98003 == ps->sCaps.AsicID )
|
||||
ps->CloseScanPath( ps );
|
||||
|
||||
/*
|
||||
* check the result !
|
||||
*/
|
||||
/* check the result ! */
|
||||
retval = _OK;
|
||||
|
||||
for( ul = 0; ul < _MEMTEST_SIZE; ul++ ) {
|
||||
|
@ -588,8 +590,7 @@ static int ioP98ReadWriteTest( pScanData ps )
|
|||
return retval;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Put data to DATA port and trigger hardware through CONTROL port to read it.
|
||||
/** Put data to DATA port and trigger hardware through CONTROL port to read it.
|
||||
*/
|
||||
static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
|
||||
{
|
||||
|
@ -600,7 +601,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
|
|||
case 0:
|
||||
for (; size; size--, pBuffer++) {
|
||||
_OUTB_DATA( ps, *pBuffer );
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE );
|
||||
_OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
|
||||
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
|
||||
}
|
||||
break;
|
||||
|
@ -610,7 +611,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
|
|||
for (; size; size--, pBuffer++) {
|
||||
_OUTB_DATA( ps, *pBuffer );
|
||||
_DO_UDELAY( 1 );
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE );
|
||||
_OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
|
||||
_DO_UDELAY( 1 );
|
||||
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
|
||||
_DO_UDELAY( 2 );
|
||||
|
@ -621,7 +622,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
|
|||
for (; size; size--, pBuffer++) {
|
||||
_OUTB_DATA( ps, *pBuffer );
|
||||
_DO_UDELAY( 1 );
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE );
|
||||
_OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
|
||||
_DO_UDELAY( 2 );
|
||||
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
|
||||
_DO_UDELAY( 3 );
|
||||
|
@ -638,24 +639,22 @@ static void ioEnterReadMode( pScanData ps )
|
|||
if( ps->IO.portMode != _PORT_SPP ) {
|
||||
|
||||
_DO_UDELAY( 1 );
|
||||
|
||||
IORegisterToScanner( ps, ps->RegEPPEnable );
|
||||
|
||||
if( _IS_ASIC98( ps->sCaps.AsicID ))
|
||||
ps->IO.useEPPCmdMode = _TRUE;
|
||||
if( _IS_ASIC98( ps->sCaps.AsicID ))
|
||||
ps->IO.useEPPCmdMode = _TRUE;
|
||||
}
|
||||
|
||||
if( _ASIC_IS_98003 == ps->sCaps.AsicID )
|
||||
ps->IO.bOldControlValue = _INB_CTRL( ps );
|
||||
if( _ASIC_IS_98003 == ps->sCaps.AsicID )
|
||||
ps->IO.bOldControlValue = _INB_CTRL( ps );
|
||||
|
||||
/* ask ASIC to enter read mode */
|
||||
IORegisterToScanner( ps, ps->RegReadDataMode );
|
||||
IORegisterToScanner( ps, ps->RegReadDataMode );
|
||||
}
|
||||
|
||||
/************************ exported functions *********************************/
|
||||
|
||||
/*.............................................................................
|
||||
* here we do some init work
|
||||
/** here we do some init work
|
||||
*/
|
||||
_LOC int IOInitialize( pScanData ps )
|
||||
{
|
||||
|
@ -667,7 +666,7 @@ _LOC int IOInitialize( pScanData ps )
|
|||
if( _IS_ASIC98(ps->sCaps.AsicID)) {
|
||||
|
||||
ps->OpenScanPath = ioP98OpenScanPath;
|
||||
ps->ReadWriteTest = ioP98ReadWriteTest;
|
||||
ps->ReadWriteTest = ioP98ReadWriteTest;
|
||||
|
||||
} else if( _IS_ASIC96(ps->sCaps.AsicID)) {
|
||||
|
||||
|
@ -680,60 +679,58 @@ _LOC int IOInitialize( pScanData ps )
|
|||
}
|
||||
|
||||
ps->CloseScanPath = ioCloseScanPath;
|
||||
ps->Device.ReadData = ioReadFunc[ps->IO.portMode];
|
||||
|
||||
ps->Device.ReadData = ioReadFunc[ps->IO.portMode].func;
|
||||
DBG( DBG_HIGH, "* using readfunction >%s<\n",
|
||||
ioReadFunc[ps->IO.portMode].name );
|
||||
return _OK;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Write specific length buffer to scanner
|
||||
/** Write specific length buffer to scanner
|
||||
* The scan path is already established
|
||||
*/
|
||||
_LOC void IOMoveDataToScanner( pScanData ps, pUChar pBuffer, ULong size )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if( 0 == ps->IO.bOpenCount )
|
||||
DBG( DBG_IO, "IOMoveDataToScanner - no connection!\n" );
|
||||
if( 0 == ps->IO.bOpenCount )
|
||||
DBG( DBG_IO, "IOMoveDataToScanner - no connection!\n" );
|
||||
#endif
|
||||
|
||||
IORegisterToScanner( ps, ps->RegInitDataFifo );
|
||||
IORegisterToScanner( ps, ps->RegWriteDataMode );
|
||||
IORegisterToScanner( ps, ps->RegInitDataFifo );
|
||||
IORegisterToScanner( ps, ps->RegWriteDataMode );
|
||||
|
||||
ioSPPWrite( ps, pBuffer, size );
|
||||
ioSPPWrite( ps, pBuffer, size );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path is established.
|
||||
/** Calling SITUATION: Scanner path is established.
|
||||
* download a scanstate-table
|
||||
*/
|
||||
_LOC void IODownloadScanStates( pScanData ps )
|
||||
{
|
||||
TimerDef timer;
|
||||
TimerDef timer;
|
||||
#ifdef DEBUG
|
||||
if( 0 == ps->IO.bOpenCount )
|
||||
DBG( DBG_IO, "IODownloadScanStates - no connection!\n" );
|
||||
if( 0 == ps->IO.bOpenCount )
|
||||
DBG( DBG_IO, "IODownloadScanStates - no connection!\n" );
|
||||
#endif
|
||||
|
||||
IORegisterToScanner( ps, ps->RegScanStateControl );
|
||||
IORegisterToScanner( ps, ps->RegScanStateControl );
|
||||
|
||||
ioSPPWrite( ps, ps->a_nbNewAdrPointer, _SCANSTATE_BYTES );
|
||||
ioSPPWrite( ps, ps->a_nbNewAdrPointer, _SCANSTATE_BYTES );
|
||||
|
||||
if( ps->Scan.fRefreshState ) {
|
||||
if( ps->Scan.fRefreshState ) {
|
||||
|
||||
IORegisterToScanner( ps, ps->RegRefreshScanState );
|
||||
IORegisterToScanner( ps, ps->RegRefreshScanState );
|
||||
|
||||
MiscStartTimer( &timer, (_SECOND/2));
|
||||
do {
|
||||
MiscStartTimer( &timer, (_SECOND/2));
|
||||
do {
|
||||
|
||||
if (!( IOGetScanState( ps, _TRUE) & _SCANSTATE_STOP))
|
||||
break;
|
||||
}
|
||||
while( !MiscCheckTimer(&timer));
|
||||
}
|
||||
if (!( IOGetScanState( ps, _TRUE) & _SCANSTATE_STOP))
|
||||
break;
|
||||
}
|
||||
while( !MiscCheckTimer(&timer));
|
||||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path is established.
|
||||
/** Calling SITUATION: Scanner path is established.
|
||||
* Write a data to asic
|
||||
*/
|
||||
_LOC void IODataToScanner( pScanData ps, Byte bValue )
|
||||
|
@ -741,7 +738,7 @@ _LOC void IODataToScanner( pScanData ps, Byte bValue )
|
|||
ULong deltime = 4;
|
||||
|
||||
#ifdef DEBUG
|
||||
if( 0 == ps->IO.bOpenCount )
|
||||
if( 0 == ps->IO.bOpenCount )
|
||||
DBG( DBG_IO, "IODataToScanner - no connection!\n" );
|
||||
#endif
|
||||
|
||||
|
@ -753,7 +750,7 @@ _LOC void IODataToScanner( pScanData ps, Byte bValue )
|
|||
_DO_UDELAY( deltime );
|
||||
|
||||
/* notify asic there is data */
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE );
|
||||
_OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
|
||||
_DO_UDELAY( deltime );
|
||||
|
||||
/* end write cycle */
|
||||
|
@ -761,8 +758,7 @@ _LOC void IODataToScanner( pScanData ps, Byte bValue )
|
|||
_DO_UDELAY( deltime-1 );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path is established.
|
||||
/** Calling SITUATION: Scanner path is established.
|
||||
* Write a data to specific asic's register
|
||||
*/
|
||||
_LOC void IODataToRegister( pScanData ps, Byte bReg, Byte bData )
|
||||
|
@ -779,13 +775,12 @@ _LOC void IODataToRegister( pScanData ps, Byte bReg, Byte bData )
|
|||
IODataToScanner( ps, bData );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path is established.
|
||||
/** Calling SITUATION: Scanner path is established.
|
||||
* Read the content of specific asic's register
|
||||
*/
|
||||
_LOC Byte IODataFromRegister( pScanData ps, Byte bReg )
|
||||
{
|
||||
IORegisterToScanner( ps, bReg );
|
||||
IORegisterToScanner( ps, bReg );
|
||||
|
||||
if( 0 == ps->IO.delay )
|
||||
return ioDataFromSPPFast( ps );
|
||||
|
@ -797,8 +792,7 @@ _LOC Byte IODataFromRegister( pScanData ps, Byte bReg )
|
|||
return ioDataFromSPPSlowest( ps );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path is established.
|
||||
/** Calling SITUATION: Scanner path is established.
|
||||
* Write a register to asic (used for a command without parameter)
|
||||
*/
|
||||
_LOC void IORegisterToScanner( pScanData ps, Byte bReg )
|
||||
|
@ -835,13 +829,13 @@ _LOC void IORegisterToScanner( pScanData ps, Byte bReg )
|
|||
if( ps->IO.delay < 2 ) {
|
||||
|
||||
_DO_UDELAY( 1 );
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_REGWRITE);
|
||||
_OUTB_CTRL( ps, _CTRL_START_REGWRITE);
|
||||
_DO_UDELAY( 1 );
|
||||
_OUTB_CTRL( ps, _CTRL_END_REGWRITE);
|
||||
} else {
|
||||
|
||||
_DO_UDELAY( 2 );
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_REGWRITE);
|
||||
_OUTB_CTRL( ps, _CTRL_START_REGWRITE);
|
||||
_DO_UDELAY( 2 );
|
||||
_OUTB_CTRL( ps, _CTRL_END_REGWRITE);
|
||||
_DO_UDELAY( 2 );
|
||||
|
@ -849,8 +843,7 @@ _LOC void IORegisterToScanner( pScanData ps, Byte bReg )
|
|||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* write data to the DAC - ASIC 98001/3 only
|
||||
/** write data to the DAC - ASIC 98001/3 only
|
||||
*/
|
||||
_LOC void IODataRegisterToDAC( pScanData ps, Byte bReg, Byte bData )
|
||||
{
|
||||
|
@ -865,15 +858,14 @@ _LOC void IODataRegisterToDAC( pScanData ps, Byte bReg, Byte bData )
|
|||
|
||||
for( i = 4; i; i-- ) {
|
||||
|
||||
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE );
|
||||
_OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
|
||||
_DO_UDELAY( 5 );
|
||||
_OUTB_CTRL( ps, _CTRL_NORMAL );
|
||||
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
|
||||
_DO_UDELAY( 12 );
|
||||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path was not established.
|
||||
/** Calling SITUATION: Scanner path was not established.
|
||||
* Read the content of specific asics' register
|
||||
*/
|
||||
_LOC Byte IODataRegisterFromScanner( pScanData ps, Byte bReg )
|
||||
|
@ -887,8 +879,7 @@ _LOC Byte IODataRegisterFromScanner( pScanData ps, Byte bReg )
|
|||
return bData;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path not established.
|
||||
/** Calling SITUATION: Scanner path not established.
|
||||
* Write a value of register to asic
|
||||
*/
|
||||
_LOC void IOCmdRegisterToScanner( pScanData ps, Byte bReg, Byte bData )
|
||||
|
@ -898,8 +889,7 @@ _LOC void IOCmdRegisterToScanner( pScanData ps, Byte bReg, Byte bData )
|
|||
ps->CloseScanPath( ps );
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* Calling SITUATION: Scanner path not established.
|
||||
/** Calling SITUATION: Scanner path not established.
|
||||
* Write a register to asic (used for a command without parameter)
|
||||
*/
|
||||
_LOC void IORegisterDirectToScanner( pScanData ps, Byte bReg )
|
||||
|
@ -909,8 +899,7 @@ _LOC void IORegisterDirectToScanner( pScanData ps, Byte bReg )
|
|||
ps->CloseScanPath( ps ); /* disconnect */
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* perform a SW reset of ASIC 98003 models
|
||||
/** perform a SW reset of ASIC 98003 models
|
||||
*/
|
||||
_LOC void IOSoftwareReset( pScanData ps )
|
||||
{
|
||||
|
@ -1007,6 +996,6 @@ _LOC Byte IOInDelayed( UShort port )
|
|||
return inb_p( port );
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif /* guard __KERNEL__ */
|
||||
|
||||
/* END PLUSTEK-PP_IO.C ......................................................*/
|
||||
|
|
|
@ -492,10 +492,10 @@ _LOC int MiscInitPorts( pScanData ps, int port )
|
|||
ps->IO.pbStatusPort = (UShort)port+1;
|
||||
ps->IO.pbControlPort = (UShort)port+2;
|
||||
ps->IO.pbEppDataPort = (UShort)port+4;
|
||||
|
||||
|
||||
#else
|
||||
int mode;
|
||||
|
||||
|
||||
if( NULL == ps )
|
||||
return _E_NULLPTR;
|
||||
|
||||
|
|
|
@ -246,11 +246,12 @@ static SANE_Auth_Callback auth = NULL;
|
|||
static void show_cnf( pCnfDef cnf )
|
||||
{
|
||||
DBG( _DBG_SANE_INIT,"Device configuration:\n" );
|
||||
DBG( _DBG_SANE_INIT,"device name : >%s<\n", cnf->devName );
|
||||
DBG( _DBG_SANE_INIT,"direct I/O : %s\n", _YN(cnf->adj.direct_io ));
|
||||
DBG( _DBG_SANE_INIT,"warmup : %ds\n", cnf->adj.warmup );
|
||||
DBG( _DBG_SANE_INIT,"lampOff : %d\n", cnf->adj.lampOff );
|
||||
DBG( _DBG_SANE_INIT,"lampOffOnEnd : %s\n", _YN(cnf->adj.lampOffOnEnd ));
|
||||
DBG( _DBG_SANE_INIT,"device name : >%s<\n", cnf->devName );
|
||||
DBG( _DBG_SANE_INIT,"direct I/O : %s\n", _YN(cnf->adj.direct_io ));
|
||||
DBG( _DBG_SANE_INIT,"warmup : %ds\n", cnf->adj.warmup );
|
||||
DBG( _DBG_SANE_INIT,"lampOff : %d\n", cnf->adj.lampOff );
|
||||
DBG( _DBG_SANE_INIT,"lampOffOnEnd : %s\n", _YN(cnf->adj.lampOffOnEnd ));
|
||||
DBG( _DBG_SANE_INIT,"model override: %d\n", cnf->adj.mov );
|
||||
DBG( _DBG_SANE_INIT,"---------------------\n" );
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue