Merge branch 'genesys-plustek-7300-7500i' into 'master'

genesys: Implement support for Plustek OpticFilm 7300 and 7500i scanners

See merge request sane-project/backends!210
merge-requests/210/merge
Povilas Kanapickas 2019-10-12 15:41:59 +00:00
commit 5ca0acd19a
12 zmienionych plików z 500 dodań i 27 usunięć

Wyświetl plik

@ -127,6 +127,12 @@ usb 0x07b3 0x0900
# Plustek OpticFilm 7200i
usb 0x07b3 0x0c04
# Plustek OpticFilm 7300
usb 0x07b3 0x0c12
# Plustek OpticFilm 7500i
usb 0x07b3 0x0c13
# Primax Electronics, Ltd Xerox 2400 Onetouch
usb 0x0461 0x038b

Wyświetl plik

@ -153,6 +153,8 @@ enum class ModelId : unsigned
PENTAX_DSMOBILE_600,
PLUSTEK_OPTICBOOK_3800,
PLUSTEK_OPTICFILM_7200I,
PLUSTEK_OPTICFILM_7300,
PLUSTEK_OPTICFILM_7500I,
PLUSTEK_OPTICPRO_3600,
PLUSTEK_OPTICPRO_ST12,
PLUSTEK_OPTICPRO_ST24,
@ -190,6 +192,8 @@ enum class SensorId : unsigned
CCD_KVSS080,
CCD_PLUSTEK_OPTICBOOK_3800,
CCD_PLUSTEK_OPTICFILM_7200I,
CCD_PLUSTEK_OPTICFILM_7300,
CCD_PLUSTEK_OPTICFILM_7500I,
CCD_PLUSTEK_OPTICPRO_3600,
CCD_ROADWARRIOR,
CCD_ST12, // SONY ILX548: 5340 Pixel ???
@ -239,6 +243,8 @@ enum class AdcId : unsigned
KVSS080,
PLUSTEK_OPTICBOOK_3800,
PLUSTEK_OPTICFILM_7200I,
PLUSTEK_OPTICFILM_7300,
PLUSTEK_OPTICFILM_7500I,
PLUSTEK_OPTICPRO_3600,
WOLFSON_5345,
WOLFSON_DSM600,
@ -289,6 +295,8 @@ enum class GpioId : unsigned
MD_5345,
PLUSTEK_OPTICBOOK_3800,
PLUSTEK_OPTICFILM_7200I,
PLUSTEK_OPTICFILM_7300,
PLUSTEK_OPTICFILM_7500I,
PLUSTEK_OPTICPRO_3600,
ST12,
ST24,
@ -321,6 +329,8 @@ enum class MotorId : unsigned
MD_5345,
PLUSTEK_OPTICBOOK_3800,
PLUSTEK_OPTICFILM_7200I,
PLUSTEK_OPTICFILM_7300,
PLUSTEK_OPTICFILM_7500I,
PLUSTEK_OPTICPRO_3600,
ROADWARRIOR,
ST24,

Wyświetl plik

