1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy.
2141cc406Sopenharmony_ci
3141cc406Sopenharmony_ci   Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
4141cc406Sopenharmony_ci
5141cc406Sopenharmony_ci   This file is part of the SANE package.
6141cc406Sopenharmony_ci
7141cc406Sopenharmony_ci   This program is free software; you can redistribute it and/or
8141cc406Sopenharmony_ci   modify it under the terms of the GNU General Public License as
9141cc406Sopenharmony_ci   published by the Free Software Foundation; either version 2 of the
10141cc406Sopenharmony_ci   License, or (at your option) any later version.
11141cc406Sopenharmony_ci
12141cc406Sopenharmony_ci   This program is distributed in the hope that it will be useful, but
13141cc406Sopenharmony_ci   WITHOUT ANY WARRANTY; without even the implied warranty of
14141cc406Sopenharmony_ci   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15141cc406Sopenharmony_ci   General Public License for more details.
16141cc406Sopenharmony_ci
17141cc406Sopenharmony_ci   You should have received a copy of the GNU General Public License
18141cc406Sopenharmony_ci   along with this program.  If not, see <https://www.gnu.org/licenses/>.
19141cc406Sopenharmony_ci*/
20141cc406Sopenharmony_ci
21141cc406Sopenharmony_ci#define DEBUG_DECLARE_ONLY
22141cc406Sopenharmony_ci
23141cc406Sopenharmony_ci#include "test_scanner_interface.h"
24141cc406Sopenharmony_ci#include "device.h"
25141cc406Sopenharmony_ci#include <cstring>
26141cc406Sopenharmony_ci
27141cc406Sopenharmony_cinamespace genesys {
28141cc406Sopenharmony_ci
29141cc406Sopenharmony_ciTestScannerInterface::TestScannerInterface(Genesys_Device* dev, std::uint16_t vendor_id,
30141cc406Sopenharmony_ci                                           std::uint16_t product_id, std::uint16_t bcd_device) :
31141cc406Sopenharmony_ci    dev_{dev},
32141cc406Sopenharmony_ci    usb_dev_{vendor_id, product_id, bcd_device}
33141cc406Sopenharmony_ci{
34141cc406Sopenharmony_ci    // initialize status registers
35141cc406Sopenharmony_ci    if (dev_->model->asic_type == AsicType::GL124) {
36141cc406Sopenharmony_ci        write_register(0x101, 0x00);
37141cc406Sopenharmony_ci    } else {
38141cc406Sopenharmony_ci        write_register(0x41, 0x00);
39141cc406Sopenharmony_ci    }
40141cc406Sopenharmony_ci    if (dev_->model->asic_type == AsicType::GL841 ||
41141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL842 ||
42141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL843 ||
43141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL845 ||
44141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL846 ||
45141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL847)
46141cc406Sopenharmony_ci    {
47141cc406Sopenharmony_ci        write_register(0x40, 0x00);
48141cc406Sopenharmony_ci    }
49141cc406Sopenharmony_ci
50141cc406Sopenharmony_ci    // initialize other registers that we read on init
51141cc406Sopenharmony_ci    if (dev_->model->asic_type == AsicType::GL124) {
52141cc406Sopenharmony_ci        write_register(0x33, 0x00);
53141cc406Sopenharmony_ci        write_register(0xbd, 0x00);
54141cc406Sopenharmony_ci        write_register(0xbe, 0x00);
55141cc406Sopenharmony_ci        write_register(0x100, 0x00);
56141cc406Sopenharmony_ci    }
57141cc406Sopenharmony_ci
58141cc406Sopenharmony_ci    if (dev_->model->asic_type == AsicType::GL845 ||
59141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL846 ||
60141cc406Sopenharmony_ci        dev_->model->asic_type == AsicType::GL847)
61141cc406Sopenharmony_ci    {
62141cc406Sopenharmony_ci        write_register(0xbd, 0x00);
63141cc406Sopenharmony_ci        write_register(0xbe, 0x00);
64141cc406Sopenharmony_ci
65141cc406Sopenharmony_ci        write_register(0xd0, 0x00);
66141cc406Sopenharmony_ci        write_register(0xd1, 0x01);
67141cc406Sopenharmony_ci        write_register(0xd2, 0x02);
68141cc406Sopenharmony_ci        write_register(0xd3, 0x03);
69141cc406Sopenharmony_ci        write_register(0xd4, 0x04);
70141cc406Sopenharmony_ci        write_register(0xd5, 0x05);
71141cc406Sopenharmony_ci        write_register(0xd6, 0x06);
72141cc406Sopenharmony_ci        write_register(0xd7, 0x07);
73141cc406Sopenharmony_ci        write_register(0xd8, 0x08);
74141cc406Sopenharmony_ci        write_register(0xd9, 0x09);
75141cc406Sopenharmony_ci    }
76141cc406Sopenharmony_ci}
77141cc406Sopenharmony_ci
78141cc406Sopenharmony_ciTestScannerInterface::~TestScannerInterface() = default;
79141cc406Sopenharmony_ci
80141cc406Sopenharmony_cibool TestScannerInterface::is_mock() const
81141cc406Sopenharmony_ci{
82141cc406Sopenharmony_ci    return true;
83141cc406Sopenharmony_ci}
84141cc406Sopenharmony_ci
85141cc406Sopenharmony_cistd::uint8_t TestScannerInterface::read_register(std::uint16_t address)
86141cc406Sopenharmony_ci{
87141cc406Sopenharmony_ci    return cached_regs_.get(address);
88141cc406Sopenharmony_ci}
89141cc406Sopenharmony_ci
90141cc406Sopenharmony_civoid TestScannerInterface::write_register(std::uint16_t address, std::uint8_t value)
91141cc406Sopenharmony_ci{
92141cc406Sopenharmony_ci    cached_regs_.update(address, value);
93141cc406Sopenharmony_ci}
94141cc406Sopenharmony_ci
95141cc406Sopenharmony_civoid TestScannerInterface::write_registers(const Genesys_Register_Set& regs)
96141cc406Sopenharmony_ci{
97141cc406Sopenharmony_ci    cached_regs_.update(regs);
98141cc406Sopenharmony_ci}
99141cc406Sopenharmony_ci
100141cc406Sopenharmony_ci
101141cc406Sopenharmony_civoid TestScannerInterface::write_0x8c(std::uint8_t index, std::uint8_t value)
102141cc406Sopenharmony_ci{
103141cc406Sopenharmony_ci    (void) index;
104141cc406Sopenharmony_ci    (void) value;
105141cc406Sopenharmony_ci}
106141cc406Sopenharmony_ci
107141cc406Sopenharmony_civoid TestScannerInterface::bulk_read_data(std::uint8_t addr, std::uint8_t* data, std::size_t size)
108141cc406Sopenharmony_ci{
109141cc406Sopenharmony_ci    (void) addr;
110141cc406Sopenharmony_ci    std::memset(data, 0, size);
111141cc406Sopenharmony_ci}
112141cc406Sopenharmony_ci
113141cc406Sopenharmony_civoid TestScannerInterface::bulk_write_data(std::uint8_t addr, std::uint8_t* data, std::size_t size)
114141cc406Sopenharmony_ci{
115141cc406Sopenharmony_ci    (void) addr;
116141cc406Sopenharmony_ci    (void) data;
117141cc406Sopenharmony_ci    (void) size;
118141cc406Sopenharmony_ci}
119141cc406Sopenharmony_ci
120141cc406Sopenharmony_civoid TestScannerInterface::write_buffer(std::uint8_t type, std::uint32_t addr, std::uint8_t* data,
121141cc406Sopenharmony_ci                                        std::size_t size)
122141cc406Sopenharmony_ci{
123141cc406Sopenharmony_ci    (void) type;
124141cc406Sopenharmony_ci    (void) addr;
125141cc406Sopenharmony_ci    (void) data;
126141cc406Sopenharmony_ci    (void) size;
127141cc406Sopenharmony_ci}
128141cc406Sopenharmony_ci
129141cc406Sopenharmony_civoid TestScannerInterface::write_gamma(std::uint8_t type, std::uint32_t addr, std::uint8_t* data,
130141cc406Sopenharmony_ci                                       std::size_t size)
131141cc406Sopenharmony_ci{
132141cc406Sopenharmony_ci    (void) type;
133141cc406Sopenharmony_ci    (void) addr;
134141cc406Sopenharmony_ci    (void) data;
135141cc406Sopenharmony_ci    (void) size;
136141cc406Sopenharmony_ci}
137141cc406Sopenharmony_ci
138141cc406Sopenharmony_civoid TestScannerInterface::write_ahb(std::uint32_t addr, std::uint32_t size, std::uint8_t* data)
139141cc406Sopenharmony_ci{
140141cc406Sopenharmony_ci    (void) addr;
141141cc406Sopenharmony_ci    (void) size;
142141cc406Sopenharmony_ci    (void) data;
143141cc406Sopenharmony_ci}
144141cc406Sopenharmony_ci
145141cc406Sopenharmony_cistd::uint16_t TestScannerInterface::read_fe_register(std::uint8_t address)
146141cc406Sopenharmony_ci{
147141cc406Sopenharmony_ci    return cached_fe_regs_.get(address);
148141cc406Sopenharmony_ci}
149141cc406Sopenharmony_ci
150141cc406Sopenharmony_civoid TestScannerInterface::write_fe_register(std::uint8_t address, std::uint16_t value)
151141cc406Sopenharmony_ci{
152141cc406Sopenharmony_ci    cached_fe_regs_.update(address, value);
153141cc406Sopenharmony_ci}
154141cc406Sopenharmony_ci
155141cc406Sopenharmony_ciIUsbDevice& TestScannerInterface::get_usb_device()
156141cc406Sopenharmony_ci{
157141cc406Sopenharmony_ci    return usb_dev_;
158141cc406Sopenharmony_ci}
159141cc406Sopenharmony_ci
160141cc406Sopenharmony_civoid TestScannerInterface::sleep_us(unsigned microseconds)
161141cc406Sopenharmony_ci{
162141cc406Sopenharmony_ci    (void) microseconds;
163141cc406Sopenharmony_ci}
164141cc406Sopenharmony_ci
165141cc406Sopenharmony_civoid TestScannerInterface::record_slope_table(unsigned table_nr,
166141cc406Sopenharmony_ci                                              const std::vector<std::uint16_t>& steps)
167141cc406Sopenharmony_ci{
168141cc406Sopenharmony_ci    slope_tables_[table_nr] = steps;
169141cc406Sopenharmony_ci}
170141cc406Sopenharmony_ci
171141cc406Sopenharmony_cistd::map<unsigned, std::vector<std::uint16_t>>& TestScannerInterface::recorded_slope_tables()
172141cc406Sopenharmony_ci{
173141cc406Sopenharmony_ci    return slope_tables_;
174141cc406Sopenharmony_ci}
175141cc406Sopenharmony_ci
176141cc406Sopenharmony_civoid TestScannerInterface::record_progress_message(const char* msg)
177141cc406Sopenharmony_ci{
178141cc406Sopenharmony_ci    last_progress_message_ = msg;
179141cc406Sopenharmony_ci}
180141cc406Sopenharmony_ci
181141cc406Sopenharmony_ciconst std::string& TestScannerInterface::last_progress_message() const
182141cc406Sopenharmony_ci{
183141cc406Sopenharmony_ci    return last_progress_message_;
184141cc406Sopenharmony_ci}
185141cc406Sopenharmony_ci
186141cc406Sopenharmony_civoid TestScannerInterface::record_key_value(const std::string& key, const std::string& value)
187141cc406Sopenharmony_ci{
188141cc406Sopenharmony_ci    key_values_[key] = value;
189141cc406Sopenharmony_ci}
190141cc406Sopenharmony_ci
191141cc406Sopenharmony_cistd::map<std::string, std::string>& TestScannerInterface::recorded_key_values()
192141cc406Sopenharmony_ci{
193141cc406Sopenharmony_ci    return key_values_;
194141cc406Sopenharmony_ci}
195141cc406Sopenharmony_ci
196141cc406Sopenharmony_civoid TestScannerInterface::test_checkpoint(const std::string& name)
197141cc406Sopenharmony_ci{
198141cc406Sopenharmony_ci    if (checkpoint_callback_) {
199141cc406Sopenharmony_ci        checkpoint_callback_(*dev_, *this, name);
200141cc406Sopenharmony_ci    }
201141cc406Sopenharmony_ci}
202141cc406Sopenharmony_ci
203141cc406Sopenharmony_civoid TestScannerInterface::set_checkpoint_callback(TestCheckpointCallback callback)
204141cc406Sopenharmony_ci{
205141cc406Sopenharmony_ci    checkpoint_callback_ = callback;
206141cc406Sopenharmony_ci}
207141cc406Sopenharmony_ci
208141cc406Sopenharmony_ci} // namespace genesys
209