kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'genesys-simplify-dpiset' into 'master'
genesys: Simplify DPISET register calculations See merge request sane-project/backends!367fix-build-obselete-jpeg
commit
c99580b811
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Plik diff jest za duży
Load Diff
Ładowanie…
Reference in New Issue