major update, sanei_pp integration, compilation fixes.

merge-requests/1/head
Gerhard Jaeger 2003-10-22 19:20:31 +00:00
rodzic 01d0486095
commit fe555addac
14 zmienionych plików z 195 dodań i 402 usunięć

Wyświetl plik

@ -363,6 +363,7 @@ libsane-plustek.la: ../sanei/sanei_lm983x.lo
libsane-plustek.la: ../sanei/sanei_thread.lo
libsane-plustek_pp.la: ../sanei/sanei_constrain_value.lo
libsane-plustek_pp.la: ../sanei/sanei_thread.lo
libsane-plustek_pp.la: ../sanei/sanei_pp.lo
libsane-pnm.la: ../sanei/sanei_constrain_value.lo
libsane-qcam.la: ../sanei/sanei_constrain_value.lo
libsane-ricoh.la: ../sanei/sanei_config2.lo

Wyświetl plik

@ -67,6 +67,8 @@
# ifndef __KERNEL__
# include <assert.h>
# define _ASSERT(x) assert(x)
# else
# define _ASSERT(x)
# endif
# ifndef DBG

Wyświetl plik

@ -101,13 +101,15 @@ static int detectScannerConnection( pScanData ps )
UChar data, control, status;
int retval = _E_NO_CONN;
#ifdef __KERNEL__
DBG( DBG_LOW, "Dataport = 0x%04x\n", ps->IO.pbSppDataPort );
DBG( DBG_LOW, "Ctrlport = 0x%04x\n", ps->IO.pbControlPort );
#endif
detectResetPort( ps );
/*
* as we´re called during InitPorts, we can be sure
* as we're called during InitPorts, we can be sure
* to operate in EPP-mode (hopefuly ;-)
*/
control = _INB_CTRL( ps );
@ -151,7 +153,7 @@ static int detectScannerConnection( pScanData ps )
ps->CloseScanPath( ps );
/*
* so we´re done ´til now...
* so we're done 'til now...
*/
DBG( DBG_HIGH, "Compare data=0x%x and status=0x%x, port=0x%x\n",
data, status, ps->IO.portBase );
@ -181,7 +183,11 @@ static int detectScannerConnection( pScanData ps )
* work on the result
*/
if ( _OK == retval ) {
#ifdef __KERNEL__
ps->sCaps.wIOBase = ps->IO.pbSppDataPort;
#else
ps->sCaps.wIOBase = ps->pardev;
#endif
ps->PutToIdleMode( ps );
} else {
@ -199,7 +205,6 @@ static int detectScannerConnection( pScanData ps )
return retval;
}
/*.............................................................................
* we need some memory...
*/
@ -390,7 +395,6 @@ static int detectAsic98001( pScanData ps )
#else
DBG( DBG_HIGH,
#endif
"!!!! WARNING, have a look at function detectAsic98001() !!!!\n" );
ps->sCaps.AsicID = _ASIC_IS_98001;
ps->sCaps.wIOBase = ps->IO.pbSppDataPort;

Wyświetl plik

