genesys: Reduce duplication of sensor setup functionality

merge-requests/412/head
Povilas Kanapickas 2020-04-17 05:38:45 +03:00
rodzic d0855e513b
commit afa96a227d
9 zmienionych plików z 71 dodań i 164 usunięć

Wyświetl plik

@ -632,6 +632,30 @@ bool scanner_is_motor_stopped(Genesys_Device& dev)
}
}
void scanner_setup_sensor(Genesys_Device& dev, const Genesys_Sensor& sensor,
Genesys_Register_Set& regs)
{
DBG_HELPER(dbg);
if (dev.model->asic_type == AsicType::GL646) {
for (const auto& custom_reg : sensor.custom_base_regs) {
regs.set8(custom_reg.address, custom_reg.value);
}
} else {
for (const auto& custom_reg : sensor.custom_regs) {
regs.set8(custom_reg.address, custom_reg.value);
}
}
if (dev.model->asic_type != AsicType::GL841 &&
dev.model->asic_type != AsicType::GL843)
{
regs_set_exposure(dev.model->asic_type, regs, sensor.exposure);
}
dev.segment_order = sensor.segment_order;
}
void scanner_stop_action(Genesys_Device& dev)
{
DBG_HELPER(dbg);

Wyświetl plik

@ -640,35 +640,6 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev,
reg->set16(REG_FMOVDEC, fast_table.steps_count);
}
/** @brief copy sensor specific settings
* Set up register set for the given sensor resolution. Values are from the device table
* in genesys_devices.c for registers:
* [0x16 ... 0x1d]
* [0x52 ... 0x5e]
* Other come from the specific device sensor table in genesys_gl124.h:
* 0x18, 0x20, 0x61, 0x98 and
* @param dev device to set up
* @param regs register set to modify
* @param dpi resolution of the sensor during scan
* @param ccd_size_divisor flag for half ccd mode
* */
static void gl124_setup_sensor(Genesys_Device* dev, const Genesys_Sensor& sensor,
Genesys_Register_Set* regs)
{
DBG_HELPER(dbg);
for (const auto& reg : sensor.custom_regs) {
regs->set8(reg.address, reg.value);
}
regs->set24(REG_EXPR, sensor.exposure.red);
regs->set24(REG_EXPG, sensor.exposure.green);
regs->set24(REG_EXPB, sensor.exposure.blue);
dev->segment_order = sensor.segment_order;
}
/** @brief setup optical related registers
* start and pixels are expressed in optical sensor resolution coordinate
* space.
@ -692,7 +663,7 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time);
uint32_t expmax;
gl124_setup_sensor(dev, sensor, reg);
scanner_setup_sensor(*dev, sensor, *reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET);

Wyświetl plik

@ -546,30 +546,6 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
gl646_send_slope_table(dev, 1, slope_table2.table, regs->get8(0x6b));
}
/** copy sensor specific settings */
/* *dev : device infos
*regs : regiters to be set
extended : do extended set up
ccd_size_divisor: set up for half ccd resolution
all registers 08-0B, 10-1D, 52-5E are set up. They shouldn't
appear anywhere else but in register init
*/
static void
gl646_setup_sensor (Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys_Register_Set * regs)
{
(void) dev;
DBG(DBG_proc, "%s: start\n", __func__);
for (const auto& reg_setting : sensor.custom_base_regs) {
regs->set8(reg_setting.address, reg_setting.value);
}
// FIXME: all other drivers don't set exposure here
regs_set_exposure(AsicType::GL646, *regs, sensor.exposure);
DBG(DBG_proc, "%s: end\n", __func__);
}
/**
* Set all registers to default values after init
* @param dev scannerr's device to set
@ -643,8 +619,7 @@ gl646_init_regs (Genesys_Device * dev)
dev->reg.find_reg(0x06).value = 0x18; // PWRBIT on, shading gain=8, normal AFE image capture
}
gl646_setup_sensor(dev, sensor, &dev->reg);
scanner_setup_sensor(*dev, sensor, dev->reg);
dev->reg.find_reg(0x1e).value = 0xf0; /* watch-dog time */

Wyświetl plik

