kopia lustrzana https://gitlab.com/sane-project/backends
Removed direct dependence of sm3600 on libusb. Used sanei_usb instead. Based on
patch from Francois Revol <revol@free.fr>. Updated documentation accordingly. Fixed compilation warnings.merge-requests/1/head
rodzic
ee11f5abcf
commit
a2f1183de1
|
@ -11,7 +11,13 @@
|
||||||
* tools/check-usb-chip.c: Added check for combination of a
|
* tools/check-usb-chip.c: Added check for combination of a
|
||||||
PowerVision PV8630 (USB->parport bridge) and National
|
PowerVision PV8630 (USB->parport bridge) and National
|
||||||
Semiconductor LM9830 as used in the HP 4200. Fixed compilation
|
Semiconductor LM9830 as used in the HP 4200. Fixed compilation
|
||||||
warning.
|
warning.
|
||||||
|
* configure configure.in backend/Makefile.in backend/sm3600-scanusb.c
|
||||||
|
backend/sm3600-scanutil.c backend/sm3600.c backend/sm3600.h
|
||||||
|
doc/sane-sm3600.man doc/sane-usb.man:
|
||||||
|
Removed direct dependence of sm3600 on libusb. Used sanei_usb
|
||||||
|
instead. Based on patch from François Revol <revol@free.fr>.
|
||||||
|
Updated documentation accordingly. Fixed compilation warnings.
|
||||||
|
|
||||||
2005-08-15 Oliver Schwartz <Oliver.Schwartz@gmx.de>
|
2005-08-15 Oliver Schwartz <Oliver.Schwartz@gmx.de>
|
||||||
|
|
||||||
|
|
|
@ -430,6 +430,7 @@ libsane-sharp.la: ../sanei/sanei_config2.lo
|
||||||
libsane-sharp.la: ../sanei/sanei_constrain_value.lo
|
libsane-sharp.la: ../sanei/sanei_constrain_value.lo
|
||||||
libsane-sharp.la: ../sanei/sanei_scsi.lo
|
libsane-sharp.la: ../sanei/sanei_scsi.lo
|
||||||
libsane-sm3600.la: ../sanei/sanei_constrain_value.lo
|
libsane-sm3600.la: ../sanei/sanei_constrain_value.lo
|
||||||
|
libsane-sm3600.la: ../sanei/sanei_usb.lo
|
||||||
libsane-sm3840.la: ../sanei/sanei_config2.lo
|
libsane-sm3840.la: ../sanei/sanei_config2.lo
|
||||||
libsane-sm3840.la: ../sanei/sanei_constrain_value.lo
|
libsane-sm3840.la: ../sanei/sanei_constrain_value.lo
|
||||||
libsane-sm3840.la: ../sanei/sanei_usb.lo
|
libsane-sm3840.la: ../sanei/sanei_usb.lo
|
||||||
|
|
|
@ -68,14 +68,20 @@ static int TransferControlMsg(TInstance *this,
|
||||||
int cchBuffer,
|
int cchBuffer,
|
||||||
int cJiffiesTimeout)
|
int cJiffiesTimeout)
|
||||||
{
|
{
|
||||||
return usb_control_msg(this->hScanner,
|
SANE_Status err;
|
||||||
|
|
||||||
|
cJiffiesTimeout = cJiffiesTimeout;
|
||||||
|
|
||||||
|
err = sanei_usb_control_msg (this->hScanner,
|
||||||
nReqType,
|
nReqType,
|
||||||
nRequest,
|
nRequest,
|
||||||
nValue,
|
nValue,
|
||||||
nIndex,
|
nIndex,
|
||||||
pBuffer,
|
|
||||||
cchBuffer,
|
cchBuffer,
|
||||||
cJiffiesTimeout);
|
pBuffer);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
return cchBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* **********************************************************************
|
/* **********************************************************************
|
||||||
|
@ -90,11 +96,18 @@ static int TransferBulkRead(TInstance *this,
|
||||||
int cchMax,
|
int cchMax,
|
||||||
int cJiffiesTimeout)
|
int cJiffiesTimeout)
|
||||||
{
|
{
|
||||||
return usb_bulk_read(this->hScanner,
|
int err;
|
||||||
nEndPoint,
|
size_t sz = cchMax;
|
||||||
pBuffer,
|
|
||||||
cchMax,
|
nEndPoint = nEndPoint;
|
||||||
cJiffiesTimeout);
|
cJiffiesTimeout = cJiffiesTimeout;
|
||||||
|
|
||||||
|
err = sanei_usb_read_bulk(this->hScanner,
|
||||||
|
pBuffer,
|
||||||
|
&sz);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* **********************************************************************
|
/* **********************************************************************
|
||||||
|
@ -310,7 +323,9 @@ int BulkRead(TInstance *this, FILE *fhOut, unsigned int cchBulk)
|
||||||
{
|
{
|
||||||
rc=SetError(this,SANE_STATUS_IO_ERROR,
|
rc=SetError(this,SANE_STATUS_IO_ERROR,
|
||||||
"bulk read of %d bytes failed: %s",
|
"bulk read of %d bytes failed: %s",
|
||||||
cchChunk,usb_strerror());
|
cchChunk,
|
||||||
|
"I/O error"
|
||||||
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,7 +386,9 @@ int BulkReadBuffer(TInstance *this,
|
||||||
else
|
else
|
||||||
rc=SetError(this,SANE_STATUS_IO_ERROR,
|
rc=SetError(this,SANE_STATUS_IO_ERROR,
|
||||||
"bulk read of %d bytes failed: %s",
|
"bulk read of %d bytes failed: %s",
|
||||||
cchChunk,usb_strerror());
|
cchChunk,
|
||||||
|
"I/O error"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
dprintf(DEBUG_COMM,"writing %d bytes\n",cchRead);
|
dprintf(DEBUG_COMM,"writing %d bytes\n",cchRead);
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ $Id$
|
||||||
|
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
#include "sm3600-scantool.h"
|
#include "sm3600-scantool.h"
|
||||||
|
|
||||||
/* **********************************************************************
|
/* **********************************************************************
|
||||||
|
|
109
backend/sm3600.c
109
backend/sm3600.c
|
@ -55,24 +55,25 @@ Start: 2.4.2001
|
||||||
|
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
|
|
||||||
#include "sane/config.h"
|
#include "../include/sane/config.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <usb.h>
|
#define BUILD 6
|
||||||
|
|
||||||
#define BUILD 5
|
|
||||||
|
|
||||||
#ifndef BACKEND_NAME
|
#ifndef BACKEND_NAME
|
||||||
#define BACKEND_NAME sm3600
|
#define BACKEND_NAME sm3600
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "sane/sane.h"
|
#include "../include/sane/sane.h"
|
||||||
#include "sane/sanei.h"
|
#include "../include/sane/sanei.h"
|
||||||
#include "sane/sanei_backend.h"
|
#include "../include/sane/sanei_backend.h"
|
||||||
#include "sane/sanei_config.h"
|
#include "../include/sane/sanei_config.h"
|
||||||
#include "sane/saneopts.h"
|
#include "../include/sane/saneopts.h"
|
||||||
|
#include "../include/sane/sanei_usb.h"
|
||||||
|
|
||||||
|
#undef HAVE_LIBUSB
|
||||||
|
|
||||||
/* prevent inclusion of scantool.h */
|
/* prevent inclusion of scantool.h */
|
||||||
#define SCANTOOL_H
|
#define SCANTOOL_H
|
||||||
|
@ -326,7 +327,8 @@ InitOptions(TInstance *this)
|
||||||
}
|
}
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
RegisterSaneDev (struct usb_device *pdevUSB, TModel model, char *szName){
|
RegisterSaneDev (TModel model, SANE_String_Const szName)
|
||||||
|
{
|
||||||
TDevice * q;
|
TDevice * q;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
@ -342,7 +344,6 @@ RegisterSaneDev (struct usb_device *pdevUSB, TModel model, char *szName){
|
||||||
q->sane.model = "ScanMaker 3600";
|
q->sane.model = "ScanMaker 3600";
|
||||||
q->sane.type = "flatbed scanner";
|
q->sane.type = "flatbed scanner";
|
||||||
|
|
||||||
q->pdev=pdevUSB;
|
|
||||||
q->model=model;
|
q->model=model;
|
||||||
|
|
||||||
++num_devices;
|
++num_devices;
|
||||||
|
@ -351,13 +352,37 @@ RegisterSaneDev (struct usb_device *pdevUSB, TModel model, char *szName){
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SANE_Status
|
||||||
|
sm_usb_attach (SANE_String_Const dev_name)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
SANE_Status err;
|
||||||
|
SANE_Word v, p;
|
||||||
|
TModel model;
|
||||||
|
|
||||||
|
err = sanei_usb_open(dev_name, &fd);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = sanei_usb_get_vendor_product (fd, &v, &p);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
sanei_usb_close (fd);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
DBG (DEBUG_JUNK, "found dev %04X/%04X, %s\n", v, p, dev_name);
|
||||||
|
model = GetScannerModel (v, p);
|
||||||
|
if (model != unknown)
|
||||||
|
RegisterSaneDev (model, dev_name);
|
||||||
|
|
||||||
|
sanei_usb_close(fd);
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
SANE_Status
|
SANE_Status
|
||||||
sane_init (SANE_Int *version_code, SANE_Auth_Callback authCB)
|
sane_init (SANE_Int *version_code, SANE_Auth_Callback authCB)
|
||||||
{
|
{
|
||||||
struct usb_bus *pbus;
|
int i;
|
||||||
struct usb_device *pdev;
|
|
||||||
int iBus;
|
|
||||||
|
|
||||||
DBG_INIT();
|
DBG_INIT();
|
||||||
|
|
||||||
|
@ -372,38 +397,11 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authCB)
|
||||||
}
|
}
|
||||||
|
|
||||||
pdevFirst=NULL;
|
pdevFirst=NULL;
|
||||||
|
|
||||||
usb_init();
|
sanei_usb_init();
|
||||||
usb_find_busses();
|
for (i = 0; aScanners[i].idProduct; i++)
|
||||||
if (!usb_busses)
|
|
||||||
return SANE_STATUS_IO_ERROR;
|
|
||||||
|
|
||||||
usb_find_devices();
|
|
||||||
|
|
||||||
iBus=0;
|
|
||||||
DBG(DEBUG_INFO,"starting bus scan\n");
|
|
||||||
for (pbus = usb_busses; pbus; pbus = pbus->next)
|
|
||||||
{
|
{
|
||||||
int iDev=0;
|
sanei_usb_find_devices(SCANNER_VENDOR, aScanners[i].idProduct, sm_usb_attach);
|
||||||
iBus++;
|
|
||||||
/* 0.1.3b no longer has a "busnum" member */
|
|
||||||
DBG(DEBUG_JUNK,"scanning bus %s\n", pbus->dirname);
|
|
||||||
for (pdev=pbus->devices; pdev; pdev = pdev->next)
|
|
||||||
{
|
|
||||||
TModel model;
|
|
||||||
iDev++;
|
|
||||||
DBG(DEBUG_JUNK,"found dev %04X/%04X\n",
|
|
||||||
pdev->descriptor.idVendor,
|
|
||||||
pdev->descriptor.idProduct);
|
|
||||||
model=GetScannerModel(pdev->descriptor.idVendor,
|
|
||||||
pdev->descriptor.idProduct);
|
|
||||||
if (model!=unknown)
|
|
||||||
{
|
|
||||||
char ach[100];
|
|
||||||
sprintf(ach,"%d/%d",iBus,iDev);
|
|
||||||
RegisterSaneDev(pdev,model,ach);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
@ -464,8 +462,11 @@ sane_open (SANE_String_Const devicename, SANE_Handle *handle)
|
||||||
if (devicename[0]) /* selected */
|
if (devicename[0]) /* selected */
|
||||||
{
|
{
|
||||||
for (pdev=pdevFirst; pdev; pdev=pdev->pNext)
|
for (pdev=pdevFirst; pdev; pdev=pdev->pNext)
|
||||||
|
{
|
||||||
|
DBG(DEBUG_VERBOSE,"%s<>%s\n",devicename, pdev->sane.name);
|
||||||
if (!strcmp(devicename,pdev->sane.name))
|
if (!strcmp(devicename,pdev->sane.name))
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
/* no dynamic post-registration */
|
/* no dynamic post-registration */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -482,14 +483,11 @@ sane_open (SANE_String_Const devicename, SANE_Handle *handle)
|
||||||
pinstFirst=this;
|
pinstFirst=this;
|
||||||
this->model=pdev->model; /* memorize model */
|
this->model=pdev->model; /* memorize model */
|
||||||
/* open and prepare USB scanner handle */
|
/* open and prepare USB scanner handle */
|
||||||
this->hScanner=usb_open(pdev->pdev);
|
|
||||||
if (!this->hScanner)
|
if (sanei_usb_open (devicename, &this->hScanner) != SANE_STATUS_GOOD)
|
||||||
return SetError(this,SANE_STATUS_IO_ERROR, "cannot open scanner device");
|
return SetError (this, SANE_STATUS_IO_ERROR, "cannot open scanner device");
|
||||||
rc=SANE_STATUS_GOOD;
|
|
||||||
if (usb_claim_interface(this->hScanner, 0))
|
rc = SANE_STATUS_GOOD;
|
||||||
return SetError(this,SANE_STATUS_IO_ERROR, "cannot claim IF");
|
|
||||||
if (usb_set_configuration(this->hScanner, 1))
|
|
||||||
return SetError(this,SANE_STATUS_IO_ERROR, "cannot set USB config 1");
|
|
||||||
|
|
||||||
this->quality=fast;
|
this->quality=fast;
|
||||||
return InitOptions(this);
|
return InitOptions(this);
|
||||||
|
@ -505,8 +503,9 @@ sane_close (SANE_Handle handle)
|
||||||
{
|
{
|
||||||
if (this->state.bScanning)
|
if (this->state.bScanning)
|
||||||
EndScan(this);
|
EndScan(this);
|
||||||
usb_close(this->hScanner);
|
|
||||||
this->hScanner=NULL;
|
sanei_usb_close(this->hScanner);
|
||||||
|
this->hScanner=-1;
|
||||||
}
|
}
|
||||||
ResetCalibration(this); /* release calibration data */
|
ResetCalibration(this); /* release calibration data */
|
||||||
/* unlink active device entry */
|
/* unlink active device entry */
|
||||||
|
|
|
@ -190,7 +190,7 @@ typedef struct TInstance {
|
||||||
TQuality quality;
|
TQuality quality;
|
||||||
TMode mode;
|
TMode mode;
|
||||||
TModel model;
|
TModel model;
|
||||||
usb_dev_handle *hScanner;
|
int hScanner;
|
||||||
FILE *fhLog;
|
FILE *fhLog;
|
||||||
FILE *fhScan;
|
FILE *fhScan;
|
||||||
int ichPageBuffer; /* write position in full page buffer */
|
int ichPageBuffer; /* write position in full page buffer */
|
||||||
|
|
|
@ -26142,7 +26142,8 @@ echo "$as_me: Manually selected backends: ${BACKENDS}" >&6;}
|
||||||
microtek2 mustek mustek_usb nec pie plustek \
|
microtek2 mustek mustek_usb nec pie plustek \
|
||||||
plustek_pp ricoh s9036 sceptre sharp \
|
plustek_pp ricoh s9036 sceptre sharp \
|
||||||
sp15c st400 tamarack test teco1 teco2 teco3 umax umax_pp umax1220u \
|
sp15c st400 tamarack test teco1 teco2 teco3 umax umax_pp umax1220u \
|
||||||
artec_eplus48u ma1509 ibm hp5400 u12 snapscan niash sm3840 hp4200"
|
artec_eplus48u ma1509 ibm hp5400 u12 snapscan niash sm3840 hp4200 \
|
||||||
|
sm3600"
|
||||||
|
|
||||||
if test "${sane_cv_use_libjpeg}" != "yes"; then
|
if test "${sane_cv_use_libjpeg}" != "yes"; then
|
||||||
echo "*** disabling DC210 backend (failed to find JPEG library)"
|
echo "*** disabling DC210 backend (failed to find JPEG library)"
|
||||||
|
@ -26216,12 +26217,6 @@ else
|
||||||
echo "*** disabling pnm backend (not selected manually)"
|
echo "*** disabling pnm backend (not selected manually)"
|
||||||
|
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
if test "${HAVE_LIBUSB}" != "yes" ; then
|
|
||||||
echo "*** disabling SM3600 backend (libusb or usb.h not found)"
|
|
||||||
else
|
|
||||||
BACKENDS="${BACKENDS} sm3600"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -337,7 +337,8 @@ else
|
||||||
microtek2 mustek mustek_usb nec pie plustek \
|
microtek2 mustek mustek_usb nec pie plustek \
|
||||||
plustek_pp ricoh s9036 sceptre sharp \
|
plustek_pp ricoh s9036 sceptre sharp \
|
||||||
sp15c st400 tamarack test teco1 teco2 teco3 umax umax_pp umax1220u \
|
sp15c st400 tamarack test teco1 teco2 teco3 umax umax_pp umax1220u \
|
||||||
artec_eplus48u ma1509 ibm hp5400 u12 snapscan niash sm3840 hp4200"
|
artec_eplus48u ma1509 ibm hp5400 u12 snapscan niash sm3840 hp4200 \
|
||||||
|
sm3600"
|
||||||
|
|
||||||
if test "${sane_cv_use_libjpeg}" != "yes"; then
|
if test "${sane_cv_use_libjpeg}" != "yes"; then
|
||||||
echo "*** disabling DC210 backend (failed to find JPEG library)"
|
echo "*** disabling DC210 backend (failed to find JPEG library)"
|
||||||
|
@ -409,12 +410,6 @@ else
|
||||||
], [
|
], [
|
||||||
echo "*** disabling pnm backend (not selected manually)"
|
echo "*** disabling pnm backend (not selected manually)"
|
||||||
])
|
])
|
||||||
|
|
||||||
if test "${HAVE_LIBUSB}" != "yes" ; then
|
|
||||||
echo "*** disabling SM3600 backend (libusb or usb.h not found)"
|
|
||||||
else
|
|
||||||
BACKENDS="${BACKENDS} sm3600"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH sane-sm3600 5 "10.02.2002" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
.TH sane-sm3600 5 "16 August 2005" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||||
.IX sane-sm3600
|
.IX sane-sm3600
|
||||||
.SH NAME
|
.SH NAME
|
||||||
sane-sm3600 \- SANE backend for Microtek scanners with M011 USB chip
|
sane-sm3600 \- SANE backend for Microtek scanners with M011 USB chip
|
||||||
|
@ -9,7 +9,7 @@ library implements a SANE (Scanner Access Now Easy) backend that
|
||||||
provides access to some Microtek scanners with the Toshiba M011 custom
|
provides access to some Microtek scanners with the Toshiba M011 custom
|
||||||
USB chip. This backend should be considered alpha.
|
USB chip. This backend should be considered alpha.
|
||||||
.PP
|
.PP
|
||||||
There exist a backends for Microtek scanners with SCSI command set.
|
There are also backends for Microtek scanners with SCSI command set.
|
||||||
Refer to sane-microtek(5) and sane-microtek2(5) for details.
|
Refer to sane-microtek(5) and sane-microtek2(5) for details.
|
||||||
.PP
|
.PP
|
||||||
At present, the following
|
At present, the following
|
||||||
|
@ -56,23 +56,6 @@ The static library implementing this backend.
|
||||||
The shared library implementing this backend (present on systems that
|
The shared library implementing this backend (present on systems that
|
||||||
support dynamic loading).
|
support dynamic loading).
|
||||||
|
|
||||||
.SH PERMISSIONS AND INTERFACES
|
|
||||||
|
|
||||||
The backend uses \fBlibusb\fR and it's pseudo files in
|
|
||||||
\fI/proc/bus/usb/*\fR. Since \fBlibusb\fR versions 0.1.3b and 0.1.4 have
|
|
||||||
incompatible binary data structures, You must be shure not to have obsolete
|
|
||||||
header files. When You mix wrong versions, the scanner detection code will
|
|
||||||
raise a "segment violation".
|
|
||||||
|
|
||||||
These files are normally owned by \fBroot\fR and You are responsible
|
|
||||||
to get access to these files, for example \fBchown\fR-ing them to
|
|
||||||
Yourself. If You have no right permissions, the backend will find the
|
|
||||||
device, but You'll get an I/O error.
|
|
||||||
|
|
||||||
The better way is to use automatical \fBhotplugging\fR. See
|
|
||||||
\fIhttp://sm3600.sf.net/hotplug.html\fR for instructions and useful
|
|
||||||
links.
|
|
||||||
|
|
||||||
.SH ENVIRONMENT
|
.SH ENVIRONMENT
|
||||||
.TP
|
.TP
|
||||||
.B SANE_DEBUG_SM3600
|
.B SANE_DEBUG_SM3600
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH sane-usb 5 "29 May 2005" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
.TH sane-usb 5 "16 August 2005" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||||
.IX sane-usb
|
.IX sane-usb
|
||||||
.SH NAME
|
.SH NAME
|
||||||
sane-usb \- USB configuration tips for SANE
|
sane-usb \- USB configuration tips for SANE
|
||||||
|
@ -7,14 +7,12 @@ This manual page contains information on how to access scanners with a USB
|
||||||
interface. It focusses on two main topics: getting the scanner detected by the
|
interface. It focusses on two main topics: getting the scanner detected by the
|
||||||
operating system kernel and using it with SANE.
|
operating system kernel and using it with SANE.
|
||||||
.PP
|
.PP
|
||||||
This page applies to most backends and scanners, as they use the generic
|
This page applies to USB most backends and scanners, as they use the generic
|
||||||
sanei_usb interface. However, there are some exceptions: USB Scanners
|
sanei_usb interface. However, there is one exceptions: USB Scanners
|
||||||
supported by the microtek2 backend need a special USB kernel
|
supported by the microtek2 backend need a special USB kernel
|
||||||
driver, see
|
driver, see
|
||||||
.BR sane-microtek2 (5)
|
.BR sane-microtek2 (5)
|
||||||
for details. The sm3600 backend accesses scanners over libusb dierctly. See the
|
for details.
|
||||||
appropriate section in this manpage and
|
|
||||||
.BR sane-sm3600 (5).
|
|
||||||
|
|
||||||
.SH "QUICK START"
|
.SH "QUICK START"
|
||||||
This is a short HOWTO-like section. For the full details, read the following
|
This is a short HOWTO-like section. For the full details, read the following
|
||||||
|
|
Ładowanie…
Reference in New Issue