@ -591,6 +591,7 @@ typedef struct
*/
typedef struct {
#ifdef __KERNEL__
pFnOut fnOut;
pFnIn fnIn;
@ -600,6 +601,7 @@ typedef struct {
UShort pbStatusPort;
UShort pbControlPort;
UShort pbAddrOffsetPort;
#endif
UShort portBase;
UShort portMode;

Wyświetl plik

@ -85,8 +85,7 @@ static pFnReadData ioReadFunc[3] = {
/*************************** local functions *********************************/
/*.............................................................................
* we provide some functions to read data from SPP port according to
/** we provide some functions to read data from SPP port according to
* the speed we have detected (ReadWriteTest!!)
*/
static Byte ioDataFromSPPFast( pScanData ps )
@ -579,7 +578,8 @@ static int ioP98ReadWriteTest( pScanData ps )
*/
static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
{
DBG( DBG_IO , "IODELAY = %u\n", ps->IO.delay );
DBG( DBG_IO , "Moving %lu bytes to scanner, IODELAY = %u...\n",
size, ps->IO.delay );
switch( ps->IO.delay ) {
case 0:
@ -613,6 +613,7 @@ static void ioSPPWrite( pScanData ps, pUChar pBuffer, ULong size )
}
break;
}
DBG( DBG_IO , "... done.\n" );
}
/*.............................................................................
@ -954,8 +955,9 @@ _LOC void IOReadScannerImageData( pScanData ps, pUChar pBuf, ULong size )
ps->OpenScanPath( ps );
}
/*.............................................................................
* the wrapper functions to support delayed and non-delayed I/O
#ifdef __KERNEL__
/** the wrapper functions to support delayed and non-delayed I/O
*/
_LOC void IOOut( Byte data, UShort port )
{
@ -992,5 +994,6 @@ _LOC Byte IOInDelayed( UShort port )
return inb_p( port );
#endif
}
#endif
/* END PLUSTEK-PP_IO.C ......................................................*/

Wyświetl plik

@ -19,7 +19,7 @@
* - for selecting the port-mode this driver uses
* - 0.33 - added code to use faster portmodes
* - 0.34 - added sample code for changing from ECP to PS/2 bidi mode
* - 0.35 - added Kevins´ changes (new function miscSetFastMode())
* - 0.35 - added Kevins' changes (new function miscSetFastMode())
* - moved function initPageSettings() to module models.c
* - 0.36 - added random generator
* - added additional debug messages
@ -80,11 +80,11 @@
/*************************** some definitions ********************************/
#ifndef __KERNEL__
#define PPA_PROBE_SPP 0x0001
#define PPA_PROBE_PS2 0x0002
#define PPA_PROBE_ECR 0x0010
#define PPA_PROBE_EPP17 0x0100
#define PPA_PROBE_EPP19 0x0200
# define PPA_PROBE_SPP 0x0001
# define PPA_PROBE_PS2 0x0002
# define PPA_PROBE_ECR 0x0010
# define PPA_PROBE_EPP17 0x0100
# define PPA_PROBE_EPP19 0x0200
#else
/*
@ -123,6 +123,8 @@ static int portIsClaimed[_MAX_PTDEVS] = { 0, 0, 0, 0 };
/*************************** local functions *********************************/
#ifdef __KERNEL__
/** display the avaialable port-modes
*/
#ifdef DEBUG
@ -130,7 +132,6 @@ static void miscShowPortModes( int modes )
{
DBG( DBG_LOW, "parport-modi:" );
#ifdef __KERNEL__
if( modes & PARPORT_MODE_PCSPP )
DBG( DBG_LOW, " SPP" );
@ -148,22 +149,6 @@ static void miscShowPortModes( int modes )
if( modes & PARPORT_MODE_PCECPPS2 )
DBG( DBG_LOW, " PS/2(ECP)" );
#else
if( modes & PPA_PROBE_SPP )
DBG( DBG_LOW, " SPP" );
if( modes & PPA_PROBE_PS2 )
DBG( DBG_LOW, " PS/2" );
if( modes & PPA_PROBE_EPP17 )
DBG( DBG_LOW, " EPP17" );
if( modes & PPA_PROBE_EPP19 )
DBG( DBG_LOW, " EPP19" );
if( modes & PPA_PROBE_ECR )
DBG( DBG_LOW, " ECP" );
#endif
DBG( DBG_LOW, "\n" );
}
@ -174,199 +159,15 @@ static void miscShowPortModes( int modes )
static int initPortProbe( pScanData ps )
{
int retv = 0;
#ifndef __KERNEL__
UShort port;
UChar a, b, c;
UInt i, j;
#endif
/*
* clear the controls
*/
/* clear the controls */
ps->IO.lastPortMode = 0xFFFF;
#ifdef __KERNEL__
if( NULL != ps->pardev )
retv = ps->pardev->port->modes;
#else
port = ps->IO.portBase;
DBG(DBG_SCAN, "Probing port 0x%04x\n", port);
/* ##### ###### ######
* # # # # # #
* # # # # #
* ##### ###### ######
* # # #
* # # # #
* ##### # #
*/
outb(0x0c, port + 0x402);
outb(0x0c, port + 0x002);
outb(0x55, port);
a = inb(port);
if (a != 0x55)
return retv;
DBG(DBG_SCAN, " SPP port present\n");
retv += PPA_PROBE_SPP;
/* ####### ##### ######
* # # # # #
* # # # #
* ##### # ######
* # # #
* # # # #
* ####### ##### #
*/
for (i = 1024; i > 0; i--) { /* clear at most 1k of data from FIFO */
a = inb(port + 0x402);
if ((a & 0x03) == 0x03)
goto no_ecp;
if (a & 0x01)
break;
inb(port + 0x400); /* Remove byte from FIFO */
}
if (i <= 0)
goto no_ecp;
b = a ^ 3;
outb(b, port + 0x402);
c = inb(port + 0x402);
if (a == c) {
outb(0xc0, port + 0x402); /* FIFO test */
j = 0;
while (!(inb(port + 0x402) & 0x01) && (j < 1024)) {
inb(port + 0x400);
j++;
}
if (j >= 1024)
goto no_ecp;
i = 0;
j = 0;
while (!(inb(port + 0x402) & 0x02) && (j < 1024)) {
outb(0x00, port + 0x400);
i++;
j++;
}
if (j >= 1024)
goto no_ecp;
j = 0;
while (!(inb(port + 0x402) & 0x01) && (j < 1024)) {
inb(port + 0x400);
j++;
}
if (j >= 1024)
goto no_ecp;
DBG(DBG_SCAN, " ECP with a %i byte FIFO present\n", i);
retv += PPA_PROBE_ECR;
}
/* ###### ##### #####
* # # # # # #
* # # # #
* ###### ##### #####
* # # #
* # # # #
* # ##### #######
*/
no_ecp:
if (retv & PPA_PROBE_ECR)
outb(0x20, port + 0x402);
outb(0x55, port);
outb(0x0c, port + 2);
a = inb(port);
outb(0x55, port);
outb(0x2c, port + 2);
b = inb(port);
if (a != b) {
DBG(DBG_SCAN, " PS/2 bidirectional port present\n");
retv += PPA_PROBE_PS2;
}
/* ####### ###### ######
* # # # # #
* # # # # #
* ##### ###### ######
* # # #
* # # #
* ####### # #
*/
if (port & 0x007) {
DBG(DBG_SCAN, " EPP not supported at this address\n");
return retv;
}
if (retv & PPA_PROBE_ECR) {
for (i = 0x00; i < 0x80; i += 0x20) {
outb(i, port + 0x402);
a = inb(port + 1);
outb(a, port + 1);
outb(a & 0xfe, port + 1);
a = inb(port + 1);
if (!(a & 0x01)) {
DBG(DBG_SCAN, " Failed Intel bug check. (Phony EPP in ECP)\n");
return retv;
}
}
DBG(DBG_SCAN, " Passed Intel bug check.\n");
outb(0x80, port + 0x402);
}
a = inb(port + 1);
outb(a, port + 1);
outb(a & 0xfe, port + 1);
a = inb(port + 1);
if (a & 0x01) {
outb(0x0c, port + 0x402);
outb(0x0c, port + 0x002);
return retv;
}
outb(0x04, port + 2);
inb(port + 4);
a = inb(port + 1);
outb(a, port + 1);
outb(a & 0xfe, port + 1);
if (a & 0x01) {
DBG(DBG_SCAN, " EPP 1.9 with hardware direction protocol\n");
retv += PPA_PROBE_EPP19;
} else {
/* The EPP timeout bit was not set, this could either be:
* EPP 1.7
* EPP 1.9 with software direction
*/
outb(0x24, port + 2);
inb(port + 4);
a = inb(port + 1);
outb(a, port + 1);
outb(a & 0xfe, port + 1);
if (a & 0x01) {
DBG(DBG_SCAN, " EPP 1.9 with software direction protocol\n");
retv += PPA_PROBE_EPP19;
} else {
DBG(DBG_SCAN, " EPP 1.7\n");
retv += PPA_PROBE_EPP17;
}
}
outb(0x0c, port + 0x402);
outb(0x0c, port + 0x002);
#endif
return retv;
}
#ifdef __KERNEL__
/** will be called by the parport module when we already have access, but
* another module wants access to the port...
*/
@ -524,35 +325,25 @@ static int miscSetFastMode( pScanData ps )
return _OK;
}
#endif
/** check the state of the par-port and switch to EPP-mode if possible
*/
static int miscSetPortMode( pScanData ps )
{
#ifndef __KERNEL__
if (iopl(3)) {
DBG( DBG_HIGH, "Could not unlock IO ports. Are you superuser?\n" );
return _E_LOCK;
}
#endif
/*
* try to detect the port settings, SPP seems to work in any case !
*/
port_feature = initPortProbe( ps );
/* try to detect the port settings, SPP seems to work in any case ! */
port_feature = initPortProbe( ps );
#ifdef DEBUG
miscShowPortModes( port_feature );
#endif
switch( ps->IO.forceMode ) {
switch( ps->IO.forceMode ) {
case 1:
DBG( DBG_LOW, "Use of SPP-mode enforced\n" );
ps->IO.portMode = _PORT_SPP;
return _OK;
break;
case 1:
DBG( DBG_LOW, "Use of SPP-mode enforced\n" );
ps->IO.portMode = _PORT_SPP;
return _OK;
break;
case 2:
DBG( DBG_LOW, "Use of EPP-mode enforced\n" );
@ -564,7 +355,6 @@ static int miscSetPortMode( pScanData ps )
break;
}
#ifdef __KERNEL__
if( !(port_feature & PARPORT_MODE_PCEPP)) {
if( !(port_feature & PARPORT_MODE_PCSPP )) {
@ -575,32 +365,15 @@ static int miscSetPortMode( pScanData ps )
DBG(DBG_LOW, "Using SPP-mode\n" );
ps->IO.portMode = _PORT_SPP;
}
#else
if (!(port_feature & (PPA_PROBE_EPP17 | PPA_PROBE_EPP19))){
if( !(port_feature & PPA_PROBE_SPP )) {
DBG(DBG_HIGH,"\nThis Port supports not the SPP- or EPP-Mode\n");
DBG(DBG_HIGH,"Please activate SPP-Mode, EPP-Mode or\n"
"EPP + ECP-Mode!\n");
return _E_NOSUPP;
} else {
DBG(DBG_LOW, "Using SPP-mode\n" );
ps->IO.portMode = _PORT_SPP;
}
#endif
} else {
DBG(DBG_LOW, "Using EPP-mode\n" );
ps->IO.portMode = _PORT_EPP;
}
#ifdef __KERNEL__
/* else try to set to a faster mode than SPP */
return miscSetFastMode( ps );
#else
return _OK;
#endif
}
#endif
/** miscNextLongRand() -- generate 2**31-2 random numbers
**
@ -658,7 +431,6 @@ _LOC pScanData MiscAllocAndInitStruct( void )
}
DBG( DBG_HIGH, "ScanData = 0x%08lx\n", (ULong)ps );
return ps;
}
@ -686,7 +458,6 @@ _LOC int MiscReinitStruct( pScanData ps )
miscSeedLongRand((Long)ps);
DBG( DBG_HIGH, "Init settings done\n" );
return _OK;
}
@ -695,6 +466,7 @@ _LOC int MiscReinitStruct( pScanData ps )
*/
_LOC int MiscInitPorts( pScanData ps, int port )
{
#ifdef __KERNEL__
int status;
if( NULL == ps )
@ -720,6 +492,17 @@ _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
if( NULL == ps )
return _E_NULLPTR;
DBG(DBG_LOW, "Using EPP-mode\n" );
ps->IO.portMode = _PORT_EPP;
_VAR_NOT_USED( port );
#endif
return _OK;
}
@ -728,8 +511,10 @@ _LOC int MiscInitPorts( pScanData ps, int port )
*/
_LOC void MiscRestorePort( pScanData ps )
{
#ifdef __KERNEL__
if( 0 == ps->IO.pbSppDataPort )
return;
#endif
DBG(DBG_LOW,"MiscRestorePort()\n");
@ -750,7 +535,7 @@ _LOC void MiscRestorePort( pScanData ps )
}
#else
if (port_feature & PPA_PROBE_ECR ){
outb( ps->IO.lastPortMode, ps->IO.pbSppDataPort + 0x402);
_OUTB_ECTL(ps,ps->IO.lastPortMode);
}
#endif
}
@ -787,8 +572,9 @@ _LOC _INL int MiscCheckTimer( pTimerDef timer )
} else {
#ifdef __KERNEL__
schedule();
#else
sched_yield();
/*#else
sched_yield();
*/
#endif
return _OK;
}
@ -820,27 +606,8 @@ _LOC Bool MiscAllPointersSet( pScanData ps )
_LOC int MiscRegisterPort( pScanData ps, int portAddr )
{
#ifndef __KERNEL__
int i;
Bool found;
ULong pref[] = { 0x378, 0x278, 0x3bc, 0xFFFFFFFF };
DBG( DBG_LOW, "Requested port at 0x%02x\n", portAddr );
_VAR_NOT_USED( ps );
/*
* check the port address !!!!
*/
found = _FALSE;
for( i = 0; 0xFFFFFFFF != pref[i]; i++ ) {
if(((ULong)portAddr != 0xFFFFFFFF) && (pref[i] == (ULong)portAddr)) {
found = _TRUE;
break;
}
}
if( !found )
return _E_INVALID;
DBG( DBG_LOW, "Assigning port handle %i\n", portAddr );
ps->pardev = portAddr;
#else
struct parport *pp;
@ -858,7 +625,7 @@ _LOC int MiscRegisterPort( pScanData ps, int portAddr )
*/
for( ps->pp = NULL; NULL != pp; ) {
if( pp->base == portAddr ) {
if( pp->base == (unsigned long)portAddr ) {
DBG( DBG_LOW, "Requested port (0x%02x) found\n", portAddr );
DBG( DBG_LOW, "Port mode reported: (0x%04x)\n", pp->modes );
ps->pp = pp;
@ -900,12 +667,11 @@ _LOC void MiscUnregisterPort( pScanData ps )
parport_unregister_device( ps->pardev );
}
#else
_VAR_NOT_USED( ps );
sanei_pp_close( ps->pardev );
#endif
}
/*.............................................................................
* try to claim the port (KERNEL-Mode only)
/** try to claim the port (KERNEL-Mode only)
*/
_LOC int MiscClaimPort( pScanData ps )
{
@ -916,26 +682,29 @@ _LOC int MiscClaimPort( pScanData ps )
if( 0 != parport_claim( ps->pardev ))
return _E_BUSY;
}
#else
sanei_pp_claim( ps->pardev );
#endif
portIsClaimed[ps->devno]++;
return _OK;
}
/*.............................................................................
* release previously claimed port (KERNEL-Mode only)
/** release previously claimed port (KERNEL-Mode only)
*/
_LOC void MiscReleasePort( pScanData ps )
{
if( portIsClaimed[ps->devno] > 0 ) {
portIsClaimed[ps->devno]--;
#ifdef __KERNEL__
if( 0 == portIsClaimed[ps->devno] ) {
DBG( DBG_HIGH, "Releasing parport\n" );
#ifdef __KERNEL__
parport_release( ps->pardev );
}
#else
sanei_pp_release( ps->pardev );
#endif
}
}
}

Wyświetl plik

@ -1526,7 +1526,7 @@ static void motorP96FillHalfStepTable( pScanData ps )
#else
#if DEBUG
#ifdef DEBUG
if( 0 == wP96BaseDpi )
DBG( DBG_HIGH, "!!!! WARNING - motorP96FillHalfStepTable(), "
"wP96BaseDpi == 0 !!!!\n" );

Wyświetl plik

@ -843,7 +843,6 @@ static void p9636PutToIdleMode( pScanData ps )
DBG( DBG_IO, "CCD-Stop\n" );
for( i = 0; i < 12; i++ ) {
DBG(DBG_IO, "*[0x%02x] = 0x%02x\n",ccdStop[i].bReg, ccdStop[i].bParam);
@ -1058,7 +1057,7 @@ _LOC int P9636InitAsic( pScanData ps )
return _E_INTERNAL;
#endif
DBG( DBG_LOW, "0x%02x\n", ps->sCaps.AsicID );
DBG( DBG_LOW, "0x%02x\n", ps->sCaps.AsicID );
if( _FALSE == ps->OpenScanPath( ps )) {
DBG( DBG_LOW, "P9636InitAsic() failed.\n" );

Wyświetl plik

@ -226,10 +226,12 @@ _LOC void IORegisterDirectToScanner( pScanData, Byte bReg );
_LOC void IOSoftwareReset ( pScanData ps );
_LOC void IOReadScannerImageData ( pScanData ps, pUChar pBuf, ULong size );
#ifdef __KERNEL__
_LOC void IOOut ( Byte data, UShort port );
_LOC void IOOutDelayed( Byte data, UShort port );
_LOC Byte IOIn ( UShort port );
_LOC Byte IOInDelayed ( UShort port );
#endif
/*
* implementation in plustek-pp_tpa.c

Wyświetl plik

@ -113,35 +113,49 @@
/****************************** static vars **********************************/
static pScanData PtDrvDevices[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = NULL};
/* default port is at 0x378 */
static int port[_MAX_PTDEVS] = { 0x378, 0, 0, 0 };
#ifdef __KERNEL__
static pScanData PtDrvDevices[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = NULL};
/* default is 180 secs for lamp switch off */
static int lampoff[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 180 };
/* warmup period for lamp (30 secs) */
static int warmup[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 30 };
static int warmup[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 30 };
/* switch lamp off on unload (default = no)*/
static int lOffonEnd[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
/* model override (0-->none) */
static UShort mov[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
static UShort mov[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
/* forceMode (0--> auto, 1: SPP, 2:EPP, others: auto) */
static UShort forceMode[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
static UShort forceMode[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
/* to use delayed I/O for each device */
static Bool slowIO[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = _FALSE };
#else
static pScanData PtDrvDevices[_MAX_PTDEVS]= { NULL, NULL, NULL, NULL };
static int lampoff[_MAX_PTDEVS] = { 180, 180, 180, 180 };
static int warmup[_MAX_PTDEVS] = { 30, 30, 30, 30 };
static int lOffonEnd[_MAX_PTDEVS] = { 0, 0, 0, 0 };
static UShort mov[_MAX_PTDEVS] = { 0, 0, 0, 0 };
static UShort forceMode[_MAX_PTDEVS] = { 0, 0, 0, 0 };
#endif
/* timers for warmup checks */
static TimerDef toTimer[_MAX_PTDEVS];
#ifndef __KERNEL__
static Bool PtDrvInitialized = _FALSE;
#ifdef HAVE_SETITIMER
static struct itimerval saveSettings;
#endif
#else
static Bool deviceScanning = _FALSE;
@ -154,7 +168,7 @@ extern volatile ULong jiffies;
* the parameter interface
*/
#if ((LINUX_VERSION_CODE > 0x020111) && defined(MODULE))
MODULE_AUTHOR("Gerhard Jaeger");
MODULE_AUTHOR("Gerhard Jaeger <gerhard@gjaeger.de>");
MODULE_DESCRIPTION("Plustek parallelport-scanner driver");
/* addresses this 'new' license feature... */
@ -181,7 +195,8 @@ MODULE_PARM(slowIO,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
MODULE_PARM_DESC(slowIO, "0 = Fast I/O, 1 = Delayed I/O");
MODULE_PARM(forceMode,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
MODULE_PARM_DESC(forceMode, "0 = use auto detection, 1 = use SPP mode, 2 = use EPP mode");
MODULE_PARM_DESC(forceMode, "0 = use auto detection, "
"1 = use SPP mode, 2 = use EPP mode");
#endif
#ifdef CONFIG_DEVFS_FS
@ -251,8 +266,7 @@ static void ptdrvStartLampTimer( pScanData ps );
/****************************** local functions ******************************/
#ifdef __KERNEL__
/*.............................................................................
* depending on the device, return the data structure
/** depending on the device, return the data structure
*/
static pScanData get_pt_from_inode(struct inode *ip)
{
@ -272,8 +286,7 @@ static pScanData get_pt_from_inode(struct inode *ip)
}
#endif
/*.............................................................................
* copy user-space data into kernel memory
/** copy user-space data into kernel memory
*/
static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
{
@ -328,8 +341,7 @@ static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
return err;
}
/*.............................................................................
* copy kernel data into user mode address space
/** copy kernel data into user mode address space
*/
static int putUserPtr( const pVoid ptr, pVoid useraddr, UInt size )
{
@ -362,8 +374,7 @@ static void copy_to_user( pVoid dest, pVoid src, int len )
}
#endif
/*.............................................................................
*
/**
*/
static int putUserVal(const ULong value, pVoid useraddr, UInt size)
{
@ -409,8 +420,7 @@ static int putUserVal(const ULong value, pVoid useraddr, UInt size)
return 0;
}
/*.............................................................................
* switch lamp 0 on
/** switch lamp 0 on
*/
static void ptDrvSwitchLampOn( pScanData ps )
{
@ -431,8 +441,7 @@ static void ptDrvSwitchLampOn( pScanData ps )
IOCmdRegisterToScanner(ps, ps->RegScanControl, ps->AsicReg.RD_ScanControl);
}
/*.............................................................................
* check the lamp warmup
/** check the lamp warmup
*/
static void ptdrvLampWarmup( pScanData ps )
{
@ -488,8 +497,7 @@ static void ptdrvLampWarmup( pScanData ps )
MiscStartTimer( &toTimer[ps->devno], _SECOND );
}
/*.............................................................................
*
/**
*/
#ifdef __KERNEL__
static void ptdrvLampTimerIrq( ULong ptr )
@ -540,15 +548,16 @@ static void ptdrvLampTimerIrq( int sig_num )
MiscReleasePort(ps);
}
/*.............................................................................
*
/**
*/
static void ptdrvStartLampTimer( pScanData ps )
{
#ifndef __KERNEL__
sigset_t block, pause_mask;
struct sigaction s;
#ifdef HAVE_SETITIMER
struct itimerval interval;
#endif
/* block SIGALRM */
sigemptyset( &block );
@ -567,6 +576,7 @@ static void ptdrvStartLampTimer( pScanData ps )
sigprocmask( SIG_UNBLOCK, &block, &pause_mask );
#ifdef HAVE_SETITIMER
/*
* define a one-shot timer
*/
@ -577,6 +587,9 @@ static void ptdrvStartLampTimer( pScanData ps )
if( 0 != ps->lampoff )
setitimer( ITIMER_REAL, &interval, &saveSettings );
#else
alarm( ps->lampoff );
#endif
#else
init_timer( &tl[ps->devno] );
@ -592,8 +605,7 @@ static void ptdrvStartLampTimer( pScanData ps )
DBG( DBG_HIGH, "Lamp-Timer started!\n" );
}
/*.............................................................................
*
/**
*/
static void ptdrvStopLampTimer( pScanData ps )
{
@ -604,8 +616,13 @@ static void ptdrvStopLampTimer( pScanData ps )
sigemptyset( &block );
sigaddset ( &block, SIGALRM );
sigprocmask( SIG_BLOCK, &block, &pause_mask );
#ifdef HAVE_SETITIMER
if( 0 != ps->lampoff )
setitimer( ITIMER_REAL, &saveSettings, NULL );
#else
_VAR_NOT_USED( ps );
alarm(0);
#endif
#else
if( 0 != ps->lampoff )
del_timer( &tl[ps->devno] );
@ -614,8 +631,7 @@ static void ptdrvStopLampTimer( pScanData ps )
DBG( DBG_HIGH, "Lamp-Timer stopped!\n" );
}
/*.............................................................................
* claim and initialize the requested port
/** claim and initialize the requested port
*/
static int ptdrvOpen( pScanData ps, int portBase )
{
@ -636,8 +652,7 @@ static int ptdrvOpen( pScanData ps, int portBase )
return MiscInitPorts( ps, portBase );
}
/*.............................................................................
* free used memory (if necessary)
/** free used memory (if necessary)
* restore the parallel port settings and release the port
*/
static int ptdrvClose( pScanData ps )
@ -669,8 +684,7 @@ static int ptdrvClose( pScanData ps )
return _OK;
}
/*.............................................................................
* will be called during OPEN_DEVICE ioctl call
/** will be called during OPEN_DEVICE ioctl call
*/
static int ptdrvOpenDevice( pScanData ps )
{
@ -681,10 +695,10 @@ static int ptdrvOpenDevice( pScanData ps )
ULong devno;
#ifdef __KERNEL__
UShort flags;
UShort flags;
struct pardevice *pd;
struct parport *pp;
ProcDirDef procDir;
ProcDirDef procDir;
#endif
/*
@ -692,8 +706,8 @@ static int ptdrvOpenDevice( pScanData ps )
*/
#ifdef __KERNEL__
flags = ps->flags;
pd = ps->pardev;
pp = ps->pp;
pd = ps->pardev;
pp = ps->pp;
procDir = ps->procDir;
#endif
iobase = ps->sCaps.wIOBase;
@ -721,6 +735,7 @@ static int ptdrvOpenDevice( pScanData ps )
ps->IO.lastPortMode = lastMode;
ps->devno = devno;
#ifdef __KERNEL__
if( _TRUE == slowIO[devno] ) {
DBG( DBG_LOW, "Using slow I/O\n" );
ps->IO.slowIO = _TRUE;
@ -732,6 +747,7 @@ static int ptdrvOpenDevice( pScanData ps )
ps->IO.fnOut = IOOut;
ps->IO.fnIn = IOIn;
}
#endif
ps->ModelOverride = mov[devno];
ps->warmup = warmup[devno];
ps->lampoff = lampoff[devno];
@ -757,8 +773,8 @@ static int ptdrvOpenDevice( pScanData ps )
*/
static int ptdrvInit( int devno )
{
int retval;
pScanData ps;
int retval;
pScanData ps;
DBG( DBG_HIGH, "ptdrvInit(%u)\n", devno );
@ -773,6 +789,7 @@ static int ptdrvInit( int devno )
return _E_ALLOC;
}
#ifdef __KERNEL__
if( _TRUE == slowIO[devno] ) {
DBG( DBG_LOW, "Using slow I/O\n" );
ps->IO.slowIO = _TRUE;
@ -784,7 +801,7 @@ static int ptdrvInit( int devno )
ps->IO.fnOut = IOOut;
ps->IO.fnIn = IOIn;
}
#endif
ps->ModelOverride = mov[devno];
ps->warmup = warmup[devno];
ps->lampoff = lampoff[devno];
@ -820,12 +837,12 @@ static int ptdrvInit( int devno )
if( _OK == retval ) {
#ifdef __KERNEL__
_PRINT(
#else
DBG( DBG_LOW,
#endif
"pt_drv%u: %s found on port 0x%04x\n",
_PRINT( "pt_drv%u: %s found on port 0x%04x\n",
devno, MiscGetModelName(ps->sCaps.Model), ps->IO.pbSppDataPort );
#else
DBG( DBG_LOW, "pt_drv%u: %s found\n",
devno, MiscGetModelName(ps->sCaps.Model));
#endif
/*
* initialize the timespan timer
@ -1468,8 +1485,9 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
/* needed, esp. to avoid freezing the system in SPP mode */
#ifdef __KERNEL__
schedule();
#else
/*#else
sched_yield();
*/
#endif
}
@ -1811,20 +1829,27 @@ static int pt_drv_ioctl( struct inode *inode, struct file *file,
/*.............................................................................
* here we only have wrapper functions
*/
static int PtDrvInit( int portAddr, UShort model_override )
static int PtDrvInit( const char *dev_name, UShort model_override )
{
int fd;
int result = _OK;
if( _TRUE == PtDrvInitialized )
return _E_INIT;
return _OK;
port[0] = portAddr;
result = sanei_pp_open( dev_name, &fd );
if( SANE_STATUS_GOOD != result )
return result;
port[0] = fd;
mov[0] = model_override;
result = ptdrvInit( 0 );
if( _OK == result ) {
PtDrvInitialized = _TRUE;
} else {
ptdrvShutdown( PtDrvDevices[0] );
}
return result;

Wyświetl plik

@ -73,12 +73,13 @@
# include <string.h>
# include <stdio.h>
# include <unistd.h>
# include <sched.h>
/*# include <sched.h>*/
# include <sys/time.h>
# include <sys/signal.h>
# include <sys/ioctl.h>
# include <sys/io.h>
# ifdef HAVE_SYS_IO_H
# include <sys/io.h>
# endif
#else
# include <linux/version.h>
@ -106,12 +107,11 @@
# define _OPF ps->IO.fnOut
# define _IPF ps->IO.fnIn
#if 1
#ifdef __KERNEL__
#define _OUTB_CTRL(pSD,port_value) _OPF(port_value,pSD->IO.pbControlPort)
#define _OUTB_DATA(pSD,port_value) _OPF(port_value,pSD->IO.pbSppDataPort)
#define _OUTB_ECTL(pSD,port_value) _OPF(port_value,(pSD->IO.portBase+0x402))
#define _OUTB_STATUS(pSD,port_value) _OPF(port_value,pSD->IO.pbStatusPort)
#define _INB_CTRL(pSD) _IPF(pSD->IO.pbControlPort)
#define _INB_DATA(pSD) _IPF(pSD->IO.pbSppDataPort)
@ -121,23 +121,14 @@
#else
#define _OUTB_CTRL(pSD,port_value) parport_pc_write_control(pSD->pp, port_value)
#define _OUTB_DATA(pSD,port_value) parport_pc_write_data(pSD->pp, port_value)
#define _OUTB_STATUS(pSD,port_value) parport_pc_write_status(pSD->pp, port_value)
#define _OUTB_CTRL(pSD,port_value) sanei_pp_outb_ctrl(pSD->pardev, port_value)
#define _OUTB_DATA(pSD,port_value) sanei_pp_outb_data(pSD->pardev, port_value)
#define _OUTB_ECTL(pSD,port_value)
#define _INB_CTRL(pSD) parport_pc_read_control(pSD->pp)
#define _INB_DATA(pSD) parport_pc_read_data(pSD->pp)
#define _INB_STATUS(pSD) parport_pc_read_status(pSD->pp)
#ifdef LINUX_24
# define _OUTB_ECTL(pSD,port_value) outb_p(port_value,(pSD->IO.portBase+0x402))
# define _INB_EPPDATA(pSD) inb_p(pSD->IO.pbEppDataPort)
# define _INB_ECTL(pSD) inb_p((pSD->IO.portBase+0x402))
#else
# define _OUTB_ECTL(pSD,port_value) parport_pc_write_econtrol(pSD->pp, port_value)
# define _INB_EPPDATA(pSD) parport_pc_read_epp(pSD->pp)
# define _INB_ECTL(pSD) parport_pc_read_econtrol(pSD->pp)
#endif
#define _INB_CTRL(pSD) sanei_pp_inb_ctrl(pSD->pardev)
#define _INB_DATA(pSD) sanei_pp_inb_data(pSD->pardev)
#define _INB_EPPDATA(pSD) sanei_pp_inb_epp(pSD->pardev)
#define _INB_STATUS(pSD) sanei_pp_inb_stat(pSD->pardev)
#endif
@ -174,11 +165,11 @@ typedef long long TimerDef, *pTimerDef;
* timer topics
*/
#ifndef __KERNEL__
#define _DO_UDELAY(usecs) { int i; for( i = usecs; i--; ) outb(0x80,0); }
#define _DODELAY(msecs) { int i; for( i = msecs; i--; ) _DO_UDELAY(1000); }
# define _DO_UDELAY(usecs) { int i,j; for( i = usecs; i--; ) j+=i*3; }
# define _DODELAY(msecs) { int i; for( i = msecs; i--; ) usleep(1000); }
#else
#define _DO_UDELAY(usecs) udelay(usecs)
#define _DODELAY(msecs) mdelay(msecs)
# define _DO_UDELAY(usecs) udelay(usecs)
# define _DODELAY(msecs) mdelay(msecs)
#endif
/*.............................................................................

Wyświetl plik

@ -117,16 +117,16 @@ typedef struct _IMAGESIZE
typedef struct _IMAGEDEF
{
IMAGESIZE Image;
DWORD dwVxDFlag;
DWORD dwScanFlag;
CROPRECT Area;
XY Dpi;
WORD wDataType;
WORD wBrightness;
WORD wPhyDpiY;
WORD wResult;
WORD Reserved;
IMAGESIZE Image;
DWORD dwVxDFlag;
DWORD dwScanFlag;
CROPRECT Area;
XY Dpi;
WORD wDataType;
WORD wBrightness;
WORD wPhyDpiY;
WORD wResult;
WORD Reserved;
} IMAGEDEF, *PIMAGEDEF;
#endif
@ -182,6 +182,8 @@ typedef struct scandata
struct pardevice *pardev; /* for accessing parport... */
struct parport *pp;
ProcDirDef procDir;
#else
int pardev; /* parport handle in user-space */
#endif
/*

Wyświetl plik

@ -62,22 +62,11 @@
/******************* wrapper functions for parport device ********************/
/** stuff needed for user space stuff
*/
#if 0
int PtDrvInit ( int portAddr, unsigned short model_override );
int PtDrvShutdown( void );
int PtDrvOpen ( void );
int PtDrvClose ( void );
int PtDrvIoctl ( unsigned int cmd, void *arg );
int PtDrvRead ( unsigned char *buffer, int count );
#endif
#ifndef _BACKEND_ENABLED
static int PtDrvInit( int portAddr, unsigned short model_override )
static int PtDrvInit( char *dev_name, unsigned short model_override )
{
_VAR_NOT_USED( portAddr );
_VAR_NOT_USED( dev_name );
_VAR_NOT_USED( model_override );
DBG( _DBG_ERROR, "Backend does not support direct I/O!\n" );
return -1;
@ -131,11 +120,11 @@ static int ppDev_open( const char *dev_name, void *misc )
Plustek_Device *dev = (Plustek_Device *)misc;
if( dev->adj.direct_io ) {
/* convert device name to port-address... */
long portaddr = strtol( dev_name, 0, 0 );
PtDrvInit((int)portaddr, dev->adj.mov );
result = PtDrvInit( dev_name, dev->adj.mov );
if( 0 != result ) {
DBG( _DBG_ERROR, "open: PtDrvInit failed: %d\n", result );
return -1;
}
}
if( dev->adj.direct_io )
@ -144,7 +133,7 @@ static int ppDev_open( const char *dev_name, void *misc )
handle = open( dev_name, O_RDONLY );
if ( handle < 0 ) {
DBG(_DBG_ERROR, "open: can't open %s as a device\n", dev_name);
DBG( _DBG_ERROR, "open: can't open %s as a device\n", dev_name );
return handle;
}

Wyświetl plik

@ -62,11 +62,11 @@
*/
#ifdef _AIX
# include <lalloca.h> /* MUST come first for AIX! */
# include "../include/lalloca.h" /* MUST come first for AIX! */
#endif
#include "sane/config.h"
#include <lalloca.h>
#include "../include/sane/config.h"
#include "../include/lalloca.h"
#include <errno.h>
#include <fcntl.h>
@ -83,15 +83,16 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include "sane/sane.h"
#include "sane/sanei.h"
#include "sane/saneopts.h"
#include "../include/sane/sane.h"
#include "../include/sane/sanei.h"
#include "../include/sane/saneopts.h"
#define BACKEND_VERSION "0.01-2"
#define BACKEND_VERSION "0.01-3"
#define BACKEND_NAME plustek_pp
#include "sane/sanei_backend.h"
#include "sane/sanei_config.h"
#include "sane/sanei_thread.h"
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_config.h"
#include "../include/sane/sanei_thread.h"
#include "../include/sane/sanei_pp.h"
#ifdef HAVE_IOPERM
# define _BACKEND_ENABLED
@ -120,6 +121,9 @@
MODELSTR;
#ifdef _BACKEND_ENABLED
#ifndef NDEBUG
# define DEBUG
#endif
/* needed to statisfy the module code ... */
#define _PTDRV_V0 0