@ -2591,6 +2591,8 @@ static void genesys_send_shading_coefficient(Genesys_Device* dev, const Genesys_
case SensorId::CCD_CANON_8400F:
case SensorId::CCD_CANON_8600F:
case SensorId::CCD_PLUSTEK_OPTICFILM_7200I:
case SensorId::CCD_PLUSTEK_OPTICFILM_7300:
case SensorId::CCD_PLUSTEK_OPTICFILM_7500I:
target_code = 0xe000;
o = 0;
compute_coefficients (dev,

Wyświetl plik

@ -175,7 +175,9 @@ static void gl843_setup_sensor(Genesys_Device* dev, const Genesys_Sensor& sensor
regs->set8(custom_reg.address, custom_reg.value);
}
if (!(dev->model->flags & GENESYS_FLAG_FULL_HWDPI_MODE) &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I)
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300 &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7500I)
{
regs->set8(0x7d, 0x90);
}
@ -204,12 +206,7 @@ gl843_init_registers (Genesys_Device * dev)
dev->reg.clear();
/* default to KV-SS080 */
SETREG (0xa2, 0x0f);
if (dev->model->model_id == ModelId::CANON_8600F) {
SETREG(0xa2, 0x1f);
}
SETREG (0x01, 0x00);
SETREG(0x01, 0x00);
SETREG (0x02, 0x78);
SETREG (0x03, 0x1f);
if (dev->model->model_id == ModelId::HP_SCANJET_G4010 ||
@ -223,7 +220,10 @@ gl843_init_registers (Genesys_Device * dev)
}
SETREG(0x04, 0x10);
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I) {
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x04, 0x22);
}
@ -250,7 +250,10 @@ gl843_init_registers (Genesys_Device * dev)
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I) {
SETREG(0x06, 0xd0);
}
if (dev->model->model_id == ModelId::CANON_4400F) {
if (dev->model->model_id == ModelId::CANON_4400F ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x06, 0xf0); /* SCANMOD=111, PWRBIT and no GAIN4 */
}
@ -280,6 +283,10 @@ gl843_init_registers (Genesys_Device * dev)
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I) {
SETREG(0x0b, 0x2a);
}
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I) {
SETREG(0x0b, 0x4a);
}
if (dev->model->model_id == ModelId::HP_SCANJET_G4010 ||
dev->model->model_id == ModelId::HP_SCANJET_G4050 ||
dev->model->model_id == ModelId::HP_SCANJET_4850C)
@ -288,7 +295,8 @@ gl843_init_registers (Genesys_Device * dev)
}
if (dev->model->model_id != ModelId::CANON_8400F &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I)
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300)
{
SETREG (0x0c, 0x00);
}
@ -382,6 +390,11 @@ gl843_init_registers (Genesys_Device * dev)
{
SETREG(0x34, 0x14);
}
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x34, 0x3c);
}
// MAXWD: If available buffer size is less than 2*MAXWD words, then
// "buffer full" state will be set.
@ -437,6 +450,11 @@ gl843_init_registers (Genesys_Device * dev)
if (dev->model->model_id == ModelId::CANON_8600F) {
SETREG(0x5e, 0x1f);
}
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x5e, 0x01);
}
//FMOVDEC: The number of deceleration steps in table 5 for auto-go-home
SETREG(0x5f, 0x01);
@ -446,6 +464,11 @@ gl843_init_registers (Genesys_Device * dev)
if (dev->model->model_id == ModelId::CANON_8600F) {
SETREG(0x5f, 0xf0);
}
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x5f, 0x01);
}
// Z1MOD[0:20]
SETREG (0x60, 0x00);
@ -466,6 +489,11 @@ gl843_init_registers (Genesys_Device * dev)
// FASTPWM[5:0]: Motor phase PWM duty cycle setting for tables 4-5
SETREG (0x68, 0x7f);
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300) {
SETREG(0x67, 0x80);
SETREG(0x68, 0x80);
}
// FSHDEC[0:7]: The number of deceleration steps after scanning is finished
// (table 3)
SETREG (0x69, 0x01);
@ -496,7 +524,10 @@ gl843_init_registers (Genesys_Device * dev)
{
SETREG(0x6b, 0xf4);
}
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I) {
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x6b, 0x31);
}
@ -579,11 +610,13 @@ gl843_init_registers (Genesys_Device * dev)
{
SETREG(0x80, 0x50);
}
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x80, 0x0f);
}
if (dev->model->model_id != ModelId::CANON_4400F) {
// NOTE: Historical code. None of the following 6 registers are
// documented in the datasheet. Their default value is 0, so probably it's
// not a bad idea to leave this here.
SETREG (0x81, 0x00);
SETREG (0x82, 0x00);
SETREG (0x83, 0x00);
@ -602,7 +635,8 @@ gl843_init_registers (Genesys_Device * dev)
// MTRPLS[0:7]: The width of the ADF motor trigger signal pulse.
if (dev->model->model_id != ModelId::CANON_8400F &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I)
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300)
{
SETREG(0x94, 0xff);
}
@ -632,6 +666,11 @@ gl843_init_registers (Genesys_Device * dev)
// RMADLY[0:1], MOTLAG, CMODE, STEPTIM, MULDMYLN, IFRS
SETREG(0x9d, 0x04);
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
SETREG(0x9d, 0x00);
}
if (dev->model->model_id == ModelId::CANON_4400F ||
dev->model->model_id == ModelId::CANON_8400F ||
dev->model->model_id == ModelId::CANON_8600F ||
@ -646,11 +685,16 @@ gl843_init_registers (Genesys_Device * dev)
// SEL3INV, TGSTIME[0:2], TGWTIME[0:2]
if (dev->model->model_id != ModelId::CANON_8400F &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I)
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300)
{
SETREG(0x9e, 0x00); // SENSOR_DEF
}
if (dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300) {
SETREG(0xa2, 0x0f);
}
// RFHSET[0:4]: Refresh time of SDRAM in units of 2us
if (dev->model->model_id == ModelId::CANON_4400F ||
dev->model->model_id == ModelId::CANON_8600F)
@ -663,14 +707,16 @@ gl843_init_registers (Genesys_Device * dev)
// not documented
if (dev->model->model_id != ModelId::CANON_4400F &&
dev->model->model_id != ModelId::CANON_8400F &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I)
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300)
{
SETREG(0xaa, 0x00);
}
// GPOM9, MULSTOP[0-2], NODECEL, TB3TB1, TB5TB2, FIX16CLK. Not documented
if (dev->model->model_id != ModelId::CANON_8400F &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I) {
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7200I &&
dev->model->model_id != ModelId::PLUSTEK_OPTICFILM_7300) {
SETREG(0xab, 0x50);
}
if (dev->model->model_id == ModelId::CANON_4400F) {
@ -979,12 +1025,8 @@ static void gl843_init_motor_regs_scan(Genesys_Device* dev,
r->value &= 0xf0; /* 0 dummy lines */
r->value |= scan_dummy; /* dummy lines */
r = sanei_genesys_get_address (reg, REG67);
r->value = 0x3f | (static_cast<unsigned>(step_type) << REG67S_STEPSEL);
// BUG: here we are writing non-fast step type to fast step type register
r = sanei_genesys_get_address (reg, REG68);
r->value = 0x3f | (static_cast<unsigned>(step_type) << REG68S_FSTPSEL);
reg->set8_mask(REG67, static_cast<unsigned>(step_type) << REG67S_STEPSEL, 0xc0);
reg->set8_mask(REG68, static_cast<unsigned>(step_type) << REG68S_FSTPSEL, 0xc0);
/* steps for STOP table */
r = sanei_genesys_get_address (reg, REG_FMOVDEC);
@ -1724,6 +1766,14 @@ static void gl843_set_xpa_lamp_power(Genesys_Device* dev, bool set)
{ 0xa8, 0x00, 0x07 },
}
},
{ ModelId::PLUSTEK_OPTICFILM_7300, ScanMethod::TRANSPARENCY, {}, {} },
{ ModelId::PLUSTEK_OPTICFILM_7500I, ScanMethod::TRANSPARENCY, {}, {} },
{ ModelId::PLUSTEK_OPTICFILM_7500I, ScanMethod::TRANSPARENCY_INFRARED, {
{ 0xa8, 0x07, 0x07 },
}, {
{ 0xa8, 0x00, 0x07 },
}
},
};
for (const auto& setting : settings) {
@ -1798,7 +1848,9 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
gl843_set_xpa_motor_power(dev, true);
}
break;
case GpioId::PLUSTEK_OPTICFILM_7200I: {
case GpioId::PLUSTEK_OPTICFILM_7200I:
case GpioId::PLUSTEK_OPTICFILM_7300:
case GpioId::PLUSTEK_OPTICFILM_7500I: {
if (reg->state.is_xpa_on && reg->state.is_lamp_on) {
gl843_set_xpa_lamp_power(dev, true);
}
@ -3094,6 +3146,10 @@ void CommandSetGl843::asic_boot(Genesys_Device* dev, bool cold) const
}
else if (dev->model->model_id == ModelId::CANON_8600F) {
sanei_genesys_write_0x8c(dev, 0x10, 0xc8);
} else if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
sanei_genesys_write_0x8c(dev, 0x10, 0xd4);
} else {
sanei_genesys_write_0x8c(dev, 0x10, 0xb4);
}
@ -3107,6 +3163,10 @@ void CommandSetGl843::asic_boot(Genesys_Device* dev, bool cold) const
case ModelId::PLUSTEK_OPTICFILM_7200I:
clock_freq = REG0B_30MHZ;
break;
case ModelId::PLUSTEK_OPTICFILM_7300:
case ModelId::PLUSTEK_OPTICFILM_7500I:
clock_freq = REG0B_40MHZ;
break;
default:
break;
}

