From 6913513dc26c98a0965429086831f306d3279c91 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sun, 1 Dec 2019 10:08:55 +0200 Subject: [PATCH] genesys: Extract regs_set_optical_off() to use across the ASICs --- backend/genesys/gl124.cpp | 8 +++---- backend/genesys/gl646.cpp | 10 ++++----- backend/genesys/gl646_registers.h | 1 + backend/genesys/gl841.cpp | 24 ++++++--------------- backend/genesys/gl843.cpp | 16 ++++++-------- backend/genesys/gl846.cpp | 8 +++---- backend/genesys/gl847.cpp | 9 +++----- backend/genesys/low.cpp | 35 +++++++++++++++++++++++++++++++ backend/genesys/low.h | 2 ++ 9 files changed, 63 insertions(+), 50 deletions(-) diff --git a/backend/genesys/gl124.cpp b/backend/genesys/gl124.cpp index 4d8469550..278975e4a 100644 --- a/backend/genesys/gl124.cpp +++ b/backend/genesys/gl124.cpp @@ -739,8 +739,8 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens dev->cmd_set->set_fe(dev, sensor, AFE_SET); /* enable shading */ + regs_set_optical_off(dev->model->asic_type, *reg); r = sanei_genesys_get_address (reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) || (dev->model->flags & GENESYS_FLAG_NO_CALIBRATION)) { @@ -1017,10 +1017,8 @@ void gl124_stop_action(Genesys_Device* dev) } /* ends scan */ - std::uint8_t val = dev->reg.get8(REG_0x01); - val &= ~REG_0x01_SCAN; - dev->reg.set8(REG_0x01, val); - dev->interface->write_register(REG_0x01, val); + regs_set_optical_off(dev->model->asic_type, dev->reg); + dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); dev->interface->sleep_ms(100); diff --git a/backend/genesys/gl646.cpp b/backend/genesys/gl646.cpp index a4220c937..339a7186d 100644 --- a/backend/genesys/gl646.cpp +++ b/backend/genesys/gl646.cpp @@ -1384,10 +1384,8 @@ static void end_scan_impl(Genesys_Device* dev, Genesys_Register_Set* reg, bool c } /* ends scan */ - std::uint8_t val = reg->get8(0x01); - val &= ~REG_0x01_SCAN; - reg->set8(0x01, val); - dev->interface->write_register(0x01, val); + regs_set_optical_off(dev->model->asic_type, *reg); + dev->interface->write_register(0x01, reg->get8(0x01)); /* for sheetfed scanners, we may have to eject document */ if (dev->model->is_sheetfed) { @@ -1525,7 +1523,7 @@ void CommandSetGl646::slow_back_home(Genesys_Device* dev, bool wait_until_home) init_regs_for_scan_session(dev, sensor, &dev->reg, session); /* backward , no actual data scanned TODO more setup flags to avoid this register manipulations ? */ - dev->reg.find_reg(0x01).value &= ~REG_0x01_SCAN; + regs_set_optical_off(dev->model->asic_type, dev->reg); // sets frontend gl646_set_fe(dev, sensor, AFE_SET, resolution); @@ -2687,7 +2685,7 @@ static void gl646_repark_head(Genesys_Device* dev) setup_for_scan(dev, sensor, &dev->reg, settings, false, false, false, false); /* TODO seems wrong ... no effective scan */ - dev->reg.find_reg(0x01).value &= ~REG_0x01_SCAN; + regs_set_optical_off(dev->model->asic_type, dev->reg); dev->interface->write_registers(dev->reg); diff --git a/backend/genesys/gl646_registers.h b/backend/genesys/gl646_registers.h index 06dafae29..2fe8f19e3 100644 --- a/backend/genesys/gl646_registers.h +++ b/backend/genesys/gl646_registers.h @@ -53,6 +53,7 @@ using RegAddr = std::uint16_t; using RegMask = std::uint8_t; using RegShift = unsigned; +static constexpr RegAddr REG_0x01 = 0x01; static constexpr RegMask REG_0x01_CISSET = 0x80; static constexpr RegMask REG_0x01_DOGENB = 0x40; static constexpr RegMask REG_0x01_DVDSET = 0x20; diff --git a/backend/genesys/gl841.cpp b/backend/genesys/gl841.cpp index 75058728b..46a7bb741 100644 --- a/backend/genesys/gl841.cpp +++ b/backend/genesys/gl841.cpp @@ -1300,15 +1300,6 @@ gl841_get_dpihw(Genesys_Device * dev) return 0; } -static void gl841_init_optical_regs_off(Genesys_Register_Set* reg) -{ - DBG_HELPER(dbg); - GenesysRegister* r; - - r = sanei_genesys_get_address(reg, 0x01); - r->value &= ~REG_0x01_SCAN; -} - static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sensor& sensor, Genesys_Register_Set* reg, unsigned int exposure_time, const ScanSession& session) @@ -1879,7 +1870,7 @@ static void gl841_stop_action(Genesys_Device* dev) local_reg = dev->reg; - gl841_init_optical_regs_off(&local_reg); + regs_set_optical_off(dev->model->asic_type, local_reg); gl841_init_motor_regs_off(&local_reg,0); dev->interface->write_registers(local_reg); @@ -1941,7 +1932,7 @@ void CommandSetGl841::eject_document(Genesys_Device* dev) const local_reg = dev->reg; - gl841_init_optical_regs_off(&local_reg); + regs_set_optical_off(dev->model->asic_type, local_reg); const auto& sensor = sanei_genesys_find_sensor_any(dev); gl841_init_motor_regs(dev, sensor, &local_reg, 65536, MOTOR_ACTION_FEED, MotorFlag::NONE); @@ -2180,7 +2171,7 @@ static void gl841_feed(Genesys_Device* dev, int steps) local_reg = dev->reg; - gl841_init_optical_regs_off(&local_reg); + regs_set_optical_off(dev->model->asic_type, local_reg); gl841_init_motor_regs(dev, sensor, &local_reg, steps, MOTOR_ACTION_FEED, MotorFlag::NONE); @@ -2229,7 +2220,6 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home) { DBG_HELPER_ARGS(dbg, "wait_until_home = %d", wait_until_home); Genesys_Register_Set local_reg; - GenesysRegister *r; int loop = 0; if (dev->model->is_sheetfed) { @@ -2264,9 +2254,8 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home) } /* end previous scan if any */ - r = sanei_genesys_get_address(&dev->reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; - dev->interface->write_register(REG_0x01, r->value); + regs_set_optical_off(dev->model->asic_type, dev->reg); + dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); /* if motor is on, stop current action */ if (status.is_motor_enabled) { @@ -2280,8 +2269,7 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home) gl841_init_motor_regs(dev, sensor, &local_reg, 65536, MOTOR_ACTION_GO_HOME, MotorFlag::REVERSE); // set up for no scan - r = sanei_genesys_get_address(&local_reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; + regs_set_optical_off(dev->model->asic_type, local_reg); dev->interface->write_registers(local_reg); diff --git a/backend/genesys/gl843.cpp b/backend/genesys/gl843.cpp index 4a4cb7ad6..405b6235f 100644 --- a/backend/genesys/gl843.cpp +++ b/backend/genesys/gl843.cpp @@ -1039,8 +1039,8 @@ static void gl843_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens dev->cmd_set->set_fe(dev, sensor, AFE_SET); /* enable shading */ + regs_set_optical_off(dev->model->asic_type, *reg); r = sanei_genesys_get_address (reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) || (dev->model->flags & GENESYS_FLAG_NO_CALIBRATION || (dev->model->flags & GENESYS_FLAG_CALIBRATION_HOST_SIDE))) @@ -1318,10 +1318,8 @@ void CommandSetGl843::set_powersaving(Genesys_Device* dev, int delay /* in minut static void gl843_stop_action_no_move(Genesys_Device* dev, Genesys_Register_Set* reg) { DBG_HELPER(dbg); - uint8_t val = reg->get8(REG_0x01); - val &= ~REG_0x01_SCAN; - reg->set8(REG_0x01, val); - dev->interface->write_register(REG_0x01, val); + regs_set_optical_off(dev->model->asic_type, *reg); + dev->interface->write_register(REG_0x01, reg->get8(REG_0x01)); dev->interface->sleep_ms(100); } @@ -1341,11 +1339,9 @@ void gl843_stop_action(Genesys_Device* dev) return; } - /* ends scan 646 */ - std::uint8_t val = dev->reg.get8(REG_0x01); - val &= ~REG_0x01_SCAN; - dev->reg.set8(REG_0x01, val); - dev->interface->write_register(REG_0x01, val); + // ends scan + regs_set_optical_off(dev->model->asic_type, dev->reg); + dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); dev->interface->sleep_ms(100); diff --git a/backend/genesys/gl846.cpp b/backend/genesys/gl846.cpp index 72c5704e9..7626ae1ee 100644 --- a/backend/genesys/gl846.cpp +++ b/backend/genesys/gl846.cpp @@ -612,8 +612,8 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens dev->cmd_set->set_fe(dev, sensor, AFE_SET); /* enable shading */ + regs_set_optical_off(dev->model->asic_type, *reg); r = sanei_genesys_get_address(reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; r->value |= REG_0x01_SHDAREA; if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) || (dev->model->flags & GENESYS_FLAG_NO_CALIBRATION)) @@ -857,10 +857,8 @@ void gl846_stop_action(Genesys_Device* dev) } /* ends scan */ - std::uint8_t val = dev->reg.get8(REG_0x01); - val &= ~REG_0x01_SCAN; - dev->reg.set8(REG_0x01, val); - dev->interface->write_register(REG_0x01, val); + regs_set_optical_off(dev->model->asic_type, dev->reg); + dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); dev->interface->sleep_ms(100); if (is_testing_mode()) { diff --git a/backend/genesys/gl847.cpp b/backend/genesys/gl847.cpp index 19a7490da..44ba313ab 100644 --- a/backend/genesys/gl847.cpp +++ b/backend/genesys/gl847.cpp @@ -619,8 +619,8 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens dev->cmd_set->set_fe(dev, sensor, AFE_SET); /* enable shading */ + regs_set_optical_off(dev->model->asic_type, *reg); r = sanei_genesys_get_address(reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; r->value |= REG_0x01_SHDAREA; if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) || @@ -847,7 +847,6 @@ void CommandSetGl847::set_powersaving(Genesys_Device* dev, int delay /* in minut void gl847_stop_action(Genesys_Device* dev) { DBG_HELPER(dbg); - uint8_t val; unsigned int loop; dev->cmd_set->update_home_sensor_gpio(*dev); @@ -862,10 +861,8 @@ void gl847_stop_action(Genesys_Device* dev) } /* ends scan */ - val = dev->reg.get8(REG_0x01); - val &= ~REG_0x01_SCAN; - dev->reg.set8(REG_0x01, val); - dev->interface->write_register(REG_0x01, val); + regs_set_optical_off(dev->model->asic_type, dev->reg); + dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); dev->interface->sleep_ms(100); diff --git a/backend/genesys/low.cpp b/backend/genesys/low.cpp index 48a1ef7ce..9a61ea491 100644 --- a/backend/genesys/low.cpp +++ b/backend/genesys/low.cpp @@ -49,6 +49,7 @@ #include "test_settings.h" #include "gl124_registers.h" +#include "gl646_registers.h" #include "gl841_registers.h" #include "gl843_registers.h" #include "gl846_registers.h" @@ -1691,6 +1692,40 @@ void regs_set_exposure(AsicType asic_type, Genesys_Register_Set& regs, } } +void regs_set_optical_off(AsicType asic_type, Genesys_Register_Set& regs) +{ + DBG_HELPER(dbg); + switch (asic_type) { + case AsicType::GL646: { + regs.find_reg(gl646::REG_0x01).value &= ~gl646::REG_0x01_SCAN; + break; + } + case AsicType::GL841: { + regs.find_reg(gl841::REG_0x01).value &= ~gl841::REG_0x01_SCAN; + break; + } + case AsicType::GL843: { + regs.find_reg(gl843::REG_0x01).value &= ~gl843::REG_0x01_SCAN; + break; + } + case AsicType::GL845: + case AsicType::GL846: { + regs.find_reg(gl846::REG_0x01).value &= ~gl846::REG_0x01_SCAN; + break; + } + case AsicType::GL847: { + regs.find_reg(gl847::REG_0x01).value &= ~gl847::REG_0x01_SCAN; + break; + } + case AsicType::GL124: { + regs.find_reg(gl124::REG_0x01).value &= ~gl124::REG_0x01_SCAN; + break; + } + default: + throw SaneException("Unsupported asic"); + } +} + bool get_registers_gain4_bit(AsicType asic_type, const Genesys_Register_Set& regs) { switch (asic_type) { diff --git a/backend/genesys/low.h b/backend/genesys/low.h index f0a698e74..f7d7eb62b 100644 --- a/backend/genesys/low.h +++ b/backend/genesys/low.h @@ -379,6 +379,8 @@ Image read_unshuffled_image_from_scanner(Genesys_Device* dev, const ScanSession& void regs_set_exposure(AsicType asic_type, Genesys_Register_Set& regs, const SensorExposure& exposure); +void regs_set_optical_off(AsicType asic_type, Genesys_Register_Set& regs); + void sanei_genesys_set_dpihw(Genesys_Register_Set& regs, const Genesys_Sensor& sensor, unsigned dpihw);