Merge branch 'genesys-simplify-dpiset' into 'master'

genesys: Simplify DPISET register calculations

See merge request sane-project/backends!367
fix-build-obselete-jpeg
Povilas Kanapickas 2020-03-22 13:01:07 +00:00
commit c99580b811
12 zmienionych plików z 726 dodań i 632 usunięć

Wyświetl plik

@ -247,6 +247,7 @@ enum class SensorId : unsigned
CCD_DP665, CCD_DP665,
CCD_DP685, CCD_DP685,
CCD_DSMOBILE600, CCD_DSMOBILE600,
CCD_DOCKETPORT_487,
CCD_G4050, CCD_G4050,
CCD_HP2300, CCD_HP2300,
CCD_HP2400, CCD_HP2400,

Wyświetl plik

@ -492,6 +492,7 @@ static void genesys_send_offset_and_shading(Genesys_Device* dev, const Genesys_S
&& dev->model->sensor_id != SensorId::CCD_CANON_8600F && dev->model->sensor_id != SensorId::CCD_CANON_8600F
&& dev->model->sensor_id != SensorId::CCD_DSMOBILE600 && dev->model->sensor_id != SensorId::CCD_DSMOBILE600
&& dev->model->sensor_id != SensorId::CCD_XP300 && dev->model->sensor_id != SensorId::CCD_XP300
&& dev->model->sensor_id != SensorId::CCD_DOCKETPORT_487
&& dev->model->sensor_id != SensorId::CCD_DP665 && dev->model->sensor_id != SensorId::CCD_DP665
&& dev->model->sensor_id != SensorId::CCD_DP685 && dev->model->sensor_id != SensorId::CCD_DP685
&& dev->model->sensor_id != SensorId::CIS_CANON_LIDE_80 && dev->model->sensor_id != SensorId::CIS_CANON_LIDE_80
@ -2879,6 +2880,7 @@ static void genesys_send_shading_coefficient(Genesys_Device* dev, const Genesys_
switch (dev->model->sensor_id) switch (dev->model->sensor_id)
{ {
case SensorId::CCD_XP300: case SensorId::CCD_XP300:
case SensorId::CCD_DOCKETPORT_487:
case SensorId::CCD_ROADWARRIOR: case SensorId::CCD_ROADWARRIOR:
case SensorId::CCD_DP665: case SensorId::CCD_DP665:
case SensorId::CCD_DP685: case SensorId::CCD_DP685:
@ -3204,6 +3206,7 @@ static void genesys_flatbed_calibration(Genesys_Device* dev, Genesys_Sensor& sen
dev->interface->record_progress_message("led_calibration"); dev->interface->record_progress_message("led_calibration");
switch (dev->model->asic_type) { switch (dev->model->asic_type) {
case AsicType::GL124: case AsicType::GL124:
case AsicType::GL841:
case AsicType::GL845: case AsicType::GL845:
case AsicType::GL846: case AsicType::GL846:
case AsicType::GL847: { case AsicType::GL847: {
@ -4916,7 +4919,7 @@ static void probe_genesys_devices()
of Genesys_Calibration_Cache as is. of Genesys_Calibration_Cache as is.
*/ */
static const char* CALIBRATION_IDENT = "sane_genesys"; static const char* CALIBRATION_IDENT = "sane_genesys";
static const int CALIBRATION_VERSION = 28; static const int CALIBRATION_VERSION = 29;
bool read_calibration(std::istream& str, Genesys_Device::Calibration& calibration, bool read_calibration(std::istream& str, Genesys_Device::Calibration& calibration,
const std::string& path) const std::string& path)

Wyświetl plik

@ -693,10 +693,6 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
GenesysRegister *r; GenesysRegister *r;
uint32_t expmax; uint32_t expmax;
// resolution is divided according to ccd_pixels_per_system_pixel
unsigned ccd_pixels_per_system_pixel = sensor.ccd_pixels_per_system_pixel();
DBG(DBG_io2, "%s: ccd_pixels_per_system_pixel=%d\n", __func__, ccd_pixels_per_system_pixel);
gl124_setup_sensor(dev, sensor, reg); gl124_setup_sensor(dev, sensor, reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET); dev->cmd_set->set_fe(dev, sensor, AFE_SET);
@ -772,14 +768,7 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
reg->find_reg(REG_0x05).value &= ~REG_0x05_GMMENB; reg->find_reg(REG_0x05).value &= ~REG_0x05_GMMENB;
} }
unsigned dpiset_reg = session.output_resolution * ccd_pixels_per_system_pixel * reg->set16(REG_DPISET, sensor.register_dpiset);
session.ccd_size_divisor;
if (sensor.dpiset_override != 0) {
dpiset_reg = sensor.dpiset_override;
}
reg->set16(REG_DPISET, dpiset_reg);
DBG (DBG_io2, "%s: dpiset used=%d\n", __func__, dpiset_reg);
r = sanei_genesys_get_address(reg, REG_0x06); r = sanei_genesys_get_address(reg, REG_0x06);
r->value |= REG_0x06_GAIN4; r->value |= REG_0x06_GAIN4;

Wyświetl plik

@ -362,8 +362,11 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
regs->set24(REG_MAXWD, session.output_line_bytes); regs->set24(REG_MAXWD, session.output_line_bytes);
regs->set16(REG_DPISET, session.output_resolution * session.ccd_size_divisor * // FIXME: the incoming sensor is selected for incorrect resolution
sensor.ccd_pixels_per_system_pixel()); const auto& dpiset_sensor = sanei_genesys_find_sensor(dev, session.params.xres,
session.params.channels,
session.params.scan_method);
regs->set16(REG_DPISET, dpiset_sensor.register_dpiset);
regs->set16(REG_LPERIOD, sensor.exposure_lperiod); regs->set16(REG_LPERIOD, sensor.exposure_lperiod);
/* move distance must be adjusted to take into account the extra lines /* move distance must be adjusted to take into account the extra lines
@ -1549,15 +1552,18 @@ void CommandSetGl646::init_regs_for_shading(Genesys_Device* dev, const Genesys_S
DBG_HELPER(dbg); DBG_HELPER(dbg);
(void) regs; (void) regs;
Genesys_Settings settings; Genesys_Settings settings;
int cksel = 1;
/* fill settings for scan : always a color scan */ /* fill settings for scan : always a color scan */
int channels = 3; int channels = 3;
unsigned ccd_size_divisor = sensor.get_ccd_size_divisor_for_dpi(dev->settings.xres);
unsigned cksel = get_cksel(dev->model->sensor_id, dev->settings.xres, channels);
unsigned resolution = sensor.optical_res / ccd_size_divisor / cksel;
// FIXME: we select wrong calibration sensor
const auto& calib_sensor = sanei_genesys_find_sensor(dev, dev->settings.xres, channels, const auto& calib_sensor = sanei_genesys_find_sensor(dev, dev->settings.xres, channels,
dev->settings.scan_method); dev->settings.scan_method);
unsigned ccd_size_divisor = calib_sensor.get_ccd_size_divisor_for_dpi(dev->settings.xres);
settings.scan_method = dev->settings.scan_method; settings.scan_method = dev->settings.scan_method;
settings.scan_mode = dev->settings.scan_mode; settings.scan_mode = dev->settings.scan_mode;
@ -1565,9 +1571,7 @@ void CommandSetGl646::init_regs_for_shading(Genesys_Device* dev, const Genesys_S
// FIXME: always a color scan, but why don't we set scan_mode to COLOR_SINGLE_PASS always? // FIXME: always a color scan, but why don't we set scan_mode to COLOR_SINGLE_PASS always?
settings.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; settings.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
} }
settings.xres = sensor.optical_res / ccd_size_divisor; settings.xres = resolution;
cksel = get_cksel(dev->model->sensor_id, dev->settings.xres, channels);
settings.xres = settings.xres / cksel;
settings.yres = settings.xres; settings.yres = settings.xres;
settings.tl_x = 0; settings.tl_x = 0;
settings.tl_y = 0; settings.tl_y = 0;

Wyświetl plik

@ -101,99 +101,12 @@ other register settings depending on this:
RHI(0x52),RLOW(0x53),GHI(0x54),GLOW(0x55),BHI(0x56),BLOW(0x57), RHI(0x52),RLOW(0x53),GHI(0x54),GLOW(0x55),BHI(0x56),BLOW(0x57),
*/ */
static void sanei_gl841_setup_sensor(Genesys_Device * dev, const Genesys_Sensor& sensor, static void sanei_gl841_setup_sensor(const Genesys_Sensor& sensor, Genesys_Register_Set* regs)
Genesys_Register_Set * regs,
bool extended, unsigned ccd_size_divisor)
{ {
DBG(DBG_proc, "%s\n", __func__); DBG_HELPER(dbg);
// that one is tricky at least for (const auto& custom_reg : sensor.custom_regs) {
for (uint16_t addr = 0x08; addr <= 0x0b; ++addr) { regs->set8(custom_reg.address, custom_reg.value);
regs->set8(0x70 + addr - 0x08, sensor.custom_regs.get_value(addr));
}
// ignore registers in range [0x10..0x16)
for (uint16_t addr = 0x16; addr < 0x1e; ++addr) {
regs->set8(addr, sensor.custom_regs.get_value(addr));
}
// ignore registers in range [0x5b..0x5e]
for (uint16_t addr = 0x52; addr < 0x52 + 9; ++addr) {
regs->set8(addr, sensor.custom_regs.get_value(addr));
}
/* don't go any further if no extended setup */
if (!extended)
return;
/* todo : add more CCD types if needed */
/* we might want to expand the Sensor struct to have these
2 kind of settings */
if (dev->model->sensor_id == SensorId::CCD_5345) {
if (ccd_size_divisor > 1) {
GenesysRegister* r;
/* settings for CCD used at half is max resolution */
r = sanei_genesys_get_address (regs, 0x70);
r->value = 0x00;
r = sanei_genesys_get_address (regs, 0x71);
r->value = 0x05;
r = sanei_genesys_get_address (regs, 0x72);
r->value = 0x06;
r = sanei_genesys_get_address (regs, 0x73);
r->value = 0x08;
r = sanei_genesys_get_address (regs, 0x18);
r->value = 0x28;
r = sanei_genesys_get_address (regs, 0x58);
r->value = 0x80 | (r->value & 0x03); /* VSMP=16 */
}
else
{
GenesysRegister* r;
/* swap latch times */
r = sanei_genesys_get_address (regs, 0x18);
r->value = 0x30;
regs->set8(0x52, sensor.custom_regs.get_value(0x55));
regs->set8(0x53, sensor.custom_regs.get_value(0x56));
regs->set8(0x54, sensor.custom_regs.get_value(0x57));
regs->set8(0x55, sensor.custom_regs.get_value(0x52));
regs->set8(0x56, sensor.custom_regs.get_value(0x53));
regs->set8(0x57, sensor.custom_regs.get_value(0x54));
r = sanei_genesys_get_address (regs, 0x58);
r->value = 0x20 | (r->value & 0x03); /* VSMP=4 */
}
return;
}
if (dev->model->sensor_id == SensorId::CCD_HP2300) {
/* settings for CCD used at half is max resolution */
GenesysRegister* r;
if (ccd_size_divisor > 1) {
r = sanei_genesys_get_address (regs, 0x70);
r->value = 0x16;
r = sanei_genesys_get_address (regs, 0x71);
r->value = 0x00;
r = sanei_genesys_get_address (regs, 0x72);
r->value = 0x01;
r = sanei_genesys_get_address (regs, 0x73);
r->value = 0x03;
/* manual clock programming */
r = sanei_genesys_get_address (regs, 0x1d);
r->value |= 0x80;
}
else
{
r = sanei_genesys_get_address (regs, 0x70);
r->value = 1;
r = sanei_genesys_get_address (regs, 0x71);
r->value = 3;
r = sanei_genesys_get_address (regs, 0x72);
r->value = 4;
r = sanei_genesys_get_address (regs, 0x73);
r->value = 6;
}
r = sanei_genesys_get_address (regs, 0x58);
r->value = 0x80 | (r->value & 0x03); /* VSMP=16 */
return;
} }
} }
@ -344,7 +257,7 @@ gl841_init_lide80 (Genesys_Device * dev)
dev->reg.find_reg(0x6c).value |= REG_0x6B_GPO18; dev->reg.find_reg(0x6c).value |= REG_0x6B_GPO18;
dev->reg.find_reg(0x6c).value &= ~REG_0x6B_GPO17; dev->reg.find_reg(0x6c).value &= ~REG_0x6B_GPO17;
sanei_gl841_setup_sensor(dev, sensor, &dev->reg, 0, 1); sanei_gl841_setup_sensor(sensor, &dev->reg);
} }
/* /*
@ -409,24 +322,14 @@ gl841_init_registers (Genesys_Device * dev)
dev->reg.find_reg(0x05).value = 0x00; /* disable gamma, 24 clocks/pixel */ dev->reg.find_reg(0x05).value = 0x00; /* disable gamma, 24 clocks/pixel */
unsigned dpihw = 0; sanei_genesys_set_dpihw(dev->reg, sensor.register_dpihw);
unsigned sensor_pixels = dev->model->x_size_calib_mm * sensor.optical_res / MM_PER_INCH;
if (sensor_pixels < 0x1500) {
dpihw = 600;
} else if (sensor_pixels < 0x2a80) {
dpihw = 1200;
} else if (sensor_pixels < 0x5400) {
dpihw = 2400;
} else {
throw SaneException("Cannot handle sensor pixel count %d", sensor_pixels);
}
sanei_genesys_set_dpihw(dev->reg, dpihw);
dev->reg.find_reg(0x06).value |= REG_0x06_PWRBIT; dev->reg.find_reg(0x06).value |= REG_0x06_PWRBIT;
dev->reg.find_reg(0x06).value |= REG_0x06_GAIN4; dev->reg.find_reg(0x06).value |= REG_0x06_GAIN4;
/* XP300 CCD needs different clock and clock/pixels values */ /* XP300 CCD needs different clock and clock/pixels values */
if (dev->model->sensor_id != SensorId::CCD_XP300 && if (dev->model->sensor_id != SensorId::CCD_XP300 &&
dev->model->sensor_id != SensorId::CCD_DOCKETPORT_487 &&
dev->model->sensor_id != SensorId::CCD_DP685 && dev->model->sensor_id != SensorId::CCD_DP685 &&
dev->model->sensor_id != SensorId::CCD_PLUSTEK_OPTICPRO_3600) dev->model->sensor_id != SensorId::CCD_PLUSTEK_OPTICPRO_3600)
{ {
@ -480,7 +383,7 @@ gl841_init_registers (Genesys_Device * dev)
/*STOPTIM*/ /*STOPTIM*/
dev->reg.find_reg(0x5e).value |= 0x2 << REG_0x5ES_STOPTIM; dev->reg.find_reg(0x5e).value |= 0x2 << REG_0x5ES_STOPTIM;
sanei_gl841_setup_sensor(dev, sensor, &dev->reg, 0, 1); sanei_gl841_setup_sensor(sensor, &dev->reg);
// set up GPIO // set up GPIO
for (const auto& reg : dev->gpo.regs) { for (const auto& reg : dev->gpo.regs) {
@ -506,27 +409,21 @@ gl841_init_registers (Genesys_Device * dev)
} }
// Send slope table for motor movement slope_table in machine byte order // Send slope table for motor movement slope_table in machine byte order
static void gl841_send_slope_table(Genesys_Device* dev, int table_nr, static void gl841_send_slope_table(Genesys_Device* dev, const Genesys_Sensor& sensor,
const std::vector<uint16_t>& slope_table, int table_nr, const std::vector<uint16_t>& slope_table,
int steps) int steps)
{ {
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %d", table_nr, steps); DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %d", table_nr, steps);
int dpihw;
int start_address; int start_address;
/*#ifdef WORDS_BIGENDIAN*/ /*#ifdef WORDS_BIGENDIAN*/
int i; int i;
/*#endif*/ /*#endif*/
dpihw = dev->reg.find_reg(0x05).value >> 6; switch (sensor.register_dpihw) {
case 600: start_address = 0x08000; break;
if (dpihw == 0) /* 600 dpi */ case 1200: start_address = 0x10000; break;
start_address = 0x08000; case 2400: start_address = 0x20000; break;
else if (dpihw == 1) /* 1200 dpi */ default: throw SaneException("Unexpected dpihw");
start_address = 0x10000;
else if (dpihw == 2) /* 2400 dpi */
start_address = 0x20000;
else {
throw SaneException("Unexpected dpihw");
} }
std::vector<uint8_t> table(steps * 2); std::vector<uint8_t> table(steps * 2);
@ -804,11 +701,11 @@ static void gl841_init_motor_regs(Genesys_Device* dev, const Genesys_Sensor& sen
std::vector<uint16_t> table; std::vector<uint16_t> table;
table.resize(256, 0xffff); table.resize(256, 0xffff);
gl841_send_slope_table(dev, 0, table, 256); gl841_send_slope_table(dev, sensor, 0, table, 256);
gl841_send_slope_table(dev, 1, table, 256); gl841_send_slope_table(dev, sensor, 1, table, 256);
gl841_send_slope_table(dev, 2, table, 256); gl841_send_slope_table(dev, sensor, 2, table, 256);
gl841_send_slope_table(dev, 3, table, 256); gl841_send_slope_table(dev, sensor, 3, table, 256);
gl841_send_slope_table(dev, 4, table, 256); gl841_send_slope_table(dev, sensor, 4, table, 256);
} }
gl841_write_freq(dev, dev->motor.base_ydpi / 4); gl841_write_freq(dev, dev->motor.base_ydpi / 4);
@ -909,7 +806,7 @@ HOME_FREE: 3
r->value |= REG_0x02_MTRREV; r->value |= REG_0x02_MTRREV;
} }
gl841_send_slope_table(dev, 3, fast_table.table, 256); gl841_send_slope_table(dev, sensor, 3, fast_table.table, 256);
r = sanei_genesys_get_address(reg, 0x67); r = sanei_genesys_get_address(reg, 0x67);
r->value = 0x3f; r->value = 0x3f;
@ -970,11 +867,11 @@ static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor
std::vector<uint16_t> table; std::vector<uint16_t> table;
table.resize(256, 0xffff); table.resize(256, 0xffff);
gl841_send_slope_table(dev, 0, table, 256); gl841_send_slope_table(dev, sensor, 0, table, 256);
gl841_send_slope_table(dev, 1, table, 256); gl841_send_slope_table(dev, sensor, 1, table, 256);
gl841_send_slope_table(dev, 2, table, 256); gl841_send_slope_table(dev, sensor, 2, table, 256);
gl841_send_slope_table(dev, 3, table, 256); gl841_send_slope_table(dev, sensor, 3, table, 256);
gl841_send_slope_table(dev, 4, table, 256); gl841_send_slope_table(dev, sensor, 4, table, 256);
} }
@ -1130,18 +1027,16 @@ HOME_FREE: 3
r->value &= ~0x40; r->value &= ~0x40;
} }
gl841_send_slope_table(dev, 0, slow_table.table, 256); gl841_send_slope_table(dev, sensor, 0, slow_table.table, 256);
gl841_send_slope_table(dev, sensor, 1, back_table.table, 256);
gl841_send_slope_table(dev, 1, back_table.table, 256); gl841_send_slope_table(dev, sensor, 2, slow_table.table, 256);
gl841_send_slope_table(dev, 2, slow_table.table, 256);
if (use_fast_fed) { if (use_fast_fed) {
gl841_send_slope_table(dev, 3, fast_table.table, 256); gl841_send_slope_table(dev, sensor, 3, fast_table.table, 256);
} }
if (has_flag(flags, MotorFlag::AUTO_GO_HOME)) { if (has_flag(flags, MotorFlag::AUTO_GO_HOME)) {
gl841_send_slope_table(dev, 4, fast_table.table, 256); gl841_send_slope_table(dev, sensor, 4, fast_table.table, 256);
} }
/* now reg 0x21 and 0x24 are available, we can calculate reg 0x22 and 0x23, /* now reg 0x21 and 0x24 are available, we can calculate reg 0x22 and 0x23,
@ -1222,23 +1117,6 @@ HOME_FREE: 3
r->value = (fast_table.steps_count >> 1) + (fast_table.steps_count & 1); r->value = (fast_table.steps_count >> 1) + (fast_table.steps_count & 1);
} }
static int
gl841_get_dpihw(Genesys_Device * dev)
{
GenesysRegister* r;
r = sanei_genesys_get_address(&dev->reg, 0x05);
if ((r->value & REG_0x05_DPIHW) == REG_0x05_DPIHW_600) {
return 600;
}
if ((r->value & REG_0x05_DPIHW) == REG_0x05_DPIHW_1200) {
return 1200;
}
if ((r->value & REG_0x05_DPIHW) == REG_0x05_DPIHW_2400) {
return 2400;
}
return 0;
}
static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sensor& sensor, static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
Genesys_Register_Set* reg, unsigned int exposure_time, Genesys_Register_Set* reg, unsigned int exposure_time,
const ScanSession& session) const ScanSession& session)
@ -1370,12 +1248,12 @@ static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
} }
/* sensor parameters */ /* sensor parameters */
sanei_gl841_setup_sensor(dev, sensor, &dev->reg, 1, session.ccd_size_divisor); sanei_gl841_setup_sensor(sensor, &dev->reg);
r = sanei_genesys_get_address (reg, 0x29); r = sanei_genesys_get_address (reg, 0x29);
r->value = 255; /*<<<"magic" number, only suitable for cis*/ r->value = 255; /*<<<"magic" number, only suitable for cis*/
reg->set16(REG_DPISET, gl841_get_dpihw(dev) * session.output_resolution / session.optical_resolution); reg->set16(REG_DPISET, sensor.register_dpiset);
reg->set16(REG_STRPIXEL, session.pixel_startx); reg->set16(REG_STRPIXEL, session.pixel_startx);
reg->set16(REG_ENDPIXEL, session.pixel_endx); reg->set16(REG_ENDPIXEL, session.pixel_endx);
@ -3163,8 +3041,8 @@ void CommandSetGl841::send_shading_data(Genesys_Device* dev, const Genesys_Senso
uint8_t* data, int size) const uint8_t* data, int size) const
{ {
DBG_HELPER_ARGS(dbg, "writing %d bytes of shading data", size); DBG_HELPER_ARGS(dbg, "writing %d bytes of shading data", size);
uint32_t length, x, factor, pixels, i; uint32_t length, x, pixels, i;
uint16_t dpiset, dpihw, beginpixel; std::uint16_t beginpixel;
uint8_t *ptr,*src; uint8_t *ptr,*src;
/* old method if no SHDAREA */ /* old method if no SHDAREA */
@ -3178,14 +3056,6 @@ void CommandSetGl841::send_shading_data(Genesys_Device* dev, const Genesys_Senso
unsigned strpixel = dev->session.pixel_startx; unsigned strpixel = dev->session.pixel_startx;
unsigned endpixel = dev->session.pixel_endx; unsigned endpixel = dev->session.pixel_endx;
/* compute deletion/average factor */
dpiset = dev->reg.get16(REG_DPISET);
dpihw = gl841_get_dpihw(dev);
unsigned ccd_size_divisor = dev->session.ccd_size_divisor;
factor=dpihw/dpiset;
DBG(DBG_io2, "%s: dpihw=%d, dpiset=%d, ccd_size_divisor=%d, factor=%d\n", __func__, dpihw, dpiset,
ccd_size_divisor, factor);
/* turn pixel value into bytes 2x16 bits words */ /* turn pixel value into bytes 2x16 bits words */
strpixel*=2*2; /* 2 words of 2 bytes */ strpixel*=2*2; /* 2 words of 2 bytes */
endpixel*=2*2; endpixel*=2*2;
@ -3194,10 +3064,10 @@ void CommandSetGl841::send_shading_data(Genesys_Device* dev, const Genesys_Senso
/* shading pixel begin is start pixel minus start pixel during shading /* shading pixel begin is start pixel minus start pixel during shading
* calibration. Currently only cases handled are full and half ccd resolution. * calibration. Currently only cases handled are full and half ccd resolution.
*/ */
beginpixel = sensor.ccd_start_xoffset / ccd_size_divisor; beginpixel = sensor.ccd_start_xoffset / dev->session.ccd_size_divisor;
beginpixel += sensor.dummy_pixel + 1; beginpixel += sensor.dummy_pixel + 1;
DBG(DBG_io2, "%s: ORIGIN PIXEL=%d\n", __func__, beginpixel); DBG(DBG_io2, "%s: ORIGIN PIXEL=%d\n", __func__, beginpixel);
beginpixel = (strpixel-beginpixel*2*2)/factor; beginpixel = (strpixel - beginpixel * 2 * 2) / sensor.shading_factor;
DBG(DBG_io2, "%s: BEGIN PIXEL=%d\n", __func__, beginpixel/4); DBG(DBG_io2, "%s: BEGIN PIXEL=%d\n", __func__, beginpixel/4);
dev->interface->record_key_value("shading_offset", std::to_string(beginpixel)); dev->interface->record_key_value("shading_offset", std::to_string(beginpixel));

Wyświetl plik

@ -960,10 +960,6 @@ static void gl843_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
/* sensor parameters */ /* sensor parameters */
gl843_setup_sensor(dev, sensor, reg); gl843_setup_sensor(dev, sensor, reg);
// resolution is divided according to CKSEL
unsigned ccd_pixels_per_system_pixel = sensor.ccd_pixels_per_system_pixel();
DBG(DBG_io2, "%s: ccd_pixels_per_system_pixel=%d\n", __func__, ccd_pixels_per_system_pixel);
dev->cmd_set->set_fe(dev, sensor, AFE_SET); dev->cmd_set->set_fe(dev, sensor, AFE_SET);
/* enable shading */ /* enable shading */
@ -1078,14 +1074,7 @@ static void gl843_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
reg->find_reg(REG_0x05).value &= ~REG_0x05_GMMENB; reg->find_reg(REG_0x05).value &= ~REG_0x05_GMMENB;
} }
unsigned dpiset = session.output_resolution * session.ccd_size_divisor * reg->set16(REG_DPISET, sensor.register_dpiset);
ccd_pixels_per_system_pixel;
if (sensor.dpiset_override != 0) {
dpiset = sensor.dpiset_override;
}
reg->set16(REG_DPISET, dpiset);
DBG(DBG_io2, "%s: dpiset used=%d\n", __func__, dpiset);
reg->set16(REG_STRPIXEL, session.pixel_startx); reg->set16(REG_STRPIXEL, session.pixel_startx);
reg->set16(REG_ENDPIXEL, session.pixel_endx); reg->set16(REG_ENDPIXEL, session.pixel_endx);

Wyświetl plik

@ -518,10 +518,6 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time); DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time);
GenesysRegister *r; GenesysRegister *r;
// resolution is divided according to ccd_pixels_per_system_pixel()
unsigned ccd_pixels_per_system_pixel = sensor.ccd_pixels_per_system_pixel();
DBG(DBG_io2, "%s: ccd_pixels_per_system_pixel=%d\n", __func__, ccd_pixels_per_system_pixel);
gl846_setup_sensor(dev, sensor, reg); gl846_setup_sensor(dev, sensor, reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET); dev->cmd_set->set_fe(dev, sensor, AFE_SET);
@ -613,10 +609,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
}*/ }*/
} }
unsigned dpiset = session.params.xres * ccd_pixels_per_system_pixel; reg->set16(REG_DPISET, sensor.register_dpiset);
reg->set16(REG_DPISET, dpiset);
DBG(DBG_io2, "%s: dpiset used=%d\n", __func__, dpiset);
reg->set16(REG_STRPIXEL, session.pixel_startx); reg->set16(REG_STRPIXEL, session.pixel_startx);
reg->set16(REG_ENDPIXEL, session.pixel_endx); reg->set16(REG_ENDPIXEL, session.pixel_endx);

