GitLab's annual major release is around the corner. Along with a lot of new and exciting features, there will be a few breaking changes. Learn more here.

avision.c 277 KB
Newer Older
1 2 3
/*******************************************************************************
 * SANE - Scanner Access Now Easy.

4
   avision.c
5 6 7 8 9 10 11 12 13 14 15 16 17 18

   This file is part of the SANE package.

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <https://www.gnu.org/licenses/>.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

   As a special exception, the authors of SANE give permission for
   additional uses of the libraries contained in this release of SANE.

   The exception is that, if you link a SANE library with other files
   to produce an executable, this does not by itself cause the
   resulting executable to be covered by the GNU General Public
   License.  Your use of that executable is in no way restricted on
   account of linking the SANE library code into it.

   This exception does not, however, invalidate any other reasons why
   the executable file might be covered by the GNU General Public
   License.

   If you submit changes to SANE to the maintainers to be included in
   a subsequent release, you agree by submitting the changes that
   those changes may be distributed with this exception intact.

   *****************************************************************************

40
   This file implements a SANE backend for the Avision SCSI Scanners (like the
41
   AV 630 / 620 (CS) ...) and some Avision (OEM) USB scanners (like the HP 53xx,
42
   74xx, Minolta FS-V1 ...) or Fujitsu ScanPartner with the AVISION SCSI-2/3
43 44
   or USB command set and written by René Rebe and Meino Cramer.

45

46 47 48
   Copyright 2002 - 2015 by
               	"Ren Rebe" <rene@exactcode.de>

49
   Copyright 1999, 2000, 2001 by
50
                "René Rebe" <rene@exactcode.de>
51
                "Meino Christian Cramer" <mccramer@s.netic.de>
52

Rene Rebe's avatar
Rene Rebe committed
53 54
   Copyright 2002 by
                "Jose Paulo Moitinho de Almeida" <moitinho@civil.ist.utl.pt>
55

Mike's avatar
Mike committed
56
   Copyright 2010, 2011 by
Mike's avatar
Mike committed
57 58
                "Mike Kelly" <mike@piratehaven.org>

59
   Additional Contributors:
60 61
                "Gunter Wagner"
                  (some fixes and the transparency option)
62
                "Martin Jelínek" <mates@sirrah.troja.mff.cuni.cz>
63 64
                   nice attach debug output
                "Marcin Siennicki" <m.siennicki@cloos.pl>
Rene Rebe's avatar
Rene Rebe committed
65
                   found some typos and contributed fixes for the HP 7400
66 67
                "Frank Zago" <fzago@greshamstorage.com>
                   Mitsubishi IDs and report
68 69
                Avision INC
                   example code to handle calibration and C5 ASIC specifics
70 71
                "Franz Bakan" <fbakan@gmx.net>
                   OS/2 threading support
72 73
                "Falk Rohsiepe"
                   Spelling and whitespace as well as HP5370 quirks
74

Mike's avatar
Mike committed
75
   Many additional special thanks to:
76 77
                Avision INC for providing protocol documentation.
                Avision INC for sponsoring an AV 8000S with ADF.
78 79
                Avision Europe and BHS Binkert for sponsoring several more scanners.
                Archivista GmbH, Switzerland, for sponsoring several features
80 81 82
                Roberto Di Cosmo who sponsored a HP 5370 scanner.
                Oliver Neukum who sponsored a HP 5300 USB scanner.
                Matthias Wiedemann for lending his HP 7450C for some weeks.
83
                Compusoft, C.A. Caracas / Venezuela for sponsoring a
84
                           HP 7450 scanner and so enhanced ADF support.
Mike's avatar
Mike committed
85
                Chris Komatsu for the nice ADF scanning observation.
86 87 88 89 90

                All the many other beta-tester and debug-log sender!

                Thanks to all the people and companies above. Without you
                the Avision backend would not be in the shape it is today! ;-)
91

92 93
********************************************************************************/

