Made PS/2 bidirectional mode work.

merge-requests/1/head
Gerhard Jaeger 2003-10-30 15:54:07 +00:00
rodzic ccb3053773
commit 4a31f9681a
5 zmienionych plików z 188 dodań i 197 usunięć

Wyświetl plik

@ -490,7 +490,7 @@ _LOC int DetectScanner( pScanData ps, int mode )
} else { } else {
/* this will be called each time before operating on a previously /* 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 ) { if( _ASIC_IS_98001 == mode ) {

Wyświetl plik

@ -203,18 +203,19 @@
/* /*
* for Asic I/O signal control * for Asic I/O signal control
*/ */
#define _CTRL_GENSIGNAL (_CTRL_RESERVED + _CTRL_NOT_INIT) /* 0xc4 */ #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_START_REGWRITE (_CTRL_GENSIGNAL + _CTRL_SELECT_IN) /* 0xcc */
#define _CTRL_END_REGWRITE (_CTRL_GENSIGNAL) /* 0xc4 */ #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_START_DATAWRITE (_CTRL_GENSIGNAL + _CTRL_AUTOLF) /* 0xc6 */
#define _CTRL_EPPSIGNAL_WRITE (_CTRL_GENSIGNAL + _CTRL_STROBE) /* 0xc5 */ #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_EPPTRIG_REGWRITE (_CTRL_GENSIGNAL + _CTRL_SELECT_IN + _CTRL_STROBE)
#define _CTRL_END_DATAREAD (_CTRL_GENSIGNAL) /* 0xc4 */ #define _CTRL_START_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION + _CTRL_AUTOLF)
#define _CTRL_SIGNAL_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION + _CTRL_AUTOLF) #define _CTRL_END_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION) /* 0xe4 */
#define _CTRL_END_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION) /* 0xe4 */
typedef struct typedef struct

Wyświetl plik

@ -73,10 +73,15 @@ static Bool fnEPPRead ( pScanData ps, pUChar pBuffer, ULong ulSize );
static Bool fnSPPRead ( 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 Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize );
static pFnReadData ioReadFunc[3] = { typedef struct {
fnEPPRead, pFnReadData func;
fnSPPRead, char *name;
fnBiDirRead } ioReadFuncDef;
static ioReadFuncDef ioReadFunc[3] = {
{ fnEPPRead, "fnEPPRead" },
{ fnSPPRead, "fnSPPRead" },
{ fnBiDirRead, "fnBiDirRead" }
}; };
/*************************** some definitions ********************************/ /*************************** some definitions ********************************/
@ -216,51 +221,8 @@ static UChar ioDataFromSPPSlowest( pScanData ps )
return bData; return bData;
} }
/** Using buffered I/O to read data from EPP Data Port /** Read data from STATUS port. We have to read twice and combine two nibble
*/ * data to one byte.
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
*/ */
static Bool fnSPPRead( pScanData ps, pUChar pBuffer, ULong ulSize ) static Bool fnSPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
{ {
@ -290,33 +252,80 @@ static Bool fnSPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
return _TRUE; 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 ) 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)); _OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
}
#endif
switch( ps->IO.delay ) { switch( ps->IO.delay ) {
case 0: case 0:
for(; ulSize; ulSize--, pBuffer++ ) { for( ; ulSize; ulSize--, pBuffer++ ) {
_OUTB_CTRL( ps, _CTRL_SIGNAL_BIDIREAD); /* 0xe6 */ _OUTB_CTRL( ps, start );
*pBuffer = _INB_DATA( ps ); *pBuffer = _INB_DATA( ps );
_OUTB_CTRL( ps, _CTRL_END_BIDIREAD ); /* 0xe4 */ _OUTB_CTRL( ps, end );
} }
break; break;
case 1: case 1:
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
for(; ulSize; ulSize--, pBuffer++ ) { for(; ulSize; ulSize--, pBuffer++ ) {
_OUTB_CTRL( ps, _CTRL_SIGNAL_BIDIREAD); /* 0xe6 */ _OUTB_CTRL( ps, start );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
*pBuffer = _INB_DATA( ps ); *pBuffer = _INB_DATA( ps );
_OUTB_CTRL( ps, _CTRL_END_BIDIREAD ); /* 0xe4 */ _OUTB_CTRL( ps, end );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
} }
break; break;
@ -324,55 +333,53 @@ static Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize )
default: default:
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
for(; ulSize; ulSize--, pBuffer++ ) { for(; ulSize; ulSize--, pBuffer++ ) {
_OUTB_CTRL( ps, _CTRL_SIGNAL_BIDIREAD); /* 0xe6 */ _OUTB_CTRL( ps, start );
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
*pBuffer = _INB_DATA( ps ); *pBuffer = _INB_DATA( ps );
_OUTB_CTRL( ps, _CTRL_END_BIDIREAD ); /* 0xe4 */ _OUTB_CTRL( ps, end );
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
} }
break; break;
} }
if( _IS_ASIC98(ps->sCaps.AsicID)) #ifndef __KERNEL__
_OUTB_CTRL( ps, _CTRL_END_DATAREAD ); /* 0xc4 */ sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAOUT );
#else
return _TRUE; 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 ) 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.bOldControlValue = _INB_CTRL( ps );
ps->IO.bOldDataValue = _INB_DATA( ps ); ps->IO.bOldDataValue = _INB_DATA( ps );
_OUTB_CTRL( ps, _CTRL_NORMAL ); /* 0xc4 */ _OUTB_CTRL( ps, _CTRL_GENSIGNAL ); /* 0xc4 */
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
} }
/*............................................................................. /** restore the port settings
* restore the settings
*/ */
static void ioRestoreParallelMode( pScanData ps ) static void ioRestoreParallelMode( pScanData ps )
{ {
_OUTB_CTRL( ps, ps->IO.bOldControlValue & 0x3f ); _OUTB_CTRL( ps, ps->IO.bOldControlValue & 0x3f );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
_OUTB_DATA( ps, ps->IO.bOldDataValue ); _OUTB_DATA( ps, ps->IO.bOldDataValue );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
} }
/*............................................................................. /** try to connect to scanner (ASIC 9600x and 98001)
* try to connect to scanner
*/
/*static void ioP98001EstablishScannerConnection( pScanData, ULong );
*/ */
_LOC _INL void ioP98001EstablishScannerConnection( pScanData ps, ULong delTime ) _LOC _INL void ioP98001EstablishScannerConnection( pScanData ps, ULong delTime )
{ {
@ -392,8 +399,24 @@ _LOC _INL void ioP98001EstablishScannerConnection( pScanData ps, ULong delTime )
_DO_UDELAY( delTime ); _DO_UDELAY( delTime );
} }
/*............................................................................. /** try to connect to scanner (ASIC 98003)
* switch the printer interface to scanner */
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 ) static Bool ioP96OpenScanPath( pScanData ps )
{ {
@ -419,23 +442,7 @@ static Bool ioP96OpenScanPath( pScanData ps )
return _TRUE; return _TRUE;
} }
static void ioP98003EstablishScannerConnection( pScanData ps, ULong delTime ) /** try to connect to scanner
{
_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
*/ */
static Bool ioP98OpenScanPath( pScanData ps ) static Bool ioP98OpenScanPath( pScanData ps )
{ {
@ -463,8 +470,8 @@ static Bool ioP98OpenScanPath( pScanData ps )
ioP98003EstablishScannerConnection( ps, dw ); ioP98003EstablishScannerConnection( ps, dw );
} }
_INB_STATUS( ps ); _INB_STATUS( ps );
tmp = _INB_STATUS( ps ); tmp = _INB_STATUS( ps );
if( 0x50 == ( tmp & 0xf0 )) { if( 0x50 == ( tmp & 0xf0 )) {
@ -490,8 +497,7 @@ static Bool ioP98OpenScanPath( pScanData ps )
return _TRUE; return _TRUE;
} }
/*............................................................................. /** Switch back to printer mode.
* Switch back to printer mode
* Restore the printer control/data port value. * Restore the printer control/data port value.
*/ */
static void ioCloseScanPath( pScanData ps ) static void ioCloseScanPath( pScanData ps )
@ -499,7 +505,7 @@ static void ioCloseScanPath( pScanData ps )
if( ps->IO.bOpenCount && !(--ps->IO.bOpenCount)) { if( ps->IO.bOpenCount && !(--ps->IO.bOpenCount)) {
#ifdef DEBUG #ifdef DEBUG
ps->IO.bOpenCount = 1; ps->IO.bOpenCount = 1;
#endif #endif
IORegisterToScanner( ps, 0xff ); IORegisterToScanner( ps, 0xff );
@ -516,9 +522,8 @@ static void ioCloseScanPath( pScanData ps )
} }
} }
/*............................................................................. /** check the memory to see that the data-transfers will work.
* check the memory to see that the data-transfers will work * (ASIC 9800x only)
* ASIC 9800x only
*/ */
static int ioP98ReadWriteTest( pScanData ps ) static int ioP98ReadWriteTest( pScanData ps )
{ {
@ -531,7 +536,6 @@ static int ioP98ReadWriteTest( pScanData ps )
/* _MEMTEST_SIZE: Read, _MEMTEST_SIZE:Write */ /* _MEMTEST_SIZE: Read, _MEMTEST_SIZE:Write */
buffer = _KALLOC( sizeof(UChar) * _MEMTEST_SIZE*2, GFP_KERNEL ); buffer = _KALLOC( sizeof(UChar) * _MEMTEST_SIZE*2, GFP_KERNEL );
if( NULL == buffer ) if( NULL == buffer )
return _E_ALLOC; return _E_ALLOC;
@ -545,7 +549,7 @@ static int ioP98ReadWriteTest( pScanData ps )
tmp = ps->bLastLampStatus + _SCAN_BYTEMODE; tmp = ps->bLastLampStatus + _SCAN_BYTEMODE;
IODataToRegister( ps, ps->RegScanControl, tmp ); 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->RegModeControl, _ModeMappingMem );
IODataToRegister( ps, ps->RegMemoryLow, 0 ); IODataToRegister( ps, ps->RegMemoryLow, 0 );
@ -560,19 +564,17 @@ static int ioP98ReadWriteTest( pScanData ps )
IODataToRegister( ps, ps->RegWidthPixelsLow, 0 ); IODataToRegister( ps, ps->RegWidthPixelsLow, 0 );
IODataToRegister( ps, ps->RegWidthPixelsHigh, 5 ); IODataToRegister( ps, ps->RegWidthPixelsHigh, 5 );
ps->AsicReg.RD_ModeControl = _ModeReadMappingMem; ps->AsicReg.RD_ModeControl = _ModeReadMappingMem;
if( _ASIC_IS_98001 == ps->sCaps.AsicID ) if( _ASIC_IS_98001 == ps->sCaps.AsicID )
ps->CloseScanPath( ps ); ps->CloseScanPath( ps );
IOReadScannerImageData( ps, buffer + _MEMTEST_SIZE, _MEMTEST_SIZE ); IOReadScannerImageData( ps, buffer + _MEMTEST_SIZE, _MEMTEST_SIZE );
if( _ASIC_IS_98003 == ps->sCaps.AsicID ) if( _ASIC_IS_98003 == ps->sCaps.AsicID )
ps->CloseScanPath( ps ); ps->CloseScanPath( ps );
/* /* check the result ! */
* check the result !
*/
retval = _OK; retval = _OK;
for( ul = 0; ul < _MEMTEST_SIZE; ul++ ) { for( ul = 0; ul < _MEMTEST_SIZE; ul++ ) {
@ -588,8 +590,7 @@ static int ioP98ReadWriteTest( pScanData ps )
return retval; 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 ) static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
{ {
@ -600,7 +601,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
case 0: case 0:
for (; size; size--, pBuffer++) { for (; size; size--, pBuffer++) {
_OUTB_DATA( ps, *pBuffer ); _OUTB_DATA( ps, *pBuffer );
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
} }
break; break;
@ -610,7 +611,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
for (; size; size--, pBuffer++) { for (; size; size--, pBuffer++) {
_OUTB_DATA( ps, *pBuffer ); _OUTB_DATA( ps, *pBuffer );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
@ -621,7 +622,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
for (; size; size--, pBuffer++) { for (; size; size--, pBuffer++) {
_OUTB_DATA( ps, *pBuffer ); _OUTB_DATA( ps, *pBuffer );
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
_OUTB_CTRL( ps, _CTRL_END_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
_DO_UDELAY( 3 ); _DO_UDELAY( 3 );
@ -638,24 +639,22 @@ static void ioEnterReadMode( pScanData ps )
if( ps->IO.portMode != _PORT_SPP ) { if( ps->IO.portMode != _PORT_SPP ) {
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
IORegisterToScanner( ps, ps->RegEPPEnable ); IORegisterToScanner( ps, ps->RegEPPEnable );
if( _IS_ASIC98( ps->sCaps.AsicID )) if( _IS_ASIC98( ps->sCaps.AsicID ))
ps->IO.useEPPCmdMode = _TRUE; ps->IO.useEPPCmdMode = _TRUE;
} }
if( _ASIC_IS_98003 == ps->sCaps.AsicID ) if( _ASIC_IS_98003 == ps->sCaps.AsicID )
ps->IO.bOldControlValue = _INB_CTRL( ps ); ps->IO.bOldControlValue = _INB_CTRL( ps );
/* ask ASIC to enter read mode */ /* ask ASIC to enter read mode */
IORegisterToScanner( ps, ps->RegReadDataMode ); IORegisterToScanner( ps, ps->RegReadDataMode );
} }
/************************ exported functions *********************************/ /************************ exported functions *********************************/
/*............................................................................. /** here we do some init work
* here we do some init work
*/ */
_LOC int IOInitialize( pScanData ps ) _LOC int IOInitialize( pScanData ps )
{ {
@ -667,7 +666,7 @@ _LOC int IOInitialize( pScanData ps )
if( _IS_ASIC98(ps->sCaps.AsicID)) { if( _IS_ASIC98(ps->sCaps.AsicID)) {
ps->OpenScanPath = ioP98OpenScanPath; ps->OpenScanPath = ioP98OpenScanPath;
ps->ReadWriteTest = ioP98ReadWriteTest; ps->ReadWriteTest = ioP98ReadWriteTest;
} else if( _IS_ASIC96(ps->sCaps.AsicID)) { } else if( _IS_ASIC96(ps->sCaps.AsicID)) {
@ -680,60 +679,58 @@ _LOC int IOInitialize( pScanData ps )
} }
ps->CloseScanPath = ioCloseScanPath; 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; return _OK;
} }
/*............................................................................. /** Write specific length buffer to scanner
* Write specific length buffer to scanner
* The scan path is already established * The scan path is already established
*/ */
_LOC void IOMoveDataToScanner( pScanData ps, pUChar pBuffer, ULong size ) _LOC void IOMoveDataToScanner( pScanData ps, pUChar pBuffer, ULong size )
{ {
#ifdef DEBUG #ifdef DEBUG
if( 0 == ps->IO.bOpenCount ) if( 0 == ps->IO.bOpenCount )
DBG( DBG_IO, "IOMoveDataToScanner - no connection!\n" ); DBG( DBG_IO, "IOMoveDataToScanner - no connection!\n" );
#endif #endif
IORegisterToScanner( ps, ps->RegInitDataFifo ); IORegisterToScanner( ps, ps->RegInitDataFifo );
IORegisterToScanner( ps, ps->RegWriteDataMode ); 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 * download a scanstate-table
*/ */
_LOC void IODownloadScanStates( pScanData ps ) _LOC void IODownloadScanStates( pScanData ps )
{ {
TimerDef timer; TimerDef timer;
#ifdef DEBUG #ifdef DEBUG
if( 0 == ps->IO.bOpenCount ) if( 0 == ps->IO.bOpenCount )
DBG( DBG_IO, "IODownloadScanStates - no connection!\n" ); DBG( DBG_IO, "IODownloadScanStates - no connection!\n" );
#endif #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)); MiscStartTimer( &timer, (_SECOND/2));
do { do {
if (!( IOGetScanState( ps, _TRUE) & _SCANSTATE_STOP)) if (!( IOGetScanState( ps, _TRUE) & _SCANSTATE_STOP))
break; break;
} }
while( !MiscCheckTimer(&timer)); while( !MiscCheckTimer(&timer));
} }
} }
/*............................................................................. /** Calling SITUATION: Scanner path is established.
* Calling SITUATION: Scanner path is established.
* Write a data to asic * Write a data to asic
*/ */
_LOC void IODataToScanner( pScanData ps, Byte bValue ) _LOC void IODataToScanner( pScanData ps, Byte bValue )
@ -741,7 +738,7 @@ _LOC void IODataToScanner( pScanData ps, Byte bValue )
ULong deltime = 4; ULong deltime = 4;
#ifdef DEBUG #ifdef DEBUG
if( 0 == ps->IO.bOpenCount ) if( 0 == ps->IO.bOpenCount )
DBG( DBG_IO, "IODataToScanner - no connection!\n" ); DBG( DBG_IO, "IODataToScanner - no connection!\n" );
#endif #endif
@ -753,7 +750,7 @@ _LOC void IODataToScanner( pScanData ps, Byte bValue )
_DO_UDELAY( deltime ); _DO_UDELAY( deltime );
/* notify asic there is data */ /* notify asic there is data */
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
_DO_UDELAY( deltime ); _DO_UDELAY( deltime );
/* end write cycle */ /* end write cycle */
@ -761,8 +758,7 @@ _LOC void IODataToScanner( pScanData ps, Byte bValue )
_DO_UDELAY( deltime-1 ); _DO_UDELAY( deltime-1 );
} }
/*............................................................................. /** Calling SITUATION: Scanner path is established.
* Calling SITUATION: Scanner path is established.
* Write a data to specific asic's register * Write a data to specific asic's register
*/ */
_LOC void IODataToRegister( pScanData ps, Byte bReg, Byte bData ) _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 ); IODataToScanner( ps, bData );
} }
/*............................................................................. /** Calling SITUATION: Scanner path is established.
* Calling SITUATION: Scanner path is established.
* Read the content of specific asic's register * Read the content of specific asic's register
*/ */
_LOC Byte IODataFromRegister( pScanData ps, Byte bReg ) _LOC Byte IODataFromRegister( pScanData ps, Byte bReg )
{ {
IORegisterToScanner( ps, bReg ); IORegisterToScanner( ps, bReg );
if( 0 == ps->IO.delay ) if( 0 == ps->IO.delay )
return ioDataFromSPPFast( ps ); return ioDataFromSPPFast( ps );
@ -797,8 +792,7 @@ _LOC Byte IODataFromRegister( pScanData ps, Byte bReg )
return ioDataFromSPPSlowest( ps ); 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) * Write a register to asic (used for a command without parameter)
*/ */
_LOC void IORegisterToScanner( pScanData ps, Byte bReg ) _LOC void IORegisterToScanner( pScanData ps, Byte bReg )
@ -835,13 +829,13 @@ _LOC void IORegisterToScanner( pScanData ps, Byte bReg )
if( ps->IO.delay < 2 ) { if( ps->IO.delay < 2 ) {
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
_OUTB_CTRL( ps, _CTRL_SIGNAL_REGWRITE); _OUTB_CTRL( ps, _CTRL_START_REGWRITE);
_DO_UDELAY( 1 ); _DO_UDELAY( 1 );
_OUTB_CTRL( ps, _CTRL_END_REGWRITE); _OUTB_CTRL( ps, _CTRL_END_REGWRITE);
} else { } else {
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
_OUTB_CTRL( ps, _CTRL_SIGNAL_REGWRITE); _OUTB_CTRL( ps, _CTRL_START_REGWRITE);
_DO_UDELAY( 2 ); _DO_UDELAY( 2 );
_OUTB_CTRL( ps, _CTRL_END_REGWRITE); _OUTB_CTRL( ps, _CTRL_END_REGWRITE);
_DO_UDELAY( 2 ); _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 ) _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-- ) { for( i = 4; i; i-- ) {
_OUTB_CTRL( ps, _CTRL_SIGNAL_DATAWRITE ); _OUTB_CTRL( ps, _CTRL_START_DATAWRITE );
_DO_UDELAY( 5 ); _DO_UDELAY( 5 );
_OUTB_CTRL( ps, _CTRL_NORMAL ); _OUTB_CTRL( ps, _CTRL_END_DATAWRITE );
_DO_UDELAY( 12 ); _DO_UDELAY( 12 );
} }
} }
/*............................................................................. /** Calling SITUATION: Scanner path was not established.
* Calling SITUATION: Scanner path was not established.
* Read the content of specific asics' register * Read the content of specific asics' register
*/ */
_LOC Byte IODataRegisterFromScanner( pScanData ps, Byte bReg ) _LOC Byte IODataRegisterFromScanner( pScanData ps, Byte bReg )
@ -887,8 +879,7 @@ _LOC Byte IODataRegisterFromScanner( pScanData ps, Byte bReg )
return bData; return bData;
} }
/*............................................................................. /** Calling SITUATION: Scanner path not established.
* Calling SITUATION: Scanner path not established.
* Write a value of register to asic * Write a value of register to asic
*/ */
_LOC void IOCmdRegisterToScanner( pScanData ps, Byte bReg, Byte bData ) _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 ); 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) * Write a register to asic (used for a command without parameter)
*/ */
_LOC void IORegisterDirectToScanner( pScanData ps, Byte bReg ) _LOC void IORegisterDirectToScanner( pScanData ps, Byte bReg )
@ -909,8 +899,7 @@ _LOC void IORegisterDirectToScanner( pScanData ps, Byte bReg )
ps->CloseScanPath( ps ); /* disconnect */ 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 ) _LOC void IOSoftwareReset( pScanData ps )
{ {
@ -1007,6 +996,6 @@ _LOC Byte IOInDelayed( UShort port )
return inb_p( port ); return inb_p( port );
#endif #endif
} }
#endif #endif /* guard __KERNEL__ */
/* END PLUSTEK-PP_IO.C ......................................................*/ /* END PLUSTEK-PP_IO.C ......................................................*/