@ -68,15 +68,6 @@ static int gl841_exposure_time(Genesys_Device *dev, const Genesys_Sensor& sensor
int start,
int used_pixels);
static void sanei_gl841_setup_sensor(const Genesys_Sensor& sensor, Genesys_Register_Set* regs)
{
DBG_HELPER(dbg);
for (const auto& custom_reg : sensor.custom_regs) {
regs->set8(custom_reg.address, custom_reg.value);
}
}
/*
* Set all registers to default values
* (function called only once at the beginning)
@ -169,14 +160,14 @@ gl841_init_registers (Genesys_Device * dev)
dev->reg.init_reg(0x15, 0x00);
}
dev->reg.init_reg(0x16, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x17, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x18, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x19, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x1a, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x1b, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x1c, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x1d, 0x01); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x16, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x17, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x18, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x19, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x1a, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x1b, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x1c, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x1d, 0x01); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x1e, 0xf0);
if (dev->model->model_id == ModelId::CANON_LIDE_80) {
dev->reg.init_reg(0x1e, 0x10);
@ -237,15 +228,15 @@ gl841_init_registers (Genesys_Device * dev)
dev->reg.init_reg(0x3e, 0x00);
dev->reg.init_reg(0x3f, 0x00);
dev->reg.init_reg(0x52, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x53, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x54, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x55, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x56, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x57, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x58, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x59, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x5a, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x52, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x53, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x54, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x55, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x56, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x57, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x58, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x59, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x5a, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
if (dev->model->model_id == ModelId::CANON_LIDE_80) {
dev->reg.init_reg(0x5d, 0x20);
@ -273,10 +264,10 @@ gl841_init_registers (Genesys_Device * dev)
dev->reg.init_reg(0x5e, 0x02);
}
dev->reg.init_reg(0x70, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x71, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x72, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x73, 0x00); // SENSOR_DEF, overwritten in sanei_gl841_setup_sensor() below
dev->reg.init_reg(0x70, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x71, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x72, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
dev->reg.init_reg(0x73, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
if (dev->model->model_id == ModelId::CANON_LIDE_80) {
dev->reg.init_reg(0x74, 0x00);
@ -307,7 +298,7 @@ gl841_init_registers (Genesys_Device * dev)
}
}
sanei_gl841_setup_sensor(sensor, &dev->reg);
scanner_setup_sensor(*dev, sensor, dev->reg);
// set up GPIO
for (const auto& reg : dev->gpo.regs) {
@ -1066,7 +1057,7 @@ static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
}
/* sensor parameters */
sanei_gl841_setup_sensor(sensor, &dev->reg);
scanner_setup_sensor(*dev, sensor, dev->reg);
reg->set8(0x29, 255); /*<<<"magic" number, only suitable for cis*/
reg->set16(REG_DPISET, sensor.register_dpiset);
reg->set16(REG_STRPIXEL, session.pixel_startx);

Wyświetl plik

@ -66,26 +66,6 @@ static int gl843_get_step_multiplier(Genesys_Register_Set* regs)
}
}
/** copy sensor specific settings */
static void gl843_setup_sensor(Genesys_Device* dev, const Genesys_Sensor& sensor,
Genesys_Register_Set* regs)
{
DBG_HELPER(dbg);
for (const auto& custom_reg : sensor.custom_regs) {
regs->set8(custom_reg.address, custom_reg.value);
}
if (dev->model->model_id == ModelId::PANASONIC_KV_SS080 ||
dev->model->model_id == ModelId::HP_SCANJET_4850C ||
dev->model->model_id == ModelId::HP_SCANJET_G4010 ||
dev->model->model_id == ModelId::HP_SCANJET_G4050)
{
regs->set8(0x7d, 0x90);
}
dev->segment_order = sensor.segment_order;
}
/** @brief set all registers to default values .
* This function is called only once at the beginning and
* fills register startup values for registers reused across scans.
@ -96,9 +76,9 @@ static void gl843_setup_sensor(Genesys_Device* dev, const Genesys_Sensor& sensor
static void
gl843_init_registers (Genesys_Device * dev)
{
// Within this function SENSOR_DEF marker documents that a register is part
// of the sensors definition and the actual value is set in
// gl843_setup_sensor().
// Within this function SENSOR_DEF marker documents that a register is part
// of the sensors definition and the actual value is set in
// scanner_setup_sensor().
// 0x6c, 0x6d, 0x6e, 0x6f, 0xa6, 0xa7, 0xa8, 0xa9 are defined in the Gpo sensor struct
@ -943,8 +923,8 @@ static void gl843_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
tgtime = exposure / 65536 + 1;
DBG(DBG_io2, "%s: tgtime=%d\n", __func__, tgtime);
/* sensor parameters */
gl843_setup_sensor(dev, sensor, reg);
// sensor parameters
scanner_setup_sensor(*dev, sensor, *reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET);

Wyświetl plik