94 95 96 97 98 99 100 101 102 103
/* SANE-FLOW-DIAGRAMM (from umax.c)
 *
 * - sane_init() : initialize backend, attach scanners(devicename,0)
 * . - sane_get_devices() : query list of scanner-devices
 * . - sane_open() : open a particular scanner-device and attach_scanner(devicename,&dev)
 * . . - sane_set_io_mode : set blocking-mode
 * . . - sane_get_select_fd : get scanner-fd
 * . . - sane_get_option_descriptor() : get option information
 * . . - sane_control_option() : change option values
 * . .
Mike's avatar
Mike committed
104
 * . . - sane_start() : start image acquisition
105 106 107 108
 * . .   - sane_get_parameters() : returns actual scan-parameters
 * . .   - sane_read() : read image-data (from pipe)
 *
 * in ADF mode this is done often:
Mike's avatar
Mike committed
109
 * . . - sane_start() : start image acquisition
110 111 112 113 114 115
 * . .   - sane_get_parameters() : returns actual scan-parameters
 * . .   - sane_read() : read image-data (from pipe)
 *
 * . . - sane_cancel() : cancel operation, kill reader_process
 *
 * . - sane_close() : close opened scanner-device, do_cancel, free buffer and handle
Mike's avatar
Mike committed
116
 * - sane_exit() : terminate use of backend, free devicename and device-structure
117 118
 */

119
#include "../include/sane/config.h"
120 121 122 123 124 125 126 127 128 129 130 131

#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>

132 133
#include <math.h>

134
#define BACKEND_NAME avision
135
#define BACKEND_BUILD 297 /* avision backend BUILD version */
136

137 138 139 140 141 142 143 144
#include "../include/sane/sane.h"
#include "../include/sane/sanei.h"
#include "../include/sane/saneopts.h"
#include "../include/sane/sanei_thread.h"
#include "../include/sane/sanei_scsi.h"
#include "../include/sane/sanei_usb.h"
#include "../include/sane/sanei_config.h"
#include "../include/sane/sanei_backend.h"
145 146 147 148 149 150 151 152

#include <avision.h>

/* For timeval... */
#ifdef DEBUG
#include <sys/time.h>
#endif

Mike's avatar
Mike committed
153
/* Attention: The comments must stay as they are - they are automatically parsed
154
   to generate the SANE avision.desc file, as well as HTML online content! */
155

156 157 158 159
/* Attention2: This device table is part of the source code and as such
   licensed under the terms of the license as listed above (GPL2+). By
   using this data you obviously create derived work! -ReneR */

