kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch '578-remove-linux-kernel-driver-for-plustek_pp-backend' into 'master'
Resolve "Remove Linux kernel driver for plustek_pp backend" Closes #578 See merge request sane-project/backends!708escl-add-user-and-password
commit
c1c77436f4
|
@ -235,11 +235,7 @@ typedef const struct mode_param
|
|||
#define _E_SEQUENCE (_FIRST_ERR-30) /* caller sequence does not match */
|
||||
#define _E_NO_ASIC (_FIRST_ERR-31) /* can't detect ASIC */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
# define _E_FAULT (-EFAULT)
|
||||
#else
|
||||
# define _E_FAULT (_E_INTERNAL) /* should never happen in userspace */
|
||||
#endif
|
||||
|
||||
#define _E_LAMP_NOT_IN_POS (_FIRST_ERR-40)
|
||||
#define _E_LAMP_NOT_STABLE (_FIRST_ERR-41)
|
||||
|
@ -471,10 +467,6 @@ typedef struct {
|
|||
#define _ScanMode_AverageOut 1 /* CCD averaged 2 pixels value for output*/
|
||||
#define _ScanMode_Mono 2 /* not color mode */
|
||||
|
||||
|
||||
#ifndef __KERNEL__
|
||||
|
||||
|
||||
#define PLUSTEK_CONFIG_FILE "plustek_pp.conf"
|
||||
|
||||
#ifndef PATH_MAX
|
||||
|
@ -631,7 +623,6 @@ typedef struct {
|
|||
AdjDef adj;
|
||||
|
||||
} CnfDef, *pCnfDef;
|
||||
#endif /* guard __KERNEL__ */
|
||||
|
||||
#endif /* guard __PLUSTEKPP_H__ */
|
||||
|
||||
|
|
|
@ -46,23 +46,12 @@
|
|||
/* uncomment this to have an SW-simulatet 98001 device - don't expect to scan*/
|
||||
/* #define _ASIC_98001_SIM */
|
||||
|
||||
/*
|
||||
* the print macros
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
# define _PRINT printk
|
||||
#endif
|
||||
|
||||
/*
|
||||
* some debug definitions
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
# ifndef __KERNEL__
|
||||
# include <assert.h>
|
||||
# define _ASSERT(x) assert(x)
|
||||
# else
|
||||
# define _ASSERT(x)
|
||||
# endif
|
||||
|
||||
# ifndef DBG
|
||||
# define DBG(level, msg, args...) if ((dbg_level) & (level)) { \
|
||||
|
|
|
@ -97,11 +97,6 @@ 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 );
|
||||
|
||||
/*
|
||||
|
@ -177,11 +172,7 @@ 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 {
|
||||
|
@ -209,11 +200,7 @@ static int detectSetupBuffers( pScanData ps )
|
|||
*/
|
||||
if ( 0 == ps->TotalBufferRequire ) {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv: asic 0x%x probably not supported\n", ps->sCaps.AsicID);
|
||||
|
||||
return _E_ALLOC; /* Out of memory */
|
||||
|
@ -228,11 +215,7 @@ static int detectSetupBuffers( pScanData ps )
|
|||
|
||||
if ( NULL == ps->driverbuf ) {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv: Not enough kernel memory %d\n",
|
||||
ps->TotalBufferRequire);
|
||||
return _E_ALLOC; /* Out of memory */
|
||||
|
@ -379,12 +362,8 @@ static int detectAsic98001( pScanData ps )
|
|||
return result;
|
||||
|
||||
return detectScannerConnection( ps );
|
||||
#else
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#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;
|
||||
|
@ -434,11 +413,7 @@ _LOC int DetectScanner( pScanData ps, int mode )
|
|||
|
||||
/* read Register 0x18 (AsicID Register) of Asic9800x based devices */
|
||||
#ifdef _ASIC_98001_SIM
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"!!!! WARNING, SW-Emulation active !!!!\n" );
|
||||
asic = _ASIC_IS_98001;
|
||||
#else
|
||||
|
|
|
@ -586,19 +586,6 @@ typedef struct
|
|||
* structure to hold IO port specific stuff
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
pFnOut fnOut;
|
||||
pFnIn fnIn;
|
||||
|
||||
UShort pbSppDataPort;
|
||||
UShort pbEppDataPort;
|
||||
|
||||
UShort pbStatusPort;
|
||||
UShort pbControlPort;
|
||||
UShort pbAddrOffsetPort;
|
||||
#endif
|
||||
|
||||
UShort portBase;
|
||||
UShort portMode;
|
||||
UShort lastPortMode;
|
||||
|
|
|
@ -1288,11 +1288,7 @@ static Bool imageP98003ReadOneImageLine( pScanData ps )
|
|||
|
||||
} while( !MiscCheckTimer( &timer ));
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"Timeout - Scanner malfunction !!\n" );
|
||||
MotorToHomePosition(ps);
|
||||
|
||||
|
|
|
@ -257,21 +257,11 @@ static Bool fnEPPRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
|||
|
||||
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++ )
|
||||
|
@ -290,18 +280,12 @@ static Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
|||
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 ) {
|
||||
|
||||
|
@ -341,13 +325,7 @@ static Bool fnBiDirRead( pScanData ps, pUChar pBuffer, ULong ulSize )
|
|||
|
||||
}
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
|
@ -953,45 +931,4 @@ _LOC void IOReadScannerImageData( pScanData ps, pUChar pBuf, ULong size )
|
|||
ps->OpenScanPath( ps );
|
||||
}
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/** the wrapper functions to support delayed and non-delayed I/O
|
||||
*/
|
||||
_LOC void IOOut( Byte data, UShort port )
|
||||
{
|
||||
DBG( DBG_IOF, "sanei_outb(0x%04x, 0x%02x)\n", port, data );
|
||||
sanei_outb( port, data );
|
||||
}
|
||||
|
||||
_LOC void IOOutDelayed( Byte data, UShort port )
|
||||
{
|
||||
DBG( DBG_IOF, "sanei_outb_p(0x%04x, 0x%02x)\n", port, data );
|
||||
sanei_outb_p( port, data );
|
||||
}
|
||||
|
||||
_LOC Byte IOIn( UShort port )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Byte data = sani_inb( port );
|
||||
|
||||
DBG( DBG_IOF, "sanei_inb(0x%04x) = 0x%02x\n", port, data );
|
||||
return data;
|
||||
#else
|
||||
return sanei_inb( port );
|
||||
#endif
|
||||
}
|
||||
|
||||
_LOC Byte IOInDelayed( UShort port )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Byte data = sanei_inb_p( port );
|
||||
|
||||
DBG( DBG_IOF, "sanei_inb_p(0x%04x) = 0x%02x\n", port, data );
|
||||
return data;
|
||||
#else
|
||||
return sanei_inb_p( port );
|
||||
#endif
|
||||
}
|
||||
#endif /* guard __KERNEL__ */
|
||||
|
||||
/* END PLUSTEK-PP_IO.C ......................................................*/
|
||||
|
|
|
@ -77,27 +77,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
|
||||
#else
|
||||
|
||||
/* the parport driver in Kernel 2.4 has changed. It does report the
|
||||
* possible modes in a different, more general way. As long, as
|
||||
* we do not use the parport-module change mode facility, I assume
|
||||
* the following correlations
|
||||
*/
|
||||
#if defined LINUX_24 || defined LINUX_26
|
||||
# define PARPORT_MODE_PCPS2 PARPORT_MODE_TRISTATE
|
||||
# define PARPORT_MODE_PCEPP PARPORT_MODE_EPP
|
||||
# define PARPORT_MODE_PCECPPS2 PARPORT_MODE_TRISTATE
|
||||
# define PARPORT_MODE_PCECPEPP PARPORT_MODE_EPP
|
||||
# define PARPORT_MODE_PCECR PARPORT_MODE_ECP
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define _PP_A 16807 /**< multiplier */
|
||||
#define _PP_M 2147483647L /**< 2**31 - 1 */
|
||||
|
@ -107,299 +91,10 @@
|
|||
static int port_feature = 0;
|
||||
static long randomnum = 1;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
static int portIsClaimed[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
|
||||
|
||||
MODELSTR; /**< a static char array (see plustek-pp.h) */
|
||||
|
||||
#else
|
||||
static int portIsClaimed[_MAX_PTDEVS] = { 0, 0, 0, 0 };
|
||||
#endif
|
||||
|
||||
/*************************** local functions *********************************/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifdef LINUX_26
|
||||
|
||||
static pScanData __ps = NULL;
|
||||
static int __pa = -1;
|
||||
|
||||
/** callback from parport driver
|
||||
*/
|
||||
static void misc_attach(struct parport *port)
|
||||
{
|
||||
DBG( DBG_LOW, "misc_attach\n" );
|
||||
|
||||
__ps->pp = NULL;
|
||||
if( port->base == (unsigned long)__pa ) {
|
||||
DBG( DBG_LOW, "Requested port (0x%02x) found\n", __pa );
|
||||
DBG( DBG_LOW, "Port mode reported: (0x%04x)\n", port->modes );
|
||||
__ps->pp = port;
|
||||
}
|
||||
}
|
||||
|
||||
static void misc_detach( struct parport *port )
|
||||
{
|
||||
DBG( DBG_LOW, "misc_detach\n" );
|
||||
}
|
||||
|
||||
static struct parport_driver pt_drv = {
|
||||
.name = "pt_drv",
|
||||
.attach = misc_attach,
|
||||
.detach = misc_detach,
|
||||
};
|
||||
#endif
|
||||
|
||||
/** display the available port-modes
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
static void miscShowPortModes( int modes )
|
||||
{
|
||||
DBG( DBG_LOW, "parport-modi:" );
|
||||
|
||||
if( modes & PARPORT_MODE_PCSPP )
|
||||
DBG( DBG_LOW, " SPP" );
|
||||
|
||||
if( modes & PARPORT_MODE_PCPS2 )
|
||||
DBG( DBG_LOW, " PS/2" );
|
||||
|
||||
if( modes & PARPORT_MODE_PCEPP )
|
||||
DBG( DBG_LOW, " EPP" );
|
||||
|
||||
if( modes & PARPORT_MODE_PCECR )
|
||||
DBG( DBG_LOW, " ECP" );
|
||||
|
||||
if( modes & PARPORT_MODE_PCECPEPP )
|
||||
DBG( DBG_LOW, " EPP(ECP)" );
|
||||
|
||||
if( modes & PARPORT_MODE_PCECPPS2 )
|
||||
DBG( DBG_LOW, " PS/2(ECP)" );
|
||||
|
||||
DBG( DBG_LOW, "\n" );
|
||||
}
|
||||
#endif
|
||||
|
||||
/** probe the parallel port
|
||||
*/
|
||||
static int initPortProbe( pScanData ps )
|
||||
{
|
||||
int retv = 0;
|
||||
|
||||
/* clear the controls */
|
||||
ps->IO.lastPortMode = 0xFFFF;
|
||||
|
||||
if( NULL != ps->pardev )
|
||||
retv = ps->pardev->port->modes;
|
||||
return retv;
|
||||
}
|
||||
|
||||
/** will be called by the parport module when we already have access, but
|
||||
* another module wants access to the port...
|
||||
*/
|
||||
static int miscPreemptionCallback( pVoid data )
|
||||
{
|
||||
pScanData ps = (pScanData)data;
|
||||
|
||||
if( NULL != ps ) {
|
||||
|
||||
/* never release during scanning */
|
||||
if( ps->DataInf.dwScanFlag & _SCANNER_SCANNING ) {
|
||||
DBG( DBG_LOW, "no way!!!\n" );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* let the port go...*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** depending on the reported possible port modes, we try to set a faster mode
|
||||
* than SPP
|
||||
*/
|
||||
static int miscSetFastMode( pScanData ps )
|
||||
{
|
||||
UChar a, b;
|
||||
|
||||
/*
|
||||
* when previously found the EPP mode, break right here
|
||||
*/
|
||||
if (( _PORT_EPP == ps->IO.portMode ) && (!(port_feature & PARPORT_MODE_PCECR)))
|
||||
return _OK;
|
||||
|
||||
/* CHECK REMOVE: from here we should have SPP (Paranoia Code !) */
|
||||
if (( _PORT_SPP != ps->IO.portMode ) && (!(port_feature & PARPORT_MODE_PCECR)))
|
||||
return _OK;
|
||||
|
||||
DBG(DBG_LOW, "Trying faster mode...\n" );
|
||||
|
||||
/*
|
||||
* ECP mode usually has sub-modes of EPP and/or PS2.
|
||||
* First we try to set EPP
|
||||
*/
|
||||
if((port_feature & PARPORT_MODE_PCECR) &&
|
||||
(port_feature & PARPORT_MODE_PCECPEPP)){
|
||||
|
||||
DBG(DBG_LOW, "Attempting to set EPP from ECP mode.\n" );
|
||||
|
||||
a = _INB_ECTL(ps); /* get current ECR */
|
||||
ps->IO.lastPortMode = a; /* save it for restoring later */
|
||||
a = (a & 0x1F) | 0x80; /* set to EPP */
|
||||
_OUTB_ECTL(ps, a); /* write it back */
|
||||
_DO_UDELAY(1);
|
||||
|
||||
/*
|
||||
* It is probably unnecessary to
|
||||
* do this check but it makes me feel better
|
||||
*/
|
||||
b = _INB_ECTL(ps); /* check to see if port set */
|
||||
if( a == b ) {
|
||||
DBG( DBG_LOW, "Port is set to (ECP) EPP mode.\n" );
|
||||
ps->IO.portMode = _PORT_EPP;
|
||||
return _OK;
|
||||
|
||||
} else {
|
||||
DBG( DBG_LOW, "Port could not be set to (ECP) EPP mode. "
|
||||
"Using SPP mode.\n" );
|
||||
_OUTB_ECTL(ps,(Byte)ps->IO.lastPortMode); /* restore */
|
||||
_DO_UDELAY(1);
|
||||
ps->IO.portMode = _PORT_SPP;
|
||||
|
||||
/* go ahead and try with other settings...*/
|
||||
}
|
||||
}
|
||||
|
||||
/* If port cannot be set to EPP, try PS2 */
|
||||
if((port_feature & PARPORT_MODE_PCECR) &&
|
||||
(port_feature & PARPORT_MODE_PCECPPS2)) {
|
||||
|
||||
DBG(DBG_LOW, "Attempting to set PS2 from ECPPS2 mode.\n" );
|
||||
|
||||
a = _INB_ECTL(ps); /* get current ECR */
|
||||
ps->IO.lastPortMode = a; /* save it for restoring later */
|
||||
|
||||
/* set to Fast Centronics/bi-directional/PS2 */
|
||||
a = (a & 0x1F) | 0x20;
|
||||
_OUTB_ECTL(ps,a); /* write it back */
|
||||
_DO_UDELAY(1);
|
||||
|
||||
/*
|
||||
* It is probably unnecessary to do this check
|
||||
* but it makes me feel better
|
||||
*/
|
||||
b = _INB_ECTL(ps); /* check to see if port set */
|
||||
if (a == b) {
|
||||
DBG(DBG_LOW, "Port is set to (ECP) PS2 bidirectional mode.\n");
|
||||
ps->IO.portMode = _PORT_BIDI;
|
||||
return _OK;
|
||||
} else {
|
||||
DBG(DBG_LOW, "Port could not be set to (ECP) PS2 mode. "
|
||||
"Using SPP mode.\n");
|
||||
a = ps->IO.lastPortMode & 0x1F;
|
||||
_OUTB_ECTL(ps, a); /* set ECP ctrl to SPP */
|
||||
_DO_UDELAY(1);
|
||||
ps->IO.portMode = _PORT_SPP;
|
||||
|
||||
/* next mode, last attempt... */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Some BIOS/cards have only a Bi-directional/PS2 mode (no EPP).
|
||||
* Make one last attempt to set to PS2 mode.
|
||||
*/
|
||||
if ( port_feature & PARPORT_MODE_PCPS2 ){
|
||||
|
||||
DBG(DBG_LOW, "Attempting to set PS2 mode.\n" );
|
||||
|
||||
a = _INB_CTRL(ps); /* get current setting of control register*/
|
||||
ps->IO.lastPortMode = a; /* save it for restoring later */
|
||||
a = a | 0x20; /* set bit 5 of control reg */
|
||||
_OUTB_CTRL(ps,a); /* set to Fast Centronics/bi-directional/PS2 */
|
||||
_DO_UDELAY(1);
|
||||
a = 0;
|
||||
|
||||
_OUTB_DATA(ps,0x55);
|
||||
_DO_UDELAY(1);
|
||||
if ((sanei_inb(ps->IO.portBase)) != 0x55) /* read data */
|
||||
a++;
|
||||
|
||||
_OUTB_DATA(ps,0xAA);
|
||||
_DO_UDELAY(1);
|
||||
|
||||
if (_INB_DATA(ps) != 0xAA) /* read data */
|
||||
a++;
|
||||
|
||||
if( 2 == a ) {
|
||||
DBG(DBG_LOW, "Port is set to PS2 bidirectional mode.\n");
|
||||
ps->IO.portMode = _PORT_BIDI;
|
||||
return _OK;
|
||||
|
||||
} else {
|
||||
DBG(DBG_LOW, "Port could not be set to PS2 mode. "
|
||||
"Using SPP mode.\n");
|
||||
_OUTB_CTRL(ps,(Byte)ps->IO.lastPortMode); /* restore */
|
||||
_DO_UDELAY(1);
|
||||
ps->IO.portMode = _PORT_SPP;
|
||||
}
|
||||
}
|
||||
|
||||
/* reaching this point, we're back in SPP mode and there's no need
|
||||
* to restore at shutdown...
|
||||
*/
|
||||
ps->IO.lastPortMode = 0xFFFF;
|
||||
|
||||
return _OK;
|
||||
}
|
||||
|
||||
/** check the state of the par-port and switch to EPP-mode if possible
|
||||
*/
|
||||
static int miscSetPortMode( pScanData 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 ) {
|
||||
|
||||
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" );
|
||||
ps->IO.portMode = _PORT_EPP;
|
||||
return _OK;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if( !(port_feature & PARPORT_MODE_PCEPP)) {
|
||||
|
||||
if( !(port_feature & PARPORT_MODE_PCSPP )) {
|
||||
_PRINT("\nThis Port supports not the SPP- or EPP-Mode\n" );
|
||||
_PRINT("Please activate SPP-Mode, EPP-Mode or\nEPP + ECP-Mode!\n");
|
||||
return _E_NOSUPP;
|
||||
} else {
|
||||
DBG(DBG_LOW, "Using SPP-mode\n" );
|
||||
ps->IO.portMode = _PORT_SPP;
|
||||
}
|
||||
} else {
|
||||
DBG(DBG_LOW, "Using EPP-mode\n" );
|
||||
ps->IO.portMode = _PORT_EPP;
|
||||
}
|
||||
|
||||
/* else try to set to a faster mode than SPP */
|
||||
return miscSetFastMode( ps );
|
||||
}
|
||||
#endif
|
||||
|
||||
/** miscNextLongRand() -- generate 2**31-2 random numbers
|
||||
**
|
||||
** public domain by Ray Gardner
|
||||
|
@ -488,34 +183,6 @@ _LOC int MiscReinitStruct( pScanData ps )
|
|||
*/
|
||||
_LOC int MiscInitPorts( pScanData ps, int port )
|
||||
{
|
||||
#ifdef __KERNEL__
|
||||
int status;
|
||||
|
||||
if( NULL == ps )
|
||||
return _E_NULLPTR;
|
||||
|
||||
/*
|
||||
* Get access to the ports
|
||||
*/
|
||||
ps->IO.portBase = (UShort)port;
|
||||
|
||||
status = miscSetPortMode(ps);
|
||||
|
||||
if( _OK != status ) {
|
||||
ps->sCaps.wIOBase = _NO_BASE;
|
||||
ps->IO.portBase = _NO_BASE;
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* the port settings
|
||||
*/
|
||||
ps->IO.pbSppDataPort = (UShort)port;
|
||||
ps->IO.pbStatusPort = (UShort)port+1;
|
||||
ps->IO.pbControlPort = (UShort)port+2;
|
||||
ps->IO.pbEppDataPort = (UShort)port+4;
|
||||
|
||||
#else
|
||||
int mode, mts;
|
||||
|
||||
if( NULL == ps )
|
||||
|
@ -560,7 +227,6 @@ _LOC int MiscInitPorts( pScanData ps, int port )
|
|||
|
||||
sanei_pp_setmode( ps->pardev, mts );
|
||||
_VAR_NOT_USED( port );
|
||||
#endif
|
||||
return _OK;
|
||||
}
|
||||
|
||||
|
@ -568,11 +234,6 @@ _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");
|
||||
|
||||
/* don't restore if not necessary */
|
||||
|
@ -582,19 +243,9 @@ _LOC void MiscRestorePort( pScanData ps )
|
|||
}
|
||||
|
||||
/*Restore Port-Mode*/
|
||||
#ifdef __KERNEL__
|
||||
if( port_feature & PARPORT_MODE_PCECR ){
|
||||
_OUTB_ECTL( ps, (Byte)ps->IO.lastPortMode );
|
||||
_DO_UDELAY(1);
|
||||
} else {
|
||||
_OUTB_CTRL( ps, (Byte)ps->IO.lastPortMode );
|
||||
_DO_UDELAY(1);
|
||||
}
|
||||
#else
|
||||
if( port_feature & PPA_PROBE_ECR ){
|
||||
_OUTB_ECTL(ps,ps->IO.lastPortMode);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Initializes a timer.
|
||||
|
@ -605,11 +256,7 @@ _LOC void MiscStartTimer( TimerDef *timer , unsigned long us)
|
|||
{
|
||||
struct timeval start_time;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_GET_TIME( &start_time );
|
||||
#else
|
||||
gettimeofday(&start_time, NULL);
|
||||
#endif
|
||||
|
||||
*timer = (TimerDef)start_time.tv_sec * 1000000 + (TimerDef)start_time.tv_usec + us;
|
||||
}
|
||||
|
@ -624,21 +271,14 @@ _LOC int MiscCheckTimer( TimerDef *timer )
|
|||
{
|
||||
struct timeval current_time;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_GET_TIME( ¤t_time );
|
||||
#else
|
||||
gettimeofday(¤t_time, NULL);
|
||||
#endif
|
||||
|
||||
if ((TimerDef)current_time.tv_sec * 1000000 + (TimerDef)current_time.tv_usec > *timer) {
|
||||
return _E_TIMEOUT;
|
||||
} else {
|
||||
#ifdef __KERNEL__
|
||||
schedule();
|
||||
/*#else
|
||||
sched_yield();
|
||||
*/
|
||||
#endif
|
||||
return _OK;
|
||||
}
|
||||
}
|
||||
|
@ -673,65 +313,8 @@ _LOC Bool MiscAllPointersSet( pScanData ps )
|
|||
*/
|
||||
_LOC int MiscRegisterPort( pScanData ps, int portAddr )
|
||||
{
|
||||
#ifndef __KERNEL__
|
||||
DBG( DBG_LOW, "Assigning port handle %i\n", portAddr );
|
||||
ps->pardev = portAddr;
|
||||
#else
|
||||
|
||||
#ifdef LINUX_26
|
||||
__ps = ps;
|
||||
__pa = portAddr;
|
||||
|
||||
DBG( DBG_LOW, "Requested port at 0x%02x\n", portAddr );
|
||||
|
||||
if( parport_register_driver(&pt_drv)) {
|
||||
/* Failed; nothing we can do. */
|
||||
return _E_REGISTER;
|
||||
}
|
||||
|
||||
#else
|
||||
struct parport *pp = NULL;
|
||||
|
||||
DBG( DBG_LOW, "Requested port at 0x%02x\n", portAddr );
|
||||
|
||||
pp = parport_enumerate();
|
||||
ps->pardev = NULL;
|
||||
|
||||
if( NULL == pp ) {
|
||||
return _E_PORTSEARCH;
|
||||
}
|
||||
|
||||
/* go through the list
|
||||
*/
|
||||
for( ps->pp = NULL; NULL != pp; ) {
|
||||
|
||||
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;
|
||||
break;
|
||||
}
|
||||
pp = pp->next;
|
||||
}
|
||||
#endif
|
||||
|
||||
if( NULL == ps->pp ) {
|
||||
printk("PORT not found!!!\n");
|
||||
return _E_NO_PORT;
|
||||
}
|
||||
|
||||
/*
|
||||
* register this device
|
||||
*/
|
||||
ps->pardev = parport_register_device( ps->pp, "Plustek Driver",
|
||||
miscPreemptionCallback, NULL, NULL, 0, (pVoid)ps );
|
||||
|
||||
if( NULL == ps->pardev ) {
|
||||
return _E_REGISTER;
|
||||
}
|
||||
|
||||
DBG( DBG_LOW, "Port for device %u registered\n", ps->devno );
|
||||
#endif
|
||||
|
||||
portIsClaimed[ps->devno] = 0;
|
||||
return _OK;
|
||||
|
@ -741,17 +324,7 @@ _LOC int MiscRegisterPort( pScanData ps, int portAddr )
|
|||
*/
|
||||
_LOC void MiscUnregisterPort( pScanData ps )
|
||||
{
|
||||
#ifdef __KERNEL__
|
||||
if( NULL != ps->pardev ) {
|
||||
DBG( DBG_LOW, "Port unregistered\n" );
|
||||
parport_unregister_device( ps->pardev );
|
||||
}
|
||||
#ifdef LINUX_26
|
||||
parport_unregister_driver( &pt_drv );
|
||||
#endif
|
||||
#else
|
||||
sanei_pp_close( ps->pardev );
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Try to claim the port
|
||||
|
@ -763,11 +336,7 @@ _LOC int MiscClaimPort( pScanData ps )
|
|||
if( 0 == portIsClaimed[ps->devno] ) {
|
||||
|
||||
DBG( DBG_HIGH, "Try to claim the parport\n" );
|
||||
#ifdef __KERNEL__
|
||||
if( 0 != parport_claim( ps->pardev )) {
|
||||
#else
|
||||
if( SANE_STATUS_GOOD != sanei_pp_claim( ps->pardev )) {
|
||||
#endif
|
||||
return _E_BUSY;
|
||||
}
|
||||
}
|
||||
|
@ -785,11 +354,7 @@ _LOC void MiscReleasePort( pScanData ps )
|
|||
|
||||
if( 0 == portIsClaimed[ps->devno] ) {
|
||||
DBG( DBG_HIGH, "Releasing parport\n" );
|
||||
#ifdef __KERNEL__
|
||||
parport_release( ps->pardev );
|
||||
#else
|
||||
sanei_pp_release( ps->pardev );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -219,13 +219,6 @@ _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
|
||||
*/
|
||||
|
@ -238,16 +231,6 @@ _LOC void TPAP98003Reshading ( pScanData ps );
|
|||
*/
|
||||
_LOC void ScaleX( pScanData ps, pUChar inBuf, pUChar outBuf );
|
||||
|
||||
/*
|
||||
* implementation in plustek-pp_procfs.c (Kernel-mode only)
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
int ProcFsInitialize ( void );
|
||||
void ProcFsShutdown ( void );
|
||||
void ProcFsRegisterDevice ( pScanData ps );
|
||||
void ProcFsUnregisterDevice( pScanData ps );
|
||||
#endif
|
||||
|
||||
#endif /* guard __PROCS_H__ */
|
||||
|
||||
/* END PLUSTEK-PP_PROCS.H ...................................................*/
|
||||
|
|
|
@ -94,52 +94,13 @@
|
|||
* If you do not wish that, delete this exception notice.
|
||||
* <hr>
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
# include <linux/module.h>
|
||||
# include <linux/version.h>
|
||||
|
||||
# ifdef CONFIG_DEVFS_FS
|
||||
# include <linux/devfs_fs_kernel.h>
|
||||
# if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,69))
|
||||
# define DEVFS_26_STYLE
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "plustek-pp_scan.h"
|
||||
|
||||
#ifdef __KERNEL__
|
||||
# include <linux/param.h>
|
||||
#endif
|
||||
|
||||
/****************************** static vars **********************************/
|
||||
|
||||
/* 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 };
|
||||
|
||||
/* 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 };
|
||||
|
||||
/* forceMode (0--> auto, 1: SPP, 2:EPP, others: auto) */
|
||||
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 };
|
||||
|
@ -147,140 +108,14 @@ 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;
|
||||
|
||||
static struct timer_list tl[_MAX_PTDEVS];
|
||||
|
||||
/* for calculation of the timer expiration */
|
||||
extern volatile unsigned long jiffies;
|
||||
|
||||
/* the parameter interface
|
||||
*/
|
||||
#if ((LINUX_VERSION_CODE > 0x020111) && defined(MODULE))
|
||||
MODULE_AUTHOR("Gerhard Jaeger <gerhard@gjaeger.de>");
|
||||
MODULE_DESCRIPTION("Plustek parallelport-scanner driver");
|
||||
|
||||
/* addresses this 'new' license feature... */
|
||||
#ifdef MODULE_LICENSE
|
||||
MODULE_LICENSE("GPL");
|
||||
#endif
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13))
|
||||
MODULE_PARM(port, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
MODULE_PARM(lampoff, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
MODULE_PARM(warmup,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
MODULE_PARM(lOffonEnd, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
MODULE_PARM(mov, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
MODULE_PARM(slowIO,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
MODULE_PARM(forceMode,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
|
||||
|
||||
#else
|
||||
|
||||
static int array_len = _MAX_PTDEVS;
|
||||
|
||||
module_param_array(port, int, &array_len, 0);
|
||||
module_param_array(lampoff, int, &array_len, 0);
|
||||
module_param_array(warmup, int, &array_len, 0);
|
||||
module_param_array(lOffonEnd, int, &array_len, 0);
|
||||
module_param_array(mov, ushort, &array_len, 0);
|
||||
module_param_array(slowIO, int, &array_len, 0);
|
||||
module_param_array(forceMode, ushort, &array_len, 0);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
MODULE_PARM_DESC(port, "I/O base address of parport");
|
||||
MODULE_PARM_DESC(lampoff, "Lamp-Off timer preset in seconds");
|
||||
MODULE_PARM_DESC(warmup, "Minimum warmup time in seconds");
|
||||
MODULE_PARM_DESC(lOffonEnd, "1 - switchoff lamp on unload");
|
||||
MODULE_PARM_DESC(mov, "Modell-override switch");
|
||||
MODULE_PARM_DESC(slowIO, "0 = Fast I/O, 1 = Delayed I/O");
|
||||
MODULE_PARM_DESC(forceMode, "0 = use auto detection, "
|
||||
"1 = use SPP mode, 2 = use EPP mode");
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_DEVFS_FS)
|
||||
# ifndef (DEVFS_26_STYLE)
|
||||
static devfs_handle_t devfs_handle = NULL;
|
||||
# endif
|
||||
#else
|
||||
# ifdef LINUX_26
|
||||
static class_t *ptdrv_class;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* the module interface
|
||||
*/
|
||||
static int pt_drv_open ( struct inode *, struct file *);
|
||||
static CLOSETYPE pt_drv_close( struct inode *, struct file *);
|
||||
|
||||
#ifdef LINUX_20
|
||||
static int pt_drv_read( struct inode*, struct file*, char*, int );
|
||||
static int pt_drv_write( struct inode*, struct file*, const char*, int );
|
||||
#else
|
||||
static ssize_t pt_drv_read ( struct file *file,
|
||||
char *buffer, size_t count, loff_t *);
|
||||
static ssize_t pt_drv_write( struct file *file,
|
||||
const char *buffer, size_t tmp,loff_t *count);
|
||||
#endif
|
||||
|
||||
#ifdef NOLOCK_IOCTL
|
||||
static long pt_drv_ioctl( struct file *, UInt, unsigned long );
|
||||
#else
|
||||
static int pt_drv_ioctl( struct inode *, struct file *, UInt, unsigned long );
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* the driver interface
|
||||
*/
|
||||
#ifdef LINUX_20
|
||||
|
||||
static struct file_operations pt_drv_fops =
|
||||
{
|
||||
NULL, /* seek */
|
||||
pt_drv_read, /* read */
|
||||
pt_drv_write, /* write */
|
||||
NULL, /* readdir */
|
||||
NULL, /* select */
|
||||
pt_drv_ioctl, /* ioctl */
|
||||
NULL, /* mmap */
|
||||
pt_drv_open, /* open */
|
||||
pt_drv_close, /* release */
|
||||
NULL, /* fsync */
|
||||
NULL, /* fasync */
|
||||
NULL, /* check_media_change */
|
||||
NULL /* revalidate */
|
||||
};
|
||||
|
||||
#else /* 2.2.x and higher stuff */
|
||||
|
||||
static struct file_operations pt_drv_fops = {
|
||||
#ifdef LINUX_24
|
||||
owner: THIS_MODULE,
|
||||
#endif
|
||||
read: pt_drv_read,
|
||||
write: pt_drv_write,
|
||||
IOCTL: pt_drv_ioctl,
|
||||
open: pt_drv_open,
|
||||
release: pt_drv_close,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* guard __KERNEL */
|
||||
|
||||
/****************************** some prototypes ******************************/
|
||||
|
||||
|
@ -288,23 +123,6 @@ static void ptdrvStartLampTimer( pScanData ps );
|
|||
|
||||
/****************************** local functions ******************************/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/** depending on the device, return the data structure
|
||||
*/
|
||||
static pScanData get_pt_from_inode(struct inode *ip)
|
||||
{
|
||||
int minor = _MINOR(ip);
|
||||
|
||||
/*
|
||||
* unit out of range
|
||||
*/
|
||||
if (minor >= _MAX_PTDEVS )
|
||||
return NULL;
|
||||
|
||||
return( PtDrvDevices[minor] );
|
||||
}
|
||||
#endif
|
||||
|
||||
/** copy user-space data into kernel memory
|
||||
*/
|
||||
static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
|
||||
|
@ -315,32 +133,9 @@ static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
|
|||
if((NULL == useraddr) || ( 0 == size))
|
||||
return _E_INVALID;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
if ((err = verify_area_20(VERIFY_READ, useraddr, size)))
|
||||
return err;
|
||||
#endif
|
||||
|
||||
switch (size) {
|
||||
#ifdef __KERNEL__
|
||||
case sizeof(u_char):
|
||||
GET_USER_RET(*(u_char *)where, (u_char *) useraddr, -EFAULT);
|
||||
break;
|
||||
|
||||
case sizeof(u_short):
|
||||
GET_USER_RET(*(u_short *)where, (u_short *) useraddr, -EFAULT);
|
||||
break;
|
||||
|
||||
case sizeof(u_long):
|
||||
GET_USER_RET(*(u_long *)where, (u_long *) useraddr, -EFAULT);
|
||||
break;
|
||||
|
||||
default:
|
||||
if (copy_from_user(where, useraddr, size))
|
||||
return -EFAULT;
|
||||
#else
|
||||
default:
|
||||
memcpy( where, useraddr, size );
|
||||
#endif
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
@ -354,20 +149,11 @@ static int putUserPtr( const pVoid ptr, pVoid useraddr, UInt size )
|
|||
if (NULL == useraddr)
|
||||
return _E_INVALID;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
if ((err = verify_area_20(VERIFY_WRITE, useraddr, size)))
|
||||
return err;
|
||||
|
||||
if (copy_to_user(useraddr, ptr, size ))
|
||||
return -EFAULT;
|
||||
#else
|
||||
memcpy( useraddr, ptr, size );
|
||||
#endif
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifndef __KERNEL__
|
||||
static unsigned long copy_from_user( pVoid dest, pVoid src, unsigned long len )
|
||||
{
|
||||
memcpy( dest, src, len );
|
||||
|
@ -379,37 +165,16 @@ static unsigned long copy_to_user( pVoid dest, pVoid src, unsigned long len )
|
|||
memcpy( dest, src, len );
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
*/
|
||||
static int putUserVal(const ULong value, pVoid useraddr, UInt size)
|
||||
{
|
||||
#ifdef __KERNEL__
|
||||
int err;
|
||||
#endif
|
||||
|
||||
if (NULL == useraddr)
|
||||
return _E_INVALID;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
if ((err = verify_area_20(VERIFY_WRITE, useraddr, size)))
|
||||
return err;
|
||||
#endif
|
||||
|
||||
switch (size) {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
case sizeof(u_char):
|
||||
PUT_USER_RET((u_char)value, (u_char *) useraddr, -EFAULT);
|
||||
break;
|
||||
case sizeof(u_short):
|
||||
PUT_USER_RET((u_short)value, (u_short *) useraddr, -EFAULT);
|
||||
break;
|
||||
case sizeof(u_long):
|
||||
PUT_USER_RET((u_long)value, (u_long *) useraddr, -EFAULT);
|
||||
break;
|
||||
#else
|
||||
case sizeof(UChar):
|
||||
*(pUChar)useraddr = (UChar)value;
|
||||
break;
|
||||
|
@ -420,7 +185,6 @@ static int putUserVal(const ULong value, pVoid useraddr, UInt size)
|
|||
*(pULong)useraddr = (ULong)value;
|
||||
break;
|
||||
|
||||
#endif
|
||||
default:
|
||||
return _E_INVALID;
|
||||
}
|
||||
|
@ -506,22 +270,14 @@ static void ptdrvLampWarmup( pScanData ps )
|
|||
|
||||
/**
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
static void ptdrvLampTimerIrq( unsigned long ptr )
|
||||
#else
|
||||
static void ptdrvLampTimerIrq( int sig_num )
|
||||
#endif
|
||||
{
|
||||
pScanData ps;
|
||||
|
||||
DBG( DBG_HIGH, "!! IRQ !! Lamp-Timer stopped.\n" );
|
||||
|
||||
#ifdef __KERNEL__
|
||||
ps = (pScanData)ptr;
|
||||
#else
|
||||
_VAR_NOT_USED( sig_num );
|
||||
ps = PtDrvDevices[0];
|
||||
#endif
|
||||
|
||||
/*
|
||||
* paranoia check!
|
||||
|
@ -559,7 +315,6 @@ static void ptdrvLampTimerIrq( int sig_num )
|
|||
*/
|
||||
static void ptdrvStartLampTimer( pScanData ps )
|
||||
{
|
||||
#ifndef __KERNEL__
|
||||
sigset_t block, pause_mask;
|
||||
struct sigaction s;
|
||||
#ifdef HAVE_SETITIMER
|
||||
|
@ -597,17 +352,6 @@ static void ptdrvStartLampTimer( pScanData ps )
|
|||
#else
|
||||
alarm( ps->lampoff );
|
||||
#endif
|
||||
#else
|
||||
init_timer( &tl[ps->devno] );
|
||||
|
||||
/* timeout val in seconds */
|
||||
tl[ps->devno].expires = jiffies + ps->lampoff * HZ;
|
||||
tl[ps->devno].data = (unsigned long)ps;
|
||||
tl[ps->devno].function = ptdrvLampTimerIrq;
|
||||
|
||||
if( 0 != ps->lampoff )
|
||||
add_timer( &tl[ps->devno] );
|
||||
#endif
|
||||
|
||||
DBG( DBG_HIGH, "Lamp-Timer started!\n" );
|
||||
}
|
||||
|
@ -616,7 +360,6 @@ static void ptdrvStartLampTimer( pScanData ps )
|
|||
*/
|
||||
static void ptdrvStopLampTimer( pScanData ps )
|
||||
{
|
||||
#ifndef __KERNEL__
|
||||
sigset_t block, pause_mask;
|
||||
|
||||
/* block SIGALRM */
|
||||
|
@ -630,10 +373,6 @@ static void ptdrvStopLampTimer( pScanData ps )
|
|||
_VAR_NOT_USED( ps );
|
||||
alarm(0);
|
||||
#endif
|
||||
#else
|
||||
if( 0 != ps->lampoff )
|
||||
del_timer( &tl[ps->devno] );
|
||||
#endif
|
||||
|
||||
DBG( DBG_HIGH, "Lamp-Timer stopped!\n" );
|
||||
}
|
||||
|
@ -701,23 +440,11 @@ static int ptdrvOpenDevice( pScanData ps )
|
|||
UShort lastMode;
|
||||
ULong devno;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
UShort flags;
|
||||
struct pardevice *pd;
|
||||
struct parport *pp;
|
||||
ProcDirDef procDir;
|
||||
#else
|
||||
int pd;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* push some values from the struct
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
flags = ps->flags;
|
||||
pp = ps->pp;
|
||||
procDir = ps->procDir;
|
||||
#endif
|
||||
pd = ps->pardev;
|
||||
iobase = ps->sCaps.wIOBase;
|
||||
asic = ps->sCaps.AsicID;
|
||||
|
@ -734,29 +461,10 @@ static int ptdrvOpenDevice( pScanData ps )
|
|||
/*
|
||||
* pop the val(s)
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
ps->flags = flags;
|
||||
ps->pp = pp;
|
||||
ps->procDir = procDir;
|
||||
#endif
|
||||
ps->pardev = pd;
|
||||
ps->bLastLampStatus = lastStat;
|
||||
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;
|
||||
ps->IO.fnOut = IOOutDelayed;
|
||||
ps->IO.fnIn = IOInDelayed;
|
||||
} else {
|
||||
DBG( DBG_LOW, "Using fast I/O\n" );
|
||||
ps->IO.slowIO = _FALSE;
|
||||
ps->IO.fnOut = IOOut;
|
||||
ps->IO.fnIn = IOIn;
|
||||
}
|
||||
#endif
|
||||
ps->ModelOverride = mov[devno];
|
||||
ps->warmup = warmup[devno];
|
||||
ps->lampoff = lampoff[devno];
|
||||
|
@ -798,19 +506,6 @@ 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;
|
||||
ps->IO.fnOut = IOOutDelayed;
|
||||
ps->IO.fnIn = IOInDelayed;
|
||||
} else {
|
||||
DBG( DBG_LOW, "Using fast I/O\n" );
|
||||
ps->IO.slowIO = _FALSE;
|
||||
ps->IO.fnOut = IOOut;
|
||||
ps->IO.fnIn = IOIn;
|
||||
}
|
||||
#endif
|
||||
ps->ModelOverride = mov[devno];
|
||||
ps->warmup = warmup[devno];
|
||||
ps->lampoff = lampoff[devno];
|
||||
|
@ -845,13 +540,8 @@ static int ptdrvInit( int devno )
|
|||
|
||||
if( _OK == retval ) {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_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
|
||||
|
@ -859,43 +549,23 @@ static int ptdrvInit( int devno )
|
|||
MiscStartTimer( &toTimer[ps->devno], (_SECOND * ps->warmup));
|
||||
|
||||
if( 0 == ps->lampoff )
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_LOW,
|
||||
#endif
|
||||
"pt_drv%u: Lamp-Timer switched off.\n", devno );
|
||||
else {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_LOW,
|
||||
#endif
|
||||
"pt_drv%u: Lamp-Timer set to %u seconds.\n",
|
||||
devno, ps->lampoff );
|
||||
}
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_LOW,
|
||||
#endif
|
||||
"pt_drv%u: WarmUp period set to %u seconds.\n",
|
||||
devno, ps->warmup );
|
||||
|
||||
if( 0 == ps->lOffonEnd ) {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_LOW,
|
||||
#endif
|
||||
"pt_drv%u: Lamp untouched on driver unload.\n", devno );
|
||||
} else {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_LOW,
|
||||
#endif
|
||||
"pt_drv%u: Lamp switch-off on driver unload.\n", devno );
|
||||
}
|
||||
|
||||
|
@ -1287,31 +957,19 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
|
|||
int retval = _OK;
|
||||
|
||||
#ifdef _ASIC_98001_SIM
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_LOW,
|
||||
#endif
|
||||
"pt_drv : Software-Emulation active, can't read!\n" );
|
||||
return _E_INVALID;
|
||||
#endif
|
||||
|
||||
if((NULL == buffer) || (NULL == ps)) {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv : Internal NULL-pointer!\n" );
|
||||
return _E_NULLPTR;
|
||||
}
|
||||
|
||||
if( 0 == count ) {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv%u: reading 0 bytes makes no sense!\n", ps->devno );
|
||||
return _E_INVALID;
|
||||
}
|
||||
|
@ -1325,11 +983,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
|
|||
* when using the cat /dev/pt_drv command!
|
||||
*/
|
||||
if (!(ps->DataInf.dwVxdFlag & _VF_ENVIRONMENT_READY)) {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv%u: Cannot read, driver not initialized!\n",ps->devno);
|
||||
return _E_SEQUENCE;
|
||||
}
|
||||
|
@ -1340,11 +994,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
|
|||
ps->Scan.bp.pMonoBuf = _KALLOC( ps->DataInf.dwAppPhyBytesPerLine, GFP_KERNEL);
|
||||
|
||||
if ( NULL == ps->Scan.bp.pMonoBuf ) {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv%u: Not enough memory available!\n", ps->devno );
|
||||
return _E_ALLOC;
|
||||
}
|
||||
|
@ -1355,11 +1005,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
|
|||
scaleBuf = _KALLOC( ps->DataInf.dwAppPhyBytesPerLine, GFP_KERNEL);
|
||||
if ( NULL == scaleBuf ) {
|
||||
_KFREE( ps->Scan.bp.pMonoBuf );
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv%u: Not enough memory available!\n", ps->devno );
|
||||
return _E_ALLOC;
|
||||
}
|
||||
|
@ -1406,11 +1052,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
|
|||
|
||||
retval = ps->Calibration( ps );
|
||||
if( _OK != retval ) {
|
||||
#ifdef __KERNEL__
|
||||
_PRINT(
|
||||
#else
|
||||
DBG( DBG_HIGH,
|
||||
#endif
|
||||
"pt_drv%u: calibration failed, result = %i\n",
|
||||
ps->devno, retval );
|
||||
goto ReadFinished;
|
||||
|
@ -1507,12 +1149,9 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
|
|||
ps->Scan.dwLinesToRead--;
|
||||
|
||||
/* needed, esp. to avoid freezing the system in SPP mode */
|
||||
#ifdef __KERNEL__
|
||||
schedule();
|
||||
/*#else
|
||||
sched_yield();
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
|
||||
if (ps->fScanningStatus) {
|
||||
|
@ -1565,346 +1204,6 @@ ReadFinished:
|
|||
return retval;
|
||||
}
|
||||
|
||||
/*************************** the module interface ****************************/
|
||||
|
||||
#ifdef __KERNEL__ /* the kernel module interface */
|
||||
|
||||
/* Designed to be used as a module */
|
||||
#ifdef MODULE
|
||||
|
||||
/*.............................................................................
|
||||
* gets called upon module initialization
|
||||
*/
|
||||
#ifdef LINUX_26
|
||||
static int __init ptdrv_init( void )
|
||||
#else
|
||||
int init_module( void )
|
||||
#endif
|
||||
{
|
||||
UInt devCount;
|
||||
UInt i;
|
||||
int retval = _OK;
|
||||
int result = _OK;
|
||||
#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
|
||||
char controlname[24];
|
||||
#endif
|
||||
# ifdef LINUX_26
|
||||
char devname[20];
|
||||
#endif
|
||||
|
||||
DBG( DBG_HIGH, "*********************************************\n" );
|
||||
DBG( DBG_HIGH, "pt_drv: init_module()\n" );
|
||||
|
||||
#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
|
||||
devfs_handle = devfs_mk_dir(NULL, "scanner", NULL);
|
||||
if( devfs_register_chrdev(_PTDRV_MAJOR, _DRV_NAME, &pt_drv_fops)) {
|
||||
#else
|
||||
if( register_chrdev(_PTDRV_MAJOR, _DRV_NAME, &pt_drv_fops)) {
|
||||
#endif
|
||||
|
||||
_PRINT(KERN_INFO "pt_drv: unable to get major %d for pt_drv devices\n",
|
||||
_PTDRV_MAJOR);
|
||||
return -EIO;
|
||||
}
|
||||
printk( KERN_INFO "pt_drv : driver version "_PTDRV_VERSTR"\n" );
|
||||
|
||||
#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
|
||||
ptdrv_class = class_create(THIS_MODULE, "scanner");
|
||||
if (IS_ERR(ptdrv_class))
|
||||
goto out_devfs;
|
||||
#endif
|
||||
|
||||
/* register the proc_fs */
|
||||
ProcFsInitialize();
|
||||
|
||||
/* go through the list of defined ports and try to find a device
|
||||
*/
|
||||
devCount = 0;
|
||||
for( i = 0; i < _MAX_PTDEVS; i++ ) {
|
||||
|
||||
if( 0 != port[i] ) {
|
||||
result = ptdrvInit( i );
|
||||
|
||||
if ( _OK == result ) {
|
||||
PtDrvDevices[i]->flags |= _PTDRV_INITALIZED;
|
||||
|
||||
#ifdef CONFIG_DEVFS_FS
|
||||
# ifndef DEVFS_26_STYLE
|
||||
sprintf( controlname, "scanner/pt_drv%d", devCount );
|
||||
devfs_register( NULL, controlname,
|
||||
DEVFS_FL_DEFAULT, _PTDRV_MAJOR, 0,
|
||||
(S_IFCHR | S_IRUGO | S_IWUGO | S_IFCHR),
|
||||
&pt_drv_fops, NULL );
|
||||
# else /* DEVFS_26_STYLE */
|
||||
devfs_mk_cdev(MKDEV(_PTDRV_MAJOR, devCount),
|
||||
(S_IFCHR | S_IRUGO | S_IWUGO | S_IFCHR),
|
||||
"scanner/pt_drv%d", devCount);
|
||||
# endif
|
||||
#else
|
||||
# ifdef LINUX_26
|
||||
sprintf(devname, "pt_drv%d", devCount);
|
||||
CLASS_DEV_CREATE(ptdrv_class,
|
||||
MKDEV(_PTDRV_MAJOR, devCount), NULL,
|
||||
devname);
|
||||
|
||||
# endif /* LINUX_26 */
|
||||
#endif /* CONFIG_DEVFS_FS */
|
||||
ProcFsRegisterDevice( PtDrvDevices[i] );
|
||||
devCount++;
|
||||
} else {
|
||||
retval = result;
|
||||
ptdrvShutdown( PtDrvDevices[i] );
|
||||
PtDrvDevices[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* * if something went wrong, shutdown all... */
|
||||
if( devCount == 0 ) {
|
||||
|
||||
#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
|
||||
out_devfs:
|
||||
class_destroy(ptdrv_class);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
|
||||
devfs_unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
|
||||
#else
|
||||
unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
|
||||
#endif
|
||||
ProcFsShutdown();
|
||||
|
||||
#ifdef __KERNEL__
|
||||
_PRINT( KERN_INFO "pt_drv : no device(s) detected, (%i)\n", retval );
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
DBG( DBG_HIGH, "pt_drv : init done, %u device(s) found\n", devCount );
|
||||
retval = _OK;
|
||||
}
|
||||
DBG( DBG_HIGH, "---------------------------------------------\n" );
|
||||
|
||||
deviceScanning = _FALSE;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* cleanup the show
|
||||
*/
|
||||
#ifdef LINUX_26
|
||||
static void __exit ptdrv_exit( void )
|
||||
#else
|
||||
void cleanup_module( void )
|
||||
#endif
|
||||
{
|
||||
UInt i;
|
||||
pScanData ps;
|
||||
#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
|
||||
char controlname[24];
|
||||
devfs_handle_t master;
|
||||
#endif
|
||||
|
||||
DBG( DBG_HIGH, "pt_drv: cleanup_module()\n" );
|
||||
|
||||
for ( i = 0; i < _MAX_PTDEVS; i++ ) {
|
||||
|
||||
ps = PtDrvDevices[i];
|
||||
PtDrvDevices[i] = NULL;
|
||||
|
||||
if ( NULL != ps ) {
|
||||
#ifdef CONFIG_DEVFS_FS
|
||||
# ifndef DEVFS_26_STYLE
|
||||
sprintf( controlname, "scanner/pt_drv%d", i );
|
||||
master = devfs_find_handle( NULL,controlname, 0, 0,
|
||||
DEVFS_SPECIAL_CHR, 0 );
|
||||
devfs_unregister( master );
|
||||
# else
|
||||
devfs_remove("scanner/pt_drv%d", i);
|
||||
# endif
|
||||
#else
|
||||
# ifdef LINUX_26
|
||||
CLASS_DEV_DESTROY(ptdrv_class, MKDEV(_PTDRV_MAJOR, i));
|
||||
# endif /* LINUX_26 */
|
||||
#endif /* CONFIG_DEVFS_FS */
|
||||
ptdrvShutdown( ps );
|
||||
ProcFsUnregisterDevice( ps );
|
||||
}
|
||||
}
|
||||
|
||||
#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
|
||||
devfs_unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
|
||||
#else
|
||||
unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
|
||||
#endif
|
||||
ProcFsShutdown();
|
||||
|
||||
#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
|
||||
class_destroy(ptdrv_class);
|
||||
#endif
|
||||
|
||||
DBG( DBG_HIGH, "pt_drv: cleanup done.\n" );
|
||||
DBG( DBG_HIGH, "*********************************************\n" );
|
||||
}
|
||||
|
||||
#ifdef LINUX_26
|
||||
module_init(ptdrv_init);
|
||||
module_exit(ptdrv_exit);
|
||||
#endif
|
||||
|
||||
#endif /*MODULE*/
|
||||
|
||||
|
||||
/*.............................................................................
|
||||
* device open...
|
||||
*/
|
||||
static int pt_drv_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
pScanData ps;
|
||||
|
||||
DBG( DBG_HIGH, "pt_drv_open()\n" );
|
||||
|
||||
ps = get_pt_from_inode(inode);
|
||||
|
||||
if ( NULL == ps ) {
|
||||
return(-ENXIO);
|
||||
}
|
||||
|
||||
/* device not found ? */
|
||||
if (!(ps->flags & _PTDRV_INITALIZED)) {
|
||||
return(-ENXIO);
|
||||
}
|
||||
|
||||
/* device is busy ? */
|
||||
if (ps->flags & _PTDRV_OPEN) {
|
||||
return(-EBUSY);
|
||||
}
|
||||
|
||||
#ifdef LINUX_26
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
return -EAGAIN;
|
||||
#else
|
||||
MOD_INC_USE_COUNT;
|
||||
#endif
|
||||
ps->flags |= _PTDRV_OPEN;
|
||||
|
||||
return _OK;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* device close...
|
||||
*/
|
||||
static CLOSETYPE pt_drv_close(struct inode * inode, struct file * file)
|
||||
{
|
||||
pScanData ps;
|
||||
|
||||
DBG( DBG_HIGH, "pt_drv_close()\n" );
|
||||
|
||||
if ((ps = get_pt_from_inode(inode)) ) {
|
||||
|
||||
ptdrvClose( ps );
|
||||
|
||||
ps->flags &= ~_PTDRV_OPEN;
|
||||
#ifdef LINUX_26
|
||||
module_put(THIS_MODULE);
|
||||
#else
|
||||
MOD_DEC_USE_COUNT;
|
||||
#endif
|
||||
CLOSERETURN(0);
|
||||
} else {
|
||||
|
||||
DBG( DBG_HIGH, "pt_drv: - close failed!\n" );
|
||||
CLOSERETURN(-ENXIO);
|
||||
}
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* read data from device
|
||||
*/
|
||||
#ifdef LINUX_20
|
||||
static int pt_drv_read(struct inode *inode, struct file *file,
|
||||
char *buffer, int count)
|
||||
{
|
||||
int result;
|
||||
pScanData ps;
|
||||
|
||||
if ( !(ps = get_pt_from_inode(inode)))
|
||||
return(-ENXIO);
|
||||
#else
|
||||
static ssize_t pt_drv_read( struct file *file,
|
||||
char *buffer, size_t count, loff_t *tmp )
|
||||
{
|
||||
int result;
|
||||
pScanData ps;
|
||||
|
||||
if ( !(ps = get_pt_from_inode(file->f_dentry->d_inode)) )
|
||||
return(-ENXIO);
|
||||
#endif
|
||||
if ((result = verify_area_20(VERIFY_WRITE, buffer, count)))
|
||||
return result;
|
||||
|
||||
/*
|
||||
* as the driver contains some global vars, it is not
|
||||
* possible to scan simultaenously with two or more devices
|
||||
*/
|
||||
if( _TRUE == deviceScanning ) {
|
||||
printk( KERN_INFO "pt_drv: device %u busy!!!\n", ps->devno );
|
||||
return(-EBUSY);
|
||||
}
|
||||
|
||||
deviceScanning = _TRUE;
|
||||
|
||||
result = ptdrvRead( ps, buffer, count );
|
||||
|
||||
deviceScanning = _FALSE;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*.............................................................................
|
||||
* writing makes no sense
|
||||
*/
|
||||
#ifdef LINUX_20
|
||||
static int pt_drv_write(struct inode * inode, struct file * file,
|
||||
const char * buffer, int count)
|
||||
{
|
||||
return -EPERM;
|
||||
}
|
||||
#else
|
||||
static ssize_t pt_drv_write( struct file * file,const char * buffer,
|
||||
size_t tmp,loff_t* count)
|
||||
{
|
||||
return -EPERM;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*.............................................................................
|
||||
* the ioctl interface
|
||||
*/
|
||||
#ifdef NOLOCK_IOCTL
|
||||
static long pt_drv_ioctl( struct file *file, UInt cmd, unsigned long arg )
|
||||
{
|
||||
pScanData ps;
|
||||
|
||||
if ( !(ps = get_pt_from_inode(file->f_dentry->d_inode)) )
|
||||
return(-ENXIO);
|
||||
|
||||
return ptdrvIoctl( ps, cmd, (pVoid)arg);
|
||||
}
|
||||
#else
|
||||
static int pt_drv_ioctl( struct inode *inode, struct file *file,
|
||||
UInt cmd, unsigned long arg )
|
||||
{
|
||||
pScanData ps;
|
||||
|
||||
if ( !(ps = get_pt_from_inode(inode)) )
|
||||
return(-ENXIO);
|
||||
|
||||
return ptdrvIoctl( ps, cmd, (pVoid)arg);
|
||||
}
|
||||
#endif
|
||||
|
||||
#else /* the user-mode interface */
|
||||
|
||||
/*.............................................................................
|
||||
* here we only have wrapper functions
|
||||
*/
|
||||
|
@ -1980,6 +1279,4 @@ static int PtDrvRead ( pUChar buffer, int count )
|
|||
return ptdrvRead( PtDrvDevices[0], buffer, count );
|
||||
}
|
||||
|
||||
#endif /* guard __KERNEL__ */
|
||||
|
||||
/* END PLUSTEK-PP_PTDRV.C ...................................................*/
|
||||
|
|
|
@ -63,8 +63,6 @@
|
|||
#ifndef __PLUSTEK_SCAN_H__
|
||||
#define __PLUSTEK_SCAN_H__
|
||||
|
||||
#ifndef __KERNEL__
|
||||
|
||||
# include <stdlib.h>
|
||||
# include <stdarg.h>
|
||||
# include <string.h>
|
||||
|
@ -76,19 +74,6 @@
|
|||
# ifdef HAVE_SYS_IO_H
|
||||
# include <sys/io.h>
|
||||
# endif
|
||||
#else
|
||||
# include <linux/kernel.h>
|
||||
# include <linux/init.h>
|
||||
# include <linux/version.h>
|
||||
# include "plustek-pp_sysdep.h"
|
||||
# include <linux/delay.h>
|
||||
# include <linux/parport.h>
|
||||
|
||||
#ifdef LINUX_24
|
||||
# include <linux/parport_pc.h>
|
||||
#endif /* LINUX_24 */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
/*.............................................................................
|
||||
* driver properties
|
||||
|
@ -104,20 +89,6 @@
|
|||
# define _OPF ps->IO.fnOut
|
||||
# define _IPF ps->IO.fnIn
|
||||
|
||||
#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 _INB_CTRL(pSD) _IPF(pSD->IO.pbControlPort)
|
||||
#define _INB_DATA(pSD) _IPF(pSD->IO.pbSppDataPort)
|
||||
#define _INB_EPPDATA(pSD) _IPF(pSD->IO.pbEppDataPort)
|
||||
#define _INB_STATUS(pSD) _IPF(pSD->IO.pbStatusPort)
|
||||
#define _INB_ECTL(pSD) _IPF((pSD->IO.portBase+0x402))
|
||||
|
||||
#else
|
||||
|
||||
#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)
|
||||
|
@ -127,32 +98,19 @@
|
|||
#define _INB_EPPDATA(pSD) sanei_pp_inb_epp(pSD->pardev)
|
||||
#define _INB_STATUS(pSD) sanei_pp_inb_stat(pSD->pardev)
|
||||
|
||||
#endif
|
||||
|
||||
/*.............................................................................
|
||||
* for memory allocation
|
||||
*/
|
||||
#ifndef __KERNEL__
|
||||
# define _KALLOC(x,y) malloc(x)
|
||||
# define _KFREE(x) free(x)
|
||||
# define _VMALLOC(x) malloc(x)
|
||||
# define _VFREE(x) free(x)
|
||||
#else
|
||||
# define _KALLOC(x,y) kmalloc(x,y)
|
||||
# define _KFREE(x) kfree(x)
|
||||
# define _VMALLOC(x) vmalloc(x)
|
||||
# define _VFREE(x) vfree(x)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* WARNING - never use the _SECOND define with the _DODELAY macro !!
|
||||
* they are for use the MiscStartTimer function and the _DO_UDELAY macro
|
||||
*/
|
||||
#ifndef __KERNEL__
|
||||
typedef double TimerDef, *pTimerDef;
|
||||
#else
|
||||
typedef long long TimerDef, *pTimerDef;
|
||||
#endif
|
||||
|
||||
#define _MSECOND 1000 /* based on 1 us */
|
||||
#define _SECOND (1000*_MSECOND)
|
||||
|
@ -160,13 +118,8 @@ typedef long long TimerDef, *pTimerDef;
|
|||
/*.............................................................................
|
||||
* timer topics
|
||||
*/
|
||||
#ifndef __KERNEL__
|
||||
# define _DO_UDELAY(usecs) sanei_pp_udelay(usecs)
|
||||
# define _DODELAY(msecs) { int i; for( i = msecs; i--; ) _DO_UDELAY(1000); }
|
||||
#else
|
||||
# define _DO_UDELAY(usecs) udelay(usecs)
|
||||
# define _DODELAY(msecs) mdelay(msecs)
|
||||
#endif
|
||||
|
||||
/*.............................................................................
|
||||
* include the shared stuff right here, this concerns the ioctl interface
|
||||
|
|
|
@ -143,17 +143,7 @@ typedef struct {
|
|||
*/
|
||||
typedef struct scandata
|
||||
{
|
||||
#ifdef __KERNEL__
|
||||
UInt flags; /* as follows: */
|
||||
#define _PTDRV_INITALIZED 0x00000001
|
||||
#define _PTDRV_OPEN 0x00000002
|
||||
|
||||
struct pardevice *pardev; /* for accessing parport... */
|
||||
struct parport *pp;
|
||||
ProcDirDef procDir;
|
||||
#else
|
||||
int pardev; /* parport handle in user-space */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* device control
|
||||
|
|
|
@ -124,8 +124,8 @@ BEDOCS += mustek/mustek.CHANGES
|
|||
BEDOCS += mustek_usb/mustek_usb.CHANGES mustek_usb/mustek_usb.TODO
|
||||
BEDOCS += mustek_usb2/mustek_usb2.CHANGES mustek_usb2/mustek_usb2.TODO
|
||||
BEDOCS += niash/niash.TODO
|
||||
BEDOCS += plustek/FAQ plustek/MakeModule.sh plustek/Makefile.kernel24 \
|
||||
plustek/Makefile.kernel26 plustek/Plustek-PARPORT-TODO.txt \
|
||||
BEDOCS += plustek/FAQ \
|
||||
plustek/Plustek-PARPORT-TODO.txt \
|
||||
plustek/Plustek-PARPORT.changes plustek/Plustek-PARPORT.txt \
|
||||
plustek/Plustek-USB-TODO.txt plustek/Plustek-USB.changes \
|
||||
plustek/Plustek-USB.txt
|
||||
|
|
121
doc/plustek/FAQ
121
doc/plustek/FAQ
|
@ -12,111 +12,10 @@ If you have some more FAQ entries, let me know <gerhard@gjaeger.de>
|
|||
THANKS to Jochen <jochen@puchalla-online.de>, who roamed through the
|
||||
mailing-list and gathered the different questions.
|
||||
|
||||
|
||||
*******************************************************************************
|
||||
* TROUBLE-SHOOTING *
|
||||
* *
|
||||
* DRIVER TOPICS *
|
||||
* General *
|
||||
*******************************************************************************
|
||||
|
||||
|
||||
SYMPTOM: "kernel-module version mismatch"
|
||||
--------
|
||||
"When I try to "make load" I get an error"
|
||||
|
||||
/sbin/modprobe pt_drv || exit 1
|
||||
/lib/modules/2.2.14-6.0.6/misc/pt_drv.o: kernel-module version mismatch
|
||||
/lib/modules/2.2.14-6.0.1/misc/pt_drv.o was compiled
|
||||
for kernel version 2.2.14-5.0
|
||||
while this kernel is version 2.2.14-6.0.1.
|
||||
|
||||
PROBLEM:
|
||||
--------
|
||||
You're using the wrong Kernel-header files.
|
||||
|
||||
The path
|
||||
/usr/include/linux is a link to
|
||||
/usr/src/linux/include/linux and
|
||||
/usr/src/linux is normally a link to your current
|
||||
kernel, i.e:
|
||||
/usr/src/linux-2.2.14
|
||||
|
||||
If you now upgrade your kernel and you have
|
||||
forgotten to correct the link /usr/src/linux, then
|
||||
every kernel-module you build outside the
|
||||
kernelsource structure will include the wrong
|
||||
version information.
|
||||
|
||||
SOLUTION:
|
||||
---------
|
||||
Set the link /usr/src/linux
|
||||
to your current kernel-source tree before recompiling
|
||||
kernel-modules like pt_drv, then your version mismatch
|
||||
problem should be solved.
|
||||
|
||||
|
||||
|
||||
SYMPTOM: "Device or resource busy"
|
||||
--------
|
||||
Any attempt to "modprobe" or "make load" the driver leads
|
||||
to this message.
|
||||
|
||||
PROBLEM:
|
||||
--------
|
||||
The driver refuses to load. During startup, the driver performs
|
||||
some tests according to the parallel port and the connected
|
||||
scanners.
|
||||
If the parallel port is not supported or the scanner cannot be
|
||||
found, the driver returns an error and the system will report
|
||||
"device or resource busy"
|
||||
|
||||
SOLUTION:
|
||||
---------
|
||||
There's no way to provide a general solution. First of all
|
||||
you should check your connections and the parallel port.
|
||||
Also check power for your scanner.
|
||||
If the problem still exists, enable the debug-messages of the
|
||||
pt_drv module (see INSTALL).
|
||||
Then check the messages after loading or send the output to
|
||||
the mailing list.
|
||||
Most of these problems are related to HW-problems. Before
|
||||
giving up, check the scanner under Windows (not really a
|
||||
good advice I know, but it helps to find HW-damage).
|
||||
There was also one case were the internal plugs of the parport
|
||||
connection were wrong...
|
||||
|
||||
|
||||
|
||||
SYMPTOM: "Unresolved symbols"
|
||||
--------
|
||||
"make load" or "modprobe pt_drv" produces this message:
|
||||
|
||||
/sbin/modprobe pt_drv || exit 1
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_unregister_device
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_enumerate
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_register_device
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_claim
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_release
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o: insmod
|
||||
/lib/modules/2.2.14-5.0/misc/pt_drv.o failed
|
||||
|
||||
|
||||
PROBLEM:
|
||||
--------
|
||||
The driver needs at least the parport_pc and the parport modules
|
||||
to work. They MUST be loaded prior to pt_drv. If these modules
|
||||
are not loaded you get this message.
|
||||
|
||||
SOLUTION:
|
||||
---------
|
||||
Simply load the parport module. You can add this dependency to
|
||||
your /etc/modules.conf (or /etc/conf.modules) file (see INSTALL).
|
||||
Then every time you load pt_drv with modprobe, parport will be loaded
|
||||
automatically. After modifying this file, call
|
||||
depmod -va
|
||||
|
||||
|
||||
|
||||
SYMPTOM: Scanner makes awful noise
|
||||
--------
|
||||
|
||||
|
@ -138,7 +37,6 @@ The second case is often reported when the printer driver lp.o is
|
|||
already loaded. So remove lp.o before loading pt_drv.
|
||||
|
||||
|
||||
|
||||
SYMPTOM: Printer starts to print while scanning
|
||||
--------
|
||||
|
||||
|
@ -294,23 +192,6 @@ A: You should be able to use xscanimage with gimp:
|
|||
now the Acquire Image menu entry. That's all.
|
||||
If not, start gimp from an xterm and have a look at the output.
|
||||
|
||||
|
||||
Q: Is there any way to load the plustek_driver at bootup-time?
|
||||
|
||||
A: Normally, there is no need to do so, because once you
|
||||
altered your /etc/conf.modules file (or /etc/modules.conf)
|
||||
and added the suggested stuff (see INSTALL file), you won't
|
||||
have to worry about loading the driver. It happens automagically. ;-)
|
||||
The driver will be loaded when needed (and eventually
|
||||
removed after a specific time of not using it).
|
||||
|
||||
Nevertheless, another possibility is to do a modprobe pt_drv in the
|
||||
/etc/rc.d/boot.local (using SuSE) or
|
||||
/etc/rc.d/rc.local (using RedHat or Mandrake) file
|
||||
So the driver will be loaded at bootup-time...
|
||||
!!! YOUR SCANNER MUST BE ONLINE during power-up then !!!
|
||||
|
||||
|
||||
Q: I wonder if Mandrake 7.1's sane rpm file has this support already built in.
|
||||
My scanner light is coming on yet Xscanimage seems to report that there
|
||||
is no scanner present.
|
||||
|
|
|
@ -1,116 +0,0 @@
|
|||
#!/bin/bash
|
||||
#******************************************************************************
|
||||
#
|
||||
# Bash-Script to create Plustek-Scannerdriver modules for Kernel 2.4, 2.6 and 3.x
|
||||
# out of the backend sources...
|
||||
#
|
||||
|
||||
BUILD_DIR=$PWD/build
|
||||
SRC_DIR=$PWD/../../backend
|
||||
MAKEFILE=$PWD/Makefile.kernel26
|
||||
KERNEL_V=`uname -r`
|
||||
OSMINOR=`uname -r | cut -b 3`
|
||||
OSMAJOR=`uname -r | cut -b 1`
|
||||
|
||||
#
|
||||
# some intro ;-)
|
||||
#
|
||||
echo "This script will try and build a suitable kernel-module for your system."
|
||||
echo "If you'd like to make the module WITH debug output, restart this script"
|
||||
echo "with as follows:"
|
||||
echo "./MakeModule.sh DEBUG=y"
|
||||
echo "Press <ENTER> to continue or <CTRL><C> to cancel."
|
||||
read
|
||||
|
||||
#
|
||||
# we need to be root user...
|
||||
#
|
||||
echo -n "Check for root..."
|
||||
if [ $EUID -ne 0 ]; then
|
||||
echo -e "\b\b\b - failed"
|
||||
echo "Please retry as root user."
|
||||
exit -1
|
||||
fi
|
||||
echo -e "\b\b\b - done."
|
||||
|
||||
#
|
||||
# Version checks...
|
||||
#
|
||||
echo -e "\nCheck for kernelversion:"
|
||||
if [ "$OSMAJOR" == "3" ];then
|
||||
echo "Using makefile for kernel 2.6.x - okay for kernel 3 as well..."
|
||||
MAKEFILE=$PWD/Makefile.kernel26
|
||||
elif [ "$OSMINOR" == "6" ]; then
|
||||
echo "Using makefile for kernel 2.6.x"
|
||||
MAKEFILE=$PWD/Makefile.kernel26
|
||||
elif [ "$OSMINOR" == "4" ]; then
|
||||
echo "Using makefile for kernel 2.4.x"
|
||||
MAKEFILE=$PWD/Makefile.kernel24
|
||||
else
|
||||
echo "Your kernelversion >"$OSMAJOR"."$OSMINOR"< is probably not supported"
|
||||
exit -2
|
||||
fi
|
||||
|
||||
#
|
||||
# Setup...
|
||||
#
|
||||
echo -e "Build-directory: \n"$BUILD_DIR
|
||||
echo -n "Removing build-directory..."
|
||||
rm -rf $BUILD_DIR
|
||||
echo -e "\b\b\b - done."
|
||||
|
||||
echo -n "Creating build-directory..."
|
||||
mkdir $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
echo -e "\b\b\b - done.\n"
|
||||
|
||||
echo -n "Linking source files..."
|
||||
C_FILES=`ls $SRC_DIR/plustek-pp_*.c`
|
||||
H_FILES=`ls $SRC_DIR/plustek-pp_*.h`
|
||||
|
||||
for F in $C_FILES $H_FILES $SRC_DIR/plustek-pp.h $SRC_DIR/plustek_pp.c; do
|
||||
ln -s $F .
|
||||
done
|
||||
echo -e "\b\b\b - done."
|
||||
|
||||
echo -n "Copying Makefile to build-directory..."
|
||||
cp $MAKEFILE Makefile
|
||||
echo -e "\b\b\b - done."
|
||||
|
||||
#
|
||||
# Building the module...
|
||||
#
|
||||
echo "Making the module..."
|
||||
if [ "$OSMAJOR" == "2" -a "$OSMINOR" == "4" ]; then
|
||||
make all $1
|
||||
else
|
||||
make -C /lib/modules/$KERNEL_V/build/ SUBDIRS=$BUILD_DIR modules $1
|
||||
fi
|
||||
RES=$?
|
||||
cd ..
|
||||
if [ $RES != 0 ]; then
|
||||
echo "There were some build errors..."
|
||||
exit -1
|
||||
fi
|
||||
echo "done."
|
||||
|
||||
echo "Should I install the module?"
|
||||
echo "Press <ENTER> to continue or <CTRL><C> to cancel."
|
||||
read
|
||||
|
||||
make -C $BUILD_DIR install
|
||||
|
||||
echo "Should I try and load the module?"
|
||||
echo "If this step fails, check the kernel-log."
|
||||
echo "Press <ENTER> to continue or <CTRL><C> to cancel."
|
||||
read
|
||||
|
||||
make -C $BUILD_DIR load
|
||||
echo "done."
|
||||
|
||||
echo "Should I remove the build directory?"
|
||||
echo "Press <ENTER> to continue or <CTRL><C> to cancel."
|
||||
read
|
||||
|
||||
rm -rf $BUILD_DIR
|
||||
echo "done."
|
|
@ -1,250 +0,0 @@
|
|||
# Makefile for the plustek scanner driver (kernel-module)
|
||||
#
|
||||
###############################################################################
|
||||
#
|
||||
# define the directories
|
||||
#
|
||||
HOME_DIR := .
|
||||
SRC_DIR := $(HOME_DIR)
|
||||
INC_DIR := $(SRC_DIR)
|
||||
OBJ_DIR := $(HOME_DIR)/obj
|
||||
DOC_DIR := $(HOME_DIR)/doc
|
||||
BACKEND := $(SRC_DIR)
|
||||
|
||||
#
|
||||
# define the used tools
|
||||
#
|
||||
MD = mkdir -p
|
||||
CC = gcc
|
||||
TAR = tar
|
||||
REF = cxref
|
||||
|
||||
#
|
||||
# Comment/uncomment the following line to disable/enable debugging
|
||||
# can also be set by commandline parameter: make all DEBUG=y
|
||||
#
|
||||
#DEBUG = y
|
||||
|
||||
#
|
||||
# common compiler options
|
||||
#
|
||||
OPT = -fomit-frame-pointer -D_PTDRV_VERSTR=\"$(VERSIONSTR)\"
|
||||
|
||||
#
|
||||
# cxref options
|
||||
#
|
||||
REFOPT = -xref-all -index-all -html32
|
||||
|
||||
#
|
||||
# Comment out if you are not running SMP. Someone take this out of here
|
||||
# when the SMP stuff gets moved out of the kernel Makefile.
|
||||
# SMP = 1
|
||||
# SMP_PROF = 1
|
||||
|
||||
#
|
||||
# add the following to get assembly listing
|
||||
# -Wa,-alh,-L -g
|
||||
|
||||
#
|
||||
# get some version numbers
|
||||
#
|
||||
ifeq ($(LINUXVERSION),)
|
||||
LINUXVERSION = $(shell uname -r)
|
||||
endif
|
||||
|
||||
VERSIONSTR = $(shell grep "define BACKEND_VERSION" $(SRC_DIR)/plustek_pp.c | cut -b25-50 )
|
||||
|
||||
# Change it here or specify it on the "make" commandline
|
||||
ifeq ($(HEADER_PATH),)
|
||||
MACHTYPE = $(shell env | grep debian-linux | wc -l | sed 's/ //g')
|
||||
ifeq ($(MACHTYPE),1)
|
||||
# debian
|
||||
HEADER_PATH = /usr/src/kernel-headers-$(LINUXVERSION)/include
|
||||
else
|
||||
# redhat, slackware
|
||||
HEADER_PATH = /usr/src/linux/include
|
||||
endif
|
||||
# HEADER_PATH = /usr/include
|
||||
endif
|
||||
|
||||
ifeq ($(DEBUG),y)
|
||||
DEBFLAGS = -O -g -DDEBUG # "-O" is needed to expand inlines
|
||||
else
|
||||
DEBFLAGS = -O2
|
||||
endif
|
||||
|
||||
#
|
||||
# the new style reference
|
||||
#
|
||||
K24_HEADER_PATH = /lib/modules/$(LINUXVERSION)/build/include
|
||||
|
||||
#
|
||||
# try to autodetect if we can use the new style header include references
|
||||
#
|
||||
KERNEL_HEADERS = $(shell if test -d $(K24_HEADER_PATH); then \
|
||||
echo $(K24_HEADER_PATH); \
|
||||
else \
|
||||
echo $(HEADER_PATH); \
|
||||
fi; )
|
||||
|
||||
#
|
||||
# seems to be necessary for kernels 2.4.x
|
||||
#
|
||||
MODVERFILE = $(shell if [ -e $(KERNEL_HEADERS)/linux/modversions.h ]; then \
|
||||
echo $(KERNEL_HEADERS)/linux/modversions.h ; \
|
||||
else \
|
||||
echo $(KERNEL_HEADERS)/linux/modsetver.h ; \
|
||||
fi )
|
||||
|
||||
MODFLAGS = -DMODULE
|
||||
|
||||
#
|
||||
# set MODVERSIONS if the kernel uses it
|
||||
#
|
||||
VERSUSED = $(shell grep 'define CONFIG_MODVERSIONS' \
|
||||
$(KERNEL_HEADERS)/linux/autoconf.h | wc -l | sed 's/ //g')
|
||||
ifeq ($(VERSUSED),1)
|
||||
MODFLAGS += -DMODVERSIONS -include $(MODVERFILE)
|
||||
endif
|
||||
|
||||
|
||||
WARNFLAGS = -Wall -Wstrict-prototypes
|
||||
CFLAGS = $(WARNFLAGS) $(OPT) -D__KERNEL__ -I$(KERNEL_HEADERS) -I$(INC_DIR) -I$(BACKEND) $(DEBFLAGS) $(MODFLAGS)
|
||||
MODLIB = /lib/modules/$(LINUXVERSION)
|
||||
|
||||
ifdef SMP
|
||||
CFLAGS += -D__SMP__
|
||||
|
||||
ifdef SMP_PROF
|
||||
CFLAGS += -D__SMP_PROF__
|
||||
endif
|
||||
endif
|
||||
|
||||
TARGET = pt_drv
|
||||
|
||||
OBJ = $(TARGET).o
|
||||
NAMES := dac detect genericio image map misc models io procfs
|
||||
NAMES := $(NAMES) motor p9636 ptdrv scale tpa p48xx p12 p12ccd
|
||||
NAMES := $(addprefix plustek-pp_, $(NAMES))
|
||||
SRCS := $(addprefix $(SRC_DIR)/, $(NAMES))
|
||||
SRCS := $(addsuffix .c, $(SRCS))
|
||||
OBJS := $(addprefix $(OBJ_DIR)/, $(NAMES))
|
||||
OBJS := $(addsuffix .o, $(OBJS))
|
||||
INCS := scan dbg types scandata procs hwdefs sysdep
|
||||
INCS := $(addsuffix .h, $(INCS))
|
||||
HDRS = $(addprefix $(INC_DIR)/plustek-pp_, $(INCS))
|
||||
|
||||
#
|
||||
# the header files we need from the backend
|
||||
#
|
||||
BACKINCS := plustek-pp.h
|
||||
BACKINCS := $(addprefix $(BACKEND)/, $(BACKINCS))
|
||||
|
||||
group = "root"
|
||||
mode = "644"
|
||||
INST_DIR = /lib/modules/$(LINUXVERSION)/kernel/drivers/char
|
||||
|
||||
info:
|
||||
@clear
|
||||
@echo "Makefile to create the Plustek-Scanner kernel-module:"
|
||||
@echo "all ... builds the module"
|
||||
@echo "all DEBUG=y ... builds the module with debug-messages enabled"
|
||||
@echo "clean ... cleans up the show"
|
||||
@echo "install ... installs the module to the library path"
|
||||
@echo "uninstall ... removes the module from the library path"
|
||||
@echo "load ... tries to load the module and creates device nodes"
|
||||
@echo "unload ... unloads the module"
|
||||
|
||||
|
||||
all: .depend chkdir $(OBJ)
|
||||
|
||||
#
|
||||
# create object directory
|
||||
#
|
||||
.PHONY : chkdir
|
||||
chkdir:
|
||||
@-$(MD) $(OBJ_DIR)
|
||||
@-$(MD) $(DOC_DIR)
|
||||
|
||||
$(OBJ): $(OBJS)
|
||||
$(LD) -r $^ -o $@
|
||||
|
||||
$(OBJS): Makefile $(HDRS) $(BACKINCS)
|
||||
|
||||
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): VERSION1 VERSION0
|
||||
|
||||
#
|
||||
# copy the driver to the modules directory
|
||||
#
|
||||
install:
|
||||
mkdir -p $(INST_DIR)
|
||||
install -c -m $(mode) $(OBJ) $(INST_DIR)
|
||||
/sbin/depmod -a
|
||||
|
||||
#
|
||||
# remove it
|
||||
#
|
||||
uninstall:
|
||||
rm -f $(INST_DIR)/$(OBJ)
|
||||
|
||||
#
|
||||
# use modprobe to load the driver, remember to set the
|
||||
# parameter in /etc/modules.conf (see sane-plustek_pp.man for more details)
|
||||
#
|
||||
load: $(INST_DIR)/$(OBJ)
|
||||
# invoke modprobe with all arguments we got
|
||||
/sbin/modprobe $(TARGET) || exit 1
|
||||
|
||||
# Remove stale nodes and replace them, then give gid and perms
|
||||
rm -f /dev/$(TARGET)*
|
||||
|
||||
# when using the devfs support, we check the /dev/scanner entries
|
||||
# and only create links to the devfs nodes
|
||||
# at least we create one link
|
||||
@if [ -e /dev/scanner/$(TARGET)* ]; then \
|
||||
ln -s /dev/scanner/$(TARGET)0 /dev/$(TARGET); \
|
||||
for name in `ls /dev/scanner | grep $(TARGET)`; do \
|
||||
ln -s /dev/scanner/$$name /dev/$$name ; \
|
||||
done \
|
||||
else \
|
||||
mknod /dev/$(TARGET) c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
|
||||
mknod /dev/$(TARGET)0 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
|
||||
mknod /dev/$(TARGET)1 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 1; \
|
||||
mknod /dev/$(TARGET)2 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 2; \
|
||||
mknod /dev/$(TARGET)3 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 3; \
|
||||
\
|
||||
chgrp $(group) /dev/$(TARGET)*; \
|
||||
chmod $(mode) /dev/$(TARGET)*; \
|
||||
fi
|
||||
|
||||
#
|
||||
# unload the driver
|
||||
#
|
||||
unload:
|
||||
/sbin/modprobe -r $(TARGET) || exit 1
|
||||
|
||||
# Remove stale nodes
|
||||
rm -f /dev/$(TARGET)*
|
||||
|
||||
#
|
||||
# create reference docu
|
||||
#
|
||||
doc: chkdir
|
||||
$(REF) $(REFOPT) $(INC_DIR)/*.h $(SRC_DIR)/*.c $(BACKEND)/plustek-share.h \
|
||||
-D__KERNEL__ -I$(KERNEL_HEADERS) -I$(INC_DIR) -I$(BACKEND) $(MODFLAGS) \
|
||||
-D_PTDRV_V1=$(VERSION1) -D_PTDRV_V0=$(VERSION0) -D_PTDRV_BUILD=$(BUILD) -O$(DOC_DIR)
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJ_DIR)/*.o .depend depend dep $(REF).* *.html $(TARGET).o
|
||||
@-rm -rf $(OBJ_DIR)
|
||||
@-rm -rf $(DOC_DIR)
|
||||
|
||||
depend .depend dep:
|
||||
$(CC) $(CFLAGS) -M $(SRCS) > $@
|
||||
|
||||
ifeq (.depend,$(wildcard .depend))
|
||||
#include .depend
|
||||
endif
|
|
@ -1,124 +0,0 @@
|
|||
# Makefile for the plustek scanner driver (kernel-module)
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
#
|
||||
# retrieve the version numbers
|
||||
#
|
||||
ifeq ($(LINUXVERSION),)
|
||||
LINUXVERSION = $(shell uname -r)
|
||||
endif
|
||||
LINUXRELEASE = $(shell uname -r | cut -d'.' -f3)
|
||||
|
||||
ifeq ($(VERSIONSTR),)
|
||||
ifeq ($(SUBDIRS),)
|
||||
VERSIONSTR = $(shell grep "define BACKEND_VERSION" $(M)/plustek_pp.c | cut -b25-50 )
|
||||
else
|
||||
VERSIONSTR = $(shell grep "define BACKEND_VERSION" $(SUBDIRS)/plustek_pp.c | cut -b25-50 )
|
||||
endif
|
||||
endif
|
||||
|
||||
#
|
||||
# extra flags
|
||||
#
|
||||
EXTRA_CFLAGS += -D_PTDRV_VERSTR=\"$(VERSIONSTR)\"
|
||||
|
||||
ifeq ($(DEBUG),y)
|
||||
EXTRA_CFLAGS += -DDEBUG
|
||||
endif
|
||||
|
||||
#
|
||||
# the module name
|
||||
#
|
||||
TARGET := pt_drv
|
||||
MODULE := $(TARGET).ko
|
||||
|
||||
#
|
||||
# our files...
|
||||
#
|
||||
NAMES := dac detect genericio image map misc models io procfs
|
||||
NAMES := $(NAMES) motor p9636 ptdrv scale tpa p48xx p12 p12ccd
|
||||
NAMES := $(addprefix plustek-pp_, $(NAMES))
|
||||
OBJS := $(addsuffix .o, $(NAMES))
|
||||
|
||||
#
|
||||
# now the kernel magic
|
||||
#
|
||||
ifneq ($(KERNELRELEASE),)
|
||||
obj-m := $(TARGET).o
|
||||
|
||||
$(TARGET)-objs := $(OBJS)
|
||||
|
||||
else
|
||||
KDIR := /lib/modules/$(shell uname -r)/build
|
||||
PWD := $(shell pwd)
|
||||
|
||||
default:
|
||||
$(MAKE) -C $(KDIR) M=$(PWD) modules
|
||||
endif
|
||||
|
||||
#
|
||||
# the installation stuff
|
||||
#
|
||||
group = "root"
|
||||
mode = "644"
|
||||
INST_DIR = /lib/modules/$(LINUXVERSION)/kernel/drivers/parport
|
||||
|
||||
#
|
||||
# copy the driver to the modules directory
|
||||
#
|
||||
install:
|
||||
mkdir -p $(INST_DIR)
|
||||
install -c -m $(mode) $(MODULE) $(INST_DIR)
|
||||
/sbin/depmod -a
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
uninstall:
|
||||
rm -f $(INST_DIR)/$(MODULE)
|
||||
|
||||
#
|
||||
# use modprobe to load the driver, remember to set the
|
||||
# parameter in /etc/conf.modules (see INSTALL for more details)
|
||||
#
|
||||
load: $(INST_DIR)/$(MODULE)
|
||||
# invoke modprobe with all arguments we got
|
||||
/sbin/modprobe $(TARGET) || exit 1
|
||||
|
||||
# Remove stale nodes and replace them, then give gid and perms
|
||||
rm -f /dev/$(TARGET)*
|
||||
|
||||
# when using the devfs support, we check the /dev/scanner entries
|
||||
# and only create links to the devfs nodes
|
||||
# at least we create one link
|
||||
@if [ -e /dev/scanner/$(TARGET)* ]; then \
|
||||
ln -s /dev/scanner/$(TARGET)0 /dev/$(TARGET); \
|
||||
for name in `ls /dev/scanner | grep $(TARGET)`; do \
|
||||
ln -s /dev/scanner/$$name /dev/$$name ; \
|
||||
done \
|
||||
else \
|
||||
mknod /dev/$(TARGET) c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
|
||||
mknod /dev/$(TARGET)0 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
|
||||
mknod /dev/$(TARGET)1 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 1; \
|
||||
mknod /dev/$(TARGET)2 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 2; \
|
||||
mknod /dev/$(TARGET)3 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 3; \
|
||||
\
|
||||
chgrp $(group) /dev/$(TARGET)*; \
|
||||
chmod $(mode) /dev/$(TARGET)*; \
|
||||
fi
|
||||
|
||||
#
|
||||
# unload the driver
|
||||
#
|
||||
unload:
|
||||
/sbin/modprobe -r $(TARGET) || exit 1
|
||||
|
||||
# Remove stale nodes
|
||||
rm -f /dev/$(TARGET)*
|
||||
|
||||
#
|
||||
# cleanup the show
|
||||
#
|
||||
clean:
|
||||
@-rm -f *.o .depend depend dep $(MODULE) $(TARGET).o $(TARGET).mod.c .*.cmd
|
|
@ -1,46 +1,10 @@
|
|||
Plustek-PARPRORT.txt (2004-03-28) Gerhard Jäger <gerhard@gjaeger.de>
|
||||
====================================================================
|
||||
|
||||
|
||||
Beginning with SANE-1.0.13, there's a backend called plustek_pp.
|
||||
This is for controlling Plustek parallel-port scanner and compatible
|
||||
devices. For a full listing, see plustek_pp.desc.
|
||||
|
||||
This code formerly was available for creating the Linux kernelmodule
|
||||
pt_drv. This should no longer be necessary. You should be able to use
|
||||
This code formerly was available for creating the Linux kernel module
|
||||
pt_drv. This is no longer be necessary. You should be able to use
|
||||
the backend out of the box.
|
||||
|
||||
|
||||
The kernel module
|
||||
-----------------
|
||||
|
||||
As it might be helpful to create and use the kernel-module, this way still
|
||||
exists. It's possible to create this module out of the backend sources
|
||||
in sane-backends/backend. Simply do (as root user)
|
||||
|
||||
./MakeModule.sh
|
||||
|
||||
Then the module should be compiled, installed and loaded.
|
||||
|
||||
Add the following three lines to file /etc/modules.conf
|
||||
|
||||
alias char-major-40 pt_drv
|
||||
pre-install pt_drv modprobe -k parport
|
||||
options pt_drv lampoff=180 warmup=15 port=0x378 lOffonEnd=0 mov=0 slowIO=1
|
||||
|
||||
See man page for sane-plustek_pp ("man sane-plustek_pp") for explanation of
|
||||
these options.
|
||||
|
||||
Now "scanimage -L" should show something like this:
|
||||
device `plustek:/dev/pt_drv' is a Plustek 9630P flatbed scanner
|
||||
|
||||
|
||||
Known Problems:
|
||||
---------------
|
||||
|
||||
Sometimes it is necessary to change the ioctl-interface between the
|
||||
driver and the backend, in this case the version number of the communication
|
||||
protocol will be changed and newer drivers won't work with older backends
|
||||
and vice versa.
|
||||
In this case (error -9019 in the SANE debug output!!) you have to recompile SANE
|
||||
AND the driver (have a look at the installation procedure above).
|
||||
|
|
|
@ -4,10 +4,7 @@ Plustek-USB.txt (2005-08-08) Gerhard Jäger <gerhard@gjaeger.de>
|
|||
NOTE:
|
||||
-----
|
||||
|
||||
ALL YOU NEED TO RUN YOUR USB SCANNER IS ALREADY INCLUDED. THERE'S
|
||||
NO NEED TO INSTALL THE KERNEL MODULE pt_drv. THIS ONE IS ONLY NEEDED
|
||||
FOR THE PLUSTEK PARALLELPORT SCANNER.
|
||||
|
||||
ALL YOU NEED TO RUN YOUR USB SCANNER IS ALREADY INCLUDED.
|
||||
|
||||
List of all currently implemented devices
|
||||
-----------------------------------------
|
||||
|
|
|
@ -9,18 +9,10 @@ The
|
|||
library implements a SANE (Scanner Access Now Easy) backend that
|
||||
provides access to Plustek ASIC 9600[1/3] and P9800[1/3] based
|
||||
parallel port flatbed scanners.
|
||||
The access of the scanner is either done directly by the backend
|
||||
or via kernel module, called pt_drv which can be created out of
|
||||
the
|
||||
.B sane\-plustek_pp
|
||||
backend code \- see also section
|
||||
.B "BUILDING THE KERNEL MODULE"
|
||||
for further information.
|
||||
|
||||
.SH "SUPPORTED DEVICES"
|
||||
|
||||
At present, the following scanners should work with this backend
|
||||
and/or the kernel module:
|
||||
At present, the following scanners should work with this backend:
|
||||
.PP
|
||||
.B "PLUSTEK SCANNERS"
|
||||
.PP
|
||||
|
@ -112,18 +104,14 @@ BrightScan OpticPro OpticPro P12
|
|||
.ft R
|
||||
|
||||
.SH "DEVICE NAMES"
|
||||
This backend works in two modes, the so called "direct-mode"
|
||||
and the "kernel-mode". In direct-mode, the user-space backend is
|
||||
used, in kernel-mode, you should have a kernel-module named pt_drv
|
||||
loaded.
|
||||
This backends default device is:
|
||||
This backend's default device is:
|
||||
.PP
|
||||
.RS
|
||||
.I 0x378
|
||||
.RE
|
||||
.PP
|
||||
This "default device" will be used, if no configuration
|
||||
file can be found. It is rather the base address of the parallel port
|
||||
This "default device" will be used if no configuration
|
||||
file can be found. It is the base address of the parallel port
|
||||
on i386 machines.
|
||||
.PP
|
||||
As the backend supports up to four devices, it is possible to
|
||||
|
@ -150,24 +138,13 @@ For a proper setup, you will need at least two entries:
|
|||
.I device 0x378
|
||||
.RE
|
||||
.PP
|
||||
or
|
||||
.RS
|
||||
.I [kernel]
|
||||
.br
|
||||
.I device /dev/pt_drv
|
||||
.RE
|
||||
.PP
|
||||
.I direct
|
||||
tells the backend, that the following devicename (here
|
||||
.IR 0x378 )
|
||||
has to be interpreted as parallel port scanner device. In
|
||||
fact it is the address to use, alternatively you can use
|
||||
fact it is the address to use. Alternatively you can use
|
||||
.I /dev/parport0
|
||||
if the backend has been compiled with libieee1284 support.
|
||||
.I kernel
|
||||
should only be used, when a kernel-module has been built
|
||||
out of the backend sources. See below for more instructions
|
||||
about this.
|
||||
.PP
|
||||
Further options:
|
||||
.PP
|
||||
|
@ -235,157 +212,6 @@ See the
|
|||
file for examples.
|
||||
.PP
|
||||
|
||||
.SH "BUILDING THE KERNEL MODULE"
|
||||
As mentioned before, the
|
||||
.B sane\-plustek_pp
|
||||
backend code can also be compiled and installed as linux kernel module. To do so,
|
||||
you will need the source-files of this sane\-backend installation.
|
||||
Unpack this tar-ball and go to the directory:
|
||||
.IR sane\-backends/doc/plustek .
|
||||
Within this directory, you should find a script called:
|
||||
.IR MakeModule.sh .
|
||||
Now if your Linux kernelsources are installed correctly,
|
||||
it should be possible to build, install and load the
|
||||
module
|
||||
.BR pt_drv .
|
||||
.B Please note,
|
||||
that the kernelsources need to be configured correctly.
|
||||
Refer to your distributions
|
||||
manual on how this is done. As root user, try
|
||||
.PP
|
||||
.I ./MakeModule.sh
|
||||
.PP
|
||||
the script will try and get all necessary information about your
|
||||
running kernel and will lead you through the whole installation
|
||||
process.
|
||||
.br
|
||||
.B Note: Installing and loading the can only be done as
|
||||
superuser.
|
||||
.PP
|
||||
|
||||
.SH "KERNEL MODULE SETUP"
|
||||
The configuration of the kernel module is done by providing
|
||||
some or more options found below to the kernel module at
|
||||
load time. This can be done by invoking
|
||||
.BR insmod (8)
|
||||
with the appropriate parameters or appending the options to the file
|
||||
.I /etc/modules.conf (kernel < 2.6.x)
|
||||
or
|
||||
.I /etc/modprobe.conf (kernel >= 2.6.x)
|
||||
.PP
|
||||
.B
|
||||
The Options:
|
||||
.br
|
||||
lampoff=lll
|
||||
.RS
|
||||
The value
|
||||
.I lll
|
||||
tells the driver, after how many seconds to
|
||||
switch-off the lamp(s). The default value is 180.
|
||||
0 will disable this feature.
|
||||
.br
|
||||
.B HINT:
|
||||
Do not use a value that is too small, because often
|
||||
switching on/off the lamps will reduce their lifetime.
|
||||
.RE
|
||||
.PP
|
||||
port=ppp
|
||||
.RS
|
||||
.I ppp
|
||||
specifies the port base address, where the scanner
|
||||
is connected to. The default value is 0x378, which
|
||||
is normally a standard.
|
||||
.RE
|
||||
.PP
|
||||
warmup=www
|
||||
.RS
|
||||
.I www
|
||||
specifies the time in seconds, how long a lamp has to be on,
|
||||
until the driver will start to scan. The default value is 30.
|
||||
.RE
|
||||
.PP
|
||||
lOffonEnd=e
|
||||
.RS
|
||||
.I e
|
||||
specifies the behaviour when unloading the driver, 1 --> switch
|
||||
lamps off, 0 --> do not change lamp status
|
||||
.RE
|
||||
.PP
|
||||
slowIO=s
|
||||
.RS
|
||||
.I s
|
||||
specifies which I/O functions the driver should use, 1 --> use
|
||||
delayed functions, 0 --> use the non-delayed ones
|
||||
.RE
|
||||
.PP
|
||||
forceMode=fm
|
||||
.RS
|
||||
.I fm
|
||||
specifies port mode which should be used, 0 --> autodetection,
|
||||
1 --> use SPP mode and 2 --> use EPP mode
|
||||
.RE
|
||||
.PP
|
||||
mov=m
|
||||
.RS
|
||||
.TP
|
||||
.IR m " = 0"
|
||||
default: no override
|
||||
.TP
|
||||
.IR m " = 1"
|
||||
OpticPro 9630PL override (works if OP9630
|
||||
has been detected) forces legal size (14")
|
||||
.TP
|
||||
.IR m " = 2"
|
||||
Primax 4800Direct override (works if OP600
|
||||
has been detected) swaps red/green color
|
||||
.TP
|
||||
.IR m " = 3"
|
||||
OpticPro 9636 override (works if OP9636 has
|
||||
been detected) disables backends
|
||||
transparency/negative capabilities
|
||||
.TP
|
||||
.IR m " = 4"
|
||||
OpticPro 9636P override (works if OP9636 has
|
||||
been detected) disables backends
|
||||
transparency/negative capabilities
|
||||
.TP
|
||||
.IR m " = 5"
|
||||
OpticPro A3I override (works if OP12000 has
|
||||
been detected) enables A3 scanning
|
||||
.TP
|
||||
.IR m " = 6"
|
||||
OpticPro 4800P override (works if OP600
|
||||
has been detected) swaps red/green color
|
||||
.TP
|
||||
.IR m " = 7"
|
||||
Primax 4800Direct 30bit override (works if
|
||||
OP4830 has been detected)
|
||||
.RE
|
||||
.PP
|
||||
Sample entry for file
|
||||
.IR /etc/modules.conf :
|
||||
.PP
|
||||
.RS
|
||||
alias char\-major\-40 pt_drv
|
||||
.br
|
||||
pre-install pt_drv modprobe -k parport
|
||||
.br
|
||||
options pt_drv lampoff=180 warmup=15 port=0x378 lOffonEnd=0 mov=0 slowIO=0 forceMode=0
|
||||
.RE
|
||||
.PP
|
||||
For multidevice support, simply add values separated by commas to
|
||||
the different options
|
||||
.PP
|
||||
.RS
|
||||
options pt_drv port=0x378,0x278 mov=0,4 slowIO=0,1 forceMode=0,1
|
||||
.RE
|
||||
.PP
|
||||
Remember to call
|
||||
.BR depmod (8)
|
||||
after changing
|
||||
.IR /etc/conf.modules .
|
||||
.PP
|
||||
|
||||
.SH "PARALLEL PORT MODES"
|
||||
.PP
|
||||
The current driver works best, when the parallel port
|
||||
|
@ -423,13 +249,6 @@ The static library implementing this backend.
|
|||
.I @LIBDIR@/libsane\-plustek_pp.so
|
||||
The shared library implementing this backend (present on systems that
|
||||
support dynamic loading).
|
||||
.TP
|
||||
.I /lib/modules/<Kernel-Version>/kernel/drivers/parport/pt_drv.o
|
||||
The Linux kernelmodule for kernels < 2.6.x.
|
||||
.TP
|
||||
.I /lib/modules/<Kernel-Version>/kernel/drivers/parport/pt_drv.ko
|
||||
The Linux kernelmodule for kernels >= 2.6.x.
|
||||
.PP
|
||||
|
||||
.SH ENVIRONMENT
|
||||
.TP
|
||||
|
|
Ładowanie…
Reference in New Issue