Wyświetl plik

@ -492,10 +492,10 @@ _LOC int MiscInitPorts( pScanData ps, int port )
ps->IO.pbStatusPort = (UShort)port+1; ps->IO.pbStatusPort = (UShort)port+1;
ps->IO.pbControlPort = (UShort)port+2; ps->IO.pbControlPort = (UShort)port+2;
ps->IO.pbEppDataPort = (UShort)port+4; ps->IO.pbEppDataPort = (UShort)port+4;
#else #else
int mode; int mode;
if( NULL == ps ) if( NULL == ps )
return _E_NULLPTR; return _E_NULLPTR;

Wyświetl plik

@ -246,11 +246,12 @@ static SANE_Auth_Callback auth = NULL;
static void show_cnf( pCnfDef cnf ) static void show_cnf( pCnfDef cnf )
{ {
DBG( _DBG_SANE_INIT,"Device configuration:\n" ); DBG( _DBG_SANE_INIT,"Device configuration:\n" );
DBG( _DBG_SANE_INIT,"device name : >%s<\n", cnf->devName ); 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,"direct I/O : %s\n", _YN(cnf->adj.direct_io ));
DBG( _DBG_SANE_INIT,"warmup : %ds\n", cnf->adj.warmup ); DBG( _DBG_SANE_INIT,"warmup : %ds\n", cnf->adj.warmup );
DBG( _DBG_SANE_INIT,"lampOff : %d\n", cnf->adj.lampOff ); 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,"lampOffOnEnd : %s\n", _YN(cnf->adj.lampOffOnEnd ));
DBG( _DBG_SANE_INIT,"model override: %d\n", cnf->adj.mov );
DBG( _DBG_SANE_INIT,"---------------------\n" ); DBG( _DBG_SANE_INIT,"---------------------\n" );
} }