Wyświetl plik

@ -938,7 +938,8 @@ void sanei_genesys_set_lamp_power(Genesys_Device* dev, const Genesys_Sensor& sen
// we don't actually turn on lamp on infrared scan
if ((dev->model->model_id == ModelId::CANON_8400F ||
dev->model->model_id == ModelId::CANON_8600F ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I) &&
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I) &&
dev->settings.scan_method == ScanMethod::TRANSPARENCY_INFRARED)
{
regs.find_reg(0x03).value &= ~REG03_LAMPPWR;
@ -1493,7 +1494,10 @@ void compute_session(Genesys_Device* dev, ScanSession& s, const Genesys_Sensor&
// In quarter-CCD mode optical_pixels is 4x larger than the actual physical number
s.optical_pixels = align_int_up(s.optical_pixels, 2 * s.ccd_size_divisor);
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I) {
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200I ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7300 ||
dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7500I)
{
s.optical_pixels = align_int_up(s.optical_pixels, 16);
}
}

Wyświetl plik

@ -478,6 +478,40 @@ void genesys_init_frontend_tables()
s_frontends->push_back(fe);
fe = Genesys_Frontend();
fe.id = AdcId::PLUSTEK_OPTICFILM_7300;
fe.layout = analog_devices;
fe.regs = {
{ 0x00, 0xf8 },
{ 0x01, 0x80 },
{ 0x02, 0x10 },
{ 0x03, 0x06 },
{ 0x04, 0x06 },
{ 0x05, 0x09 },
{ 0x06, 0x0a },
{ 0x07, 0x0102 },
};
fe.reg2 = {0x00, 0x00, 0x00};
s_frontends->push_back(fe);
fe = Genesys_Frontend();
fe.id = AdcId::PLUSTEK_OPTICFILM_7500I;
fe.layout = analog_devices;
fe.regs = {
{ 0x00, 0xf8 },
{ 0x01, 0x80 },
{ 0x02, 0x1d },
{ 0x03, 0x17 },
{ 0x04, 0x13 },
{ 0x05, 0x00 },
{ 0x06, 0x00 },
{ 0x07, 0x0111 },
};
fe.reg2 = {0x00, 0x00, 0x00};
s_frontends->push_back(fe);
fe = Genesys_Frontend();
fe.id = AdcId::CANON_8400F;
fe.layout = wolfson_layout;

