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 {
/* 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 ) {

Wyświetl plik

@ -204,16 +204,17 @@
* 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_START_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_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_START_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION + _CTRL_AUTOLF)
#define _CTRL_END_BIDIREAD (_CTRL_GENSIGNAL + _CTRL_DIRECTION) /* 0xe4 */

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 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,41 +333,42 @@ 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 */
#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 */
_OUTB_CTRL( ps, _CTRL_GENSIGNAL ); /* 0xc4 */
_DO_UDELAY( 2 );
}
/*.............................................................................
* restore the settings
/** restore the port settings
*/
static void ioRestoreParallelMode( pScanData ps )
{
@ -369,10 +379,7 @@ static void ioRestoreParallelMode( pScanData ps )
_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 )
{
@ -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 )
@ -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;
@ -570,9 +574,7 @@ static int ioP98ReadWriteTest( pScanData 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,7 +639,6 @@ static void ioEnterReadMode( pScanData ps )
if( ps->IO.portMode != _PORT_SPP ) {
_DO_UDELAY( 1 );
IORegisterToScanner( ps, ps->RegEPPEnable );
if( _IS_ASIC98( ps->sCaps.AsicID ))
@ -654,8 +654,7 @@ static void ioEnterReadMode( pScanData ps )
/************************ exported functions *********************************/
/*.............................................................................
* here we do some init work
/** here we do some init work
*/
_LOC int IOInitialize( pScanData ps )
{
@ -680,13 +679,13 @@ _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 )
@ -702,8 +701,7 @@ _LOC void IOMoveDataToScanner( pScanData ps, pUChar pBuffer, ULong 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 )
@ -732,8 +730,7 @@ _LOC void IODownloadScanStates( pScanData ps )
}
}
/*.............................................................................
* Calling SITUATION: Scanner path is established.
/** Calling SITUATION: Scanner path is established.
* Write a data to asic
*/
_LOC void IODataToScanner( pScanData ps, Byte bValue )
@ -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,8 +775,7 @@ _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 )
@ -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 ......................................................*/

Wyświetl plik

@ -251,6 +251,7 @@ static void show_cnf( pCnfDef cnf )
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" );
}