Wyświetl plik

@ -528,10 +528,6 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time); DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time);
GenesysRegister *r; GenesysRegister *r;
// resolution is divided according to ccd_pixels_per_system_pixel()
unsigned ccd_pixels_per_system_pixel = sensor.ccd_pixels_per_system_pixel();
DBG(DBG_io2, "%s: ccd_pixels_per_system_pixel=%d\n", __func__, ccd_pixels_per_system_pixel);
gl847_setup_sensor(dev, sensor, reg); gl847_setup_sensor(dev, sensor, reg);
dev->cmd_set->set_fe(dev, sensor, AFE_SET); dev->cmd_set->set_fe(dev, sensor, AFE_SET);
@ -625,10 +621,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
*/ */
} }
unsigned dpiset = session.params.xres * ccd_pixels_per_system_pixel; reg->set16(REG_DPISET, sensor.register_dpiset);
reg->set16(REG_DPISET, dpiset);
DBG (DBG_io2, "%s: dpiset used=%d\n", __func__, dpiset);
reg->set16(REG_STRPIXEL, session.pixel_startx); reg->set16(REG_STRPIXEL, session.pixel_startx);
reg->set16(REG_ENDPIXEL, session.pixel_endx); reg->set16(REG_ENDPIXEL, session.pixel_endx);

