1 /*  sane - Scanner Access Now Easy.
2 
3     Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
4 
5     This file is part of the SANE package.
6 
7     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License as
9     published by the Free Software Foundation; either version 2 of the
10     License, or (at your option) any later version.
11 
12     This program is distributed in the hope that it will be useful, but
13     WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     General Public License for more details.
16 
17     You should have received a copy of the GNU General Public License
18     along with this program.  If not, see <https://www.gnu.org/licenses/>.
19 
20     As a special exception, the authors of SANE give permission for
21     additional uses of the libraries contained in this release of SANE.
22 
23     The exception is that, if you link a SANE library with other files
24     to produce an executable, this does not by itself cause the
25     resulting executable to be covered by the GNU General Public
26     License.  Your use of that executable is in no way restricted on
27     account of linking the SANE library code into it.
28 
29     This exception does not, however, invalidate any other reasons why
30     the executable file might be covered by the GNU General Public
31     License.
32 
33     If you submit changes to SANE to the maintainers to be included in
34     a subsequent release, you agree by submitting the changes that
35     those changes may be distributed with this exception intact.
36 
37     If you write modifications of your own for SANE, it is your choice
38     whether to permit this exception to apply to your modifications.
39     If you do not wish that, delete this exception notice.
40 */
41 
42 #define DEBUG_DECLARE_ONLY
43 
44 #include "low.h"
45 
46 namespace genesys {
47 
48 StaticInit<std::vector<Genesys_Frontend>> s_frontends;
49 
genesys_init_frontend_tables()50 void genesys_init_frontend_tables()
51 {
52     s_frontends.init();
53 
54     GenesysFrontendLayout wolfson_layout;
55     wolfson_layout.type = FrontendType::WOLFSON;
56     wolfson_layout.offset_addr = { 0x20, 0x21, 0x22 };
57     wolfson_layout.gain_addr = { 0x28, 0x29, 0x2a };
58 
59     GenesysFrontendLayout analog_devices;
60     analog_devices.type = FrontendType::ANALOG_DEVICES;
61     analog_devices.offset_addr = { 0x05, 0x06, 0x07 };
62     analog_devices.gain_addr = { 0x02, 0x03, 0x04 };
63 
64     Genesys_Frontend fe;
65     fe.id = AdcId::WOLFSON_UMAX;
66     fe.layout = wolfson_layout;
67     fe.regs = {
68         { 0x00, 0x00 },
69         { 0x01, 0x03 },
70         { 0x02, 0x05 },
71         { 0x03, 0x11 },
72         { 0x20, 0x80 },
73         { 0x21, 0x80 },
74         { 0x22, 0x80 },
75         { 0x24, 0x00 },
76         { 0x25, 0x00 },
77         { 0x26, 0x00 },
78         { 0x28, 0x02 },
79         { 0x29, 0x02 },
80         { 0x2a, 0x02 },
81     };
82     fe.reg2 = {0x00, 0x00, 0x00};
83     s_frontends->push_back(fe);
84 
85 
86     fe = Genesys_Frontend();
87     fe.id = AdcId::WOLFSON_ST12;
88     fe.layout = wolfson_layout;
89     fe.regs = {
90         { 0x00, 0x00 },
91         { 0x01, 0x03 },
92         { 0x02, 0x05 },
93         { 0x03, 0x03 },
94         { 0x20, 0xc8 },
95         { 0x21, 0xc8 },
96         { 0x22, 0xc8 },
97         { 0x24, 0x00 },
98         { 0x25, 0x00 },
99         { 0x26, 0x00 },
100         { 0x28, 0x04 },
101         { 0x29, 0x04 },
102         { 0x2a, 0x04 },
103     };
104     fe.reg2 = {0x00, 0x00, 0x00};
105     s_frontends->push_back(fe);
106 
107 
108     fe = Genesys_Frontend();
109     fe.id = AdcId::WOLFSON_ST24;
110     fe.layout = wolfson_layout;
111     fe.regs = {
112         { 0x00, 0x00 },
113         { 0x01, 0x03 },
114         { 0x02, 0x05 },
115         { 0x03, 0x21 },
116         { 0x20, 0xc8 },
117         { 0x21, 0xc8 },
118         { 0x22, 0xc8 },
119         { 0x24, 0x00 },
120         { 0x25, 0x00 },
121         { 0x26, 0x00 },
122         { 0x28, 0x06 },
123         { 0x29, 0x06 },
124         { 0x2a, 0x06 },
125     };
126     fe.reg2 = {0x00, 0x00, 0x00};
127     s_frontends->push_back(fe);
128 
129 
130     fe = Genesys_Frontend();
131     fe.id = AdcId::WOLFSON_5345;
132     fe.layout = wolfson_layout;
133     fe.regs = {
134         { 0x00, 0x00 },
135         { 0x01, 0x03 },
136         { 0x02, 0x05 },
137         { 0x03, 0x12 },
138         { 0x20, 0xb8 },
139         { 0x21, 0xb8 },
140         { 0x22, 0xb8 },
141         { 0x24, 0x00 },
142         { 0x25, 0x00 },
143         { 0x26, 0x00 },
144         { 0x28, 0x04 },
145         { 0x29, 0x04 },
146         { 0x2a, 0x04 },
147     };
148     fe.reg2 = {0x00, 0x00, 0x00};
149     s_frontends->push_back(fe);
150 
151 
152     // reg3=0x02 for 50-600 dpi, 0x32 (0x12 also works well) at 1200
153     fe = Genesys_Frontend();
154     fe.id = AdcId::WOLFSON_HP2400;
155     fe.layout = wolfson_layout;
156     fe.regs = {
157         { 0x00, 0x00 },
158         { 0x01, 0x03 },
159         { 0x02, 0x05 },
160         { 0x03, 0x02 },
161         { 0x20, 0xb4 },
162         { 0x21, 0xb6 },
163         { 0x22, 0xbc },
164         { 0x24, 0x00 },
165         { 0x25, 0x00 },
166         { 0x26, 0x00 },
167         { 0x28, 0x06 },
168         { 0x29, 0x09 },
169         { 0x2a, 0x08 },
170     };
171     fe.reg2 = {0x00, 0x00, 0x00};
172     s_frontends->push_back(fe);
173 
174 
175     fe = Genesys_Frontend();
176     fe.id = AdcId::WOLFSON_HP2300;
177     fe.layout = wolfson_layout;
178     fe.regs = {
179         { 0x00, 0x00 },
180         { 0x01, 0x03 },
181         { 0x02, 0x04 },
182         { 0x03, 0x02 },
183         { 0x20, 0xbe },
184         { 0x21, 0xbe },
185         { 0x22, 0xbe },
186         { 0x24, 0x00 },
187         { 0x25, 0x00 },
188         { 0x26, 0x00 },
189         { 0x28, 0x04 },
190         { 0x29, 0x04 },
191         { 0x2a, 0x04 },
192     };
193     fe.reg2 = {0x00, 0x00, 0x00};
194     s_frontends->push_back(fe);
195 
196 
197     fe = Genesys_Frontend();
198     fe.id = AdcId::CANON_LIDE_35;
199     fe.layout = wolfson_layout;
200     fe.layout.type = FrontendType::WOLFSON_GL841;
201     fe.regs = {
202         { 0x00, 0x00 },
203         { 0x01, 0x3d },
204         { 0x02, 0x08 },
205         { 0x03, 0x00 },
206         { 0x20, 0xe1 },
207         { 0x21, 0xe1 },
208         { 0x22, 0xe1 },
209         { 0x24, 0x00 },
210         { 0x25, 0x00 },
211         { 0x26, 0x00 },
212         { 0x28, 0x93 },
213         { 0x29, 0x93 },
214         { 0x2a, 0x93 },
215     };
216     fe.reg2 = {0x00, 0x19, 0x06};
217     s_frontends->push_back(fe);
218 
219 
220     fe = Genesys_Frontend();
221     fe.id = AdcId::CANON_LIDE_90;
222     fe.layout = wolfson_layout;
223     fe.layout.type = FrontendType::WOLFSON;
224     fe.regs = {
225         { 0x01, 0x23 },
226         { 0x02, 0x07 },
227         { 0x03, 0x29 },
228         { 0x06, 0x0d },
229         { 0x08, 0x00 },
230         { 0x09, 0x16 },
231         { 0x20, 0x4d },
232         { 0x21, 0x4d },
233         { 0x22, 0x4d },
234         { 0x23, 0x4d },
235         { 0x28, 0x14 },
236         { 0x29, 0x14 },
237         { 0x2a, 0x14 },
238         { 0x2b, 0x14 },
239     };
240     fe.reg2 = {0x00, 0x00, 0x00};
241     s_frontends->push_back(fe);
242 
243 
244     fe = Genesys_Frontend();
245     fe.id = AdcId::AD_XP200;
246     fe.layout = wolfson_layout;
247     fe.regs = {
248         { 0x00, 0x58 },
249         { 0x01, 0x80 },
250         { 0x02, 0x00 },
251         { 0x03, 0x00 },
252         { 0x20, 0x09 },
253         { 0x21, 0x09 },
254         { 0x22, 0x09 },
255         { 0x24, 0x00 },
256         { 0x25, 0x00 },
257         { 0x26, 0x00 },
258         { 0x28, 0x09 },
259         { 0x29, 0x09 },
260         { 0x2a, 0x09 },
261     };
262     fe.reg2 = {0x00, 0x00, 0x00};
263     s_frontends->push_back(fe);
264 
265 
266     fe = Genesys_Frontend();
267     fe.id = AdcId::WOLFSON_XP300;
268     fe.layout = wolfson_layout;
269     fe.layout.type = FrontendType::WOLFSON_GL841;
270     fe.regs = {
271         { 0x00, 0x00 },
272         { 0x01, 0x35 },
273         { 0x02, 0x20 },
274         { 0x03, 0x14 },
275         { 0x20, 0xe1 },
276         { 0x21, 0xe1 },
277         { 0x22, 0xe1 },
278         { 0x24, 0x00 },
279         { 0x25, 0x00 },
280         { 0x26, 0x00 },
281         { 0x28, 0x93 },
282         { 0x29, 0x93 },
283         { 0x2a, 0x93 },
284     };
285     fe.reg2 = {0x07, 0x00, 0x00};
286     s_frontends->push_back(fe);
287 
288 
289     fe = Genesys_Frontend();
290     fe.id = AdcId::WOLFSON_HP3670;
291     fe.layout = wolfson_layout;
292     fe.regs = {
293         { 0x00, 0x00 },
294         { 0x01, 0x03 },
295         { 0x02, 0x05 },
296         { 0x03, 0x32 },
297         { 0x20, 0xba },
298         { 0x21, 0xb8 },
299         { 0x22, 0xb8 },
300         { 0x24, 0x00 },
301         { 0x25, 0x00 },
302         { 0x26, 0x00 },
303         { 0x28, 0x06 },
304         { 0x29, 0x05 },
305         { 0x2a, 0x04 },
306     };
307     fe.reg2 = {0x00, 0x00, 0x00};
308     s_frontends->push_back(fe);
309 
310 
311     fe = Genesys_Frontend();
312     fe.id = AdcId::WOLFSON_DSM600;
313     fe.layout = wolfson_layout;
314     fe.layout.type = FrontendType::WOLFSON_GL841;
315     fe.regs = {
316         { 0x00, 0x00 },
317         { 0x01, 0x35 },
318         { 0x02, 0x20 },
319         { 0x03, 0x14 },
320         { 0x20, 0x85 },
321         { 0x21, 0x85 },
322         { 0x22, 0x85 },
323         { 0x24, 0x00 },
324         { 0x25, 0x00 },
325         { 0x26, 0x00 },
326         { 0x28, 0xa0 },
327         { 0x29, 0xa0 },
328         { 0x2a, 0xa0 },
329     };
330     fe.reg2 = {0x07, 0x00, 0x00};
331     s_frontends->push_back(fe);
332 
333 
334     fe = Genesys_Frontend();
335     fe.id = AdcId::CANON_LIDE_200;
336     fe.layout = analog_devices;
337     fe.layout.type = FrontendType::ANALOG_DEVICES_GL847;
338     fe.regs = {
339         { 0x00, 0x9d },
340         { 0x01, 0x91 },
341         { 0x02, 0x32 },
342         { 0x03, 0x04 },
343         { 0x04, 0x00 },
344         { 0x05, 0x00 },
345         { 0x06, 0x3f },
346         { 0x07, 0x00 },
347     };
348     s_frontends->push_back(fe);
349 
350 
351     fe = Genesys_Frontend();
352     fe.id = AdcId::CANON_LIDE_700F;
353     fe.layout = analog_devices;
354     fe.layout.type = FrontendType::ANALOG_DEVICES_GL847;
355     fe.regs = {
356         { 0x00, 0x9d },
357         { 0x01, 0x9e },
358         { 0x02, 0x2f },
359         { 0x03, 0x04 },
360         { 0x04, 0x00 },
361         { 0x05, 0x00 },
362         { 0x06, 0x3f },
363         { 0x07, 0x00 },
364     };
365     s_frontends->push_back(fe);
366 
367 
368     fe = Genesys_Frontend();
369     fe.id = AdcId::KVSS080;
370     fe.layout = wolfson_layout;
371     fe.regs = {
372         { 0x00, 0x00 },
373         { 0x01, 0x23 },
374         { 0x02, 0x24 },
375         { 0x03, 0x0f },
376         { 0x20, 0x80 },
377         { 0x21, 0x80 },
378         { 0x22, 0x80 },
379         { 0x24, 0x00 },
380         { 0x25, 0x00 },
381         { 0x26, 0x00 },
382         { 0x28, 0x4b },
383         { 0x29, 0x4b },
384         { 0x2a, 0x4b },
385     };
386     fe.reg2 = {0x00,0x00,0x00};
387     s_frontends->push_back(fe);
388 
389 
390     fe = Genesys_Frontend();
391     fe.id = AdcId::G4050;
392     fe.layout = wolfson_layout;
393     fe.regs = {
394         { 0x00, 0x00 },
395         { 0x01, 0x23 },
396         { 0x02, 0x24 },
397         { 0x03, 0x1f },
398         { 0x20, 0x45 },
399         { 0x21, 0x45 },
400         { 0x22, 0x45 },
401         { 0x24, 0x00 },
402         { 0x25, 0x00 },
403         { 0x26, 0x00 },
404         { 0x28, 0x4b },
405         { 0x29, 0x4b },
406         { 0x2a, 0x4b },
407     };
408     fe.reg2 = {0x00,0x00,0x00};
409     s_frontends->push_back(fe);
410 
411 
412     fe = Genesys_Frontend();
413     fe.id = AdcId::CANON_LIDE_110;
414     fe.layout = wolfson_layout;
415     fe.layout.type = FrontendType::WOLFSON_GL124;
416     fe.regs = {
417         { 0x00, 0x80 },
418         { 0x01, 0x8a },
419         { 0x02, 0x23 },
420         { 0x03, 0x4c },
421         { 0x20, 0x00 },
422         { 0x21, 0x00 },
423         { 0x22, 0x00 },
424         { 0x24, 0x00 },
425         { 0x25, 0xca },
426         { 0x26, 0x94 },
427         { 0x28, 0x00 },
428         { 0x29, 0x00 },
429         { 0x2a, 0x00 },
430     };
431     fe.reg2 = {0x00, 0x00, 0x00};
432     s_frontends->push_back(fe);
433 
434     /** @brief GL124 special case
435     * for GL124 based scanners, this struct is "abused"
436     * in fact the fields are map like below to AFE registers
437     * (from Texas Instrument or alike ?)
438     */
439     fe = Genesys_Frontend();
440     fe.id = AdcId::CANON_LIDE_120;
441     fe.layout = wolfson_layout;
442     fe.layout.type = FrontendType::WOLFSON_GL124;
443     fe.regs = {
444         { 0x00, 0x80 },
445         { 0x01, 0xa3 },
446         { 0x02, 0x2b },
447         { 0x03, 0x4c },
448         { 0x20, 0x00 },
449         { 0x21, 0x00 },
450         { 0x22, 0x00 },
451         { 0x24, 0x00 }, // actual address 0x05
452         { 0x25, 0xca }, // actual address 0x06
453         { 0x26, 0x95 }, // actual address 0x07
454         { 0x28, 0x00 },
455         { 0x29, 0x00 },
456         { 0x2a, 0x00 },
457     };
458     fe.reg2 = {0x00, 0x00, 0x00};
459     s_frontends->push_back(fe);
460 
461 
462     fe = Genesys_Frontend();
463     fe.id = AdcId::PLUSTEK_OPTICPRO_3600;
464     fe.layout = wolfson_layout;
465     fe.regs = {
466         { 0x00, 0x70 },
467         { 0x01, 0x80 },
468         { 0x02, 0x00 },
469         { 0x03, 0x00 },
470         { 0x20, 0x00 },
471         { 0x21, 0x00 },
472         { 0x22, 0x00 },
473         { 0x24, 0x00 },
474         { 0x25, 0x00 },
475         { 0x26, 0x00 },
476         { 0x28, 0x3f },
477         { 0x29, 0x3d },
478         { 0x2a, 0x3d },
479     };
480     fe.reg2 = {0x00, 0x00, 0x00};
481     s_frontends->push_back(fe);
482 
483 
484     fe = Genesys_Frontend();
485     fe.id = AdcId::PLUSTEK_OPTICFILM_7200;
486     fe.layout = analog_devices;
487     fe.regs = {
488         { 0x00, 0xf8 },
489         { 0x01, 0x80 },
490         { 0x02, 0x2e },
491         { 0x03, 0x17 },
492         { 0x04, 0x20 },
493         { 0x05, 0x0109 },
494         { 0x06, 0x01 },
495         { 0x07, 0x0104 },
496     };
497     fe.reg2 = {0x00, 0x00, 0x00};
498     s_frontends->push_back(fe);
499 
500 
501     fe = Genesys_Frontend();
502     fe.id = AdcId::PLUSTEK_OPTICFILM_7200I;
503     fe.layout = analog_devices;
504     fe.regs = {
505         { 0x00, 0xf8 },
506         { 0x01, 0x80 },
507         { 0x02, 0x0a },
508         { 0x03, 0x06 },
509         { 0x04, 0x0f },
510         { 0x05, 0x56 },
511         { 0x06, 0x64 },
512         { 0x07, 0x56 },
513     };
514     fe.reg2 = {0x00, 0x00, 0x00};
515     s_frontends->push_back(fe);
516 
517 
518     fe = Genesys_Frontend();
519     fe.id = AdcId::PLUSTEK_OPTICFILM_7300;
520     fe.layout = analog_devices;
521     fe.regs = {
522         { 0x00, 0xf8 },
523         { 0x01, 0x80 },
524         { 0x02, 0x10 },
525         { 0x03, 0x06 },
526         { 0x04, 0x06 },
527         { 0x05, 0x09 },
528         { 0x06, 0x0a },
529         { 0x07, 0x0102 },
530     };
531     fe.reg2 = {0x00, 0x00, 0x00};
532     s_frontends->push_back(fe);
533 
534 
535     fe = Genesys_Frontend();
536     fe.id = AdcId::PLUSTEK_OPTICFILM_7400;
537     fe.layout = analog_devices;
538     fe.regs = {
539         { 0x00, 0xf8 },
540         { 0x01, 0x80 },
541         { 0x02, 0x1f },
542         { 0x03, 0x14 },
543         { 0x04, 0x19 },
544         { 0x05, 0x1b },
545         { 0x06, 0x1e },
546         { 0x07, 0x0e },
547     };
548     fe.reg2 = {0x00, 0x00, 0x00};
549     s_frontends->push_back(fe);
550 
551 
552     fe = Genesys_Frontend();
553     fe.id = AdcId::PLUSTEK_OPTICFILM_7500I;
554     fe.layout = analog_devices;
555     fe.regs = {
556         { 0x00, 0xf8 },
557         { 0x01, 0x80 },
558         { 0x02, 0x1d },
559         { 0x03, 0x17 },
560         { 0x04, 0x13 },
561         { 0x05, 0x00 },
562         { 0x06, 0x00 },
563         { 0x07, 0x0111 },
564     };
565     fe.reg2 = {0x00, 0x00, 0x00};
566     s_frontends->push_back(fe);
567 
568 
569     fe = Genesys_Frontend();
570     fe.id = AdcId::PLUSTEK_OPTICFILM_8200I;
571     fe.layout = analog_devices;
572     fe.regs = {
573         { 0x00, 0xf8 },
574         { 0x01, 0x80 },
575         { 0x02, 0x28 },
576         { 0x03, 0x20 },
577         { 0x04, 0x28 },
578         { 0x05, 0x2f },
579         { 0x06, 0x2d },
580         { 0x07, 0x23 },
581     };
582     fe.reg2 = {0x00, 0x00, 0x00};
583     s_frontends->push_back(fe);
584 
585 
586     fe = Genesys_Frontend();
587     fe.id = AdcId::CANON_4400F;
588     fe.layout = wolfson_layout;
589     fe.regs = {
590         { 0x00, 0x00 },
591         { 0x01, 0x23 },
592         { 0x02, 0x24 },
593         { 0x03, 0x2f },
594         { 0x20, 0x6d },
595         { 0x21, 0x67 },
596         { 0x22, 0x5b },
597         { 0x24, 0x00 },
598         { 0x25, 0x00 },
599         { 0x26, 0x00 },
600         { 0x28, 0xd8 },
601         { 0x29, 0xd1 },
602         { 0x2a, 0xb9 },
603     };
604     fe.reg2 = {0x00, 0x00, 0x00};
605     s_frontends->push_back(fe);
606 
607 
608     fe = Genesys_Frontend();
609     fe.id = AdcId::CANON_5600F;
610     fe.layout = wolfson_layout;
611     fe.regs = {
612         { 0x01, 0x23 },
613         { 0x02, 0x24 },
614         { 0x03, 0x2f },
615         { 0x06, 0x00 },
616         { 0x08, 0x00 },
617         { 0x09, 0x00 },
618         { 0x20, 0x60 },
619         { 0x21, 0x60 },
620         { 0x22, 0x60 },
621         { 0x28, 0x77 },
622         { 0x29, 0x77 },
623         { 0x2a, 0x77 },
624     };
625     s_frontends->push_back(fe);
626 
627 
628     fe = Genesys_Frontend();
629     fe.id = AdcId::CANON_8400F;
630     fe.layout = wolfson_layout;
631     fe.regs = {
632         { 0x00, 0x00 },
633         { 0x01, 0x23 },
634         { 0x02, 0x24 },
635         { 0x03, 0x0f },
636         { 0x20, 0x60 },
637         { 0x21, 0x5c },
638         { 0x22, 0x6c },
639         { 0x24, 0x00 },
640         { 0x25, 0x00 },
641         { 0x26, 0x00 },
642         { 0x28, 0x8a },
643         { 0x29, 0x9f },
644         { 0x2a, 0xc2 },
645     };
646     fe.reg2 = {0x00, 0x00, 0x00};
647     s_frontends->push_back(fe);
648 
649 
650     fe = Genesys_Frontend();
651     fe.id = AdcId::CANON_8600F;
652     fe.layout = wolfson_layout;
653     fe.regs = {
654         { 0x00, 0x00 },
655         { 0x01, 0x23 },
656         { 0x02, 0x24 },
657         { 0x03, 0x2f },
658         { 0x20, 0x67 },
659         { 0x21, 0x69 },
660         { 0x22, 0x68 },
661         { 0x24, 0x00 },
662         { 0x25, 0x00 },
663         { 0x26, 0x00 },
664         { 0x28, 0xdb },
665         { 0x29, 0xda },
666         { 0x2a, 0xd7 },
667     };
668     fe.reg2 = { 0x00, 0x00, 0x00 };
669     s_frontends->push_back(fe);
670 
671 
672     fe = Genesys_Frontend();
673     fe.id = AdcId::IMG101;
674     fe.layout = wolfson_layout;
675     fe.layout.type = FrontendType::WOLFSON_GL846;
676     fe.regs = {
677         { 0x00, 0x78 },
678         { 0x01, 0xf0 },
679         { 0x02, 0x00 },
680         { 0x03, 0x00 },
681         { 0x20, 0x00 },
682         { 0x21, 0x00 },
683         { 0x22, 0x00 },
684         { 0x24, 0x00 },
685         { 0x25, 0x00 },
686         { 0x26, 0x00 },
687         { 0x28, 0x00 },
688         { 0x29, 0x00 },
689         { 0x2a, 0x00 },
690     };
691     fe.reg2 = {0x00, 0x00, 0x00};
692     s_frontends->push_back(fe);
693 
694 
695     fe = Genesys_Frontend();
696     fe.id = AdcId::PLUSTEK_OPTICBOOK_3800;
697     fe.layout = wolfson_layout;
698     fe.layout.type = FrontendType::WOLFSON_GL846;
699     fe.regs = {
700         { 0x00, 0x78 },
701         { 0x01, 0xf0 },
702         { 0x02, 0x00 },
703         { 0x03, 0x00 },
704         { 0x20, 0x00 },
705         { 0x21, 0x00 },
706         { 0x22, 0x00 },
707         { 0x24, 0x00 },
708         { 0x25, 0x00 },
709         { 0x26, 0x00 },
710         { 0x28, 0x00 },
711         { 0x29, 0x00 },
712         { 0x2a, 0x00 },
713     };
714     fe.reg2 = {0x00, 0x00, 0x00};
715     s_frontends->push_back(fe);
716 
717 
718     /* reg0: control 74 data, 70 no data
719     * reg3: offset
720     * reg6: gain
721     * reg0 , reg3, reg6 */
722     fe = Genesys_Frontend();
723     fe.id = AdcId::CANON_LIDE_80;
724     fe.layout = wolfson_layout;
725     fe.layout.type = FrontendType::CANON_LIDE_80;
726     fe.regs = {
727         { 0x00, 0x70 },
728         { 0x01, 0x16 },
729         { 0x02, 0x60 },
730         { 0x03, 0x00 },
731         { 0x20, 0x00 },
732         { 0x21, 0x00 },
733         { 0x22, 0x00 },
734         { 0x24, 0x00 },
735         { 0x25, 0x00 },
736         { 0x26, 0x00 },
737         { 0x28, 0x00 },
738         { 0x29, 0x00 },
739         { 0x2a, 0x00 },
740     };
741     fe.reg2 = {0x00, 0x00, 0x00};
742     s_frontends->push_back(fe);
743 }
744 
745 } // namespace genesys
746