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!708
escl-add-user-and-password
Ralph Little 2022-03-25 03:49:57 +00:00
commit c1c77436f4
19 zmienionych plików z 11 dodań i 2177 usunięć

Wyświetl plik

@ -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__ */

Wyświetl plik

@ -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)) { \

Wyświetl plik

@ -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

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);

Wyświetl plik

@ -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 ......................................................*/

Wyświetl plik

@ -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( &current_time );
#else
gettimeofday(&current_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
}
}
}

Wyświetl plik

@ -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 ...................................................*/

Wyświetl plik

@ -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 ...................................................*/

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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.

Wyświetl plik

@ -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."

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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).

Wyświetl plik

@ -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
-----------------------------------------

Wyświetl plik

@ -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