1/* sane - Scanner Access Now Easy.
2
3   Copyright (C) 2003 Oliver Rauch
4   Copyright (C) 2003-2005 Henning Meier-Geinitz <henning@meier-geinitz.de>
5   Copyright (C) 2004, 2005 Gerhard Jaeger <gerhard@gjaeger.de>
6   Copyright (C) 2004-2013 Stéphane Voltz <stef.dev@free.fr>
7   Copyright (C) 2005-2009 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
8   Copyright (C) 2007 Luke <iceyfor@gmail.com>
9   Copyright (C) 2010 Jack McGill <jmcgill85258@yahoo.com>
10   Copyright (C) 2010 Andrey Loginov <avloginov@gmail.com>,
11                   xerox travelscan device entry
12   Copyright (C) 2010 Chris Berry <s0457957@sms.ed.ac.uk> and Michael Rickmann <mrickma@gwdg.de>
13                 for Plustek Opticbook 3600 support
14   Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
15
16   This file is part of the SANE package.
17
18   This program is free software; you can redistribute it and/or
19   modify it under the terms of the GNU General Public License as
20   published by the Free Software Foundation; either version 2 of the
21   License, or (at your option) any later version.
22
23   This program is distributed in the hope that it will be useful, but
24   WITHOUT ANY WARRANTY; without even the implied warranty of
25   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26   General Public License for more details.
27
28   You should have received a copy of the GNU General Public License
29   along with this program.  If not, see <https://www.gnu.org/licenses/>.
30*/
31
32#define DEBUG_DECLARE_ONLY
33
34#include "low.h"
35
36namespace genesys {
37
38StaticInit<std::vector<UsbDeviceEntry>> s_usb_devices;
39
40void genesys_init_usb_device_tables()
41{
42    /*  Guidelines on calibration area sizes
43        ------------------------------------
44
45        on many scanners scanning a single line takes around 10ms. In order not to take excessive
46        amount of time, the sizes of the calibration area are limited as follows:
47        2400 dpi or less: 4mm (would take ~4 seconds on 2400 dpi)
48        4800 dpi or less: 3mm (would take ~6 seconds on 4800 dpi)
49        anything more: 2mm (would take ~7 seconds on 9600 dpi)
50
51        Optional properties
52        -------------------
53
54        All fields of the Genesys_Model class are defined even if they use default value, with
55        the following exceptions:
56
57        If the scanner does not have ScanMethod::TRANSPARENCY or ScanMethod::TRANSPARENCY_INFRARED,
58        the following properties are optional:
59
60        model.x_offset_ta = 0.0;
61        model.y_offset_ta = 0.0;
62        model.x_size_ta = 0.0;
63        model.y_size_ta = 0.0;
64
65        model.y_offset_sensor_to_ta = 0.0;
66        model.y_offset_calib_white_ta = 0.0;
67        model.y_size_calib_ta_mm = 0.0;
68
69        If the scanner does not have ModelFlag::DARK_WHITE_CALIBRATION, then the following
70        properties are optional:
71
72        model.y_offset_calib_dark_white_mm = 0.0;
73        model.y_size_calib_dark_white_mm = 0.0;
74    */
75
76    s_usb_devices.init();
77
78    Genesys_Model model;
79    model.name = "umax-astra-4500";
80    model.vendor = "UMAX";
81    model.model = "Astra 4500";
82    model.model_id = ModelId::UMAX_ASTRA_4500;
83    model.asic_type = AsicType::GL646;
84
85    model.resolutions = {
86        {
87            { ScanMethod::FLATBED },
88            { 1200, 600, 300, 150, 75 },
89            { 2400, 1200, 600, 300, 150, 75 }
90        }
91    };
92    model.bpp_gray_values = { 8, 16 };
93    model.bpp_color_values = { 8, 16 };
94
95    model.x_offset = 3.5;
96    model.y_offset = 7.5;
97    model.x_size = 218.0;
98    model.y_size = 299.0;
99
100    model.y_offset_calib_white = 0.0;
101    model.y_size_calib_mm = 4.0;
102    model.x_offset_calib_black = 1.0;
103    model.x_size_calib_mm = 228.6;
104
105    model.post_scan = 0.0;
106    model.eject_feed = 0.0;
107
108    model.ld_shift_r = 0;
109    model.ld_shift_g = 8;
110    model.ld_shift_b = 16;
111
112    model.line_mode_color_order = ColorOrder::BGR;
113
114    model.is_cis = false;
115    model.is_sheetfed = false;
116    model.sensor_id = SensorId::CCD_UMAX;
117    model.adc_id = AdcId::WOLFSON_UMAX;
118    model.gpio_id = GpioId::UMAX;
119    model.motor_id = MotorId::UMAX;
120    model.flags = ModelFlag::UNTESTED;
121    model.buttons = GENESYS_HAS_NO_BUTTONS;
122    model.search_lines = 200;
123
124    s_usb_devices->emplace_back(0x0638, 0x0a10, model);
125
126
127    model = Genesys_Model();
128    model.name = "canon-lide-50";
129    model.vendor = "Canon";
130    model.model = "LiDE 35/40/50";
131    model.model_id = ModelId::CANON_LIDE_50;
132    model.asic_type = AsicType::GL841;
133
134    model.resolutions = {
135        {
136            { ScanMethod::FLATBED },
137            { 1200, 600, 300, 200, 150, 75 },
138            { 2400, 1200, 600, 300, 200, 150, 75 },
139        }
140    };
141
142    model.bpp_gray_values = { 8, 16 };
143    model.bpp_color_values = { 8, 16 };
144
145    model.x_offset = 0.42;
146    model.y_offset = 7.9;
147    model.x_size = 218.0;
148    model.y_size = 299.0;
149
150    model.y_offset_calib_white = 3.0;
151    model.y_size_calib_mm = 3.0;
152    model.y_offset_calib_dark_white_mm = 1.0;
153    model.y_size_calib_dark_white_mm = 6.0;
154    model.x_size_calib_mm = 220.13334;
155    model.x_offset_calib_black = 0.0;
156
157    model.post_scan = 0.0;
158    model.eject_feed = 0.0;
159
160    model.ld_shift_r = 0;
161    model.ld_shift_g = 0;
162    model.ld_shift_b = 0;
163
164    model.line_mode_color_order = ColorOrder::RGB;
165
166    model.is_cis = true;
167    model.is_sheetfed = false;
168    model.sensor_id = SensorId::CIS_CANON_LIDE_35;
169    model.adc_id = AdcId::CANON_LIDE_35;
170    model.gpio_id = GpioId::CANON_LIDE_35;
171    model.motor_id = MotorId::CANON_LIDE_35;
172    model.flags = ModelFlag::DARK_WHITE_CALIBRATION |
173                  ModelFlag::HOST_SIDE_GRAY |
174                  ModelFlag::CUSTOM_GAMMA;
175    model.buttons = GENESYS_HAS_SCAN_SW |
176                    GENESYS_HAS_FILE_SW |
177                    GENESYS_HAS_EMAIL_SW |
178                    GENESYS_HAS_COPY_SW;
179    model.search_lines = 400;
180
181    s_usb_devices->emplace_back(0x04a9, 0x2213, model);
182
183
184    model = Genesys_Model();
185    model.name = "panasonic-kv-ss080";
186    model.vendor = "Panasonic";
187    model.model = "KV-SS080";
188    model.model_id = ModelId::PANASONIC_KV_SS080;
189    model.asic_type = AsicType::GL843;
190
191    model.resolutions = {
192        {
193            { ScanMethod::FLATBED },
194            { 600, /* 500, 400,*/ 300, 200, 150, 100, 75 },
195            { 1200, 600, /* 500, 400, */ 300, 200, 150, 100, 75 },
196        }
197    };
198
199    model.bpp_gray_values = { 8, 16 };
200    model.bpp_color_values = { 8, 16 };
201
202    model.x_offset = 7.2;
203    model.y_offset = 14.7;
204    model.x_size = 217.7;
205    model.y_size = 300.0;
206
207    model.y_offset_calib_white = 9.0;
208    model.y_size_calib_mm = 4.0;
209    model.x_offset_calib_black = 0.0;
210    model.x_size_calib_mm = 227.584;
211
212    model.post_scan = 0.0;
213    model.eject_feed = 0.0;
214
215    model.ld_shift_r = 0;
216    model.ld_shift_g = 8;
217    model.ld_shift_b = 16;
218
219    model.line_mode_color_order = ColorOrder::RGB;
220
221    model.is_cis = false;
222    model.is_sheetfed = false;
223    model.sensor_id = SensorId::CCD_KVSS080;
224    model.adc_id = AdcId::KVSS080;
225    model.gpio_id = GpioId::KVSS080;
226    model.motor_id = MotorId::KVSS080;
227    model.flags = ModelFlag::CUSTOM_GAMMA;
228    model.buttons = GENESYS_HAS_SCAN_SW;
229    model.search_lines = 100;
230
231    s_usb_devices->emplace_back(0x04da, 0x100f, model);
232
233
234    model = Genesys_Model();
235    model.name = "hewlett-packard-scanjet-4850c";
236    model.vendor = "Hewlett Packard";
237    model.model = "ScanJet 4850C";
238    model.model_id = ModelId::HP_SCANJET_4850C;
239    model.asic_type = AsicType::GL843;
240
241    model.resolutions = {
242        {
243            { ScanMethod::FLATBED },
244            { 2400, 1200, 600, 400, 300, 200, 150, 100 },
245            { 2400, 1200, 600, 400, 300, 200, 150, 100 },
246        }
247    };
248
249    model.bpp_gray_values = { 8, 16 };
250    model.bpp_color_values = { 8, 16 };
251
252    model.x_offset = 7.9;
253    model.y_offset = 10.0;
254    model.x_size = 219.6;
255    model.y_size = 314.5;
256
257    model.y_offset_calib_white = 0.0;
258    model.y_size_calib_mm = 4.0;
259    model.x_offset_calib_black = 0.0;
260    model.x_size_calib_mm = 226.9067;
261
262    model.post_scan = 0.0;
263    model.eject_feed = 0.0;
264
265    model.ld_shift_r = 0;
266    model.ld_shift_g = 24;
267    model.ld_shift_b = 48;
268
269    model.line_mode_color_order = ColorOrder::RGB;
270
271    model.is_cis = false;
272    model.is_sheetfed = false;
273    model.sensor_id = SensorId::CCD_HP_4850C;
274    model.adc_id = AdcId::G4050;
275    model.gpio_id = GpioId::G4050;
276    model.motor_id = MotorId::G4050;
277    model.flags = ModelFlag::WARMUP |
278                  ModelFlag::SHADING_REPARK |
279                  ModelFlag::CUSTOM_GAMMA;
280    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW;
281    model.search_lines = 100;
282    s_usb_devices->emplace_back(0x03f0, 0x1b05, model);
283
284
285    model = Genesys_Model();
286    model.name = "hewlett-packard-scanjet-g4010";
287    model.vendor = "Hewlett Packard";
288    model.model = "ScanJet G4010";
289    model.model_id = ModelId::HP_SCANJET_G4010;
290    model.asic_type = AsicType::GL843;
291
292    model.resolutions = {
293        {
294            { ScanMethod::FLATBED },
295            { 2400, 1200, 600, 400, 300, 200, 150, 100 },
296            { 2400, 1200, 600, 400, 300, 200, 150, 100 },
297        }
298    };
299
300    model.bpp_gray_values = { 8, 16 };
301    model.bpp_color_values = { 8, 16 };
302
303    model.x_offset = 8.0;
304    model.y_offset = 13.00;
305    model.x_size = 217.9;
306    model.y_size = 315.0;
307
308    model.y_offset_calib_white = 3.0;
309    model.y_size_calib_mm = 4.0;
310    model.x_offset_calib_black = 0.0;
311    model.x_size_calib_mm = 226.9067;
312
313    model.post_scan = 0.0;
314    model.eject_feed = 0.0;
315
316    model.ld_shift_r = 0;
317    model.ld_shift_g = 24;
318    model.ld_shift_b = 48;
319    model.line_mode_color_order = ColorOrder::RGB;
320
321    model.is_cis = false;
322    model.is_sheetfed = false;
323    model.sensor_id = SensorId::CCD_G4050;
324    model.adc_id = AdcId::G4050;
325    model.gpio_id = GpioId::G4010;
326    model.motor_id = MotorId::G4050;
327    model.flags = ModelFlag::WARMUP |
328                  ModelFlag::DARK_CALIBRATION |
329                  ModelFlag::CUSTOM_GAMMA;
330    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_TRANSP_SW;
331    model.search_lines = 100;
332
333    s_usb_devices->emplace_back(0x03f0, 0x4505, model);
334
335
336    model = Genesys_Model();
337    model.name = "hewlett-packard-scanjet-g4050";
338    model.vendor = "Hewlett Packard";
339    model.model = "ScanJet G4050";
340    model.model_id = ModelId::HP_SCANJET_G4050;
341    model.asic_type = AsicType::GL843;
342
343    model.resolutions = {
344        {
345            { ScanMethod::FLATBED },
346            { 2400, 1200, 600, 400, 300, 200, 150, 100 },
347            { 2400, 1200, 600, 400, 300, 200, 150, 100 },
348        }
349    };
350
351    model.bpp_gray_values = { 8, 16 };
352    model.bpp_color_values = { 8, 16 };
353
354    model.x_offset = 8.0;
355    model.y_offset = 10.00;
356    model.x_size = 217.9;
357    model.y_size = 315.0;
358
359    model.y_offset_calib_white = 0.0;
360    model.y_size_calib_mm = 4.0;
361    model.x_offset_calib_black = 0.0;
362    model.x_size_calib_mm = 226.9067;
363
364    model.post_scan = 0.0;
365    model.eject_feed = 0.0;
366
367    model.ld_shift_r = 0;
368    model.ld_shift_g = 24;
369    model.ld_shift_b = 48;
370
371    model.line_mode_color_order = ColorOrder::RGB;
372
373    model.is_cis = false;
374    model.is_sheetfed = false;
375    model.sensor_id = SensorId::CCD_G4050;
376    model.adc_id = AdcId::G4050;
377    model.gpio_id = GpioId::G4050;
378    model.motor_id = MotorId::G4050;
379    model.flags = ModelFlag::WARMUP |
380                  ModelFlag::DARK_CALIBRATION |
381                  ModelFlag::CUSTOM_GAMMA;
382    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW;
383    model.search_lines = 100;
384
385    s_usb_devices->emplace_back(0x03f0, 0x4605, model);
386
387
388    model = Genesys_Model();
389    model.name = "canon-canoscan-4400f";
390    model.vendor = "Canon";
391    model.model = "Canoscan 4400f";
392    model.model_id = ModelId::CANON_4400F;
393    model.asic_type = AsicType::GL843;
394
395    model.resolutions = {
396        {
397            { ScanMethod::FLATBED },
398            { 1200, 600, 300 },
399            { 1200, 600, 300 },
400        }, {
401            { ScanMethod::TRANSPARENCY },
402            { 4800, 2400, 1200 },
403            { 9600, 4800, 2400, 1200 },
404        }
405    };
406
407    model.bpp_gray_values = { 8, 16 };
408    model.bpp_color_values = { 8, 16 };
409
410    model.x_offset = 6.0;
411    model.y_offset = 10.00;
412    model.x_size = 215.9;
413    model.y_size = 297.0;
414
415    model.y_offset_calib_white = 2.0;
416    model.y_size_calib_mm = 4.0;
417    model.x_offset_calib_black = 0.0;
418    model.x_size_calib_mm = 241.3;
419
420    model.x_offset_ta = 115.0;
421    model.y_offset_ta = 37.0;
422    model.x_size_ta = 35.0;
423    model.y_size_ta = 230.0;
424
425    model.y_offset_sensor_to_ta = 23.0;
426    model.y_offset_calib_white_ta = 24.0;
427    model.y_size_calib_ta_mm = 2.0;
428
429    model.post_scan = 0.0;
430    model.eject_feed = 0.0;
431
432    model.ld_shift_r = 96;
433    model.ld_shift_g = 48;
434    model.ld_shift_b = 0;
435
436    model.line_mode_color_order = ColorOrder::RGB;
437
438    model.is_cis = false;
439    model.is_sheetfed = false;
440    model.sensor_id = SensorId::CCD_CANON_4400F;
441    model.adc_id = AdcId::CANON_4400F;
442    model.gpio_id = GpioId::CANON_4400F;
443    model.motor_id = MotorId::CANON_4400F;
444    model.flags = ModelFlag::WARMUP |
445                  ModelFlag::DARK_CALIBRATION |
446                  ModelFlag::CUSTOM_GAMMA |
447                  ModelFlag::SHADING_REPARK |
448                  ModelFlag::UTA_NO_SECONDARY_MOTOR;
449
450    model.buttons = GENESYS_HAS_TRANSP_SW | GENESYS_HAS_EMAIL_SW
451        | GENESYS_HAS_COPY_SW | GENESYS_HAS_PDF1_SW | GENESYS_HAS_PDF2_SW
452        | GENESYS_HAS_PDF3_SW | GENESYS_HAS_PDF4_SW;
453    model.search_lines = 100;
454
455    s_usb_devices->emplace_back(0x04a9, 0x2228, model);
456
457
458    model = Genesys_Model();
459    model.name = "canon-canoscan-8400f";
460    model.vendor = "Canon";
461    model.model = "Canoscan 8400f";
462    model.model_id = ModelId::CANON_8400F;
463    model.asic_type = AsicType::GL843;
464
465    model.resolutions = {
466        {
467            { ScanMethod::FLATBED },
468            { 3200, 1600, 800, 400 },
469            { 3200, 1600, 800, 400 },
470        }, {
471            { ScanMethod::TRANSPARENCY },
472            { 3200, 1600, 800, 400 },
473            { 3200, 1600, 800, 400 },
474        }, {
475            { ScanMethod::TRANSPARENCY_INFRARED },
476            { 3200, 1600, 800, 400 },
477            { 3200, 1600, 800, 400 },
478        }
479    };
480
481    model.bpp_gray_values = { 8, 16 };
482    model.bpp_color_values = { 8, 16 };
483
484    model.x_offset = 5.5;
485    model.y_offset = 17.00;
486    model.x_size = 219.9;
487    model.y_size = 300.0;
488
489    model.y_offset_calib_white = 0.0;
490    model.y_size_calib_mm = 3.0;
491    model.x_offset_calib_black = 10.0;
492    model.x_size_calib_mm = 225.425;
493
494    model.x_offset_ta = 75.0;
495    model.y_offset_ta = 45.00;
496    model.x_size_ta = 75.0;
497    model.y_size_ta = 230.0;
498
499    model.y_offset_sensor_to_ta = 22.0;
500    model.y_offset_calib_white_ta = 25.0;
501    model.y_size_calib_ta_mm = 3.0;
502
503    model.post_scan = 0.0;
504    model.eject_feed = 0.0;
505
506    model.ld_shift_r = 0;
507    model.ld_shift_g = 24;
508    model.ld_shift_b = 48;
509
510    model.line_mode_color_order = ColorOrder::RGB;
511
512    model.is_cis = false;
513    model.is_sheetfed = false;
514    model.sensor_id = SensorId::CCD_CANON_8400F;
515    model.adc_id = AdcId::CANON_8400F;
516    model.gpio_id = GpioId::CANON_8400F;
517    model.motor_id = MotorId::CANON_8400F;
518    model.flags = ModelFlag::WARMUP |
519                  ModelFlag::DARK_CALIBRATION |
520                  ModelFlag::CUSTOM_GAMMA |
521                  ModelFlag::SHADING_REPARK;
522    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW;
523    model.search_lines = 100;
524
525    s_usb_devices->emplace_back(0x04a9, 0x221e, model);
526
527
528    model = Genesys_Model();
529    model.name = "canon-canoscan-8600f";
530    model.vendor = "Canon";
531    model.model = "Canoscan 8600f";
532    model.model_id = ModelId::CANON_8600F;
533    model.asic_type = AsicType::GL843;
534
535    model.resolutions = {
536        {
537            { ScanMethod::FLATBED },
538            { 1200, 600, 300 },
539            { 1200, 600, 300 },
540        }, {
541            { ScanMethod::TRANSPARENCY, ScanMethod::TRANSPARENCY_INFRARED },
542            { 4800, 2400, 1200, 600, 300 },
543            { 4800, 2400, 1200, 600, 300 },
544        }
545    };
546
547    model.bpp_gray_values = { 8, 16 };
548    model.bpp_color_values = { 8, 16 };
549
550    model.x_offset = 24.0;
551    model.y_offset = 10.0;
552    model.x_size = 216.0;
553    model.y_size = 297.0;
554
555    model.y_offset_calib_white = 0.0;
556    model.y_size_calib_mm = 4.0;
557    model.x_offset_calib_black = 8.0;
558    model.x_size_calib_mm = 240.70734;
559
560    model.x_offset_ta = 97.0;
561    model.y_offset_ta = 38.5;
562    model.x_size_ta = 70.0;
563    model.y_size_ta = 230.0;
564
565    model.y_offset_sensor_to_ta = 23.0;
566    model.y_offset_calib_white_ta = 25.5;
567    model.y_size_calib_ta_mm = 3.0;
568
569    model.post_scan = 0.0;
570    model.eject_feed = 0.0;
571
572    model.ld_shift_r = 0;
573    model.ld_shift_g = 48;
574    model.ld_shift_b = 96;
575
576    model.line_mode_color_order = ColorOrder::RGB;
577
578    model.is_cis = false;
579    model.is_sheetfed = false;
580    model.sensor_id = SensorId::CCD_CANON_8600F;
581    model.adc_id = AdcId::CANON_8600F;
582    model.gpio_id = GpioId::CANON_8600F;
583    model.motor_id = MotorId::CANON_8600F;
584    model.flags = ModelFlag::WARMUP |
585                  ModelFlag::DARK_CALIBRATION |
586                  ModelFlag::CUSTOM_GAMMA |
587                  ModelFlag::SHADING_REPARK;
588    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW;
589    model.search_lines = 100;
590
591    s_usb_devices->emplace_back(0x04a9, 0x2229, model);
592
593
594    model = Genesys_Model();
595    model.name = "canon-lide-100";
596    model.vendor = "Canon";
597    model.model = "LiDE 100";
598    model.model_id = ModelId::CANON_LIDE_100;
599    model.asic_type = AsicType::GL847;
600
601    model.resolutions = {
602        {
603            { ScanMethod::FLATBED },
604            { 2400, 1200, 600, 300, 200, 150 },
605            { 4800, 2400, 1200, 600, 300, 200, 150 },
606        }
607    };
608
609    model.bpp_gray_values = { 8, 16 };
610    model.bpp_color_values = { 8, 16 };
611
612    model.x_offset = 1.1;
613    model.y_offset = 8.3;
614    model.x_size = 216.07;
615    model.y_size = 299.0;
616
617    model.y_offset_calib_white = 0.4233334;
618    model.y_size_calib_mm = 3.0;
619    model.x_offset_calib_black = 0.0;
620    model.x_size_calib_mm = 217.4241;
621
622    model.post_scan = 0.0;
623    model.eject_feed = 0.0;
624
625    model.ld_shift_r = 0;
626    model.ld_shift_g = 0;
627    model.ld_shift_b = 0;
628
629    model.line_mode_color_order = ColorOrder::RGB;
630
631    model.is_cis = true;
632    model.is_sheetfed = false;
633    model.sensor_id = SensorId::CIS_CANON_LIDE_100;
634    model.adc_id = AdcId::CANON_LIDE_200;
635    model.gpio_id = GpioId::CANON_LIDE_200;
636    model.motor_id = MotorId::CANON_LIDE_100;
637    model.flags = ModelFlag::SIS_SENSOR |
638                  ModelFlag::DARK_CALIBRATION |
639                  ModelFlag::SHADING_REPARK |
640                  ModelFlag::CUSTOM_GAMMA;
641    model.buttons = GENESYS_HAS_SCAN_SW |
642                    GENESYS_HAS_COPY_SW |
643                    GENESYS_HAS_EMAIL_SW |
644                    GENESYS_HAS_FILE_SW;
645    model.search_lines = 400;
646
647    s_usb_devices->emplace_back(0x04a9, 0x1904, model);
648
649
650    model = Genesys_Model();
651    model.name = "canon-lide-110";
652    model.vendor = "Canon";
653    model.model = "LiDE 110";
654    model.model_id = ModelId::CANON_LIDE_110;
655    model.asic_type = AsicType::GL124;
656
657    model.resolutions = {
658        {
659            { ScanMethod::FLATBED },
660            { 2400, 1200, 600, /* 400,*/ 300, 150, 100, 75 },
661            { 4800, 2400, 1200, 600, /* 400,*/ 300, 150, 100, 75 },
662        }
663    };
664
665    model.bpp_gray_values = { 8, 16 };
666    model.bpp_color_values = { 8, 16 };
667
668    model.x_offset = 2.2;
669    model.y_offset = 9.0;
670    model.x_size = 216.70;
671    model.y_size = 300.0;
672
673    model.y_offset_calib_white = 0.0;
674    model.y_size_calib_mm = 3.0;
675    model.x_offset_calib_black = 0.0;
676    model.x_size_calib_mm = 218.7787;
677
678    model.post_scan = 0.0;
679    model.eject_feed = 0.0;
680
681    model.ld_shift_r = 0;
682    model.ld_shift_g = 0;
683    model.ld_shift_b = 0;
684    model.line_mode_color_order = ColorOrder::RGB;
685
686    model.is_cis = true;
687    model.is_sheetfed = false;
688    model.sensor_id = SensorId::CIS_CANON_LIDE_110;
689    model.adc_id = AdcId::CANON_LIDE_110;
690    model.gpio_id = GpioId::CANON_LIDE_110;
691    model.motor_id = MotorId::CANON_LIDE_110;
692    model.flags = ModelFlag::DARK_CALIBRATION |
693                  ModelFlag::SHADING_REPARK |
694                  ModelFlag::CUSTOM_GAMMA;
695    model.buttons = GENESYS_HAS_SCAN_SW |
696                    GENESYS_HAS_COPY_SW |
697                    GENESYS_HAS_EMAIL_SW |
698                    GENESYS_HAS_FILE_SW;
699    model.search_lines = 400;
700
701    s_usb_devices->emplace_back(0x04a9, 0x1909, model);
702
703
704    model = Genesys_Model();
705    model.name = "canon-lide-120";
706    model.vendor = "Canon";
707    model.model = "LiDE 120";
708    model.model_id = ModelId::CANON_LIDE_120;
709    model.asic_type = AsicType::GL124;
710
711    model.resolutions = {
712        {
713            { ScanMethod::FLATBED },
714            { 2400, 1200, 600, 300, 150, 100, 75 },
715            { 4800, 2400, 1200, 600, 300, 150, 100, 75 },
716        }
717    };
718
719    model.bpp_gray_values = { 8, 16 };
720    model.bpp_color_values = { 8, 16 };
721
722    model.x_offset = 0.0;
723    model.y_offset = 8.0;
724    model.x_size = 216.0;
725    model.y_size = 300.0;
726
727    model.y_offset_calib_white = 1.0;
728    model.y_size_calib_mm = 3.0;
729    model.x_offset_calib_black = 0.0;
730    model.x_size_calib_mm = 216.0694;
731
732    model.post_scan = 0.0;
733    model.eject_feed = 0.0;
734
735    model.ld_shift_r = 0;
736    model.ld_shift_g = 0;
737    model.ld_shift_b = 0;
738    model.line_mode_color_order = ColorOrder::RGB;
739    model.is_cis = true;
740    model.is_sheetfed = false;
741    model.sensor_id = SensorId::CIS_CANON_LIDE_120;
742    model.adc_id = AdcId::CANON_LIDE_120;
743    model.gpio_id = GpioId::CANON_LIDE_120;
744    model.motor_id = MotorId::CANON_LIDE_120;
745    model.flags = ModelFlag::DARK_CALIBRATION |
746                  ModelFlag::SHADING_REPARK |
747                  ModelFlag::CUSTOM_GAMMA;
748    model.buttons = GENESYS_HAS_SCAN_SW |
749                    GENESYS_HAS_COPY_SW |
750                    GENESYS_HAS_EMAIL_SW |
751                    GENESYS_HAS_FILE_SW;
752    model.search_lines = 400;
753
754    s_usb_devices->emplace_back(0x04a9, 0x190e, model);
755
756
757    model = Genesys_Model();
758    model.name = "canon-lide-210";
759    model.vendor = "Canon";
760    model.model = "LiDE 210";
761    model.model_id = ModelId::CANON_LIDE_210;
762    model.asic_type = AsicType::GL124;
763
764    model.resolutions = {
765        {
766            { ScanMethod::FLATBED },
767            { 4800, 2400, 1200, 600, /* 400,*/ 300, 150, 100, 75 },
768            { 4800, 2400, 1200, 600, /* 400,*/ 300, 150, 100, 75 },
769        }
770    };
771
772    model.bpp_gray_values = { 8, 16 };
773    model.bpp_color_values = { 8, 16 };
774
775    model.x_offset = 2.1;
776    model.y_offset = 8.7;
777    model.x_size = 216.70;
778    model.y_size = 297.5;
779
780    model.y_offset_calib_white = 0.0;
781    model.y_size_calib_mm = 3.0;
782    model.x_offset_calib_black = 0.0;
783    model.x_size_calib_mm = 218.7787;
784
785    model.post_scan = 0.0;
786    model.eject_feed = 0.0;
787
788    model.ld_shift_r = 0;
789    model.ld_shift_g = 0;
790    model.ld_shift_b = 0;
791
792    model.line_mode_color_order = ColorOrder::RGB;
793
794    model.is_cis = true;
795    model.is_sheetfed = false;
796    model.sensor_id = SensorId::CIS_CANON_LIDE_210;
797    model.adc_id = AdcId::CANON_LIDE_110;
798    model.gpio_id = GpioId::CANON_LIDE_210;
799    model.motor_id = MotorId::CANON_LIDE_210;
800    model.flags = ModelFlag::DARK_CALIBRATION |
801                  ModelFlag::SHADING_REPARK |
802                  ModelFlag::CUSTOM_GAMMA;
803    model.buttons = GENESYS_HAS_SCAN_SW |
804                    GENESYS_HAS_COPY_SW |
805                    GENESYS_HAS_EMAIL_SW |
806                    GENESYS_HAS_FILE_SW |
807                    GENESYS_HAS_EXTRA_SW;
808    model.search_lines = 400;
809
810    s_usb_devices->emplace_back(0x04a9, 0x190a, model);
811
812
813    model = Genesys_Model();
814    model.name = "canon-lide-220";
815    model.vendor = "Canon";
816    model.model = "LiDE 220";
817    model.model_id = ModelId::CANON_LIDE_220;
818    model.asic_type = AsicType::GL124; // or a compatible one
819
820    model.resolutions = {
821        {
822            { ScanMethod::FLATBED },
823            { 4800, 2400, 1200, 600, 300, 150, 100, 75 },
824            { 4800, 2400, 1200, 600, 300, 150, 100, 75 },
825        }
826    };
827
828    model.bpp_gray_values = { 8, 16 };
829    model.bpp_color_values = { 8, 16 };
830
831    model.x_offset = 2.1;
832    model.y_offset = 8.7;
833    model.x_size = 216.70;
834    model.y_size = 297.5;
835
836    model.y_offset_calib_white = 0.0;
837    model.y_size_calib_mm = 3.0;
838    model.x_offset_calib_black = 0.0;
839    model.x_size_calib_mm = 218.7787;
840
841    model.post_scan = 0.0;
842    model.eject_feed = 0.0;
843
844    model.ld_shift_r = 0;
845    model.ld_shift_g = 0;
846    model.ld_shift_b = 0;
847
848    model.line_mode_color_order = ColorOrder::RGB;
849    model.is_cis = true;
850    model.is_sheetfed = false;
851    model.sensor_id = SensorId::CIS_CANON_LIDE_220;
852    model.adc_id = AdcId::CANON_LIDE_110;
853    model.gpio_id = GpioId::CANON_LIDE_210;
854    model.motor_id = MotorId::CANON_LIDE_210;
855    model.flags = ModelFlag::DARK_CALIBRATION |
856                  ModelFlag::SHADING_REPARK |
857                  ModelFlag::CUSTOM_GAMMA;
858    model.buttons = GENESYS_HAS_SCAN_SW |
859                    GENESYS_HAS_COPY_SW |
860                    GENESYS_HAS_EMAIL_SW |
861                    GENESYS_HAS_FILE_SW |
862                    GENESYS_HAS_EXTRA_SW;
863    model.search_lines = 400;
864
865    s_usb_devices->emplace_back(0x04a9, 0x190f, model);
866
867
868    model = Genesys_Model();
869    model.name = "canon-canoscan-5600f";
870    model.vendor = "Canon";
871    model.model = "CanoScan 5600F";
872    model.model_id = ModelId::CANON_5600F;
873    model.asic_type = AsicType::GL847;
874
875    model.resolutions = {
876        {
877            { ScanMethod::FLATBED, ScanMethod::TRANSPARENCY },
878            { 4800, 2400, 1200, 600, 300, /*150*/ },
879            { 4800, 2400, 1200, 600, 300, /*150*/ },
880        }
881    };
882
883    model.bpp_gray_values = { 8, 16 };
884    model.bpp_color_values = { 8, 16 };
885
886    model.x_offset = 1.5;
887    model.y_offset = 10.4;
888    model.x_size = 219.00;
889    model.y_size = 305.0;
890
891    model.y_offset_calib_white = 2.0;
892    model.y_size_calib_mm = 2.0;
893    model.x_offset_calib_black = 0.0;
894    model.x_size_calib_mm = 220.5;
895
896    model.x_offset_ta = 93.0;
897    model.y_offset_ta = 42.4;
898    model.x_size_ta = 35.0;
899    model.y_size_ta = 230.0;
900
901    model.y_offset_sensor_to_ta = 0;
902    model.y_offset_calib_white_ta = 21.4;
903    model.y_size_calib_ta_mm = 1.0;
904
905    model.post_scan = 0.0;
906    model.eject_feed = 0.0;
907
908    model.ld_shift_r = 0;
909    model.ld_shift_g = 32;
910    model.ld_shift_b = 64;
911
912    model.line_mode_color_order = ColorOrder::RGB;
913
914    model.is_cis = false;
915    model.is_sheetfed = false;
916    model.sensor_id = SensorId::CCD_CANON_5600F;
917    model.adc_id = AdcId::CANON_5600F;
918    model.gpio_id = GpioId::CANON_5600F;
919    model.motor_id = MotorId::CANON_5600F;
920    model.flags = ModelFlag::SIS_SENSOR |
921                  ModelFlag::INVERT_PIXEL_DATA |
922                  ModelFlag::DISABLE_ADC_CALIBRATION |
923                  ModelFlag::DISABLE_EXPOSURE_CALIBRATION |
924                  ModelFlag::HOST_SIDE_CALIBRATION_COMPLETE_SCAN |
925                  ModelFlag::DARK_CALIBRATION |
926                  ModelFlag::SHADING_REPARK |
927                  ModelFlag::UTA_NO_SECONDARY_MOTOR |
928                  ModelFlag::CUSTOM_GAMMA;
929    model.buttons = GENESYS_HAS_SCAN_SW |
930                    GENESYS_HAS_COPY_SW |
931                    GENESYS_HAS_EMAIL_SW |
932                    GENESYS_HAS_PDF1_SW |
933                    GENESYS_HAS_PDF2_SW |
934                    GENESYS_HAS_PDF3_SW |
935                    GENESYS_HAS_PDF4_SW;
936    model.search_lines = 400;
937
938    s_usb_devices->emplace_back(0x04a9, 0x1906, model);
939
940
941    model = Genesys_Model();
942    model.name = "canon-lide-700f";
943    model.vendor = "Canon";
944    model.model = "LiDE 700F";
945    model.model_id = ModelId::CANON_LIDE_700F;
946    model.asic_type = AsicType::GL847;
947
948    model.resolutions = {
949        {
950            // FIXME: support 2400 ad 4800 dpi
951            { ScanMethod::FLATBED },
952            { 1200, 600, 300, 200, 150, 100, 75 },
953            { 1200, 600, 300, 200, 150, 100, 75 },
954        }
955    };
956
957    model.bpp_gray_values = { 8, 16 };
958    model.bpp_color_values = { 8, 16 };
959
960    model.x_offset = 3.1;
961    model.y_offset = 8.1;
962    model.x_size = 216.07;
963    model.y_size = 297.0;
964
965    model.y_offset_calib_white = 0.4233334;
966    model.y_size_calib_mm = 3.0;
967    model.x_offset_calib_black = 0.0;
968    model.x_size_calib_mm = 219.6254;
969
970    model.post_scan = 0.0;
971    model.eject_feed = 0.0;
972
973    model.ld_shift_r = 0;
974    model.ld_shift_g = 0;
975    model.ld_shift_b = 0;
976
977    model.line_mode_color_order = ColorOrder::RGB;
978
979    model.is_cis = true;
980    model.is_sheetfed = false;
981    model.sensor_id = SensorId::CIS_CANON_LIDE_700F;
982    model.adc_id = AdcId::CANON_LIDE_700F;
983    model.gpio_id = GpioId::CANON_LIDE_700F;
984    model.motor_id = MotorId::CANON_LIDE_700;
985    model.flags = ModelFlag::SIS_SENSOR |
986                  ModelFlag::DARK_CALIBRATION |
987                  ModelFlag::SHADING_REPARK |
988                  ModelFlag::CUSTOM_GAMMA;
989    model.buttons = GENESYS_HAS_SCAN_SW |
990                    GENESYS_HAS_COPY_SW |
991                    GENESYS_HAS_EMAIL_SW |
992                    GENESYS_HAS_FILE_SW;
993    model.search_lines = 400;
994
995    s_usb_devices->emplace_back(0x04a9, 0x1907, model);
996
997
998    model = Genesys_Model();
999    model.name = "canon-lide-200";
1000    model.vendor = "Canon";
1001    model.model = "LiDE 200";
1002    model.model_id = ModelId::CANON_LIDE_200;
1003    model.asic_type = AsicType::GL847;
1004
1005    model.resolutions = {
1006        {
1007            { ScanMethod::FLATBED },
1008            { 4800, 2400, 1200, 600, 300, 200, 150 },
1009            { 4800, 2400, 1200, 600, 300, 200, 150 },
1010        }
1011    };
1012
1013    model.bpp_gray_values = { 8, 16 };
1014    model.bpp_color_values = { 8, 16 };
1015
1016    model.x_offset = 1.1;
1017    model.y_offset = 8.3;
1018    model.x_size = 216.07;
1019    model.y_size = 299.0;
1020
1021    model.y_offset_calib_white = 0.4233334;
1022    model.y_size_calib_mm = 3.0;
1023    model.x_offset_calib_black = 0.0;
1024    model.x_size_calib_mm = 217.4241;
1025
1026    model.post_scan = 0.0;
1027    model.eject_feed = 0.0;
1028
1029    model.ld_shift_r = 0;
1030    model.ld_shift_g = 0;
1031    model.ld_shift_b = 0;
1032
1033    model.line_mode_color_order = ColorOrder::RGB;
1034    model.is_cis = true;
1035    model.is_sheetfed = false;
1036    model.sensor_id = SensorId::CIS_CANON_LIDE_200;
1037    model.adc_id = AdcId::CANON_LIDE_200;
1038    model.gpio_id = GpioId::CANON_LIDE_200;
1039    model.motor_id = MotorId::CANON_LIDE_200;
1040    model.flags = ModelFlag::SIS_SENSOR |
1041                  ModelFlag::DARK_CALIBRATION |
1042                  ModelFlag::SHADING_REPARK |
1043                  ModelFlag::CUSTOM_GAMMA;
1044    model.buttons = GENESYS_HAS_SCAN_SW |
1045                    GENESYS_HAS_COPY_SW |
1046                    GENESYS_HAS_EMAIL_SW |
1047                    GENESYS_HAS_FILE_SW;
1048    model.search_lines = 400;
1049
1050    s_usb_devices->emplace_back(0x04a9, 0x1905, model);
1051
1052
1053    model = Genesys_Model();
1054    model.name = "canon-lide-60";
1055    model.vendor = "Canon";
1056    model.model = "LiDE 60";
1057    model.model_id = ModelId::CANON_LIDE_60;
1058    model.asic_type = AsicType::GL841;
1059
1060    model.resolutions = {
1061        {
1062            { ScanMethod::FLATBED },
1063            { 1200, 600, 300, 150, 75 },
1064            { 2400, 1200, 600, 300, 150, 75 },
1065        }
1066    };
1067
1068    model.bpp_gray_values = { 8, 16 };
1069    model.bpp_color_values = { 8, 16 };
1070
1071    model.x_offset = 0.42;
1072    model.y_offset = 7.9;
1073    model.x_size = 218.0;
1074    model.y_size = 299.0;
1075
1076    model.y_offset_calib_white = 3.0;
1077    model.y_size_calib_mm = 3.0;
1078    model.y_offset_calib_dark_white_mm = 1.0;
1079    model.y_size_calib_dark_white_mm = 6.0;
1080    model.x_offset_calib_black = 0.0;
1081    model.x_size_calib_mm = 220.13334;
1082
1083    model.post_scan = 0.0;
1084    model.eject_feed = 0.0;
1085
1086    model.ld_shift_r = 0;
1087    model.ld_shift_g = 0;
1088    model.ld_shift_b = 0;
1089    model.line_mode_color_order = ColorOrder::RGB;
1090
1091    model.is_cis = true;
1092    model.is_sheetfed = false;
1093    model.sensor_id = SensorId::CIS_CANON_LIDE_60;
1094    model.adc_id = AdcId::CANON_LIDE_35;
1095    model.gpio_id = GpioId::CANON_LIDE_35;
1096    model.motor_id = MotorId::CANON_LIDE_60;
1097    model.flags = ModelFlag::DARK_WHITE_CALIBRATION |
1098                  ModelFlag::HOST_SIDE_GRAY |
1099                  ModelFlag::CUSTOM_GAMMA;
1100
1101    model.buttons = GENESYS_HAS_COPY_SW |
1102                    GENESYS_HAS_SCAN_SW |
1103                    GENESYS_HAS_FILE_SW |
1104                    GENESYS_HAS_EMAIL_SW;
1105    model.search_lines = 400;
1106    s_usb_devices->emplace_back(0x04a9, 0x221c, model);
1107
1108
1109    model = Genesys_Model();
1110    model.name = "canon-lide-80";
1111    model.vendor = "Canon";
1112    model.model = "LiDE 80";
1113    model.model_id = ModelId::CANON_LIDE_80;
1114    model.asic_type = AsicType::GL841;
1115
1116    model.resolutions = {
1117        {
1118            { ScanMethod::FLATBED },
1119            {       1200, 600, 300, 150, 100, 75 },
1120            { 2400, 1200, 600, 300, 150, 100, 75 },
1121        }
1122    };
1123
1124    model.bpp_gray_values = { 8, 16 };
1125    model.bpp_color_values = { 8, 16 };
1126    model.x_offset = 0.42;
1127    model.y_offset = 7.90;
1128    model.x_size = 216.07;
1129    model.y_size = 299.0;
1130
1131    model.y_offset_calib_white = 4.5;
1132    model.y_size_calib_mm = 3.0;
1133    model.y_offset_calib_dark_white_mm = 1.0;
1134    model.y_size_calib_dark_white_mm = 6.0;
1135    model.x_offset_calib_black = 0.0;
1136    model.x_size_calib_mm = 216.7467;
1137
1138    model.post_scan = 0.0;
1139    model.eject_feed = 0.0;
1140
1141    model.ld_shift_r = 0;
1142    model.ld_shift_g = 0;
1143    model.ld_shift_b = 0;
1144
1145    model.line_mode_color_order = ColorOrder::RGB;
1146
1147    model.is_cis = true;
1148    model.is_sheetfed = false;
1149    model.sensor_id = SensorId::CIS_CANON_LIDE_80;
1150    model.adc_id = AdcId::CANON_LIDE_80;
1151    model.gpio_id = GpioId::CANON_LIDE_80;
1152    model.motor_id = MotorId::CANON_LIDE_80;
1153    model.flags = ModelFlag::DARK_WHITE_CALIBRATION |
1154                  ModelFlag::HOST_SIDE_GRAY |
1155                  ModelFlag::CUSTOM_GAMMA;
1156    model.buttons = GENESYS_HAS_SCAN_SW |
1157                    GENESYS_HAS_FILE_SW |
1158                    GENESYS_HAS_EMAIL_SW |
1159                    GENESYS_HAS_COPY_SW;
1160    model.search_lines = 400;
1161
1162    s_usb_devices->emplace_back(0x04a9, 0x2214, model);
1163
1164
1165    model = Genesys_Model();
1166    model.name = "canon-lide-90";
1167    model.vendor = "Canon";
1168    model.model = "LiDE 90";
1169    model.model_id = ModelId::CANON_LIDE_90;
1170    model.asic_type = AsicType::GL842;
1171
1172    model.resolutions = {
1173        {
1174            { ScanMethod::FLATBED },
1175            { 2400, 1200, 600, 300 },
1176            { 2400, 1200, 600, 300 },
1177        }
1178    };
1179
1180    model.bpp_gray_values = { 8, 16 };
1181    model.bpp_color_values = { 8, 16 };
1182    model.x_offset = 3.50;
1183    model.y_offset = 9.0;
1184    model.x_size = 219.0;
1185    model.y_size = 299.0;
1186
1187    model.y_offset_calib_white = 0.0;
1188    model.y_size_calib_mm = 2.0;
1189    model.y_offset_calib_dark_white_mm = 0.0;
1190    model.y_size_calib_dark_white_mm = 0.0;
1191    model.x_offset_calib_black = 0.0;
1192    model.x_size_calib_mm = 221.5;
1193
1194    model.post_scan = 0.0;
1195    model.eject_feed = 0.0;
1196
1197    model.ld_shift_r = 0;
1198    model.ld_shift_g = 0;
1199    model.ld_shift_b = 0;
1200
1201    model.line_mode_color_order = ColorOrder::RGB;
1202
1203    model.is_cis = true;
1204    model.is_sheetfed = false;
1205    model.sensor_id = SensorId::CIS_CANON_LIDE_90;
1206    model.adc_id = AdcId::CANON_LIDE_90;
1207    model.gpio_id = GpioId::CANON_LIDE_90;
1208    model.motor_id = MotorId::CANON_LIDE_90;
1209    model.flags = ModelFlag::DISABLE_ADC_CALIBRATION |
1210                  ModelFlag::HOST_SIDE_CALIBRATION_COMPLETE_SCAN |
1211                  ModelFlag::USE_CONSTANT_FOR_DARK_CALIBRATION |
1212                  ModelFlag::DISABLE_FAST_FEEDING |
1213                  ModelFlag::SHADING_REPARK |
1214                  ModelFlag::CUSTOM_GAMMA;
1215    model.buttons = GENESYS_HAS_SCAN_SW |
1216                    GENESYS_HAS_FILE_SW |
1217                    GENESYS_HAS_EMAIL_SW |
1218                    GENESYS_HAS_COPY_SW;
1219    model.search_lines = 400;
1220
1221    s_usb_devices->emplace_back(0x04a9, 0x1900, model);
1222
1223
1224    model = Genesys_Model();
1225    model.name = "hewlett-packard-scanjet-2300c";
1226    model.vendor = "Hewlett Packard";
1227    model.model = "ScanJet 2300c";
1228    model.model_id = ModelId::HP_SCANJET_2300C;
1229    model.asic_type = AsicType::GL646;
1230
1231    model.resolutions = {
1232        {
1233            { ScanMethod::FLATBED },
1234            { 600, 300, 150, 75 },
1235            { 1200, 600, 300, 150, 75 },
1236        }
1237    };
1238
1239    model.bpp_gray_values = { 8, 16 };
1240    model.bpp_color_values = { 8, 16 };
1241
1242    model.x_offset = 6.5;
1243    model.y_offset = 8;
1244    model.x_size = 215.9;
1245    model.y_size = 295.0;
1246
1247    model.y_offset_calib_white = 0.0;
1248    model.y_size_calib_mm = 4.0;
1249    model.x_offset_calib_black = 1.0;
1250    model.x_size_calib_mm = 227.2454;
1251
1252    model.post_scan = 0.0;
1253    model.eject_feed = 0.0;
1254
1255    model.ld_shift_r = 32;
1256    model.ld_shift_g = 16;
1257    model.ld_shift_b = 0;
1258
1259    model.line_mode_color_order = ColorOrder::RGB;
1260    model.is_cis = false;
1261    model.is_sheetfed = false;
1262    model.sensor_id = SensorId::CCD_HP2300;
1263    model.adc_id = AdcId::WOLFSON_HP2300;
1264    model.gpio_id = GpioId::HP2300;
1265    model.motor_id = MotorId::HP2300;
1266    model.flags = ModelFlag::GAMMA_14BIT |
1267                  ModelFlag::DARK_CALIBRATION |
1268                  ModelFlag::CUSTOM_GAMMA;
1269    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW;
1270    model.search_lines = 132;
1271
1272    s_usb_devices->emplace_back(0x03f0, 0x0901, model);
1273
1274
1275    model = Genesys_Model();
1276    model.name = "hewlett-packard-scanjet-2400c";
1277    model.vendor = "Hewlett Packard";
1278    model.model = "ScanJet 2400c";
1279    model.model_id = ModelId::HP_SCANJET_2400C;
1280    model.asic_type = AsicType::GL646;
1281
1282    model.resolutions = {
1283        {
1284            { ScanMethod::FLATBED },
1285            { 1200, 600, 300, 150, 100, 50 },
1286            { 1200, 600, 300, 150, 100, 50 },
1287        }
1288    };
1289
1290    model.bpp_gray_values = { 8, 16 };
1291    model.bpp_color_values = { 8, 16 };
1292
1293    model.x_offset = 6.5;
1294    model.y_offset = 2.5;
1295    model.x_size = 220.0;
1296    model.y_size = 297.2;
1297
1298    model.y_offset_calib_white = 0.0;
1299    model.y_size_calib_mm = 2.0; // FIXME: check if white area is really so small
1300    model.x_offset_calib_black = 1.0;
1301    model.x_size_calib_mm = 230.1241;
1302
1303    model.post_scan = 0.0;
1304    model.eject_feed = 0.0;
1305
1306    model.ld_shift_r = 0;
1307    model.ld_shift_g = 24;
1308    model.ld_shift_b = 48;
1309
1310    model.line_mode_color_order = ColorOrder::RGB;
1311
1312    model.is_cis = false;
1313    model.is_sheetfed = false;
1314    model.sensor_id = SensorId::CCD_HP2400;
1315    model.adc_id = AdcId::WOLFSON_HP2400;
1316    model.gpio_id = GpioId::HP2400;
1317    model.motor_id = MotorId::HP2400;
1318    model.flags = ModelFlag::GAMMA_14BIT |
1319                  ModelFlag::DARK_CALIBRATION |
1320                  ModelFlag::CUSTOM_GAMMA;
1321    model.buttons = GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_SCAN_SW;
1322    model.search_lines = 132;
1323
1324    s_usb_devices->emplace_back(0x03f0, 0x0a01, model);
1325
1326
1327    model = Genesys_Model();
1328    model.name = "visioneer-strobe-xp200";
1329    model.vendor = "Visioneer";
1330    model.model = "Strobe XP200";
1331    model.model_id = ModelId::VISIONEER_STROBE_XP200;
1332    model.asic_type = AsicType::GL646;
1333
1334    model.resolutions = {
1335        {
1336            { ScanMethod::FLATBED },
1337            { 600, 300, 200, 100, 75 },
1338            { 600, 300, 200, 100, 75 },
1339        }
1340    };
1341
1342    model.bpp_gray_values = { 8, 16 };
1343    model.bpp_color_values = { 8, 16 };
1344
1345    model.x_offset = 0.5;
1346    model.y_offset = 16.0;
1347    model.x_size = 215.9;
1348    model.y_size = 297.2;
1349
1350    model.y_offset_calib_white = 0.0;
1351    model.y_size_calib_mm = 4.0;
1352    model.x_offset_calib_black = 0.0;
1353    model.x_size_calib_mm = 220.1334;
1354
1355    model.post_scan = 0.0;
1356    model.eject_feed = 0.0;
1357
1358    model.ld_shift_r = 0;
1359    model.ld_shift_g = 0;
1360    model.ld_shift_b = 0;
1361
1362    model.line_mode_color_order = ColorOrder::RGB;
1363
1364    model.is_cis = true;
1365    model.is_sheetfed = true;
1366    model.sensor_id = SensorId::CIS_XP200;
1367    model.adc_id = AdcId::AD_XP200;
1368    model.gpio_id = GpioId::XP200;
1369    model.motor_id = MotorId::XP200;
1370    model.flags = ModelFlag::GAMMA_14BIT |
1371                  ModelFlag::CUSTOM_GAMMA |
1372                  ModelFlag::DARK_CALIBRATION;
1373    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1374    model.search_lines = 132;
1375
1376    s_usb_devices->emplace_back(0x04a7, 0x0426, model);
1377
1378
1379    model = Genesys_Model();
1380    model.name = "hewlett-packard-scanjet-3670";
1381    model.vendor = "Hewlett Packard";
1382    model.model = "ScanJet 3670";
1383    model.model_id = ModelId::HP_SCANJET_3670;
1384    model.asic_type = AsicType::GL646;
1385
1386    model.resolutions = {
1387        {
1388            { ScanMethod::FLATBED },
1389            { 1200, 600, 300, 150, 100, 75, 50 },
1390            { 1200, 600, 300, 150, 100, 75, 50 },
1391        }
1392    };
1393
1394    model.bpp_gray_values = { 8, 16 };
1395    model.bpp_color_values = { 8, 16 };
1396
1397    model.x_offset = 8.5;
1398    model.y_offset = 11.0;
1399    model.x_size = 215.9;
1400    model.y_size = 300.0;
1401
1402    model.y_offset_calib_white = 0.0;
1403    model.y_size_calib_mm = 4.0;
1404    model.x_offset_calib_black = 1.0;
1405    model.x_size_calib_mm = 230.1241;
1406
1407    model.post_scan = 0.0;
1408    model.eject_feed = 0.0;
1409
1410    model.ld_shift_r = 0;
1411    model.ld_shift_g = 24;
1412    model.ld_shift_b = 48;
1413
1414    model.line_mode_color_order = ColorOrder::RGB;
1415
1416    model.is_cis = false;
1417    model.is_sheetfed = false;
1418    model.sensor_id = SensorId::CCD_HP3670;
1419    model.adc_id = AdcId::WOLFSON_HP3670;
1420    model.gpio_id = GpioId::HP3670;
1421    model.motor_id = MotorId::HP3670;
1422    model.flags = ModelFlag::WARMUP |
1423                  ModelFlag::GAMMA_14BIT |
1424                  ModelFlag::DARK_CALIBRATION |
1425                  ModelFlag::CUSTOM_GAMMA;
1426    model.buttons = GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_SCAN_SW;
1427    model.search_lines = 200;
1428
1429    s_usb_devices->emplace_back(0x03f0, 0x1405, model);
1430
1431
1432    model = Genesys_Model();
1433    model.name = "plustek-opticpro-st12";
1434    model.vendor = "Plustek";
1435    model.model = "OpticPro ST12";
1436    model.model_id = ModelId::PLUSTEK_OPTICPRO_ST12;
1437    model.asic_type = AsicType::GL646;
1438
1439    model.resolutions = {
1440        {
1441            { ScanMethod::FLATBED },
1442            { 600, 300, 150, 75 },
1443            { 1200, 600, 300, 150, 75 },
1444        }
1445    };
1446
1447    model.bpp_gray_values = { 8, 16 };
1448    model.bpp_color_values = { 8, 16 };
1449
1450    model.x_offset = 3.5;
1451    model.y_offset = 7.5;
1452    model.x_size = 218.0;
1453    model.y_size = 299.0;
1454
1455    model.y_offset_calib_white = 0.0;
1456    model.y_size_calib_mm = 4.0;
1457    model.x_offset_calib_black = 1.0;
1458    model.x_size_calib_mm = 229.2774;
1459
1460    model.post_scan = 0.0;
1461    model.eject_feed = 0.0;
1462
1463    model.ld_shift_r = 0;
1464    model.ld_shift_g = 8;
1465    model.ld_shift_b = 16;
1466
1467    model.line_mode_color_order = ColorOrder::BGR;
1468
1469    model.is_cis = false;
1470    model.is_sheetfed = false;
1471    model.sensor_id = SensorId::CCD_ST12;
1472    model.adc_id = AdcId::WOLFSON_ST12;
1473    model.gpio_id = GpioId::ST12;
1474    model.motor_id = MotorId::UMAX;
1475    model.flags = ModelFlag::UNTESTED | ModelFlag::GAMMA_14BIT;
1476    model.buttons = GENESYS_HAS_NO_BUTTONS;
1477    model.search_lines = 200;
1478
1479    s_usb_devices->emplace_back(0x07b3, 0x0600, model);
1480
1481    model = Genesys_Model();
1482    model.name = "plustek-opticpro-st24";
1483    model.vendor = "Plustek";
1484    model.model = "OpticPro ST24";
1485    model.model_id = ModelId::PLUSTEK_OPTICPRO_ST24;
1486    model.asic_type = AsicType::GL646;
1487
1488    model.resolutions = {
1489        {
1490            { ScanMethod::FLATBED },
1491            { 1200, 600, 300, 150, 75 },
1492            { 2400, 1200, 600, 300, 150, 75 },
1493        }
1494    };
1495
1496    model.bpp_gray_values = { 8, 16 };
1497    model.bpp_color_values = { 8, 16 };
1498
1499    model.x_offset = 3.5;
1500    model.y_offset = 7.5; // FIXME: incorrect, needs updating
1501    model.x_size = 218.0;
1502    model.y_size = 299.0;
1503
1504    model.y_offset_calib_white = 0.0;
1505    model.y_size_calib_mm = 4.0;
1506    model.x_offset_calib_black = 1.0;
1507    model.x_size_calib_mm = 228.6;
1508
1509    model.post_scan = 0.0;
1510    model.eject_feed = 0.0;
1511
1512    model.ld_shift_r = 0;
1513    model.ld_shift_g = 8;
1514    model.ld_shift_b = 16;
1515
1516    model.line_mode_color_order = ColorOrder::BGR;
1517
1518    model.is_cis = false;
1519    model.is_sheetfed = false;
1520    model.sensor_id = SensorId::CCD_ST24;
1521    model.adc_id = AdcId::WOLFSON_ST24;
1522    model.gpio_id = GpioId::ST24;
1523    model.motor_id = MotorId::ST24;
1524    model.flags = ModelFlag::UNTESTED |
1525                  ModelFlag::GAMMA_14BIT |
1526                  ModelFlag::CUSTOM_GAMMA;
1527    model.buttons = GENESYS_HAS_NO_BUTTONS;
1528    model.search_lines = 200;
1529
1530    s_usb_devices->emplace_back(0x07b3, 0x0601, model);
1531
1532    model = Genesys_Model();
1533    model.name = "medion-md5345-model";
1534    model.vendor = "Medion";
1535    model.model = "MD5345/MD6228/MD6471";
1536    model.model_id = ModelId::MEDION_MD5345;
1537    model.asic_type = AsicType::GL646;
1538
1539    model.resolutions = {
1540        {
1541            { ScanMethod::FLATBED },
1542            { 1200, 600, 400, 300, 200, 150, 100, 75, 50 },
1543            { 2400, 1200, 600, 400, 300, 200, 150, 100, 75, 50 },
1544        }
1545    };
1546
1547    model.bpp_gray_values = { 8, 16 };
1548    model.bpp_color_values = { 8, 16 };
1549
1550    model.x_offset = 0.30;
1551    model.y_offset = 4.0; // FIXME: incorrect, needs updating
1552    model.x_size = 220.0;
1553    model.y_size = 296.4;
1554
1555    model.y_offset_calib_white = 0.00;
1556    model.y_size_calib_mm = 2.0;
1557    model.x_offset_calib_black = 0.00;
1558    model.x_size_calib_mm = 230.1241;
1559
1560    model.post_scan = 0.0;
1561    model.eject_feed = 0.0;
1562
1563    model.ld_shift_r = 96;
1564    model.ld_shift_g = 48;
1565    model.ld_shift_b = 0;
1566    model.line_mode_color_order = ColorOrder::RGB;
1567
1568    model.is_cis = false;
1569    model.is_sheetfed = false;
1570    model.sensor_id = SensorId::CCD_5345;
1571    model.adc_id = AdcId::WOLFSON_5345;
1572    model.gpio_id = GpioId::MD_5345;
1573    model.motor_id = MotorId::MD_5345;
1574    model.flags = ModelFlag::WARMUP |
1575                  ModelFlag::GAMMA_14BIT |
1576                  ModelFlag::DARK_CALIBRATION |
1577                  ModelFlag::CUSTOM_GAMMA;
1578    model.buttons = GENESYS_HAS_COPY_SW |
1579                    GENESYS_HAS_EMAIL_SW |
1580                    GENESYS_HAS_POWER_SW |
1581                    GENESYS_HAS_OCR_SW |
1582                    GENESYS_HAS_SCAN_SW;
1583    model.search_lines = 200;
1584
1585    s_usb_devices->emplace_back(0x0461, 0x0377, model);
1586
1587    model = Genesys_Model();
1588    model.name = "visioneer-strobe-xp300";
1589    model.vendor = "Visioneer";
1590    model.model = "Strobe XP300";
1591    model.model_id = ModelId::VISIONEER_STROBE_XP300;
1592    model.asic_type = AsicType::GL841;
1593
1594    model.resolutions = {
1595        {
1596            { ScanMethod::FLATBED },
1597            { 600, 300, 150, 75 },
1598            { 600, 300, 150, 75 },
1599        }
1600    };
1601
1602    model.bpp_gray_values = { 8, 16 };
1603    model.bpp_color_values = { 8, 16 };
1604
1605    model.x_offset = 0.0;
1606    model.y_offset = 1.0;
1607    model.x_size = 435.0;
1608    model.y_size = 511;
1609
1610    model.y_offset_calib_white = 0.0;
1611    model.y_size_calib_mm = 4.0;
1612    model.x_offset_calib_black = 0.0;
1613    model.x_size_calib_mm = 433.4934;
1614
1615    model.post_scan = 26.5;
1616    // this is larger than needed -- accounts for second sensor head, which is a calibration item
1617    model.eject_feed = 0.0;
1618    model.ld_shift_r = 0;
1619    model.ld_shift_g = 0;
1620    model.ld_shift_b = 0;
1621
1622    model.line_mode_color_order = ColorOrder::RGB;
1623
1624    model.is_cis = true;
1625    model.is_sheetfed = true;
1626    model.sensor_id = SensorId::CCD_XP300;
1627    model.adc_id = AdcId::WOLFSON_XP300;
1628    model.gpio_id = GpioId::XP300;
1629    model.motor_id = MotorId::XP300;
1630    model.flags = ModelFlag::DARK_CALIBRATION |
1631                  ModelFlag::CUSTOM_GAMMA;
1632    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1633    model.search_lines = 400;
1634
1635    s_usb_devices->emplace_back(0x04a7, 0x0474, model);
1636
1637    model = Genesys_Model();
1638    model.name = "syscan-docketport-665";
1639    model.vendor = "Syscan/Ambir";
1640    model.model = "DocketPORT 665";
1641    model.model_id = ModelId::SYSCAN_DOCKETPORT_665;
1642    model.asic_type = AsicType::GL841;
1643
1644    model.resolutions = {
1645        {
1646            { ScanMethod::FLATBED },
1647            { 600, 300, 150, 75 },
1648            { 1200, 600, 300, 150, 75 },
1649        }
1650    };
1651
1652    model.bpp_gray_values = { 8, 16 };
1653    model.bpp_color_values = { 8, 16 };
1654
1655    model.x_offset = 0.0;
1656    model.y_offset = 0.0;
1657    model.x_size = 108.0;
1658    model.y_size = 511;
1659
1660    model.y_offset_calib_white = 0.0;
1661    model.y_size_calib_mm = 4.0;
1662    model.x_offset_calib_black = 0.0;
1663    model.x_size_calib_mm = 105.664;
1664
1665    model.post_scan = 17.5;
1666    model.eject_feed = 0.0;
1667
1668    model.ld_shift_r = 0;
1669    model.ld_shift_g = 0;
1670    model.ld_shift_b = 0;
1671
1672    model.line_mode_color_order = ColorOrder::RGB;
1673
1674    model.is_cis = true;
1675    model.is_sheetfed = true;
1676    model.sensor_id = SensorId::CCD_DP665;
1677    model.adc_id = AdcId::WOLFSON_XP300;
1678    model.gpio_id = GpioId::DP665;
1679    model.motor_id = MotorId::DP665;
1680    model.flags = ModelFlag::DARK_CALIBRATION |
1681                  ModelFlag::CUSTOM_GAMMA;
1682    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1683    model.search_lines = 400;
1684
1685    s_usb_devices->emplace_back(0x0a82, 0x4803, model);
1686
1687    model = Genesys_Model();
1688    model.name = "visioneer-roadwarrior";
1689    model.vendor = "Visioneer";
1690    model.model = "Readwarrior";
1691    model.model_id = ModelId::VISIONEER_ROADWARRIOR;
1692    model.asic_type = AsicType::GL841;
1693
1694    model.resolutions = {
1695        {
1696            { ScanMethod::FLATBED },
1697            { 600, 300, 150, 75 },
1698            { 1200, 600, 300, 150, 75 },
1699        }
1700    };
1701
1702    model.bpp_gray_values = { 8, 16 };
1703    model.bpp_color_values = { 8, 16 };
1704
1705    model.x_offset = 0.0;
1706    model.y_offset = 0.0;
1707    model.x_size = 220.0;
1708    model.y_size = 511;
1709
1710    model.y_offset_calib_white = 0.0;
1711    model.y_size_calib_mm = 4.0;
1712    model.x_offset_calib_black = 0.0;
1713    model.x_size_calib_mm = 220.1334;
1714
1715    model.post_scan = 16.0;
1716    model.eject_feed = 0.0;
1717
1718    model.ld_shift_r = 0;
1719    model.ld_shift_g = 0;
1720    model.ld_shift_b = 0;
1721
1722    model.line_mode_color_order = ColorOrder::RGB;
1723
1724    model.is_cis = true;
1725    model.is_sheetfed = true;
1726    model.sensor_id = SensorId::CCD_ROADWARRIOR;
1727    model.adc_id = AdcId::WOLFSON_XP300;
1728    model.gpio_id = GpioId::DP665;
1729    model.motor_id = MotorId::ROADWARRIOR;
1730    model.flags = ModelFlag::CUSTOM_GAMMA |
1731                  ModelFlag::DARK_CALIBRATION;
1732    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1733    model.search_lines = 400;
1734
1735    s_usb_devices->emplace_back(0x04a7, 0x0494, model);
1736
1737    model = Genesys_Model();
1738    model.name = "syscan-docketport-465";
1739    model.vendor = "Syscan";
1740    model.model = "DocketPORT 465";
1741    model.model_id = ModelId::SYSCAN_DOCKETPORT_465;
1742    model.asic_type = AsicType::GL841;
1743
1744    model.resolutions = {
1745        {
1746            { ScanMethod::FLATBED },
1747            { 600, 300, 150, 75 },
1748            { 1200, 600, 300, 150, 75 },
1749        }
1750    };
1751
1752    model.bpp_gray_values = { 8, 16 };
1753    model.bpp_color_values = { 8, 16 };
1754
1755    model.x_offset = 0.0;
1756    model.y_offset = 0.0;
1757    model.x_size = 220.0;
1758    model.y_size = 511;
1759
1760    model.y_offset_calib_white = 0.0;
1761    model.y_size_calib_mm = 4.0;
1762    model.x_offset_calib_black = 0.0;
1763    model.x_size_calib_mm = 220.1334;
1764
1765    model.post_scan = 16.0;
1766    model.eject_feed = 0.0;
1767
1768    model.ld_shift_r = 0;
1769    model.ld_shift_g = 0;
1770    model.ld_shift_b = 0;
1771
1772    model.line_mode_color_order = ColorOrder::RGB;
1773
1774    model.is_cis = true;
1775    model.is_sheetfed = true;
1776    model.sensor_id = SensorId::CCD_ROADWARRIOR;
1777    model.adc_id = AdcId::WOLFSON_XP300;
1778    model.gpio_id = GpioId::DP665;
1779    model.motor_id = MotorId::ROADWARRIOR;
1780    model.flags = ModelFlag::DISABLE_ADC_CALIBRATION |
1781                  ModelFlag::DISABLE_EXPOSURE_CALIBRATION |
1782                  ModelFlag::DISABLE_SHADING_CALIBRATION |
1783                  ModelFlag::CUSTOM_GAMMA |
1784                  ModelFlag::UNTESTED;
1785    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW;
1786    model.search_lines = 400;
1787
1788    s_usb_devices->emplace_back(0x0a82, 0x4802, model);
1789
1790
1791    model = Genesys_Model();
1792    model.name = "visioneer-xp100-revision3";
1793    model.vendor = "Visioneer";
1794    model.model = "XP100 Revision 3";
1795    model.model_id = ModelId::VISIONEER_STROBE_XP100_REVISION3;
1796    model.asic_type = AsicType::GL841;
1797
1798    model.resolutions = {
1799        {
1800            { ScanMethod::FLATBED },
1801            { 600, 300, 150, 75 },
1802            { 1200, 600, 300, 150, 75 },
1803        }
1804    };
1805
1806    model.bpp_gray_values = { 8, 16 };
1807    model.bpp_color_values = { 8, 16 };
1808
1809    model.x_offset = 0.0;
1810    model.y_offset = 0.0;
1811    model.x_size = 220.0;
1812    model.y_size = 511;
1813
1814    model.y_offset_calib_white = 0.0;
1815    model.y_size_calib_mm = 4.0;
1816    model.x_offset_calib_black = 0.0;
1817    model.x_size_calib_mm = 220.1334;
1818
1819    model.post_scan = 16.0;
1820    model.eject_feed = 0.0;
1821
1822    model.ld_shift_r = 0;
1823    model.ld_shift_g = 0;
1824    model.ld_shift_b = 0;
1825
1826    model.line_mode_color_order = ColorOrder::RGB;
1827
1828    model.is_cis = true;
1829    model.is_sheetfed = true;
1830    model.sensor_id = SensorId::CCD_ROADWARRIOR;
1831    model.adc_id = AdcId::WOLFSON_XP300;
1832    model.gpio_id = GpioId::DP665;
1833    model.motor_id = MotorId::ROADWARRIOR;
1834    model.flags = ModelFlag::CUSTOM_GAMMA |
1835                  ModelFlag::DARK_CALIBRATION;
1836    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1837    model.search_lines = 400;
1838
1839    s_usb_devices->emplace_back(0x04a7, 0x049b, model);
1840
1841    model = Genesys_Model();
1842    model.name = "pentax-dsmobile-600";
1843    model.vendor = "Pentax";
1844    model.model = "DSmobile 600";
1845    model.model_id = ModelId::PENTAX_DSMOBILE_600;
1846    model.asic_type = AsicType::GL841;
1847
1848    model.resolutions = {
1849        {
1850            { ScanMethod::FLATBED },
1851            { 600, 300, 150, 75 },
1852            { 1200, 600, 300, 150, 75 },
1853        }
1854    };
1855
1856    model.bpp_gray_values = { 8, 16 };
1857    model.bpp_color_values = { 8, 16 };
1858
1859    model.x_offset = 0.0;
1860    model.y_offset = 0.0;
1861    model.x_size = 220.0;
1862    model.y_size = 511;
1863
1864    model.y_offset_calib_white = 0.0;
1865    model.y_size_calib_mm = 4.0;
1866    model.x_offset_calib_black = 0.0;
1867    model.x_size_calib_mm = 220.1334;
1868
1869    model.post_scan = 16.0;
1870    model.eject_feed = 0.0;
1871
1872    model.ld_shift_r = 0;
1873    model.ld_shift_g = 0;
1874    model.ld_shift_b = 0;
1875
1876    model.line_mode_color_order = ColorOrder::RGB;
1877
1878    model.is_cis = true;
1879    model.is_sheetfed = true;
1880    model.sensor_id = SensorId::CCD_DSMOBILE600;
1881    model.adc_id = AdcId::WOLFSON_DSM600;
1882    model.gpio_id = GpioId::DP665;
1883    model.motor_id = MotorId::DSMOBILE_600;
1884    model.flags = ModelFlag::CUSTOM_GAMMA |
1885                  ModelFlag::DARK_CALIBRATION;
1886    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1887    model.search_lines = 400;
1888
1889    s_usb_devices->emplace_back(0x0a17, 0x3210, model);
1890    // clone, only usb id is different
1891    s_usb_devices->emplace_back(0x04f9, 0x2038, model);
1892
1893    model = Genesys_Model();
1894    model.name = "syscan-docketport-467";
1895    model.vendor = "Syscan";
1896    model.model = "DocketPORT 467";
1897    model.model_id = ModelId::SYSCAN_DOCKETPORT_467;
1898    model.asic_type = AsicType::GL841;
1899
1900    model.resolutions = {
1901        {
1902            { ScanMethod::FLATBED },
1903            { 600, 300, 150, 75 },
1904            { 1200, 600, 300, 150, 75 },
1905        }
1906    };
1907
1908    model.bpp_gray_values = { 8, 16 };
1909    model.bpp_color_values = { 8, 16 };
1910
1911    model.x_offset = 0.0;
1912    model.y_offset = 0.0;
1913    model.x_size = 220.0;
1914    model.y_size = 511;
1915
1916    model.y_offset_calib_white = 0.0;
1917    model.y_size_calib_mm = 4.0;
1918    model.x_offset_calib_black = 0.0;
1919    model.x_size_calib_mm = 220.1334;
1920
1921    model.post_scan = 16.0;
1922    model.eject_feed = 0.0;
1923
1924    model.ld_shift_r = 0;
1925    model.ld_shift_g = 0;
1926    model.ld_shift_b = 0;
1927    model.line_mode_color_order = ColorOrder::RGB;
1928
1929    model.is_cis = true;
1930    model.is_sheetfed = true;
1931    model.sensor_id = SensorId::CCD_DSMOBILE600;
1932    model.adc_id = AdcId::WOLFSON_DSM600;
1933    model.gpio_id = GpioId::DP665;
1934    model.motor_id = MotorId::DSMOBILE_600;
1935    model.flags = ModelFlag::CUSTOM_GAMMA |
1936                  ModelFlag::DARK_CALIBRATION;
1937    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1938    model.search_lines = 400;
1939
1940    s_usb_devices->emplace_back(0x1dcc, 0x4812, model);
1941
1942    model = Genesys_Model();
1943    model.name = "syscan-docketport-685";
1944    model.vendor = "Syscan/Ambir";
1945    model.model = "DocketPORT 685";
1946    model.model_id = ModelId::SYSCAN_DOCKETPORT_685;
1947    model.asic_type = AsicType::GL841;
1948
1949    model.resolutions = {
1950        {
1951            { ScanMethod::FLATBED },
1952            { 600, 300, 150, 75 },
1953            { 600, 300, 150, 75 },
1954        }
1955    };
1956
1957    model.bpp_gray_values = { 8, 16 };
1958    model.bpp_color_values = { 8, 16 };
1959
1960    model.x_offset = 0.0;
1961    model.y_offset = 1.0;
1962    model.x_size = 212.0;
1963    model.y_size = 500;
1964
1965    model.y_offset_calib_white = 0.0;
1966    model.y_size_calib_mm = 4.0;
1967    model.x_offset_calib_black = 0.0;
1968    model.x_size_calib_mm = 212.5134;
1969
1970    model.post_scan = 26.5;
1971    // this is larger than needed -- accounts for second sensor head, which is a calibration item
1972    model.eject_feed = 0.0;
1973    model.ld_shift_r = 0;
1974    model.ld_shift_g = 0;
1975    model.ld_shift_b = 0;
1976
1977    model.line_mode_color_order = ColorOrder::RGB;
1978
1979    model.is_cis = true;
1980    model.is_sheetfed = true;
1981    model.sensor_id = SensorId::CCD_DP685;
1982    model.adc_id = AdcId::WOLFSON_DSM600;
1983    model.gpio_id = GpioId::DP685;
1984    model.motor_id = MotorId::XP300;
1985    model.flags = ModelFlag::CUSTOM_GAMMA |
1986                  ModelFlag::DARK_CALIBRATION;
1987    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
1988    model.search_lines = 400;
1989
1990
1991    s_usb_devices->emplace_back(0x0a82, 0x480c, model);
1992
1993
1994    model = Genesys_Model();
1995    model.name = "syscan-docketport-485";
1996    model.vendor = "Syscan/Ambir";
1997    model.model = "DocketPORT 485";
1998    model.model_id = ModelId::SYSCAN_DOCKETPORT_485;
1999    model.asic_type = AsicType::GL841;
2000
2001    model.resolutions = {
2002        {
2003            { ScanMethod::FLATBED },
2004            { 600, 300, 150, 75 },
2005            { 600, 300, 150, 75 },
2006        }
2007    };
2008
2009    model.bpp_gray_values = { 8, 16 };
2010    model.bpp_color_values = { 8, 16 };
2011
2012    model.x_offset = 0.0;
2013    model.y_offset = 1.0;
2014    model.x_size = 435.0;
2015    model.y_size = 511;
2016
2017    model.y_offset_calib_white = 0.0;
2018    model.y_size_calib_mm = 4.0;
2019    model.x_offset_calib_black = 0.0;
2020    model.x_size_calib_mm = 433.4934;
2021
2022    model.post_scan = 26.5;
2023    // this is larger than needed -- accounts for second sensor head, which is a calibration item
2024    model.eject_feed = 0.0;
2025    model.ld_shift_r = 0;
2026    model.ld_shift_g = 0;
2027    model.ld_shift_b = 0;
2028
2029    model.line_mode_color_order = ColorOrder::RGB;
2030
2031    model.is_cis = true;
2032    model.is_sheetfed = true;
2033    model.sensor_id = SensorId::CCD_XP300;
2034    model.adc_id = AdcId::WOLFSON_XP300;
2035    model.gpio_id = GpioId::XP300;
2036    model.motor_id = MotorId::XP300;
2037    model.flags = ModelFlag::CUSTOM_GAMMA |
2038                  ModelFlag::DARK_CALIBRATION;
2039    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
2040    model.search_lines = 400;
2041
2042    s_usb_devices->emplace_back(0x0a82, 0x4800, model);
2043
2044
2045    model = Genesys_Model();
2046    model.name = "dct-docketport-487";
2047    model.vendor = "DCT";
2048    model.model = "DocketPORT 487";
2049    model.model_id = ModelId::DCT_DOCKETPORT_487;
2050    model.asic_type = AsicType::GL841;
2051
2052    model.resolutions = {
2053        {
2054            { ScanMethod::FLATBED },
2055            { 600, 300, 150, 75 },
2056            { 600, 300, 150, 75 },
2057        }
2058    };
2059
2060    model.bpp_gray_values = { 8, 16 };
2061    model.bpp_color_values = { 8, 16 };
2062
2063    model.x_offset = 0.0;
2064    model.y_offset = 1.0;
2065    model.x_size = 435.0;
2066    model.y_size = 511;
2067
2068    model.y_offset_calib_white = 0.0;
2069    model.y_size_calib_mm = 4.0;
2070    model.x_offset_calib_black = 0.0;
2071    model.x_size_calib_mm = 433.4934;
2072
2073    model.post_scan = 26.5;
2074    // this is larger than needed -- accounts for second sensor head, which is a calibration item
2075    model.eject_feed = 0.0;
2076
2077    model.ld_shift_r = 0;
2078    model.ld_shift_g = 0;
2079    model.ld_shift_b = 0;
2080
2081    model.line_mode_color_order = ColorOrder::RGB;
2082
2083    model.is_cis = true;
2084    model.is_sheetfed = true;
2085    model.sensor_id = SensorId::CCD_DOCKETPORT_487;
2086    model.adc_id = AdcId::WOLFSON_XP300;
2087    model.gpio_id = GpioId::XP300;
2088    model.motor_id = MotorId::XP300;
2089    model.flags = ModelFlag::DARK_CALIBRATION |
2090                  ModelFlag::CUSTOM_GAMMA |
2091                  ModelFlag::UNTESTED;
2092    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
2093    model.search_lines = 400;
2094
2095    s_usb_devices->emplace_back(0x1dcc, 0x4810, model);
2096
2097
2098    model = Genesys_Model();
2099    model.name = "visioneer-7100-model";
2100    model.vendor = "Visioneer";
2101    model.model = "OneTouch 7100";
2102    model.model_id = ModelId::VISIONEER_7100;
2103    model.asic_type = AsicType::GL646;
2104
2105    model.resolutions = {
2106        {
2107            { ScanMethod::FLATBED },
2108            { 1200, 600, 400, 300, 200, 150, 100, 75, 50 },
2109            { 2400, 1200, 600, 400, 300, 200, 150, 100, 75, 50 },
2110        }
2111    };
2112
2113    model.bpp_gray_values = { 8, 16 };
2114    model.bpp_color_values = { 8, 16 };
2115
2116    model.x_offset = 4.00;
2117    model.y_offset = 5.0; // FIXME: incorrect, needs updating
2118    model.x_size = 215.9;
2119    model.y_size = 296.4;
2120
2121    model.y_offset_calib_white = 0.00;
2122    model.y_size_calib_mm = 4.0;
2123    model.x_offset_calib_black = 0.00;
2124    model.x_size_calib_mm = 230.1241;
2125
2126    model.post_scan = 0.0;
2127    model.eject_feed = 0.0;
2128
2129    model.ld_shift_r = 96;
2130    model.ld_shift_g = 48;
2131    model.ld_shift_b = 0;
2132    model.line_mode_color_order = ColorOrder::RGB;
2133
2134    model.is_cis = false;
2135    model.is_sheetfed = false;
2136    model.sensor_id = SensorId::CCD_5345;
2137    model.adc_id = AdcId::WOLFSON_5345;
2138    model.gpio_id = GpioId::MD_5345;
2139    model.motor_id = MotorId::MD_5345;
2140    model.flags = ModelFlag::WARMUP |
2141                  ModelFlag::GAMMA_14BIT |
2142                  ModelFlag::DARK_CALIBRATION |
2143                  ModelFlag::CUSTOM_GAMMA;
2144    model.buttons = GENESYS_HAS_COPY_SW |
2145                    GENESYS_HAS_EMAIL_SW |
2146                    GENESYS_HAS_POWER_SW |
2147                    GENESYS_HAS_OCR_SW |
2148                    GENESYS_HAS_SCAN_SW;
2149    model.search_lines = 200;
2150
2151    s_usb_devices->emplace_back(0x04a7, 0x0229, model);
2152
2153
2154    model = Genesys_Model();
2155    model.name = "xerox-2400-model";
2156    model.vendor = "Xerox";
2157    model.model = "OneTouch 2400";
2158    model.model_id = ModelId::XEROX_2400;
2159    model.asic_type = AsicType::GL646;
2160
2161    model.resolutions = {
2162        {
2163            { ScanMethod::FLATBED },
2164            { 1200, 600, 400, 300, 200, 150, 100, 75, 50 },
2165            { 2400, 1200, 600, 400, 300, 200, 150, 100, 75, 50 },
2166        }
2167    };
2168
2169    model.bpp_gray_values = { 8, 16 };
2170    model.bpp_color_values = { 8, 16 };
2171
2172    model.x_offset = 4.00;
2173    model.y_offset = 5.0; // FIXME: incorrect, needs updating
2174    model.x_size = 215.9;
2175    model.y_size = 296.4;
2176
2177    model.y_offset_calib_white = 0.00;
2178    model.y_size_calib_mm = 4.0;
2179    model.x_offset_calib_black = 0.00;
2180    model.x_size_calib_mm = 230.1241;
2181
2182    model.post_scan = 0.0;
2183    model.eject_feed = 0.0;
2184
2185    model.ld_shift_r = 96;
2186    model.ld_shift_g = 48;
2187    model.ld_shift_b = 0;
2188    model.line_mode_color_order = ColorOrder::RGB;
2189
2190    model.is_cis = false;
2191    model.is_sheetfed = false;
2192    model.sensor_id = SensorId::CCD_5345;
2193    model.adc_id = AdcId::WOLFSON_5345;
2194    model.gpio_id = GpioId::MD_5345;
2195    model.motor_id = MotorId::MD_5345;
2196    model.flags = ModelFlag::WARMUP |
2197                  ModelFlag::GAMMA_14BIT |
2198                  ModelFlag::DARK_CALIBRATION |
2199                  ModelFlag::CUSTOM_GAMMA;
2200    model.buttons = GENESYS_HAS_COPY_SW |
2201                    GENESYS_HAS_EMAIL_SW |
2202                    GENESYS_HAS_POWER_SW |
2203                    GENESYS_HAS_OCR_SW |
2204                    GENESYS_HAS_SCAN_SW;
2205    model.search_lines = 200;
2206
2207    s_usb_devices->emplace_back(0x0461, 0x038b, model);
2208
2209
2210    model = Genesys_Model();
2211    model.name = "xerox-travelscanner";
2212    model.vendor = "Xerox";
2213    model.model = "Travelscanner 100";
2214    model.model_id = ModelId::XEROX_TRAVELSCANNER_100;
2215    model.asic_type = AsicType::GL841;
2216
2217    model.resolutions = {
2218        {
2219            { ScanMethod::FLATBED },
2220            { 600, 300, 150, 75 },
2221            { 1200, 600, 300, 150, 75 },
2222        }
2223    };
2224
2225    model.bpp_gray_values = { 8, 16 };
2226    model.bpp_color_values = { 8, 16 };
2227
2228    model.x_offset = 4.0;
2229    model.y_offset = 0.0;
2230    model.x_size = 220.0;
2231    model.y_size = 511;
2232
2233    model.y_offset_calib_white = 0.0;
2234    model.y_size_calib_mm = 4.0;
2235    model.x_offset_calib_black = 0.0;
2236    model.x_size_calib_mm = 220.1334;
2237
2238    model.post_scan = 16.0;
2239    model.eject_feed = 0.0;
2240
2241    model.ld_shift_r = 0;
2242    model.ld_shift_g = 0;
2243    model.ld_shift_b = 0;
2244
2245    model.line_mode_color_order = ColorOrder::RGB;
2246
2247    model.is_cis = true;
2248    model.is_sheetfed = true;
2249    model.sensor_id = SensorId::CCD_ROADWARRIOR;
2250    model.adc_id = AdcId::WOLFSON_XP300;
2251    model.gpio_id = GpioId::DP665;
2252    model.motor_id = MotorId::ROADWARRIOR;
2253    model.flags = ModelFlag::CUSTOM_GAMMA |
2254                  ModelFlag::DARK_CALIBRATION;
2255    model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE;
2256    model.search_lines = 400;
2257
2258    s_usb_devices->emplace_back(0x04a7, 0x04ac, model);
2259
2260
2261    model = Genesys_Model();
2262    model.name = "plustek-opticbook-3600";
2263    model.vendor = "PLUSTEK";
2264    model.model = "OpticBook 3600";
2265    model.model_id = ModelId::PLUSTEK_OPTICPRO_3600;
2266    model.asic_type = AsicType::GL841;
2267
2268    model.resolutions = {
2269        {
2270            { ScanMethod::FLATBED },
2271            { /*1200,*/ 600, 400, 300, 200, 150, 100, 75 },
2272            { /*2400,*/ 1200, 600, 400, 300, 200, 150, 100, 75 },
2273        }
2274    };
2275
2276    model.bpp_gray_values = { 8, 16 };
2277    model.bpp_color_values = { 8, 16 };
2278
2279    model.x_offset = 0.42;
2280    model.y_offset = 6.75;
2281    model.x_size = 216.0;
2282    model.y_size = 297.0;
2283
2284    model.y_offset_calib_white = 0.0;
2285    model.y_size_calib_mm = 4.0;
2286    model.x_offset_calib_black = 0.0;
2287    model.x_size_calib_mm = 213.7834;
2288
2289    model.post_scan = 0.0;
2290    model.eject_feed = 0.0;
2291
2292    model.ld_shift_r = 0;
2293    model.ld_shift_g = 24;
2294    model.ld_shift_b = 48;
2295
2296    model.line_mode_color_order = ColorOrder::RGB;
2297
2298    model.is_cis = false;
2299    model.is_sheetfed = false;
2300    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICPRO_3600;
2301    model.adc_id = AdcId::PLUSTEK_OPTICPRO_3600;
2302    model.gpio_id = GpioId::PLUSTEK_OPTICPRO_3600;
2303    model.motor_id = MotorId::PLUSTEK_OPTICPRO_3600;
2304    model.flags = ModelFlag::UNTESTED |                // not fully working yet
2305                  ModelFlag::CUSTOM_GAMMA |
2306                  ModelFlag::DARK_CALIBRATION;
2307    model.buttons = GENESYS_HAS_NO_BUTTONS;
2308    model.search_lines = 200;
2309
2310    s_usb_devices->emplace_back(0x07b3, 0x0900, model);
2311
2312
2313
2314    model = Genesys_Model();
2315    model.name = "plustek-opticfilm-7200";
2316    model.vendor = "PLUSTEK";
2317    model.model = "OpticFilm 7200";
2318    model.model_id = ModelId::PLUSTEK_OPTICFILM_7200;
2319    model.asic_type = AsicType::GL842;
2320
2321    model.resolutions = {
2322        {
2323            { ScanMethod::TRANSPARENCY },
2324            { 7200, 3600, 1800, 900 },
2325            { 7200, 3600, 1800, 900 },
2326        }
2327    };
2328
2329    model.bpp_gray_values = { 16 };
2330    model.bpp_color_values = { 16 };
2331    model.default_method = ScanMethod::TRANSPARENCY;
2332
2333    model.x_offset = 0.0;
2334    model.y_offset = 0.0;
2335    model.x_size = 36.0;
2336    model.y_size = 44.0;
2337
2338    model.y_offset_calib_white = 0.0;
2339    model.y_size_calib_mm = 0.0;
2340    model.x_offset_calib_black = 6.5;
2341    model.x_size_calib_mm = 35.9834;
2342
2343    model.x_offset_ta = 0.7f;
2344    model.y_offset_ta = 28.0;
2345    model.x_size_ta = 36.0;
2346    model.y_size_ta = 25.0;
2347
2348    model.y_offset_sensor_to_ta = 0.0;
2349    model.y_offset_calib_black_ta = 6.5;
2350    model.y_offset_calib_white_ta = 0.0;
2351    model.y_size_calib_ta_mm = 2.0;
2352
2353    model.post_scan = 0.0;
2354    model.eject_feed = 0.0;
2355
2356    model.ld_shift_r = 0;
2357    model.ld_shift_g = 12;
2358    model.ld_shift_b = 24;
2359
2360    model.line_mode_color_order = ColorOrder::RGB;
2361
2362    model.is_cis = false;
2363    model.is_sheetfed = false;
2364
2365    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7200;
2366    model.adc_id = AdcId::PLUSTEK_OPTICFILM_7200;
2367    model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7200;
2368    model.motor_id = MotorId::PLUSTEK_OPTICFILM_7200;
2369
2370    model.flags = ModelFlag::WARMUP |
2371                  ModelFlag::CUSTOM_GAMMA |
2372                  ModelFlag::DARK_CALIBRATION |
2373                  ModelFlag::SHADING_REPARK;
2374
2375    model.search_lines = 200;
2376    s_usb_devices->emplace_back(0x07b3, 0x0807, model);
2377
2378
2379    model = Genesys_Model();
2380    model.name = "plustek-opticfilm-7200i";
2381    model.vendor = "PLUSTEK";
2382    model.model = "OpticFilm 7200i";
2383    model.model_id = ModelId::PLUSTEK_OPTICFILM_7200I;
2384    model.asic_type = AsicType::GL843;
2385
2386    model.resolutions = {
2387        {
2388            { ScanMethod::TRANSPARENCY, ScanMethod::TRANSPARENCY_INFRARED },
2389            { 7200, 3600, 1800, 900 },
2390            { 7200, 3600, 1800, 900 },
2391        }
2392    };
2393
2394    model.bpp_gray_values = { 16 };
2395    model.bpp_color_values = { 16 };
2396    model.default_method = ScanMethod::TRANSPARENCY;
2397
2398    model.x_offset = 0.0;
2399    model.y_offset = 0.0;
2400    model.x_size = 36.0;
2401    model.y_size = 44.0;
2402
2403    model.y_offset_calib_white = 0.0;
2404    model.y_size_calib_mm = 0.0;
2405    model.x_offset_calib_black = 6.5;
2406    model.x_size_calib_mm = 35.9834;
2407
2408    model.x_offset_ta = 0.0;
2409    model.y_offset_ta = 29.0;
2410    model.x_size_ta = 36.0;
2411    model.y_size_ta = 24.0;
2412
2413    model.y_offset_sensor_to_ta = 0.0;
2414    model.y_offset_calib_black_ta = 6.5;
2415    model.y_offset_calib_white_ta = 0.0;
2416    model.y_size_calib_ta_mm = 2.0;
2417
2418    model.post_scan = 0.0;
2419    model.eject_feed = 0.0;
2420
2421    model.ld_shift_r = 0;
2422    model.ld_shift_g = 12;
2423    model.ld_shift_b = 24;
2424
2425    model.line_mode_color_order = ColorOrder::RGB;
2426
2427    model.is_cis = false;
2428    model.is_sheetfed = false;
2429
2430    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7200I;
2431    model.adc_id = AdcId::PLUSTEK_OPTICFILM_7200I;
2432    model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7200I;
2433    model.motor_id = MotorId::PLUSTEK_OPTICFILM_7200I;
2434
2435    model.flags = ModelFlag::WARMUP |
2436                  ModelFlag::CUSTOM_GAMMA |
2437                  ModelFlag::DARK_CALIBRATION |
2438                  ModelFlag::SHADING_REPARK |
2439                  ModelFlag::SWAP_16BIT_DATA;
2440
2441    model.search_lines = 200;
2442    s_usb_devices->emplace_back(0x07b3, 0x0c04, model);
2443
2444
2445    // same as 7200i, just without the infrared channel
2446    model.name = "plustek-opticfilm-7200-v2";
2447    model.model = "OpticFilm 7200 v2";
2448    model.resolutions = {
2449        {
2450            { ScanMethod::TRANSPARENCY },
2451            { 7200, 3600, 1800, 900 },
2452            { 7200, 3600, 1800, 900 },
2453        }
2454    };
2455    s_usb_devices->emplace_back(0x07b3, 0x0c07, model);
2456
2457
2458    model = Genesys_Model();
2459    model.name = "plustek-opticfilm-7300";
2460    model.vendor = "PLUSTEK";
2461    model.model = "OpticFilm 7300";
2462    model.model_id = ModelId::PLUSTEK_OPTICFILM_7300;
2463    model.asic_type = AsicType::GL843;
2464
2465    model.resolutions = {
2466        {
2467            { ScanMethod::TRANSPARENCY },
2468            { 7200, 3600, 1800, 900 },
2469            { 7200, 3600, 1800, 900 },
2470        }
2471    };
2472
2473    model.bpp_gray_values = { 16 };
2474    model.bpp_color_values = { 16 };
2475    model.default_method = ScanMethod::TRANSPARENCY;
2476
2477    model.x_offset = 0.0;
2478    model.y_offset = 0.0;
2479    model.x_size = 36.0;
2480    model.y_size = 44.0;
2481
2482    model.y_offset_calib_white = 0.0;
2483    model.y_size_calib_mm = 0.0;
2484    model.x_offset_calib_black = 6.5;
2485    model.x_size_calib_mm = 35.9834;
2486
2487    model.x_offset_ta = 0.0;
2488    model.y_offset_ta = 29.0;
2489    model.x_size_ta = 36.0;
2490    model.y_size_ta = 24.0;
2491
2492    model.y_offset_sensor_to_ta = 0.0;
2493    model.y_offset_calib_black_ta = 6.5;
2494    model.y_offset_calib_white_ta = 0.0;
2495    model.y_size_calib_ta_mm = 2.0;
2496
2497    model.post_scan = 0.0;
2498    model.eject_feed = 0.0;
2499
2500    model.ld_shift_r = 0;
2501    model.ld_shift_g = 12;
2502    model.ld_shift_b = 24;
2503
2504    model.line_mode_color_order = ColorOrder::RGB;
2505
2506    model.is_cis = false;
2507    model.is_sheetfed = false;
2508
2509    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7300;
2510    model.adc_id = AdcId::PLUSTEK_OPTICFILM_7300;
2511    model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7300;
2512    model.motor_id = MotorId::PLUSTEK_OPTICFILM_7300;
2513
2514    model.flags = ModelFlag::WARMUP |
2515                  ModelFlag::CUSTOM_GAMMA |
2516                  ModelFlag::DARK_CALIBRATION |
2517                  ModelFlag::SHADING_REPARK;
2518
2519    model.search_lines = 200;
2520    s_usb_devices->emplace_back(0x07b3, 0x0c12, model);
2521
2522
2523    // same as 7300, same USB ID as 7400-v2
2524    model.name = "plustek-opticfilm-7400-v1";
2525    model.model = "OpticFilm 7400 (v1)";
2526    s_usb_devices->emplace_back(0x07b3, 0x0c3a, 0x0400, model);
2527
2528
2529    model = Genesys_Model();
2530    model.name = "plustek-opticfilm-7400-v2";
2531    model.vendor = "PLUSTEK";
2532    model.model = "OpticFilm 7400 (v2)";
2533    model.model_id = ModelId::PLUSTEK_OPTICFILM_7400;
2534    model.asic_type = AsicType::GL845;
2535
2536    model.resolutions = {
2537        {
2538            { ScanMethod::TRANSPARENCY },
2539            { 7200, 3600, 2400, 1200, 600 },
2540            { 7200, 3600, 2400, 1200, 600 },
2541        }
2542    };
2543
2544    model.bpp_gray_values = { 16 };
2545    model.bpp_color_values = { 16 };
2546    model.default_method = ScanMethod::TRANSPARENCY;
2547
2548    model.x_offset = 0.0;
2549    model.y_offset = 0.0;
2550    model.x_size = 36.0;
2551    model.y_size = 44.0;
2552
2553    model.y_offset_calib_white = 0.0;
2554    model.y_size_calib_mm = 0.0;
2555    model.x_offset_calib_black = 6.5;
2556    model.x_size_calib_mm = 36.83;
2557
2558    model.x_offset_ta = 0.5;
2559    model.y_offset_ta = 29.0;
2560    model.x_size_ta = 36.33;
2561    model.y_size_ta = 25.0;
2562
2563    model.y_offset_sensor_to_ta = 0.0;
2564    model.y_offset_calib_black_ta = 6.5;
2565    model.y_offset_calib_white_ta = 0.0;
2566    model.y_size_calib_ta_mm = 2.0;
2567
2568    model.post_scan = 0.0;
2569    model.eject_feed = 0.0;
2570
2571    model.ld_shift_r = 0;
2572    model.ld_shift_g = 12;
2573    model.ld_shift_b = 24;
2574
2575    model.line_mode_color_order = ColorOrder::RGB;
2576
2577    model.is_cis = false;
2578    model.is_sheetfed = false;
2579
2580    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7400;
2581    model.adc_id = AdcId::PLUSTEK_OPTICFILM_7400;
2582    model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7400;
2583    model.motor_id = MotorId::PLUSTEK_OPTICFILM_7400;
2584
2585    model.flags = ModelFlag::CUSTOM_GAMMA |
2586                  ModelFlag::DARK_CALIBRATION |
2587                  ModelFlag::SHADING_REPARK;
2588
2589    model.search_lines = 200;
2590    s_usb_devices->emplace_back(0x07b3, 0x0c3a, 0x0605, model);
2591
2592
2593    // same as 7400-v2
2594    model.name = "plustek-opticfilm-8100";
2595    model.model = "OpticFilm 8100";
2596    s_usb_devices->emplace_back(0x07b3, 0x130c, model);
2597
2598
2599    model = Genesys_Model();
2600    model.name = "plustek-opticfilm-7500i";
2601    model.vendor = "PLUSTEK";
2602    model.model = "OpticFilm 7500i";
2603    model.model_id = ModelId::PLUSTEK_OPTICFILM_7500I;
2604    model.asic_type = AsicType::GL843;
2605
2606    model.resolutions = {
2607        {
2608            { ScanMethod::TRANSPARENCY, ScanMethod::TRANSPARENCY_INFRARED },
2609            { 7200, 3600, 1800, 900 },
2610            { 7200, 3600, 1800, 900 },
2611        }
2612    };
2613
2614    model.bpp_gray_values = { 16 };
2615    model.bpp_color_values = { 16 };
2616    model.default_method = ScanMethod::TRANSPARENCY;
2617
2618    model.x_offset = 0.0;
2619    model.y_offset = 0.0;
2620    model.x_size = 36.0;
2621    model.y_size = 44.0;
2622
2623    model.y_offset_calib_white = 0.0;
2624    model.y_size_calib_mm = 0.0;
2625    model.x_offset_calib_black = 6.5;
2626
2627    model.x_offset_ta = 0.0;
2628    model.y_offset_ta = 29.0;
2629    model.x_size_ta = 36.0;
2630    model.y_size_ta = 24.0;
2631    model.x_size_calib_mm = 35.9834;
2632
2633    model.y_offset_sensor_to_ta = 0.0;
2634    model.y_offset_calib_black_ta = 6.5;
2635    model.y_offset_calib_white_ta = 0.0;
2636    model.y_size_calib_ta_mm = 2.0;
2637
2638    model.post_scan = 0.0;
2639    model.eject_feed = 0.0;
2640
2641    model.ld_shift_r = 0;
2642    model.ld_shift_g = 12;
2643    model.ld_shift_b = 24;
2644
2645    model.line_mode_color_order = ColorOrder::RGB;
2646
2647    model.is_cis = false;
2648    model.is_sheetfed = false;
2649
2650    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7500I;
2651    model.adc_id = AdcId::PLUSTEK_OPTICFILM_7500I;
2652    model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7500I;
2653    model.motor_id = MotorId::PLUSTEK_OPTICFILM_7500I;
2654
2655    model.flags = ModelFlag::WARMUP |
2656                  ModelFlag::CUSTOM_GAMMA |
2657                  ModelFlag::DARK_CALIBRATION |
2658                  ModelFlag::SHADING_REPARK;
2659
2660    model.search_lines = 200;
2661    s_usb_devices->emplace_back(0x07b3, 0x0c13, model);
2662
2663
2664    // same as 7500i
2665    model.name = "plustek-opticfilm-7600i-v1";
2666    model.model = "OpticFilm 7600i (v1)";
2667    s_usb_devices->emplace_back(0x07b3, 0x0c3b, 0x0400, model);
2668
2669
2670    model = Genesys_Model();
2671    model.name = "plustek-opticfilm-8200i";
2672    model.vendor = "PLUSTEK";
2673    model.model = "OpticFilm 8200i";
2674    model.model_id = ModelId::PLUSTEK_OPTICFILM_8200I;
2675    model.asic_type = AsicType::GL845;
2676
2677    model.resolutions = {
2678        {
2679            { ScanMethod::TRANSPARENCY, ScanMethod::TRANSPARENCY_INFRARED },
2680            { 7200, 3600, 1800, 900 },
2681            { 7200, 3600, 1800, 900 },
2682        }
2683    };
2684
2685    model.bpp_gray_values = { 16 };
2686    model.bpp_color_values = { 16 };
2687    model.default_method = ScanMethod::TRANSPARENCY;
2688
2689    model.x_offset = 0.0;
2690    model.y_offset = 0.0;
2691    model.x_size = 36.0;
2692    model.y_size = 44.0;
2693
2694    model.y_offset_calib_white = 0.0;
2695    model.y_size_calib_mm = 0.0;
2696    model.x_offset_calib_black = 6.5;
2697    model.x_size_calib_mm = 36.83;
2698
2699    model.x_offset_ta = 0.5;
2700    model.y_offset_ta = 28.5;
2701    model.x_size_ta = 36.33;
2702    model.y_size_ta = 25.0;
2703
2704    model.y_offset_sensor_to_ta = 0.0;
2705    model.y_offset_calib_black_ta = 6.5;
2706    model.y_offset_calib_white_ta = 0.0;
2707    model.y_size_calib_ta_mm = 2.0;
2708
2709    model.post_scan = 0.0;
2710    model.eject_feed = 0.0;
2711
2712    model.ld_shift_r = 0;
2713    model.ld_shift_g = 12;
2714    model.ld_shift_b = 24;
2715
2716    model.line_mode_color_order = ColorOrder::RGB;
2717
2718    model.is_cis = false;
2719    model.is_sheetfed = false;
2720
2721    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_8200I;
2722    model.adc_id = AdcId::PLUSTEK_OPTICFILM_8200I;
2723    model.gpio_id = GpioId::PLUSTEK_OPTICFILM_8200I;
2724    model.motor_id = MotorId::PLUSTEK_OPTICFILM_8200I;
2725
2726    model.flags = ModelFlag::CUSTOM_GAMMA |
2727                  ModelFlag::DARK_CALIBRATION |
2728                  ModelFlag::SHADING_REPARK;
2729
2730    model.search_lines = 200;
2731    s_usb_devices->emplace_back(0x07b3, 0x130d, model);
2732
2733
2734    // same as 8200i
2735    model.name = "plustek-opticfilm-7600i-v2";
2736    model.model = "OpticFilm 7600i (v2)";
2737    s_usb_devices->emplace_back(0x07b3, 0x0c3b, 0x0605, model);
2738
2739
2740    model = Genesys_Model();
2741    model.name = "hewlett-packard-scanjet-N6310";
2742    model.vendor = "Hewlett Packard";
2743    model.model = "ScanJet N6310";
2744    model.model_id = ModelId::HP_SCANJET_N6310;
2745    model.asic_type = AsicType::GL847;
2746
2747    model.resolutions = {
2748        {
2749            { ScanMethod::FLATBED },
2750            { 2400, 1200, 600, 400, 300, 200, 150, 100, 75 },
2751            { 2400, 1200, 600, 400, 300, 200, 150, 100, 75 },
2752        }
2753    };
2754
2755    model.bpp_gray_values = { 8, 16 };
2756    model.bpp_color_values = { 8, 16 };
2757
2758    model.x_offset = 6;
2759    model.y_offset = 2;
2760    model.x_size = 216;
2761    model.y_size = 511;
2762
2763    model.y_offset_calib_white = 0.0;
2764    model.y_size_calib_mm = 4.0; // FIXME: y_offset is liely incorrect
2765    model.x_offset_calib_black = 0.0;
2766    model.x_size_calib_mm = 452.12;
2767
2768    model.post_scan = 0;
2769    model.eject_feed = 0;
2770
2771    model.ld_shift_r = 0;
2772    model.ld_shift_g = 0;
2773    model.ld_shift_b = 0;
2774
2775    model.line_mode_color_order = ColorOrder::RGB;
2776
2777    model.is_cis = false;
2778    model.is_sheetfed = false;
2779    model.sensor_id = SensorId::CCD_HP_N6310;
2780    model.adc_id = AdcId::CANON_LIDE_200;        // Not defined yet for N6310
2781    model.gpio_id = GpioId::HP_N6310;
2782    model.motor_id = MotorId::CANON_LIDE_200;    // Not defined yet for N6310
2783    model.flags = ModelFlag::UNTESTED |
2784                  ModelFlag::GAMMA_14BIT |
2785                  ModelFlag::DARK_CALIBRATION |
2786                  ModelFlag::CUSTOM_GAMMA |
2787                  ModelFlag::DISABLE_ADC_CALIBRATION |
2788                  ModelFlag::DISABLE_EXPOSURE_CALIBRATION |
2789                  ModelFlag::DISABLE_SHADING_CALIBRATION;
2790
2791    model.buttons = GENESYS_HAS_NO_BUTTONS;
2792    model.search_lines = 100;
2793
2794    s_usb_devices->emplace_back(0x03f0, 0x4705, model);
2795
2796
2797    model = Genesys_Model();
2798    model.name = "plustek-opticbook-3800";
2799    model.vendor = "PLUSTEK";
2800    model.model = "OpticBook 3800";
2801    model.model_id = ModelId::PLUSTEK_OPTICBOOK_3800;
2802    model.asic_type = AsicType::GL845;
2803
2804    model.resolutions = {
2805        {
2806            { ScanMethod::FLATBED },
2807            { 1200, 600, 300, 150, 100, 75 },
2808            { 1200, 600, 300, 150, 100, 75 },
2809        }
2810    };
2811
2812    model.bpp_gray_values = { 8, 16 };
2813    model.bpp_color_values = { 8, 16 };
2814
2815    model.x_offset = 7.2;
2816    model.y_offset = 14.7;
2817    model.x_size = 217.7;
2818    model.y_size = 300.0;
2819
2820    model.y_offset_calib_white = 9.0;
2821    model.y_size_calib_mm = 4.0;
2822    model.x_offset_calib_black = 0.0;
2823    model.x_size_calib_mm = 215.9;
2824
2825    model.post_scan = 0.0;
2826    model.eject_feed = 0.0;
2827
2828    model.ld_shift_r = 0;
2829    model.ld_shift_g = 24;
2830    model.ld_shift_b = 48;
2831
2832    model.line_mode_color_order = ColorOrder::RGB;
2833
2834    model.is_cis = false;
2835    model.is_sheetfed = false;
2836    model.sensor_id = SensorId::CCD_PLUSTEK_OPTICBOOK_3800;
2837    model.adc_id = AdcId::PLUSTEK_OPTICBOOK_3800;
2838    model.gpio_id = GpioId::PLUSTEK_OPTICBOOK_3800;
2839    model.motor_id = MotorId::PLUSTEK_OPTICBOOK_3800;
2840    model.flags = ModelFlag::CUSTOM_GAMMA;
2841    model.buttons = GENESYS_HAS_NO_BUTTONS;  // TODO there are 4 buttons to support
2842    model.search_lines = 100;
2843
2844    s_usb_devices->emplace_back(0x07b3, 0x1300, model);
2845
2846
2847    model = Genesys_Model();
2848    model.name = "canon-image-formula-101";
2849    model.vendor = "Canon";
2850    model.model = "Image Formula 101";
2851    model.model_id = ModelId::CANON_IMAGE_FORMULA_101;
2852    model.asic_type = AsicType::GL846;
2853
2854    model.resolutions = {
2855        {
2856            { ScanMethod::FLATBED },
2857            { 1200, 600, 300, 150, 100, 75 },
2858            { 1200, 600, 300, 150, 100, 75 },
2859        }
2860    };
2861
2862    model.bpp_gray_values = { 8, 16 };
2863    model.bpp_color_values = { 8, 16 };
2864
2865    model.x_offset = 7.2;
2866    model.y_offset = 14.7;
2867    model.x_size = 217.7;
2868    model.y_size = 300.0;
2869
2870    model.y_offset_calib_white = 9.0;
2871    model.y_size_calib_mm = 4.0;
2872    model.x_offset_calib_black = 0.0;
2873    model.x_size_calib_mm = 228.6;
2874
2875    model.post_scan = 0.0;
2876    model.eject_feed = 0.0;
2877
2878    model.ld_shift_r = 0;
2879    model.ld_shift_g = 24;
2880    model.ld_shift_b = 48;
2881
2882    model.line_mode_color_order = ColorOrder::RGB;
2883
2884    model.is_cis = false;
2885    model.is_sheetfed = false;
2886    model.sensor_id = SensorId::CCD_IMG101;
2887    model.adc_id = AdcId::IMG101;
2888    model.gpio_id = GpioId::IMG101;
2889    model.motor_id = MotorId::IMG101;
2890    model.flags = ModelFlag::CUSTOM_GAMMA |
2891                  ModelFlag::UNTESTED;
2892    model.buttons = GENESYS_HAS_NO_BUTTONS ;
2893    model.search_lines = 100;
2894
2895    s_usb_devices->emplace_back(0x1083, 0x162e, model);
2896}
2897
2898void verify_usb_device_tables()
2899{
2900    for (const auto& device : *s_usb_devices) {
2901        const auto& model = device.model();
2902
2903        if (model.x_size_calib_mm == 0.0f) {
2904            throw SaneException("Calibration width can't be zero");
2905        }
2906
2907        if (model.has_method(ScanMethod::FLATBED)) {
2908            if (model.y_size_calib_mm == 0.0f) {
2909                throw SaneException("Calibration size can't be zero");
2910            }
2911        }
2912        if (model.has_method(ScanMethod::TRANSPARENCY) ||
2913            model.has_method(ScanMethod::TRANSPARENCY_INFRARED))
2914        {
2915            if (model.y_size_calib_ta_mm == 0.0f) {
2916                throw SaneException("Calibration size can't be zero");
2917            }
2918        }
2919    }
2920}
2921
2922} // namespace genesys
2923