Wyświetl plik

@ -126,8 +126,7 @@ std::ostream& operator<<(std::ostream& out, const Genesys_Sensor& sensor)
<< " channels: " << format_vector_unsigned(4, sensor.channels) << '\n' << " channels: " << format_vector_unsigned(4, sensor.channels) << '\n'
<< " method: " << sensor.method << '\n' << " method: " << sensor.method << '\n'
<< " register_dpihw: " << sensor.register_dpihw << '\n' << " register_dpihw: " << sensor.register_dpihw << '\n'
<< " logical_dpihw_override: " << sensor.logical_dpihw_override << '\n' << " register_dpiset: " << sensor.register_dpiset << '\n'
<< " dpiset_override: " << sensor.dpiset_override << '\n'
<< " ccd_size_divisor: " << sensor.ccd_size_divisor << '\n' << " ccd_size_divisor: " << sensor.ccd_size_divisor << '\n'
<< " shading_factor: " << sensor.shading_factor << '\n' << " shading_factor: " << sensor.shading_factor << '\n'
<< " pixel_count_ratio: " << sensor.pixel_count_ratio << '\n' << " pixel_count_ratio: " << sensor.pixel_count_ratio << '\n'

Wyświetl plik

@ -273,13 +273,9 @@ struct Genesys_Sensor {
// resolution. The value zero does not set the override. // resolution. The value zero does not set the override.
unsigned register_dpihw = 0; unsigned register_dpihw = 0;
// The scanner may be setup to use a custom logical dpihw that does not correspond to any actual
// resolution. The value zero does not set the override.
unsigned logical_dpihw_override = 0;
// The scanner may be setup to use a custom dpiset value that does not correspond to any actual // The scanner may be setup to use a custom dpiset value that does not correspond to any actual
// resolution. The value zero does not set the override. // resolution. The value zero does not set the override.
unsigned dpiset_override = 0; unsigned register_dpiset = 0;
// CCD may present itself as half or quarter-size CCD on certain resolutions // CCD may present itself as half or quarter-size CCD on certain resolutions
int ccd_size_divisor = 1; int ccd_size_divisor = 1;

Wyświetl plik

@ -2045,7 +2045,7 @@ void genesys_init_usb_device_tables()
model.is_cis = true; model.is_cis = true;
model.is_sheetfed = true; model.is_sheetfed = true;
model.sensor_id = SensorId::CCD_XP300; model.sensor_id = SensorId::CCD_DOCKETPORT_487;
model.adc_id = AdcId::WOLFSON_XP300; model.adc_id = AdcId::WOLFSON_XP300;
model.gpio_id = GpioId::XP300; model.gpio_id = GpioId::XP300;
model.motor_id = MotorId::XP300; model.motor_id = MotorId::XP300;