summaryrefslogtreecommitdiff
path: root/backend/genesys/tables_frontend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backend/genesys/tables_frontend.cpp')
-rw-r--r--backend/genesys/tables_frontend.cpp653
1 files changed, 653 insertions, 0 deletions
diff --git a/backend/genesys/tables_frontend.cpp b/backend/genesys/tables_frontend.cpp
new file mode 100644
index 0000000..1edf32f
--- /dev/null
+++ b/backend/genesys/tables_frontend.cpp
@@ -0,0 +1,653 @@
+/* sane - Scanner Access Now Easy.
+
+ Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice.
+*/
+
+#define DEBUG_DECLARE_ONLY
+
+#include "low.h"
+
+namespace genesys {
+
+StaticInit<std::vector<Genesys_Frontend>> s_frontends;
+
+void genesys_init_frontend_tables()
+{
+ s_frontends.init();
+
+ GenesysFrontendLayout wolfson_layout;
+ wolfson_layout.type = FrontendType::WOLFSON;
+ wolfson_layout.offset_addr = { 0x20, 0x21, 0x22 };
+ wolfson_layout.gain_addr = { 0x28, 0x29, 0x2a };
+
+ GenesysFrontendLayout analog_devices;
+ analog_devices.type = FrontendType::ANALOG_DEVICES;
+
+
+ Genesys_Frontend fe;
+ fe.id = AdcId::WOLFSON_UMAX;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x05 },
+ { 0x03, 0x11 },
+ { 0x20, 0x80 },
+ { 0x21, 0x80 },
+ { 0x22, 0x80 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x02 },
+ { 0x29, 0x02 },
+ { 0x2a, 0x02 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_ST12;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x05 },
+ { 0x03, 0x03 },
+ { 0x20, 0xc8 },
+ { 0x21, 0xc8 },
+ { 0x22, 0xc8 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x04 },
+ { 0x29, 0x04 },
+ { 0x2a, 0x04 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_ST24;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x05 },
+ { 0x03, 0x21 },
+ { 0x20, 0xc8 },
+ { 0x21, 0xc8 },
+ { 0x22, 0xc8 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x06 },
+ { 0x29, 0x06 },
+ { 0x2a, 0x06 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_5345;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x05 },
+ { 0x03, 0x12 },
+ { 0x20, 0xb8 },
+ { 0x21, 0xb8 },
+ { 0x22, 0xb8 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x04 },
+ { 0x29, 0x04 },
+ { 0x2a, 0x04 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ // reg3=0x02 for 50-600 dpi, 0x32 (0x12 also works well) at 1200
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_HP2400;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x05 },
+ { 0x03, 0x02 },
+ { 0x20, 0xb4 },
+ { 0x21, 0xb6 },
+ { 0x22, 0xbc },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x06 },
+ { 0x29, 0x09 },
+ { 0x2a, 0x08 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_HP2300;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x04 },
+ { 0x03, 0x02 },
+ { 0x20, 0xbe },
+ { 0x21, 0xbe },
+ { 0x22, 0xbe },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x04 },
+ { 0x29, 0x04 },
+ { 0x2a, 0x04 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_LIDE_35;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x3d },
+ { 0x02, 0x08 },
+ { 0x03, 0x00 },
+ { 0x20, 0xe1 },
+ { 0x21, 0xe1 },
+ { 0x22, 0xe1 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x93 },
+ { 0x29, 0x93 },
+ { 0x2a, 0x93 },
+ };
+ fe.reg2 = {0x00, 0x19, 0x06};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::AD_XP200;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x58 },
+ { 0x01, 0x80 },
+ { 0x02, 0x00 },
+ { 0x03, 0x00 },
+ { 0x20, 0x09 },
+ { 0x21, 0x09 },
+ { 0x22, 0x09 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x09 },
+ { 0x29, 0x09 },
+ { 0x2a, 0x09 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_XP300;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x35 },
+ { 0x02, 0x20 },
+ { 0x03, 0x14 },
+ { 0x20, 0xe1 },
+ { 0x21, 0xe1 },
+ { 0x22, 0xe1 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x93 },
+ { 0x29, 0x93 },
+ { 0x2a, 0x93 },
+ };
+ fe.reg2 = {0x07, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_HP3670;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x03 },
+ { 0x02, 0x05 },
+ { 0x03, 0x32 },
+ { 0x20, 0xba },
+ { 0x21, 0xb8 },
+ { 0x22, 0xb8 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x06 },
+ { 0x29, 0x05 },
+ { 0x2a, 0x04 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::WOLFSON_DSM600;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x35 },
+ { 0x02, 0x20 },
+ { 0x03, 0x14 },
+ { 0x20, 0x85 },
+ { 0x21, 0x85 },
+ { 0x22, 0x85 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0xa0 },
+ { 0x29, 0xa0 },
+ { 0x2a, 0xa0 },
+ };
+ fe.reg2 = {0x07, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_LIDE_200;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x9d },
+ { 0x01, 0x91 },
+ { 0x02, 0x00 },
+ { 0x03, 0x00 },
+ { 0x20, 0x00 },
+ { 0x21, 0x3f },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x32 },
+ { 0x29, 0x04 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_LIDE_700F;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x9d },
+ { 0x01, 0x9e },
+ { 0x02, 0x00 },
+ { 0x03, 0x00 },
+ { 0x20, 0x00 },
+ { 0x21, 0x3f },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x2f },
+ { 0x29, 0x04 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::KVSS080;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x23 },
+ { 0x02, 0x24 },
+ { 0x03, 0x0f },
+ { 0x20, 0x80 },
+ { 0x21, 0x80 },
+ { 0x22, 0x80 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x4b },
+ { 0x29, 0x4b },
+ { 0x2a, 0x4b },
+ };
+ fe.reg2 = {0x00,0x00,0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::G4050;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x23 },
+ { 0x02, 0x24 },
+ { 0x03, 0x1f },
+ { 0x20, 0x45 },
+ { 0x21, 0x45 },
+ { 0x22, 0x45 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x4b },
+ { 0x29, 0x4b },
+ { 0x2a, 0x4b },
+ };
+ fe.reg2 = {0x00,0x00,0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_LIDE_110;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x80 },
+ { 0x01, 0x8a },
+ { 0x02, 0x23 },
+ { 0x03, 0x4c },
+ { 0x20, 0x00 },
+ { 0x21, 0x00 },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0xca },
+ { 0x26, 0x94 },
+ { 0x28, 0x00 },
+ { 0x29, 0x00 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+ /** @brief GL124 special case
+ * for GL124 based scanners, this struct is "abused"
+ * in fact the fields are map like below to AFE registers
+ * (from Texas Instrument or alike ?)
+ */
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_LIDE_120;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x80 },
+ { 0x01, 0xa3 },
+ { 0x02, 0x2b },
+ { 0x03, 0x4c },
+ { 0x20, 0x00 },
+ { 0x21, 0x00 },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 }, // actual address 0x05
+ { 0x25, 0xca }, // actual address 0x06
+ { 0x26, 0x95 }, // actual address 0x07
+ { 0x28, 0x00 },
+ { 0x29, 0x00 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::PLUSTEK_OPTICPRO_3600;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x70 },
+ { 0x01, 0x80 },
+ { 0x02, 0x00 },
+ { 0x03, 0x00 },
+ { 0x20, 0x00 },
+ { 0x21, 0x00 },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x3f },
+ { 0x29, 0x3d },
+ { 0x2a, 0x3d },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::PLUSTEK_OPTICFILM_7200I;
+ fe.layout = analog_devices;
+ fe.regs = {
+ { 0x00, 0xf8 },
+ { 0x01, 0x80 },
+ { 0x02, 0x0a },
+ { 0x03, 0x06 },
+ { 0x04, 0x0f },
+ { 0x05, 0x56 },
+ { 0x06, 0x64 },
+ { 0x07, 0x56 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::PLUSTEK_OPTICFILM_7300;
+ fe.layout = analog_devices;
+ fe.regs = {
+ { 0x00, 0xf8 },
+ { 0x01, 0x80 },
+ { 0x02, 0x10 },
+ { 0x03, 0x06 },
+ { 0x04, 0x06 },
+ { 0x05, 0x09 },
+ { 0x06, 0x0a },
+ { 0x07, 0x0102 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::PLUSTEK_OPTICFILM_7500I;
+ fe.layout = analog_devices;
+ fe.regs = {
+ { 0x00, 0xf8 },
+ { 0x01, 0x80 },
+ { 0x02, 0x1d },
+ { 0x03, 0x17 },
+ { 0x04, 0x13 },
+ { 0x05, 0x00 },
+ { 0x06, 0x00 },
+ { 0x07, 0x0111 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_4400F;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x23 },
+ { 0x02, 0x24 },
+ { 0x03, 0x2f },
+ { 0x20, 0x6d },
+ { 0x21, 0x67 },
+ { 0x22, 0x5b },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0xd8 },
+ { 0x29, 0xd1 },
+ { 0x2a, 0xb9 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_8400F;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x23 },
+ { 0x02, 0x24 },
+ { 0x03, 0x0f },
+ { 0x20, 0x60 },
+ { 0x21, 0x5c },
+ { 0x22, 0x6c },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x8a },
+ { 0x29, 0x9f },
+ { 0x2a, 0xc2 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_8600F;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x00 },
+ { 0x01, 0x23 },
+ { 0x02, 0x24 },
+ { 0x03, 0x2f },
+ { 0x20, 0x67 },
+ { 0x21, 0x69 },
+ { 0x22, 0x68 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0xdb },
+ { 0x29, 0xda },
+ { 0x2a, 0xd7 },
+ };
+ fe.reg2 = { 0x00, 0x00, 0x00 };
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::IMG101;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x78 },
+ { 0x01, 0xf0 },
+ { 0x02, 0x00 },
+ { 0x03, 0x00 },
+ { 0x20, 0x00 },
+ { 0x21, 0x00 },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x00 },
+ { 0x29, 0x00 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ fe = Genesys_Frontend();
+ fe.id = AdcId::PLUSTEK_OPTICBOOK_3800;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x78 },
+ { 0x01, 0xf0 },
+ { 0x02, 0x00 },
+ { 0x03, 0x00 },
+ { 0x20, 0x00 },
+ { 0x21, 0x00 },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x00 },
+ { 0x29, 0x00 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+
+
+ /* reg0: control 74 data, 70 no data
+ * reg3: offset
+ * reg6: gain
+ * reg0 , reg3, reg6 */
+ fe = Genesys_Frontend();
+ fe.id = AdcId::CANON_LIDE_80;
+ fe.layout = wolfson_layout;
+ fe.regs = {
+ { 0x00, 0x70 },
+ { 0x01, 0x16 },
+ { 0x02, 0x60 },
+ { 0x03, 0x00 },
+ { 0x20, 0x00 },
+ { 0x21, 0x00 },
+ { 0x22, 0x00 },
+ { 0x24, 0x00 },
+ { 0x25, 0x00 },
+ { 0x26, 0x00 },
+ { 0x28, 0x00 },
+ { 0x29, 0x00 },
+ { 0x2a, 0x00 },
+ };
+ fe.reg2 = {0x00, 0x00, 0x00};
+ s_frontends->push_back(fe);
+}
+
+} // namespace genesys