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
* @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);
SANE_Status status = SANE_STATUS_GOOD;
uint8_t val = 0;
if (set) {
sanei_genesys_read_register(dev, REGA6, &val);
struct LampSettings {
int model_id;
ScanMethod scan_method;
GenesysRegisterSettingSet regs_on;
GenesysRegisterSettingSet regs_off;
};
// cut regular lamp power
val &= ~(REGA6_GPIO24 | REGA6_GPIO23);
// set XPA lamp power
if (dev->settings.scan_method != ScanMethod::TRANSPARENCY_INFRARED) {
val |= REGA6_GPIO22 | REGA6_GPIO21 | REGA6_GPIO19;
// FIXME: BUG: we're not clearing the registers to the previous state when returning back when
// turning off the lamp
LampSettings settings[] = {
{ MODEL_CANON_CANOSCAN_8400F, ScanMethod::TRANSPARENCY, {
{ 0xa6, 0x34, 0xf4 },
{ 0xa7, 0xe0, 0xe0 },
}, {
{ 0xa6, 0x40, 0x70 },
}
sanei_genesys_write_register(dev, REGA6, val);
sanei_genesys_read_register(dev, REGA7, &val);
val|=REGA7_GPOE24; /* lamp 1 off GPOE 24 */
val|=REGA7_GPOE23; /* lamp 2 off GPOE 23 */
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, {
{ 0xa6, 0x34, 0xf4 },
{ 0xa7, 0xe0, 0xe0 },
}, {
{ 0xa6, 0x40, 0x70 },
}
},
{ 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 &&
dev->settings.scan_method == ScanMethod::TRANSPARENCY_INFRARED)
for (const auto& setting : settings) {
if (setting.model_id == dev->model->model_id &&
setting.scan_method == dev->settings.scan_method)
{
if (set) {
sanei_genesys_read_register(dev, REG6C, &val);
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);
apply_reg_settings_to_device(*dev, set ? setting.regs_on : setting.regs_off);
return;
}
}
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 */
@ -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) {
RIE(gl843_set_xpa_lamp_power(dev, true));
gl843_set_xpa_lamp_power(dev, true);
}
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_CS8600F:
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) {
dev->needs_home_ta = SANE_TRUE;

Wyświetl plik

@ -75,6 +75,16 @@ void Genesys_Device::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 */
/* ------------------------------------------------------------------------ */

Wyświetl plik

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