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
|
* 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;
|
|
||||||
|
|
||||||
|
struct LampSettings {
|
||||||
|
int model_id;
|
||||||
|
ScanMethod scan_method;
|
||||||
|
GenesysRegisterSettingSet regs_on;
|
||||||
|
GenesysRegisterSettingSet regs_off;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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 },
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ 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 },
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto& setting : settings) {
|
||||||
|
if (setting.model_id == dev->model->model_id &&
|
||||||
|
setting.scan_method == dev->settings.scan_method)
|
||||||
|
{
|
||||||
|
apply_reg_settings_to_device(*dev, set ? setting.regs_on : setting.regs_off);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BUG: we're currently calling the function in shut down path of regular lamp
|
||||||
if (set) {
|
if (set) {
|
||||||
sanei_genesys_read_register(dev, REGA6, &val);
|
throw SaneException("Unexpected code path entered");
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F &&
|
GenesysRegisterSettingSet regs = {
|
||||||
dev->settings.scan_method == ScanMethod::TRANSPARENCY_INFRARED)
|
{ 0xa6, 0x40, 0x70 },
|
||||||
{
|
};
|
||||||
if (set) {
|
apply_reg_settings_to_device(*dev, regs);
|
||||||
sanei_genesys_read_register(dev, REG6C, &val);
|
// TODO: throw exception when we're only calling this function in error return path
|
||||||
val |= REG6C_GPIO16;
|
// throw SaneException("Could not find XPA lamp settings");
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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;
|
||||||
|
|
|
@ -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 */
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
|
@ -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 = {};
|
||||||
|
|
Ładowanie…
Reference in New Issue