@ -67,25 +67,6 @@ static int gl846_get_step_multiplier (Genesys_Register_Set * regs)
return 1 << value;
}
/** @brief sensor specific settings
*/
static void gl846_setup_sensor(Genesys_Device * dev, const Genesys_Sensor& sensor,
Genesys_Register_Set* regs)
{
DBG_HELPER(dbg);
for (const auto& reg : sensor.custom_regs) {
regs->set8(reg.address, reg.value);
}
regs->set16(REG_EXPR, sensor.exposure.red);
regs->set16(REG_EXPG, sensor.exposure.green);
regs->set16(REG_EXPB, sensor.exposure.blue);
dev->segment_order = sensor.segment_order;
}
/** @brief set all registers to default values .
* This function is called only once at the beginning and
* fills register startup values for registers reused across scans.
@ -619,7 +600,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
{
DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time);
gl846_setup_sensor(dev, sensor, reg);
scanner_setup_sensor(*dev, sensor, *reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET);

Wyświetl plik

@ -62,25 +62,6 @@ static unsigned gl847_get_step_multiplier (Genesys_Register_Set * regs)
return 1 << value;
}
/** @brief sensor specific settings
*/
static void gl847_setup_sensor(Genesys_Device * dev, const Genesys_Sensor& sensor,
Genesys_Register_Set* regs)
{
DBG_HELPER(dbg);
for (const auto& reg : sensor.custom_regs) {
regs->set8(reg.address, reg.value);
}
regs->set16(REG_EXPR, sensor.exposure.red);
regs->set16(REG_EXPG, sensor.exposure.green);
regs->set16(REG_EXPB, sensor.exposure.blue);
dev->segment_order = sensor.segment_order;
}
/** @brief set all registers to default values .
* This function is called only once at the beginning and
* fills register startup values for registers reused across scans.
@ -519,7 +500,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
{
DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time);
gl847_setup_sensor(dev, sensor, reg);
scanner_setup_sensor(*dev, sensor, *reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET);

Wyświetl plik

@ -372,6 +372,9 @@ void scanner_stop_action_no_move(Genesys_Device& dev, Genesys_Register_Set& regs
bool scanner_is_motor_stopped(Genesys_Device& dev);
void scanner_setup_sensor(Genesys_Device& dev, const Genesys_Sensor& sensor,
Genesys_Register_Set& regs);
const MotorProfile* get_motor_profile_ptr(const std::vector<MotorProfile>& profiles,
unsigned exposure,
const ScanSession& session);

Wyświetl plik

@ -1489,6 +1489,7 @@ void genesys_init_sensor_tables()
{ 0x58, 0x6b },
{ 0x59, 0x00 },
{ 0x5a, 0xc0 },
{ 0x7d, 0x90 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
@ -1554,7 +1555,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x00 }, { 0x71, 0x02 },
{ 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
{ 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
{ 0x9e, 0x00 },
{ 0xaa, 0x00 },
};
@ -1568,7 +1569,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x08 }, { 0x71, 0x0c },
{ 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x01 }, { 0x79, 0xff },
{ 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff },
{ 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff }, { 0x7d, 0x90 },
{ 0x9e, 0xc0 },
{ 0xaa, 0x05 },
};
@ -1582,7 +1583,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x08 }, { 0x71, 0x0a },
{ 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
{ 0x9e, 0xc0 },
{ 0xaa, 0x05 },
};
@ -1593,10 +1594,10 @@ void genesys_init_sensor_tables()
{ 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc1 }, { 0x1d, 0x08 },
{ 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b }, { 0x56, 0x0e },
{ 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x08 }, { 0x71, 0x0a },
{ 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
{ 0x70, 0x08 }, { 0x71, 0x0a },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
{ 0x9e, 0xc0 },
{ 0xaa, 0x07 },
};
@ -1610,7 +1611,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x00 }, { 0x71, 0x02 },
{ 0x74, 0x00 }, { 0x75, 0x1c }, { 0x76, 0x7f },
{ 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
{ 0x9e, 0x00 },
{ 0xaa, 0x00 },
};
@ -1682,7 +1683,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x00 }, { 0x71, 0x02 },
{ 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
{ 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
{ 0x9e, 0x00 },
{ 0xaa, 0x00 },
};
@ -1695,7 +1696,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x08 }, { 0x71, 0x0c },
{ 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x01 }, { 0x79, 0xff },
{ 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff },
{ 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff }, { 0x7d, 0x90 },
{ 0x9e, 0xc0 },
{ 0xaa, 0x05 },
};
@ -1708,7 +1709,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x08 }, { 0x71, 0x0a },
{ 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
{ 0x9e, 0xc0 },
{ 0xaa, 0x05 },
};
@ -1721,7 +1722,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x08 }, { 0x71, 0x0a },
{ 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
{ 0x9e, 0xc0 },
{ 0xaa, 0x07 },
};
@ -1734,7 +1735,7 @@ void genesys_init_sensor_tables()
{ 0x70, 0x00 }, { 0x71, 0x02 },
{ 0x74, 0x00 }, { 0x75, 0x1c }, { 0x76, 0x7f },
{ 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
{ 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
{ 0x9e, 0x00 },
{ 0xaa, 0x00 },
};