Wyświetl plik

@ -304,6 +304,33 @@ void genesys_init_gpo_tables()
};
s_gpo->push_back(gpo);
gpo = Genesys_Gpo();
gpo.id = GpioId::PLUSTEK_OPTICFILM_7300;
gpo.regs = {
{ 0x6c, 0x4c },
{ 0x6d, 0x00 },
{ 0x6e, 0x4c },
{ 0x6f, 0x80 },
{ 0xa6, 0x00 },
{ 0xa7, 0x07 },
{ 0xa8, 0x20 },
{ 0xa9, 0x01 },
};
s_gpo->push_back(gpo);
gpo = Genesys_Gpo();
gpo.id = GpioId::PLUSTEK_OPTICFILM_7500I;
gpo.regs = {
{ 0x6c, 0x4c },
{ 0x6d, 0x00 },
{ 0x6e, 0x4c },
{ 0x6f, 0x80 },
{ 0xa6, 0x00 },
{ 0xa7, 0x07 },
{ 0xa8, 0x20 },
{ 0xa9, 0x01 },
};
s_gpo->push_back(gpo);
gpo = Genesys_Gpo();
gpo.id = GpioId::CANON_4400F;

Wyświetl plik

@ -2389,6 +2389,123 @@ void genesys_init_usb_device_tables()
s_usb_devices->emplace_back(0x07b3, 0x0c04, model);
model = Genesys_Model();
model.name = "plustek-opticfilm-7300";
model.vendor = "PLUSTEK";
model.model = "OpticFilm 7300";
model.model_id = ModelId::PLUSTEK_OPTICFILM_7300;
model.asic_type = AsicType::GL843;
model.xdpi_values = { 7200, 3600, 1800, 900 };
model.ydpi_values = { 7200, 3600, 1800, 900 };
model.bpp_gray_values = { 16 };
model.bpp_color_values = { 16 };
model.default_method = ScanMethod::TRANSPARENCY;
model.x_offset = 0.0;
model.y_offset = 0.0;
model.x_size = 36.0;
model.y_size = 44.0;
model.y_offset_calib_white = 0.0;
model.x_offset_calib_black = 6.5;
model.x_offset_ta = 0.0;
model.y_offset_ta = 29.0;
model.x_size_ta = 36.0;
model.y_size_ta = 24.0;
model.y_offset_sensor_to_ta = 0.0;
model.y_offset_calib_black_ta = 6.5;
model.y_offset_calib_white_ta = 0.0;
model.post_scan = 0.0;
model.eject_feed = 0.0;
model.ld_shift_r = 0;
model.ld_shift_g = 12;
model.ld_shift_b = 24;
model.line_mode_color_order = ColorOrder::RGB;
model.is_cis = false;
model.is_sheetfed = false;
model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7300;
model.adc_id = AdcId::PLUSTEK_OPTICFILM_7300;
model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7300;
model.motor_id = MotorId::PLUSTEK_OPTICFILM_7300;
model.flags = GENESYS_FLAG_HAS_UTA |
GENESYS_FLAG_CUSTOM_GAMMA |
GENESYS_FLAG_SKIP_WARMUP |
GENESYS_FLAG_DARK_CALIBRATION |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_HAS_NO_BUTTONS |
GENESYS_FLAG_SHADING_REPARK |
GENESYS_FLAG_CALIBRATION_HOST_SIDE;
model.shading_lines = 7;
model.shading_ta_lines = 50;
model.search_lines = 200;
s_usb_devices->emplace_back(0x07b3, 0x0c12, model);
model = Genesys_Model();
model.name = "plustek-opticfilm-7500i";
model.vendor = "PLUSTEK";
model.model = "OpticFilm 7500i";
model.model_id = ModelId::PLUSTEK_OPTICFILM_7500I;
model.asic_type = AsicType::GL843;
model.xdpi_values = { 7200, 3600, 1800, 900 };
model.ydpi_values = { 7200, 3600, 1800, 900 };
model.bpp_gray_values = { 16 };
model.bpp_color_values = { 16 };
model.default_method = ScanMethod::TRANSPARENCY;
model.x_offset = 0.0;
model.y_offset = 0.0;
model.x_size = 36.0;
model.y_size = 44.0;
model.y_offset_calib_white = 0.0;
model.x_offset_calib_black = 6.5;
model.x_offset_ta = 0.0;
model.y_offset_ta = 29.0;
model.x_size_ta = 36.0;
model.y_size_ta = 24.0;
model.y_offset_sensor_to_ta = 0.0;
model.y_offset_calib_black_ta = 6.5;
model.y_offset_calib_white_ta = 0.0;
model.post_scan = 0.0;
model.eject_feed = 0.0;
model.ld_shift_r = 0;
model.ld_shift_g = 12;
model.ld_shift_b = 24;
model.line_mode_color_order = ColorOrder::RGB;
model.is_cis = false;
model.is_sheetfed = false;
model.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7500I;
model.adc_id = AdcId::PLUSTEK_OPTICFILM_7500I;
model.gpio_id = GpioId::PLUSTEK_OPTICFILM_7500I;
model.motor_id = MotorId::PLUSTEK_OPTICFILM_7500I;
model.flags = GENESYS_FLAG_HAS_UTA |
GENESYS_FLAG_HAS_UTA_INFRARED |
GENESYS_FLAG_CUSTOM_GAMMA |
GENESYS_FLAG_SKIP_WARMUP |
GENESYS_FLAG_DARK_CALIBRATION |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_HAS_NO_BUTTONS |
GENESYS_FLAG_SHADING_REPARK |
GENESYS_FLAG_CALIBRATION_HOST_SIDE;
model.shading_lines = 7;
model.shading_ta_lines = 50;
model.search_lines = 200;
s_usb_devices->emplace_back(0x07b3, 0x0c13, model);
model = Genesys_Model();
model.name = "hewlett-packard-scanjet-N6310";
model.vendor = "Hewlett Packard";

