Genius Vivid 4xe now has color order RGB. Removed 50 dpi for Mustek BearPaw 2448

as that resolution doesn't work. Make sure that the lamp of the Mustek A3 USB
gets warmed up. It's a CIS scanner with a lamp. That code is untested. Full scan
starts scanning from the start position of the white strip now. Added detection
for Genius Vivid 1200 EX. Fixed product id of Mustek BearPaw 2448 TA Plus. Other
minor updates.
merge-requests/1/head
Henning Geinitz 2004-03-19 18:55:35 +00:00
rodzic 75018e1ad0
commit aafcfe6a8e
9 zmienionych plików z 218 dodań i 47 usunięć

Wyświetl plik

@ -1,3 +1,16 @@
2004-03-19 Henning Meier-Geinitz <henning@meier-geinitz.de>
* backend/gt68xx.c backend/gt68xx.conf backend/gt68xx_devices.c
backend/gt68xx_high.c backend/gt68xx_low.h doc/sane-gt68xx.man
doc/descriptions/gt68xx.desc doc/gt68xx/gt68xx.CHANGES: Genius
Vivid 4xe now has color order RGB. Removed 50 dpi for Mustek
BearPaw 2448 as that resolution doesn't work. Make sure that the
lamp of the Mustek A3 USB gets warmed up. It's a CIS scanner with
a lamp. That code is untested. Full scan starts scanning from the
start position of the white strip now. Added detection for Genius
Vivid 1200 EX. Fixed product id of Mustek BearPaw 2448 TA
Plus. Other minor updates.
2004-03-15 Oliver Rauch <oliver.rauch@rauch-domain.de>
* backend/umax: bugfix for sense_handler and do_calibration

Wyświetl plik

@ -48,7 +48,7 @@
#include "../include/sane/config.h"
#define BUILD 54
#define BUILD 56
#define MAX_DEBUG
#define WARMUP_TIME 30
#define CALIBRATION_HEIGHT 2.5
@ -278,7 +278,7 @@ setup_scan_request (GT68xx_Scanner * s, GT68xx_Scan_Request * scan_request)
if (s->val[OPT_FULL_SCAN].w == SANE_TRUE)
{
scan_request->x0 -= s->dev->model->x_offset;
scan_request->y0 -= s->dev->model->y_offset;
scan_request->y0 -= (s->dev->model->y_offset - s->dev->model->y_offset_calib);
scan_request->xs += s->dev->model->x_offset;
scan_request->ys += s->dev->model->y_offset;
}
@ -478,7 +478,7 @@ init_options (GT68xx_Scanner * s)
s->opt[OPT_LAMP_ON].unit = SANE_UNIT_NONE;
s->opt[OPT_LAMP_ON].constraint_type = SANE_CONSTRAINT_NONE;
s->val[OPT_LAMP_ON].w = SANE_FALSE;
if (s->dev->model->is_cis)
if (s->dev->model->is_cis && !(s->dev->model->flags & GT68XX_FLAG_CIS_LAMP))
DISABLE (OPT_LAMP_ON);
/* bit depth */
@ -533,7 +533,7 @@ init_options (GT68xx_Scanner * s)
s->opt[OPT_AUTO_WARMUP].unit = SANE_UNIT_NONE;
s->opt[OPT_AUTO_WARMUP].constraint_type = SANE_CONSTRAINT_NONE;
s->val[OPT_AUTO_WARMUP].w = SANE_TRUE;
if (s->dev->model->is_cis || !debug_options)
if ((s->dev->model->is_cis && !(s->dev->model->flags & GT68XX_FLAG_CIS_LAMP)) || !debug_options)
DISABLE (OPT_AUTO_WARMUP);
/* full scan */

Wyświetl plik

