kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Refactor XPA lamp setup function to be more extensible
rodzic
326b2a04f7
commit
ce713f95c0
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
|
|
@ -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 = {};
|
||||
|
|
Ładowanie…
Reference in New Issue