Wyświetl plik

@ -619,6 +619,22 @@ void genesys_init_motor_tables()
s_motors->push_back(std::move(motor));
motor = Genesys_Motor();
motor.id = MotorId::PLUSTEK_OPTICFILM_7300;
motor.base_ydpi = 3600;
motor.optical_ydpi = 3600;
motor.max_step_type = 0;
s_motors->push_back(std::move(motor));
motor = Genesys_Motor();
motor.id = MotorId::PLUSTEK_OPTICFILM_7500I;
motor.base_ydpi = 3600;
motor.optical_ydpi = 3600;
motor.max_step_type = 0;
s_motors->push_back(std::move(motor));
motor = Genesys_Motor();
motor.id = MotorId::IMG101;
motor.base_ydpi = 600;

Wyświetl plik

@ -747,6 +747,34 @@ static uint32_t motor_speeds_plustek_7200i_2[] = {
15880, 15880, 0
};
static std::uint32_t motor_speeds_plustek_7300_1[] = {
31250, 3105, 2266, 1883, 1653, 1512, 1512, 0
};
static std::uint32_t motor_speeds_plustek_7500i_1[] = {
31250, 3105, 2266, 1883, 1653, 1512, 1512, 0
};
static std::uint32_t motor_speeds_plustek_7500i_2[] = {
31250, 3105, 2266, 1883, 1653, 1493, 1375, 1375, 0
};
/* TODO:
1800 dpi: 31250, 3105, 3025, 3025
3600 dpi: 31250, 6050, 6050
7200 dpi: 31250, 12100, 12100
isrd:
1800 dpi: 31250, 3105, 2750, 2750
3600 dpi: 31250, 5500, 5500,
7200 dpi: 31250, 11000, 11000,
*/
Motor_Profile gl843_motor_profiles[] = {
{ MotorId::KVSS080, 8000, StepType::HALF, kvss080 },
{ MotorId::G4050, 8016, StepType::HALF, g4050_fast },
@ -758,6 +786,9 @@ Motor_Profile gl843_motor_profiles[] = {
{ MotorId::CANON_8600F, 0x59d8, StepType::QUARTER, motor_speeds_cs8600f }, // FIXME: if the exposure is lower then we'll select another motor
{ MotorId::PLUSTEK_OPTICFILM_7200I, 0x19c8, StepType::HALF, motor_speeds_plustek_7200i_1},
{ MotorId::PLUSTEK_OPTICFILM_7200I, 0x2538, StepType::HALF, motor_speeds_plustek_7200i_2},
{ MotorId::PLUSTEK_OPTICFILM_7300, 0x2f44, StepType::QUARTER, motor_speeds_plustek_7300_1},
{ MotorId::PLUSTEK_OPTICFILM_7500I, 0x2f44, StepType::QUARTER, motor_speeds_plustek_7500i_1},
{ MotorId::PLUSTEK_OPTICFILM_7500I, 0x2af8, StepType::QUARTER, motor_speeds_plustek_7500i_2},
{ MotorId::UNKNOWN, 0, StepType::FULL, nullptr },
};

Wyświetl plik

@ -3393,6 +3393,162 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7300;
sensor.optical_res = 7200;
sensor.method = ScanMethod::TRANSPARENCY;
sensor.register_dpihw_override = 1200;
sensor.black_pixels = 88; // TODO
sensor.dummy_pixel = 20;
sensor.ccd_start_xoffset = 0;
sensor.sensor_pixels = 10200; // TODO
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.exposure_lperiod = 0x2f44;
sensor.custom_regs = {
{ 0x08, 0x00 },
{ 0x09, 0x00 },
{ 0x0a, 0x00 },
{ 0x16, 0x27 },
{ 0x17, 0x0c },
{ 0x18, 0x10 },
{ 0x19, 0x2a },
{ 0x1a, 0x00 },
{ 0x1b, 0x00 },
{ 0x1c, 0x20 },
{ 0x1d, 0x84 },
{ 0x52, 0x0a },
{ 0x53, 0x0d },
{ 0x54, 0x0f },
{ 0x55, 0x01 },
{ 0x56, 0x04 },
{ 0x57, 0x07 },
{ 0x58, 0x31 },
{ 0x59, 0x79 },
{ 0x5a, 0xc0 },
{ 0x70, 0x0c },
{ 0x71, 0x0d },
{ 0x72, 0x0e },
{ 0x73, 0x0f },
{ 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
};
sensor.gamma = {1.0, 1.0, 1.0};
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings
{
ResolutionFilter resolutions;
unsigned ccd_size_divisor;
unsigned logical_dpihw_override;
unsigned pixel_count_multiplier;
unsigned dpiset_override;
};
CustomSensorSettings custom_settings[] = {
{ { 900 }, 1, 900, 8, 150 },
{ { 1800 }, 1, 1800, 4, 300 },
{ { 3600 }, 1, 3600, 2, 600 },
{ { 7200 }, 1, 7200, 1, 1200 },
};
for (const CustomSensorSettings& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
sensor.ccd_size_divisor = setting.ccd_size_divisor;
sensor.logical_dpihw_override = setting.logical_dpihw_override;
sensor.pixel_count_multiplier = setting.pixel_count_multiplier;
sensor.dpiset_override = setting.dpiset_override;
s_sensors->push_back(sensor);
}
}
sensor = Genesys_Sensor();
sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7500I;
sensor.optical_res = 7200;
sensor.register_dpihw_override = 1200;
sensor.black_pixels = 88; // TODO
sensor.dummy_pixel = 20;
sensor.ccd_start_xoffset = 0;
sensor.sensor_pixels = 10200; // TODO
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.custom_regs = {
{ 0x08, 0x00 },
{ 0x09, 0x00 },
{ 0x0a, 0x00 },
{ 0x16, 0x27 },
{ 0x17, 0x0c },
{ 0x18, 0x10 },
{ 0x19, 0x2a },
{ 0x1a, 0x00 },
{ 0x1b, 0x00 },
{ 0x1c, 0x20 },
{ 0x1d, 0x84 },
{ 0x52, 0x0a },
{ 0x53, 0x0d },
{ 0x54, 0x0f },
{ 0x55, 0x01 },
{ 0x56, 0x04 },
{ 0x57, 0x07 },
{ 0x58, 0x31 },
{ 0x59, 0x79 },
{ 0x5a, 0xc0 },
{ 0x70, 0x0c },
{ 0x71, 0x0d },
{ 0x72, 0x0e },
{ 0x73, 0x0f },
{ 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
};
sensor.gamma = {1.0, 1.0, 1.0};
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings
{
ResolutionFilter resolutions;
ScanMethod method;
unsigned ccd_size_divisor;
unsigned logical_dpihw_override;
unsigned pixel_count_multiplier;
unsigned exposure_lperiod;
unsigned dpiset_override;
};
CustomSensorSettings custom_settings[] = {
{ { 900 }, ScanMethod::TRANSPARENCY, 1, 900, 8, 0x2f44, 150 },
{ { 1800 }, ScanMethod::TRANSPARENCY, 1, 1800, 4, 0x2f44, 300 },
{ { 3600 }, ScanMethod::TRANSPARENCY, 1, 3600, 2, 0x2f44, 600 },
{ { 7200 }, ScanMethod::TRANSPARENCY, 1, 7200, 1, 0x2f44, 1200 },
{ { 900 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 900, 8, 0x2af8, 150 },
{ { 1800 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 1800, 4, 0x2af8, 300 },
{ { 3600 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 3600, 2, 0x2af8, 600 },
{ { 7200 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 7200, 1, 0x2af8, 1200 },
};
for (const CustomSensorSettings& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
sensor.method = setting.method;
sensor.ccd_size_divisor = setting.ccd_size_divisor;
sensor.logical_dpihw_override = setting.logical_dpihw_override;
sensor.pixel_count_multiplier = setting.pixel_count_multiplier;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.dpiset_override = setting.dpiset_override;
s_sensors->push_back(sensor);
}
}
sensor = Genesys_Sensor();
sensor.sensor_id = SensorId::CCD_IMG101;
sensor.optical_res = 1200;

Wyświetl plik

@ -22,6 +22,16 @@
:usbid "0x07b3" "0x0c04"
:status :basic
:model "OpticFilm 7300"
:interface "USB"
:usbid "0x07b3" "0x0c12"
:status :basic
:model "OpticFilm 7500i"
:interface "USB"
:usbid "0x07b3" "0x0c13"
:status :basic
; -----------------------------------------------------------------------------
:mfg "Medion/Lifetec/Tevion/Cytron"