@ -85,9 +85,12 @@ usb 0x055f 0x0218
usb 0x055f 0x0219
##############################################################################
# Autodetect Mustek BearPaw 2448 TA Plus
# Autodetect Mustek BearPaw 2448 TA Plus and Mustek BearPaw 2448 CS Plus
usb 0x055f 0x021a
# Mustek BearPaw 2448 CS Plus:
#model "Bearpaw 2448 CS Plus"
##############################################################################
# Autodetect Mustek BearPaw 2400 CU Plus
usb 0x055f 0x021d
@ -170,3 +173,10 @@ usb 0x0458 0x201a
# Genius Colorpage Vivid4xe doesn't need any manual settings
##############################################################################
##############################################################################
# Autodetect Genius Colorpage 1200 EX
usb 0x0458 0x201f
# Genius Colorpage Vivid 1200 EX doesn't need any manual settings
##############################################################################

Wyświetl plik

@ -315,8 +315,8 @@ static GT68xx_Model mustek_2448taplus_model = {
1200, /* if ydpi is equal or higher, use linemode */
SANE_FALSE, /* Use base_ydpi for all resolutions */
{1200, 600, 300, 100, 50, 0}, /* possible x-resolutions */
{2400, 1200, 600, 300, 100, 50, 0}, /* possible y-resolutions */
{1200, 600, 300, 100, 0}, /* possible x-resolutions */
{2400, 1200, 600, 300, 100, 0}, /* possible y-resolutions */
{16, 12, 8, 0}, /* possible depths in gray mode */
{16, 12, 8, 0}, /* possible depths in color mode */
@ -765,12 +765,12 @@ static GT68xx_Model mustek_a3usb_model = {
{12, 8, 0}, /* possible depths in color mode */
SANE_FIX (6.0), /* Start of scan area in mm (x) */
SANE_FIX (14.0), /* Start of scan area in mm (y) */
SANE_FIX (297.0), /* Size of scan area in mm (x) */
SANE_FIX (431.0), /* Size of scan area in mm (y) */
SANE_FIX (10.5), /* Start of scan area in mm (y) */
SANE_FIX (299.0), /* Size of scan area in mm (x) */
SANE_FIX (433.0), /* Size of scan area in mm (y) */
SANE_FIX (5.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (2.4), /* Start of white strip in mm (y) */
SANE_FIX (4.3), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
@ -783,14 +783,15 @@ static GT68xx_Model mustek_a3usb_model = {
0, /* CCD distcance for CCD with 6 lines) */
COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
{0x14, 0x07, 0x14, 0x07, 0x14, 0x07}, /* Default offset/gain */
{0x157, 0x157, 0x157}, /* Default exposure parameters */
SANE_FIX (2.0), /* Default gamma value */
{0x14, 0x05, 0x12, 0x05, 0x17, 0x0c}, /* Default offset/gain */
{0x255, 0x255, 0x255}, /* Default exposure parameters */
SANE_FIX (1.5), /* Default gamma value */
SANE_FALSE, /* Is this a CIS scanner? */
0 /* Which flags are needed for this scanner? */
/* Tested by Pedro Morais <morais@inocam.com>, changes to CCD by hmg, white
strip/black mark untested, line distance must be set up */
SANE_TRUE, /* Is this a CIS scanner? */
GT68XX_FLAG_UNTESTED | GT68XX_FLAG_CIS_LAMP /* Which flags are needed for this scanner? */
/* Tested by some people. This scanner is a bit strange as it uses a CIS sensor
but it also has a lamp. So the lamp needs to be heated but CIS mode must be
used for scanning. */
};
static GT68xx_Model lexmark_x73_model = {
@ -1080,14 +1081,14 @@ static GT68xx_Model genius_vivid4xe_model = {
0, 8, 16, /* RGB CCD Line-distance correction in pixel */
0, /* CCD distcance for CCD with 6 lines) */
COLOR_ORDER_BGR, /* Order of the CCD/CIS colors */
COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
{0x1c, 0x29, 0x1c, 0x2c, 0x1c, 0x2b}, /* Default offset/gain */
{0x157, 0x157, 0x157}, /* Default exposure parameters */
SANE_FIX (2.0), /* Default gamma value */
SANE_FALSE, /* Is this a CIS scanner? */
GT68XX_FLAG_OFFSET_INV /* Which flags are needed for this scanner? */
/* mostly untested, based on the Genius Vivid3x */
/* tested a bit */
};
static GT68xx_Model genius_vivid3xe_model = {
@ -1139,6 +1140,55 @@ static GT68xx_Model genius_vivid3xe_model = {
/* mostly untested, based on the Genius Vivid3x */
};
static GT68xx_Model genius_vivid1200ex_model = {
"genius-colorpage-vivid-1200-ex", /* Name */
"Genius", /* Device vendor string */
"Colorpage Vivid 1200 EX", /* Device model name */
"ccd548.fw", /* Name of the firmware file */
SANE_FALSE, /* Dynamic allocation flag */
&mustek_gt6816_command_set, /* Command set used by this scanner */
600, /* maximum optical sensor resolution */
600, /* maximum motor resolution */
600, /* base x-res used to calculate geometry */
600, /* base y-res used to calculate geometry */
50, /* if ydpi is equal or higher, use linemode */
SANE_TRUE, /* Use base_ydpi for all resolutions */
{600, 300, 150, 75, 0}, /* possible x-resolutions */
{600, 300, 150, 75, 0}, /* possible y-resolutions */
{12, 8, 0}, /* possible depths in gray mode */
{12, 8, 0}, /* possible depths in color mode */
SANE_FIX (3.5), /* Start of scan area in mm (x) */
SANE_FIX (7.5), /* Start of scan area in mm (y) */
SANE_FIX (218.0), /* Size of scan area in mm (x) */
SANE_FIX (299.0), /* Size of scan area in mm (y) */
SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (1.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
SANE_FIX (100.0), /* Size of scan area in TA mode in mm (x) */
SANE_FIX (100.0), /* Size of scan area in TA mode in mm (y) */
SANE_FIX (0.0), /* Start of white strip in TA mode in mm (y) */
0, 8, 16, /* RGB CCD Line-distance correction in pixel */
0, /* CCD distcance for CCD with 6 lines) */
COLOR_ORDER_BGR, /* Order of the CCD/CIS colors */
{0x1c, 0x29, 0x1c, 0x2c, 0x1c, 0x2b}, /* Default offset/gain */
{0x157, 0x157, 0x157}, /* Default exposure parameters */
SANE_FIX (2.0), /* Default gamma value */
SANE_FALSE, /* Is this a CIS scanner? */
GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_UNTESTED /* Which flags are needed for this scanner? */
/* untested */
};
static GT68xx_Model plustek_opticslim1200_model = {
"plustek-opticslim-1200", /* Name */
"Plustek", /* Device vendor string */
@ -1249,7 +1299,7 @@ static GT68xx_USB_Device_Entry gt68xx_usb_device_list[] = {
{0x05d8, 0x4002, &mustek_2400cu_model}, /* manual override */
{0x05d8, 0x4002, &mustek_scanexpress2400usb_model}, /* manual override */
{0x055f, 0x0210, &mustek_a3usb_model},
{0x05d8, 0x021a, &mustek_2448taplus_model},
{0x055f, 0x021a, &mustek_2448taplus_model},
{0x043d, 0x002d, &lexmark_x73_model},
{0x07b3, 0x0400, &plustek_op1248u_model},
{0x07b3, 0x0401, &plustek_op1248u_model}, /* Same scanner, different id? */
@ -1258,8 +1308,10 @@ static GT68xx_USB_Device_Entry gt68xx_usb_device_list[] = {
{0x07b3, 0x0413, &plustek_opticslim1200_model},
{0x07b3, 0x0422, &plustek_opticslim2400_model},
{0x0458, 0x2011, &genius_vivid3x_model},
{0x0458, 0x2014, &plustek_u16b_model},
{0x0458, 0x2017, &genius_vivid3xe_model},
{0x0458, 0x201a, &genius_vivid4xe_model},
{0x0458, 0x201b, &genius_vivid4x_model},
{0x0458, 0x201f, &genius_vivid1200ex_model},
{0, 0, NULL}
};

Wyświetl plik

@ -2,7 +2,7 @@
Copyright (C) 2002 Sergey Vlasov <vsu@altlinux.ru>
AFE offset/gain setting by David Stevenson <david.stevenson@zoom.co.uk>
Copyright (C) 2002 Henning Meier-Geinitz <henning@meier-geinitz.de>
Copyright (C) 2002 - 2004 Henning Meier-Geinitz <henning@meier-geinitz.de>
This file is part of the SANE package.
@ -781,7 +781,7 @@ gt68xx_scanner_calibrate (GT68xx_Scanner * scanner,
return status;
}
if (!scanner->dev->model->is_cis)
if (!scanner->dev->model->is_cis || (scanner->dev->model->flags & GT68XX_FLAG_CIS_LAMP))
usleep (500000);
status = gt68xx_scanner_start_scan_extended (scanner, &req, SA_CALIBRATE,
&params);
@ -967,7 +967,7 @@ static void
gt68xx_afe_exposure_dump (SANE_String_Const phase, int i,
GT68xx_Exposure_Parameters * exposure)
{
XDBG ((5, "set exposure %s %2d: RGB exposure time: %02x %02x %02x\n",
XDBG ((3, "set exposure %s %2d: RGB exposure time: %02x %02x %02x\n",
phase, i, exposure->r_time, exposure->g_time, exposure->b_time));
}
#endif /* not NDEBUG */
@ -1359,6 +1359,7 @@ gt68xx_afe_cis_calc_black (GT68xx_Afe_Values * values,
SANE_Int end_black;
SANE_Int i, j;
SANE_Int min_black = 255;
SANE_Int average = 0;
start_black = 0;
end_black = values->calwidth;
@ -1370,11 +1371,14 @@ gt68xx_afe_cis_calc_black (GT68xx_Afe_Values * values,
for (j = 0; j < values->callines; j++)
avg_black += (*(black_buffer + i + j * values->calwidth) >> 8);
avg_black /= values->callines;
average += avg_black;
if (avg_black < min_black)
min_black = avg_black;
}
values->black = min_black;
XDBG ((5, "%s: min_black=%02x\n", function_name, values->black));
average /= (end_black - start_black);
XDBG ((4, "%s: min_black=0x%02x, average_black=0x%02x\n", function_name, values->black,
average));
}
static void
@ -1388,19 +1392,25 @@ gt68xx_afe_cis_calc_white (GT68xx_Afe_Values * values,
start_white = 0;
end_white = values->calwidth;
values->total_white = 0;
/* find max average white value */
for (i = start_white; i < end_white; ++i)
{
SANE_Int avg_white = 0;
for (j = 0; j < values->callines; j++)
avg_white += (*(white_buffer + i + j * values->calwidth) >> 8);
{
avg_white += (*(white_buffer + i + j * values->calwidth) >> 8);
values->total_white += (*(white_buffer + i + j * values->calwidth));
}
avg_white /= values->callines;
if (avg_white > max_white)
max_white = avg_white;
}
values->white = max_white;
XDBG ((5, "%s: max_white=%02x\n", function_name, values->white));
values->total_white /= (values->callines * (end_white - start_white));
XDBG ((4, "%s: max_white=0x%02x, average_white=0x%02x\n", function_name, values->white,
values->total_white >> 8));
}
static SANE_Bool
@ -1417,18 +1427,18 @@ gt68xx_afe_cis_adjust_offset (GT68xx_Afe_Values * values,
offs = (values->offset_direction * (low - values->black) / 4);
if (offs == 0)
offs = values->offset_direction;
DBG (5, "black = %d (too low) --> offs = %d\n", values->black, offs);
DBG (4, "black = %d (too low) --> offs = %d\n", values->black, offs);
}
else if (values->black > high)
{
offs = -(values->offset_direction * (values->black - high) / 7);
if (offs == 0)
offs = -values->offset_direction;
DBG (5, "black = %d (too high) --> offs = %d\n", values->black, offs);
DBG (4, "black = %d (too high) --> offs = %d\n", values->black, offs);
}
else
{
DBG (5, "black = %d (ok)\n", values->black);
DBG (4, "black = %d (ok)\n", values->black);
}
if (offs == 0)
@ -1455,16 +1465,16 @@ gt68xx_afe_cis_adjust_gain (GT68xx_Afe_Values * values,
if (values->white < white_low)
{
g += 1;
DBG (5, "white = %d (too low) --> gain += 1\n", values->white);
DBG (4, "white = %d (too low) --> gain += 1\n", values->white);
}
else if (values->white > white_high)
{
g -= 1;
DBG (5, "white = %d (too high) --> gain -= 1\n", values->white);
DBG (4, "white = %d (too high) --> gain -= 1\n", values->white);
}
else
{
DBG (5, "white = %d (ok)\n", values->white);
DBG (4, "white = %d (ok)\n", values->white);
}
if (g < 0)
g = 0;
@ -1486,20 +1496,20 @@ gt68xx_afe_cis_adjust_exposure (GT68xx_Afe_Values * values,
if (values->white < border)
{
*exposure_time += ((border - values->white) * 2);
DBG (5, "white = %d (too low) --> += %d\n",
DBG (4, "white = %d (too low) --> += %d\n",
values->white, ((border - values->white) * 2));
return SANE_FALSE;
}
else if (values->white > border + 10)
{
*exposure_time -= ((values->white - (border + 10)) * 2);
DBG (5, "white = %d (too high) --> -= %d\n",
DBG (4, "white = %d (too high) --> -= %d\n",
values->white, ((values->white - (border + 10)) * 2));
return SANE_FALSE;
}
else
{
DBG (5, "white = %d (ok)\n", values->white);
DBG (4, "white = %d (ok)\n", values->white);
}
return SANE_TRUE;
}
@ -1619,6 +1629,49 @@ gt68xx_afe_cis_auto (GT68xx_Scanner * scanner)
if (!r_buffer || !g_buffer || !b_buffer)
return SANE_STATUS_NO_MEM;
if (scanner->dev->model->flags & GT68XX_FLAG_CIS_LAMP)
{
GT68xx_Afe_Values lamp_values = values;
SANE_Int last_white = -21;
SANE_Word i;
lamp_values.callines = 1;
/* loop waiting for lamp to give stable brightness */
for (i = 0; i < 80; i++)
{
usleep (200000);
if (i == 10)
DBG (0, "Please wait for lamp warm-up\n");
/* read line */
RIE (gt68xx_afe_cis_read_lines (&lamp_values, scanner, SANE_TRUE, SANE_FALSE,
r_buffer, g_buffer, b_buffer));
gt68xx_afe_cis_calc_white (&lamp_values, r_buffer);
XDBG ((4, "%s: check lamp stable: this white = 0x%04X, last white =0x%04X\n",
function_name, lamp_values.total_white, last_white));
if (scanner->val[OPT_AUTO_WARMUP].w == SANE_TRUE)
{
if (lamp_values.total_white <= (last_white + 20))
break; /* lamp is warmed up */
}
else
{ /* insist on 30 seconds */
struct timeval now;
int secs;
gettimeofday (&now, 0);
secs = now.tv_sec - scanner->lamp_on_time.tv_sec;
if (secs >= WARMUP_TIME)
break;
}
last_white = lamp_values.total_white;
}
}
total_count = 0;
do
{
@ -1664,6 +1717,9 @@ gt68xx_afe_cis_auto (GT68xx_Scanner * scanner)
}
while (total_count < 100 && !done);
if (total_count >= 100)
XDBG ((0, "%s: setting AFE reached limit\n", function_name));
IF_DBG (gt68xx_afe_dump ("final", total_count, afe));
/* Exposure time */
@ -1686,6 +1742,9 @@ gt68xx_afe_cis_auto (GT68xx_Scanner * scanner)
}
while (!done && exposure_count < 10);
if (exposure_count >= 10)
XDBG ((0, "%s: setting exposure reached limit\n", function_name));
free (r_buffer);
free (g_buffer);
free (b_buffer);

Wyświetl plik

@ -1,7 +1,7 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2002 Sergey Vlasov <vsu@altlinux.ru>
Copyright (C) 2002, 2003 Henning Meier-Geinitz <henning@meier-geinitz.de>
Copyright (C) 2002 - 2004 Henning Meier-Geinitz <henning@meier-geinitz.de>
This file is part of the SANE package.
@ -136,6 +136,7 @@
#define GT68XX_FLAG_UNTESTED (1 << 3) /* Print a warning for these scanners */
#define GT68XX_FLAG_SE_2400 (1 << 4) /* Special quirks for SE 2400USB */
#define GT68XX_FLAG_NO_STOP (1 << 5) /* Don't call stop_scan before the scan */
#define GT68XX_FLAG_CIS_LAMP (1 << 6) /* CIS sensor with lamp */
/* Forward typedefs */
typedef struct GT68xx_USB_Device_Entry GT68xx_USB_Device_Entry;

Wyświetl plik

@ -1,5 +1,5 @@
:backend "gt68xx"
:version "1.0-54"
:version "1.0-56"
:manpage "sane-gt68xx"
:url "http://www.meier-geinitz.de/sane/gt68xx-backend/"
:comment "Only the USB scanners mentioned below are supported. For other Mustek BearPaws, look at the Plustek and the MA-1509 backend."
@ -58,6 +58,11 @@
:interface "USB"
;:comment ""
:model "Colorpage Vivid4"
:status :untested
:interface "USB"
:comment "Should be detected but may not work. Similar to Plustek U16B?"
:model "Colorpage Vivid4x"
:status :basic
:interface "USB"
@ -68,6 +73,11 @@
:interface "USB"
:comment "Should work but has limited testing. Please contact me if you own such a device."
:model "Colorpage Vivid 1200 EX"
:status :untested
:interface "USB"
:comment "Should be detected but may not work."
; -----------------------------------------------------------------------------
:mfg "Googlegear"
@ -173,20 +183,26 @@
:status :good
:comment "Transparency adapter supported"
:model "BearPaw 2448 TA Plus"
:model "BearPaw 2448 CS Plus"
:interface "USB"
:status :minimal
:comment "Very limited testing. Images don't seem to be ok. Please contact me if you own such a device."
:model "BearPaw 2448 TA Plus"
:interface "USB"
:status :minimal
:comment "With transparency adapter. Very limited testing. Images don't seem to be ok. Please contact me if you own such a device."
:model "Plug-n-Scan 2400 MT"
:interface "USB"
:status :untested
:comment "Same as BearPaw 2400 TA Plus? May work. Please test and tell me the result."
:status :good
:comment "Works but is slow in high resolutions. Same as BearPaw 2400 TA Plus."
:model "Plug-n-Scan 2400 M"
:interface "USB"
:status :untested
:comment "Same as BearPaw 2400 TA Plus? May work. Please test and tell me the result."
:status :good
:comment "Works but is slow in high resolutions. Same as BearPaw 2400 CS Plus."
:model "ScanExpress 1200 UB Plus"
:interface "USB"
@ -239,8 +255,13 @@
:model "OpticPro U16B"
:interface "USB"
:status :untested
:comment "Should be detected but may not work. Please contact me if you own such a device."
:status :minimal
:comment "Is detected but images look strange."
:model "OpticPro U16B+"
:interface "USB"
:status :minimal
:comment "Is detected but images look strange. Same scanner as U16B?"
:model "OpticPro UT16B"
:interface "USB"

Wyświetl plik

@ -1,5 +1,19 @@
gt68xx.CHANGES -*-text-*-
V 1.0-56 (2004-03-19)
* Genius Vivid 4xe now has color order RGB.
* Removed 50 dpi for Mustek BearPaw 2448 as that resolution doesn't work.
* Make sure that the lamp of the Mustek A3 USB gets warmed up. It's a CIS
scanner with a lamp. That code is untested.
* Full scan starts scanning from the start position of the white strip now.
V 1.0-55 (2004-03-06)
* Added detection for Genius Vivid 1200 EX.
* Fixed product id of Mustek BearPaw 2448 TA Plus.
* Other minor updates.
V 1.0-54 (2004-02-10)
* Added basic support for Plustek OpticSlim 2400. Thanks to Radoslaw Grzanka and

Wyświetl plik

@ -1,4 +1,4 @@
.TH sane-gt68xx 5 "10 Feb 2004" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.TH sane-gt68xx 5 "22 Feb 2004" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane-gt68xx
.SH NAME
sane-gt68xx \- SANE backend for GT-68XX based USB flatbed scanners
@ -129,6 +129,7 @@ or
.I system32
directories). Put that firmware file into
.IR @DATADIR@/sane/gt68xx/ .
Make sure that it's readable by everyone.
.SH CONFIGURATION
The contents of the