160
static Avision_HWEntry Avision_Device_List [] =
161
  {
162
    { "AVISION", "AV100CS",
163
      0, 0,
164
      "Avision", "AV100CS",
165
      0,
166
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
167
    },
168
    /* status="untested" */
169

170
    { "AVISION", "AV100IIICS",
171
      0, 0,
172
      "Avision", "AV100IIICS",
173
      0,
174
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
175
    },
176
    /* status="untested" */
177

178
    { "AVISION", "AV100S",
179
      0, 0,
180
      "Avision", "AV100S",
181
      0,
182
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
183
    },
184
    /* status="untested" */
185

186
    { NULL, NULL,
187 188
      0x0638, 0x0A27,
      "Avision", "AV120",
189
      AV_INT_STATUS,
190
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
191
    },
192
    /* comment="sheetfed scanner" */
193
    /* status="complete" */
194

195
    { NULL, NULL,
196 197
      0x0638, 0x0A3C,
      "Avision", "AV121",
198
      AV_INT_BUTTON | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA,
199
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
200
    },
201
    /* comment="sheetfed scanner" */
Rene Rebe's avatar
Rene Rebe committed
202
    /* status="good" */
203

204
    { NULL, NULL,
205
      0x0638, 0x0A33,
206
      "Avision", "AV122",
207
      AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA,
208
      { 0, {0, 0}, {{0, 0}, {-12.7, 0}} }
209
    },
Rene Rebe's avatar
Rene Rebe committed
210 211
    /* comment="sheetfed duplex scanner" */
    /* status="good" */
212

213
    { NULL, NULL,
Rene Rebe's avatar
Rene Rebe committed
214 215
      0x0638, 0x0A93,
      "Avision", "AV122 C2",
216
      AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_NOT_KEEP_WINDOW | AV_DOES_KEEP_GAMMA,
217
      { 0, {0, 0}, {{0, 0}, {-12.7, 0}} }
218
    },
219
    /* comment="sheetfed duplex scanner" */
220
    /* status="good" */
221

222
    { NULL, NULL,
223 224
      0x0638, 0x0A24,
      "Avision", "AV210",
225
      AV_INT_BUTTON  | AV_ACCEL_TABLE,
226
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
227
    },
228
    /* comment="sheetfed scanner" */
229
    /* status="complete" */
230

231
    { NULL, NULL,
232
      0x0638, 0x0A25,
233
      "Avision", "AV210",
234
      AV_INT_BUTTON  | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN,
235
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
236
    },
237
    /* comment="sheetfed scanner" */
238 239
    /* status="complete" */

240
    { NULL, NULL,
Rene Rebe's avatar
Rene Rebe committed
241 242
      0x0638, 0x0A3A,
      "Avision", "AV210C2",
243
      AV_INT_BUTTON | AV_GRAY_MODES,
244
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
245
    },
Rene Rebe's avatar
Rene Rebe committed
246 247 248
    /* comment="sheetfed scanner" */
    /* status="complete" */

249 250 251
    { NULL, NULL,
      0x0638, 0x0A2F,
      "Avision", "AV210C2-G",
252
      AV_INT_BUTTON | AV_GRAY_MODES,
253
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
254
    },
255 256 257
    /* comment="sheetfed scanner" */
    /* status="complete" */

258 259 260
    { NULL, NULL,
      0x0638, 0x1A35,
      "Avision", "AV210D2+",
261
      AV_INT_BUTTON | AV_USE_GRAY_FILTER,
262
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
263
    },
264 265 266
    /* comment="sheetfed scanner" */
    /* status="complete" */

267
    { NULL, NULL,
268 269
      0x0638, 0x0A23,
      "Avision", "AV220",
270
      AV_INT_BUTTON | AV_GRAY_MODES,
271
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
272
    },
273 274 275
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

Rene Rebe's avatar
Rene Rebe committed
276
    { NULL, NULL,
277 278
      0x0638, 0x0A2A,
      "Avision", "AV220C2",
279
      AV_INT_BUTTON | AV_CANCEL_BUTTON,
280
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
281
    },
282 283 284
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

285 286 287
    { NULL, NULL,
      0x0638, 0x0A2B,
      "Avision", "AV220D2",
288
      AV_INT_BUTTON | AV_CANCEL_BUTTON,
289
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
290
    },
291 292 293
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

294 295 296
    { NULL, NULL,
      0x0638, 0x1A31,
      "Avision", "AV220D2+",
297
      AV_INT_BUTTON | AV_CANCEL_BUTTON | AV_USE_GRAY_FILTER,
298
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
299
    },
300 301 302
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
    { NULL, NULL,
      0x0638, 0x1A33,
      "Avision", "AV186+",
      AV_INT_BUTTON | AV_CANCEL_BUTTON | AV_USE_GRAY_FILTER,
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
    },
    /* comment="duplex! sheetfed scanner" */
    /* status="good" */

    { NULL, NULL,
      0x0638, 0x2AD9,
      "Avision", "AV188",
      AV_INT_BUTTON | AV_CANCEL_BUTTON | AV_USE_GRAY_FILTER,
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
    },
    /* comment="duplex! sheetfed scanner" */
    /* status="untested" */

321 322 323
    { NULL, NULL,
      0x0638, 0x0A2C,
      "Avision", "AV220+",
324
      AV_INT_BUTTON | AV_CANCEL_BUTTON,
325
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
326
    },
327 328 329 330 331 332
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

    { NULL, NULL,
      0x0638, 0x0A2D,
      "Avision", "AV220C2-G",
333
      AV_INT_BUTTON | AV_CANCEL_BUTTON,
334
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
335
    },
336 337 338 339 340 341
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

    { NULL, NULL,
      0x0638, 0x0A2E,
      "Avision", "AV220C2-B",
342
      AV_INT_BUTTON | AV_CANCEL_BUTTON,
343
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
344
    },
345 346 347 348 349 350
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

    { NULL, NULL,
      0x0638, 0x0A94,
      "Avision", "AV220-G",
351
      AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_FIRMWARE,
352
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
353
    },
354 355 356
    /* comment="duplex! sheetfed scanner" */
    /* status="complete" */

357
    { "AVISION", "AV240SC",
358
      0, 0,
359
      "Avision", "AV240SC",
360
      0,
361
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
362
    },
363
    /* status="untested" */
364

365
    { "AVISION", "AV260CS",
366
      0, 0,
367
      "Avision", "AV260CS",
368
      0,
369
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
370
    },
371
    /* status="untested" */
372

373
    { "AVISION", "AV360CS",
374
      0, 0,
375
      "Avision", "AV360CS",
376
      0,
377
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
378
    },
379
    /* status="untested" */
380

381
    { "AVISION", "AV363CS",
382
      0, 0,
383
      "Avision", "AV363CS",
384
      0,
385
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
386
    },
387
    /* status="untested" */
388

389
    { "AVISION", "AV420CS",
390
      0, 0,
391
      "Avision", "AV420CS",
392
      0,
393
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
394
    },
395
    /* status="untested" */
396

397
    { "AVISION", "AV6120",
398
      0, 0,
399
      "Avision", "AV6120",
400
      0,
401
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
402
    },
403
    /* status="untested" */
404

405
    { NULL, "AV610",
406
      0x0638, 0x0a18,
407
      "Avision", "AV610",
408
      AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | AV_INT_BUTTON,
409
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
410
    },
Rene Rebe's avatar
Rene Rebe committed
411 412
    /* status="good" */

413 414 415
    { NULL, NULL,
      0x0638, 0x0a18,
      "Avision", "AV600U Plus",
416
      /* If this unit requires the AV_INT_STATUS flag, then we'll need to alter the code to deal with two different devices with the same USB id (AV610 above) */
417
      AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | /* AV_INT_STATUS | */ AV_INT_BUTTON,
418
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
419
    },
420 421 422
    /* status="good" */

    { NULL, NULL,
Rene Rebe's avatar
Rene Rebe committed
423 424
      0x0638, 0x0a5e,
      "Avision", "AV610C2",
425
      AV_NO_BACKGROUND | AV_INT_BUTTON, /* cancel button -> sense abort! */
426
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
427
    },
428
    /* status="good" */
429

430
   { NULL, NULL,
431
     0x0638, 0x0a41,
432
     "Avision", "AM3000 Series",
433
      0,
434
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
435
    },
436 437 438
    /* comment="MFD" */
    /* status="basic" */

439
    { NULL, NULL,
440
      0x0638, 0x0a16,
441
      "Avision", "DS610CU Scancopier",
442
      AV_INT_STATUS,
443
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
444
    },
445 446
    /* comment="1 pass, 600 dpi, A4" */
    /* status="good" */
Rene Rebe's avatar
Rene Rebe committed
447

448
    { "AVISION", "AV620CS",
449
      0, 0,
450
      "Avision", "AV620CS",
451
      0,
452
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
453
    },
454
    /* comment="1 pass, 600 dpi" */
455
    /* status="complete" */
456

457
    { "AVISION", "AV620CS Plus",
458
      0, 0,
459
      "Avision", "AV620CS Plus",
460
      0,
461
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
462
    },
463
    /* comment="1 pass, 1200 dpi" */
464
    /* status="complete" */
465

466
    { "AVISION", "AV630CS",
467
      0, 0,
468
      "Avision", "AV630CS",
469
      0,
470
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
471
    },
472
    /* comment="1 pass, 1200 dpi" */
473
    /* status="complete" */
474

475
    { "AVISION", "AV630CSL",
476
      0, 0,
477
      "Avision", "AV630CSL",
478
      0,
479
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
480
    },
481 482
    /* comment="1 pass, 1200 dpi" */
    /* status="untested" */
483

484
    { "AVISION", "AV6240",
485
      0, 0,
486
      "Avision", "AV6240",
487
      0,
488
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
489
    },
490
    /* comment="1 pass, ??? dpi" */
491
    /* status="complete" */
492

493
    { NULL, NULL,
494 495
      0x0638, 0x0A13,
      "Avision", "AV600U",
496
      AV_MULTI_CALIB_CMD | AV_ADF_BGR_ORDER_INVERT | AV_SOFT_SCALE | AV_INT_STATUS | AV_NO_BUTTON,
497
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
498
    },
499 500
    /* comment="1 pass, 600 dpi" */
    /* status="good" */
501

502
    { "AVISION", "AV660S",
503
      0, 0,
504
      "Avision", "AV660S",
505
      0,
506
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
507
    },
508
    /* comment="1 pass, ??? dpi" */
509 510
    /* status="untested" */

511
    { "AVISION", "AV680S",
512
      0, 0,
513
      "Avision", "AV680S",
514
      0,
515
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
516
    },
517
    /* comment="1 pass, ??? dpi" */
518
    /* status="untested" */
519

520 521 522
    { "AVISION", "AV690U",
      0, 0,
      "Avision", "AV690U",
523
      0,
524
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
525
    },
526 527
    /* comment="1 pass, 2400 dpi" */
    /* status="untested" */
528

529
    { "AVISION", "AV800S",
530
      0, 0,
531
      "Avision", "AV800S",
532
      0,
533
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
534
    },
535
    /* comment="1 pass, ??? dpi" */
536
    /* status="untested" */
537

538
    { "AVISION", "AV810C",
539
      0, 0,
540
      "Avision", "AV810C",
541
      0,
542
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
543
    },
544
    /* comment="1 pass, ??? dpi" */
545
    /* status="untested" */
546

547
    { "AVISION", "AV820",
548
      0, 0,
549
      "Avision", "AV820",
550
      0,
551
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
552
    },
553
    /* comment="1 pass, ??? dpi" */
554
    /* status="untested" */
555

556
    { "AVISION", "AV820C",
557
      0, 0,
558
      "Avision", "AV820C",
559
      0,
560
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
561
    },
562
    /* comment="1 pass, ??? dpi" */
563
    /* status="complete" */
564

565
    { "AVISION", "AV820C Plus",
566
      0, 0,
567
      "Avision", "AV820C Plus",
568
      0,
569
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
570
    },
571
    /* comment="1 pass, ??? dpi" */
572
    /* status="complete" */
573

574 575 576
    { "AVISION", "AV830C",
      0, 0,
      "Avision", "AV830C",
577
      0,
578
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
579
    },
580
    /* comment="1 pass, ??? dpi" */
Rene Rebe's avatar
Rene Rebe committed
581
    /* status="complete" */
582

583 584 585
    { "AVISION", "AV830C Plus",
      0, 0,
      "Avision", "AV830C Plus",
586
      0,
587
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
588
    },
589
    /* comment="1 pass, ??? dpi" */
590
    /* status="untested" */
591

592
    { "AVISION", "AV880",
593
      0, 0,
594
      "Avision", "AV880",
595
      0,
596
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
597
    },
598
    /* comment="1 pass, ??? dpi" */
599
    /* status="untested" */
600

601
    { "AVISION", "AV880C",
602
      0, 0,
603
      "Avision", "AV880C",
604
      0,
605
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
606
    },
607
    /* comment="1 pass, ??? dpi" */
608
    /* status="untested" */
609 610 611 612

    { "AVISION", "AV3200C",
      0, 0,
      "Avision", "AV3200C",
613
      AV_NON_INTERLACED_DUPLEX_300 | AV_FASTER_WITH_FILTER,
614
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
615
    },
616 617 618
    /* comment="1 pass, ??? dpi" */
    /* status="complete" */

619 620 621
    { "AVISION", "AV3200SU",
      0x0638, 0x0A4E,
      "Avision", "AV3200SU",
622
      0,
623
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
624
    },
625 626 627 628 629 630
    /* comment="1 pass, ??? dpi" */
    /* status="complete" */

    { "AVISION", "AV3730SU",
      0x0638, 0x0A4F,
      "Avision", "AV3730SU",
631
      0,
632
      { 0, {0, 0}, {{0, 0}, {0, 0}} }
633
    },
634 635 636 637