genesys: Refactor XPA lamp setup function to be more extensible

merge-requests/102/head
Povilas Kanapickas 2019-07-20 21:17:29 +03:00
rodzic 326b2a04f7
commit ce713f95c0
3 zmienionych plików z 69 dodań i 47 usunięć

Wyświetl plik

@ -2043,57 +2043,65 @@ static SANE_Status gl843_set_xpa_motor_power(Genesys_Device *dev, bool set)
* XPA light * XPA light
* @param dev device to set up * @param dev device to set up
*/ */
static SANE_Status gl843_set_xpa_lamp_power(Genesys_Device *dev, bool set) static void gl843_set_xpa_lamp_power(Genesys_Device *dev, bool set)
{ {
DBG_HELPER(dbg); DBG_HELPER(dbg);
SANE_Status status = SANE_STATUS_GOOD;
uint8_t val = 0;
if (set) { struct LampSettings {
sanei_genesys_read_register(dev, REGA6, &val); int model_id;
ScanMethod scan_method;
GenesysRegisterSettingSet regs_on;
GenesysRegisterSettingSet regs_off;
};
// cut regular lamp power // FIXME: BUG: we're not clearing the registers to the previous state when returning back when
val &= ~(REGA6_GPIO24 | REGA6_GPIO23); // turning off the lamp
LampSettings settings[] = {
// set XPA lamp power { MODEL_CANON_CANOSCAN_8400F, ScanMethod::TRANSPARENCY, {
if (dev->settings.scan_method != ScanMethod::TRANSPARENCY_INFRARED) { { 0xa6, 0x34, 0xf4 },
val |= REGA6_GPIO22 | REGA6_GPIO21 | REGA6_GPIO19; { 0xa7, 0xe0, 0xe0 },
}, {
{ 0xa6, 0x40, 0x70 },
} }
},
sanei_genesys_write_register(dev, REGA6, val); { MODEL_CANON_CANOSCAN_8600F, ScanMethod::TRANSPARENCY, {
{ 0xa6, 0x34, 0xf4 },
sanei_genesys_read_register(dev, REGA7, &val); { 0xa7, 0xe0, 0xe0 },
val|=REGA7_GPOE24; /* lamp 1 off GPOE 24 */ }, {
val|=REGA7_GPOE23; /* lamp 2 off GPOE 23 */ { 0xa6, 0x40, 0x70 },
val|=REGA7_GPOE22; /* full XPA lamp power */
sanei_genesys_write_register(dev, REGA7, val);
} else {
sanei_genesys_read_register(dev, REGA6, &val);
// switch on regular lamp
val |= REGA6_GPIO23;
// no XPA lamp power (2 bits for level: __11 ____)
val &= ~(REGA6_GPIO22 | REGA6_GPIO21);
sanei_genesys_write_register(dev, REGA6, val);
} }
},
{ MODEL_CANON_CANOSCAN_8600F, ScanMethod::TRANSPARENCY_INFRARED, {
{ 0xa6, 0x00, 0xc0 },
{ 0xa7, 0xe0, 0xe0 },
{ 0x6c, 0x80, 0x80 },
}, {
{ 0xa6, 0x00, 0xc0 },
{ 0x6c, 0x00, 0x80 },
}
},
};
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F && for (const auto& setting : settings) {
dev->settings.scan_method == ScanMethod::TRANSPARENCY_INFRARED) if (setting.model_id == dev->model->model_id &&
setting.scan_method == dev->settings.scan_method)
{ {
if (set) { apply_reg_settings_to_device(*dev, set ? setting.regs_on : setting.regs_off);
sanei_genesys_read_register(dev, REG6C, &val); return;
val |= REG6C_GPIO16;
sanei_genesys_write_register(dev, REG6C, val);
} else {
sanei_genesys_read_register(dev, REG6C, &val);
val &= ~REG6C_GPIO16;
sanei_genesys_write_register(dev, REG6C, val);
} }
} }
return status; // BUG: we're currently calling the function in shut down path of regular lamp
if (set) {
throw SaneException("Unexpected code path entered");
}
GenesysRegisterSettingSet regs = {
{ 0xa6, 0x40, 0x70 },
};
apply_reg_settings_to_device(*dev, regs);
// TODO: throw exception when we're only calling this function in error return path
// throw SaneException("Could not find XPA lamp settings");
} }
/* Send the low-level scan command */ /* Send the low-level scan command */
@ -2138,7 +2146,7 @@ gl843_begin_scan (Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys_Re
} }
if (reg->state.is_xpa_on && reg->state.is_lamp_on) { if (reg->state.is_xpa_on && reg->state.is_lamp_on) {
RIE(gl843_set_xpa_lamp_power(dev, true)); gl843_set_xpa_lamp_power(dev, true);
} }
if (reg->state.is_xpa_on) { if (reg->state.is_xpa_on) {
@ -2152,7 +2160,7 @@ gl843_begin_scan (Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys_Re
case GPO_CS8400F: case GPO_CS8400F:
case GPO_CS8600F: case GPO_CS8600F:
if (reg->state.is_xpa_on && reg->state.is_lamp_on) { if (reg->state.is_xpa_on && reg->state.is_lamp_on) {
RIE(gl843_set_xpa_lamp_power(dev, true)); gl843_set_xpa_lamp_power(dev, true);
} }
if (reg->state.is_xpa_on) { if (reg->state.is_xpa_on) {
dev->needs_home_ta = SANE_TRUE; dev->needs_home_ta = SANE_TRUE;

Wyświetl plik

@ -75,6 +75,16 @@ void Genesys_Device::clear()
dark_average_data.clear(); dark_average_data.clear();
} }
void apply_reg_settings_to_device(Genesys_Device& dev, const GenesysRegisterSettingSet& regs)
{
for (const auto& reg : regs) {
uint8_t val;
sanei_genesys_read_register(&dev, reg.address, &val);
val = (val & ~reg.mask) | (reg.value & reg.mask);
sanei_genesys_write_register(&dev, reg.address, val);
}
}
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/* functions calling ASIC specific functions */ /* functions calling ASIC specific functions */
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */

Wyświetl plik

@ -476,6 +476,8 @@ void serialize(Stream& str, GenesysRegisterSetting& reg)
serialize(str, reg.mask); serialize(str, reg.mask);
} }
class Genesys_Device;
class GenesysRegisterSettingSet { class GenesysRegisterSettingSet {
public: public:
using container = std::vector<GenesysRegisterSetting>; using container = std::vector<GenesysRegisterSetting>;
@ -551,6 +553,8 @@ inline void serialize(std::ostream& str, GenesysRegisterSettingSet& reg)
serialize(str, reg.regs_); serialize(str, reg.regs_);
} }
void apply_reg_settings_to_device(Genesys_Device& dev, const GenesysRegisterSettingSet& regs);
struct GenesysFrontendLayout struct GenesysFrontendLayout
{ {
std::array<uint16_t, 3> offset_addr = {}; std::array<uint16_t, 3> offset_addr = {};