Lines Matching refs:dev
6 Copyright (C) 2004-2013 Stéphane Voltz <stef.dev@free.fr>
42 static int gl841_exposure_time(Genesys_Device *dev, const Genesys_Sensor& sensor,
53 gl841_init_registers (Genesys_Device * dev)
57 dev->reg.init_reg(0x01, 0x20);
58 if (dev->model->is_cis) {
59 dev->reg.find_reg(0x01).value |= REG_0x01_CISSET;
61 dev->reg.find_reg(0x01).value &= ~REG_0x01_CISSET;
63 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
64 dev->reg.init_reg(0x01, 0x82);
67 dev->reg.init_reg(0x02, 0x38);
68 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
69 dev->reg.init_reg(0x02, 0x10);
72 dev->reg.init_reg(0x03, 0x5f);
73 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
74 dev->reg.init_reg(0x03, 0x50);
77 dev->reg.init_reg(0x04, 0x10);
78 if (dev->model->model_id == ModelId::PLUSTEK_OPTICPRO_3600) {
79 dev->reg.init_reg(0x04, 0x22);
80 } else if (dev->model->model_id == ModelId::CANON_LIDE_80) {
81 dev->reg.init_reg(0x04, 0x02);
84 const auto& sensor = sanei_genesys_find_sensor_any(dev);
86 dev->reg.init_reg(0x05, 0x00); // disable gamma, 24 clocks/pixel
88 sanei_genesys_set_dpihw(dev->reg, sensor.register_dpihw);
90 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
91 dev->reg.init_reg(0x05, 0x4c);
94 dev->reg.init_reg(0x06, 0x18);
95 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
96 dev->reg.init_reg(0x06, 0x38);
98 if (dev->model->model_id == ModelId::VISIONEER_STROBE_XP300 ||
99 dev->model->model_id == ModelId::SYSCAN_DOCKETPORT_485 ||
100 dev->model->model_id == ModelId::DCT_DOCKETPORT_487 ||
101 dev->model->model_id == ModelId::SYSCAN_DOCKETPORT_685 ||
102 dev->model->model_id == ModelId::PLUSTEK_OPTICPRO_3600)
104 dev->reg.init_reg(0x06, 0xb8);
107 dev->reg.init_reg(0x07, 0x00);
108 dev->reg.init_reg(0x08, 0x00);
110 dev->reg.init_reg(0x09, 0x10);
111 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
112 dev->reg.init_reg(0x09, 0x11);
114 if (dev->model->model_id == ModelId::VISIONEER_STROBE_XP300 ||
115 dev->model->model_id == ModelId::SYSCAN_DOCKETPORT_485 ||
116 dev->model->model_id == ModelId::DCT_DOCKETPORT_487 ||
117 dev->model->model_id == ModelId::SYSCAN_DOCKETPORT_685 ||
118 dev->model->model_id == ModelId::PLUSTEK_OPTICPRO_3600)
120 dev->reg.init_reg(0x09, 0x00);
122 dev->reg.init_reg(0x0a, 0x00);
125 dev->reg.init_reg(0x10, 0x00); // SENSOR_DEF
126 dev->reg.init_reg(0x11, 0x00); // SENSOR_DEF
127 dev->reg.init_reg(0x12, 0x00); // SENSOR_DEF
128 dev->reg.init_reg(0x13, 0x00); // SENSOR_DEF
129 dev->reg.init_reg(0x14, 0x00); // SENSOR_DEF
130 dev->reg.init_reg(0x15, 0x00); // SENSOR_DEF
131 dev->reg.init_reg(0x16, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
132 dev->reg.init_reg(0x17, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
133 dev->reg.init_reg(0x18, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
134 dev->reg.init_reg(0x19, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
135 dev->reg.init_reg(0x1a, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
136 dev->reg.init_reg(0x1b, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
137 dev->reg.init_reg(0x1c, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
138 dev->reg.init_reg(0x1d, 0x01); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
139 dev->reg.init_reg(0x1e, 0xf0);
140 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
141 dev->reg.init_reg(0x1e, 0x10);
143 dev->reg.init_reg(0x1f, 0x01);
144 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
145 dev->reg.init_reg(0x1f, 0x04);
147 dev->reg.init_reg(0x20, 0x20);
148 dev->reg.init_reg(0x21, 0x01);
149 dev->reg.init_reg(0x22, 0x01);
150 dev->reg.init_reg(0x23, 0x01);
151 dev->reg.init_reg(0x24, 0x01);
152 dev->reg.init_reg(0x25, 0x00);
153 dev->reg.init_reg(0x26, 0x00);
154 dev->reg.init_reg(0x27, 0x00);
155 dev->reg.init_reg(0x29, 0xff);
157 dev->reg.init_reg(0x2c, 0x02); // DPISET: overwritten during scanner setup
158 dev->reg.init_reg(0x2d, 0x58); // DPISET: overwritten during scanner setup
159 dev->reg.init_reg(0x2e, 0x80);
160 dev->reg.init_reg(0x2f, 0x80);
162 dev->reg.init_reg(0x30, 0x00); // STRPIXEL: overwritten during scanner setup
163 dev->reg.init_reg(0x31, 0x00); // STRPIXEL: overwritten during scanner setup
164 dev->reg.init_reg(0x32, 0x00); // ENDPIXEL: overwritten during scanner setup
165 dev->reg.init_reg(0x33, 0x00); // ENDPIXEL: overwritten during scanner setup
166 dev->reg.init_reg(0x34, 0x00); // DUMMY: overwritten during scanner setup
167 dev->reg.init_reg(0x35, 0x00); // MAXWD: overwritten during scanner setup
168 dev->reg.init_reg(0x36, 0x00); // MAXWD: overwritten during scanner setup
169 dev->reg.init_reg(0x37, 0x00); // MAXWD: overwritten during scanner setup
170 dev->reg.init_reg(0x38, 0x4f); // LPERIOD: overwritten during scanner setup
171 dev->reg.init_reg(0x39, 0xc1); // LPERIOD: overwritten during scanner setup
173 dev->reg.init_reg(0x3d, 0x00);
174 dev->reg.init_reg(0x3e, 0x00);
175 dev->reg.init_reg(0x3f, 0x00);
177 dev->reg.init_reg(0x52, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
178 dev->reg.init_reg(0x53, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
179 dev->reg.init_reg(0x54, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
180 dev->reg.init_reg(0x55, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
181 dev->reg.init_reg(0x56, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
182 dev->reg.init_reg(0x57, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
183 dev->reg.init_reg(0x58, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
184 dev->reg.init_reg(0x59, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
185 dev->reg.init_reg(0x5a, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
187 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
188 dev->reg.init_reg(0x5d, 0x20);
189 dev->reg.init_reg(0x5e, 0x41);
190 dev->reg.init_reg(0x5f, 0x40);
191 dev->reg.init_reg(0x60, 0x00);
192 dev->reg.init_reg(0x61, 0x00);
193 dev->reg.init_reg(0x62, 0x00);
194 dev->reg.init_reg(0x63, 0x00);
195 dev->reg.init_reg(0x64, 0x00);
196 dev->reg.init_reg(0x65, 0x00);
197 dev->reg.init_reg(0x66, 0x00);
198 dev->reg.init_reg(0x67, 0x40);
199 dev->reg.init_reg(0x68, 0x40);
200 dev->reg.init_reg(0x69, 0x20);
201 dev->reg.init_reg(0x6a, 0x20);
202 dev->reg.init_reg(0x6c, 0x00);
203 dev->reg.init_reg(0x6d, 0x00);
204 dev->reg.init_reg(0x6e, 0x00);
205 dev->reg.init_reg(0x6f, 0x00);
208 dev->reg.init_reg(addr, 0);
210 dev->reg.init_reg(0x5e, 0x02);
211 if (dev->model->model_id == ModelId::CANON_LIDE_60) {
212 dev->reg.init_reg(0x66, 0xff);
216 dev->reg.init_reg(0x70, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
217 dev->reg.init_reg(0x71, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
218 dev->reg.init_reg(0x72, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
219 dev->reg.init_reg(0x73, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below
221 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
222 dev->reg.init_reg(0x74, 0x00);
223 dev->reg.init_reg(0x75, 0x01);
224 dev->reg.init_reg(0x76, 0xff);
225 dev->reg.init_reg(0x77, 0x00);
226 dev->reg.init_reg(0x78, 0x0f);
227 dev->reg.init_reg(0x79, 0xf0);
228 dev->reg.init_reg(0x7a, 0xf0);
229 dev->reg.init_reg(0x7b, 0x00);
230 dev->reg.init_reg(0x7c, 0x1e);
231 dev->reg.init_reg(0x7d, 0x11);
232 dev->reg.init_reg(0x7e, 0x00);
233 dev->reg.init_reg(0x7f, 0x50);
234 dev->reg.init_reg(0x80, 0x00);
235 dev->reg.init_reg(0x81, 0x00);
236 dev->reg.init_reg(0x82, 0x0f);
237 dev->reg.init_reg(0x83, 0x00);
238 dev->reg.init_reg(0x84, 0x0e);
239 dev->reg.init_reg(0x85, 0x00);
240 dev->reg.init_reg(0x86, 0x0d);
241 dev->reg.init_reg(0x87, 0x02);
242 dev->reg.init_reg(0x88, 0x00);
243 dev->reg.init_reg(0x89, 0x00);
246 dev->reg.init_reg(addr, 0);
250 scanner_setup_sensor(*dev, sensor, dev->reg);
253 for (const auto& reg : dev->gpo.regs) {
254 dev->reg.set8(reg.address, reg.value);
257 if (dev->model->gpio_id == GpioId::CANON_LIDE_35) {
258 dev->reg.find_reg(0x6b).value |= REG_0x6B_GPO18;
259 dev->reg.find_reg(0x6b).value &= ~REG_0x6B_GPO17;
262 if (dev->model->gpio_id == GpioId::XP300) {
263 dev->reg.find_reg(0x6b).value |= REG_0x6B_GPO17;
266 if (dev->model->gpio_id == GpioId::DP685) {
268 dev->reg.find_reg(0x6b).value |= REG_0x6B_GPO17 | REG_0x6B_GPO18;
271 if (dev->model->model_id == ModelId::CANON_LIDE_80) {
273 dev->interface->write_register(REG_0x6B, 0x0c);
274 dev->interface->write_register(0x06, 0x10);
275 dev->interface->write_register(REG_0x6E, 0x6d);
276 dev->interface->write_register(REG_0x6F, 0x80);
277 dev->interface->write_register(REG_0x6B, 0x0e);
278 dev->interface->write_register(REG_0x6C, 0x00);
279 dev->interface->write_register(REG_0x6D, 0x8f);
280 dev->interface->write_register(REG_0x6B, 0x0e);
281 dev->interface->write_register(REG_0x6B, 0x0e);
282 dev->interface->write_register(REG_0x6B, 0x0a);
283 dev->interface->write_register(REG_0x6B, 0x02);
284 dev->interface->write_register(REG_0x6B, 0x06);
286 dev->interface->write_0x8c(0x10, 0x94);
287 dev->interface->write_register(0x09, 0x10);
291 static void gl841_set_lide80_fe(Genesys_Device* dev, std::uint8_t set)
296 dev->frontend = dev->frontend_initial;
300 dev->interface->write_fe_register(0x00, dev->frontend.regs.get_value(0x00));
301 dev->interface->write_fe_register(0x03, dev->frontend.regs.get_value(0x01));
302 dev->interface->write_fe_register(0x06, dev->frontend.regs.get_value(0x02));
307 dev->interface->write_fe_register(0x00, dev->frontend.regs.get_value(0x00));
308 dev->interface->write_fe_register(0x06, dev->frontend.regs.get_value(0x20));
309 dev->interface->write_fe_register(0x03, dev->frontend.regs.get_value(0x28));
314 static void gl841_set_ad_fe(Genesys_Device* dev, std::uint8_t set)
319 if (dev->model->adc_id==AdcId::CANON_LIDE_80) {
320 gl841_set_lide80_fe(dev, set);
325 dev->frontend = dev->frontend_initial;
328 dev->interface->write_fe_register(0x00, dev->frontend.regs.get_value(0x00));
330 dev->interface->write_fe_register(0x01, dev->frontend.regs.get_value(0x01));
333 dev->interface->write_fe_register(0x02 + i, 0x00);
339 dev->interface->write_fe_register(0x00, dev->frontend.regs.get_value(0x00));
341 dev->interface->write_fe_register(0x01, dev->frontend.regs.get_value(0x01));
344 dev->interface->write_fe_register(0x02, dev->frontend.get_gain(0));
347 dev->interface->write_fe_register(0x03, dev->frontend.get_gain(1));
350 dev->interface->write_fe_register(0x04, dev->frontend.get_gain(2));
353 dev->interface->write_fe_register(0x05, dev->frontend.get_offset(0));
356 dev->interface->write_fe_register(0x06, dev->frontend.get_offset(1));
359 dev->interface->write_fe_register(0x07, dev->frontend.get_offset(2));
364 void CommandSetGl841::set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor,
373 std::uint8_t frontend_type = dev->reg.find_reg(0x04).value & REG_0x04_FESET;
376 gl841_set_ad_fe(dev, set);
385 dev->frontend = dev->frontend_initial;
388 dev->interface->write_fe_register(0x04, 0x80);
394 dev->interface->write_fe_register(0x01, 0x02);
399 /*if (dev->model->ccd_type!=SensorId::CCD_HP2300 && dev->model->ccd_type!=SensorId::CCD_HP2400) */
401 dev->interface->write_fe_register(0x00, dev->frontend.regs.get_value(0x00));
402 dev->interface->write_fe_register(0x02, dev->frontend.regs.get_value(0x02));
405 dev->interface->write_fe_register(0x01, dev->frontend.regs.get_value(0x01));
406 dev->interface->write_fe_register(0x03, dev->frontend.regs.get_value(0x03));
407 dev->interface->write_fe_register(0x06, dev->frontend.reg2[0]);
408 dev->interface->write_fe_register(0x08, dev->frontend.reg2[1]);
409 dev->interface->write_fe_register(0x09, dev->frontend.reg2[2]);
412 dev->interface->write_fe_register(0x24 + i, dev->frontend.regs.get_value(0x24 + i));
413 dev->interface->write_fe_register(0x28 + i, dev->frontend.get_gain(i));
414 dev->interface->write_fe_register(0x20 + i, dev->frontend.get_offset(i));
450 * @param dev device to set up motor
453 static void gl841_write_freq(Genesys_Device* dev, unsigned int ydpi)
520 if(dev->model->motor_id == MotorId::CANON_LIDE_80) {
538 dev->interface->write_register(0x66, 0x00);
539 dev->interface->write_gamma(0x28, 0xc000, table, 128);
540 dev->interface->write_register(0x5b, 0x00);
541 dev->interface->write_register(0x5c, 0x00);
545 static void gl841_init_motor_regs_feed(Genesys_Device* dev, const Genesys_Sensor& sensor,
558 scanner_send_slope_table(dev, sensor, 0, table);
559 scanner_send_slope_table(dev, sensor, 1, table);
560 scanner_send_slope_table(dev, sensor, 2, table);
561 scanner_send_slope_table(dev, sensor, 3, table);
562 scanner_send_slope_table(dev, sensor, 4, table);
565 gl841_write_freq(dev, dev->motor.base_ydpi / 4);
569 session.params.yres = dev->motor.base_ydpi;
570 session.params.scan_method = dev->model->default_method;
572 const auto* fast_profile = get_motor_profile_ptr(dev->motor.fast_profiles, 0, session);
574 fast_profile = get_motor_profile_ptr(dev->motor.profiles, 0, session);
576 auto fast_table = create_slope_table_fastest(dev->model->asic_type, step_multiplier,
611 scanner_send_slope_table(dev, sensor, 3, fast_table.table);
622 static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
651 const auto* fast_profile = get_motor_profile_ptr(dev->motor.fast_profiles, 0, session);
656 auto slow_table = create_slope_table(dev->model->asic_type, dev->motor, scan_yres,
664 auto fast_table = create_slope_table_fastest(dev->model->asic_type, step_multiplier,
711 scanner_send_slope_table(dev, sensor, 0, slow_table.table);
712 scanner_send_slope_table(dev, sensor, 1, slow_table.table);
713 scanner_send_slope_table(dev, sensor, 2, slow_table.table);
714 scanner_send_slope_table(dev, sensor, 3, fast_table.table);
715 scanner_send_slope_table(dev, sensor, 4, fast_table.table);
717 gl841_write_freq(dev, scan_yres);
766 static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
772 dev->cmd_set->set_fe(dev, sensor, AFE_SET);
775 if (dev->model->gpio_id == GpioId::CANON_LIDE_35) {
782 if (dev->model->gpio_id == GpioId::CANON_LIDE_80) {
795 has_flag(dev->model->flags, ModelFlag::DISABLE_SHADING_CALIBRATION)) {
805 sanei_genesys_set_lamp_power(dev, sensor, *reg,
846 if (dev->model->sensor_id == SensorId::CCD_PLUSTEK_OPTICPRO_3600) {
866 scanner_setup_sensor(*dev, sensor, dev->reg);
879 static int gl841_exposure_time(Genesys_Device *dev, const Genesys_Sensor& sensor,
885 if (dev->model->is_cis) {
886 unsigned dummy = dev->reg.find_reg(0x19).value;
891 return sanei_genesys_exposure_time2(dev, profile, slope_dpi,
896 void CommandSetGl841::init_regs_for_scan_session(Genesys_Device* dev, const Genesys_Sensor& sensor,
939 if (dev->model->is_cis) {
947 const auto& motor_profile = get_motor_profile(dev->motor.profiles, 0, session);
949 exposure_time = gl841_exposure_time(dev, sensor, motor_profile, slope_dpi,
952 gl841_init_optical_regs_scan(dev, sensor, reg, exposure_time, session);
957 move -= (dev->head_pos(ScanHeadId::PRIMARY) * session.params.yres) / dev->motor.base_ydpi;
969 gl841_init_motor_regs_scan(dev, sensor, session, reg, motor_profile, exposure_time,
974 setup_image_pipeline(*dev, session);
976 dev->read_active = true;
978 dev->session = session;
980 dev->total_bytes_read = 0;
981 dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
983 dev->total_bytes_to_read /= 3;
986 DBG(DBG_info, "%s: total bytes to send = %zu\n", __func__, dev->total_bytes_to_read);
989 ScanSession CommandSetGl841::calculate_scan_session(const Genesys_Device* dev,
1012 float move = dev->model->y_offset;
1013 move += dev->settings.tl_y;
1015 int move_dpi = dev->motor.base_ydpi;
1018 float start = dev->model->x_offset;
1019 start += dev->settings.tl_x;
1020 start = static_cast<float>((start * dev->settings.xres) / MM_PER_INCH);
1023 session.params.xres = dev->settings.xres;
1024 session.params.yres = dev->settings.yres;
1027 session.params.pixels = dev->settings.pixels;
1028 session.params.requested_pixels = dev->settings.requested_pixels;
1029 session.params.lines = dev->settings.lines;
1030 session.params.depth = dev->settings.depth;
1031 session.params.channels = dev->settings.get_channels();
1032 session.params.scan_method = dev->settings.scan_method;
1033 session.params.scan_mode = dev->settings.scan_mode;
1034 session.params.color_filter = dev->settings.color_filter;
1035 session.params.contrast_adjustment = dev->settings.contrast;
1036 session.params.brightness_adjustment = dev->settings.brightness;
1038 compute_session(dev, session, sensor);
1044 void CommandSetGl841::save_power(Genesys_Device* dev, bool enable) const
1048 const auto& sensor = sanei_genesys_find_sensor_any(dev);
1052 if (dev->model->gpio_id == GpioId::CANON_LIDE_35)
1059 std::uint8_t val = dev->interface->read_register(REG_0x6D);
1060 dev->interface->write_register(REG_0x6D, val | 0x80);
1062 dev->interface->sleep_ms(1);
1065 val = dev->interface->read_register(REG_0x6C);
1066 dev->interface->write_register(REG_0x6C, val | 0x01);
1069 val = dev->interface->read_register(REG_0x6B);
1070 dev->interface->write_register(REG_0x6B, val & ~REG_0x6B_GPO17);
1073 val = dev->interface->read_register(REG_0x6B);
1074 dev->interface->write_register(REG_0x6B, val & ~REG_0x6B_GPO18);
1076 dev->interface->sleep_ms(1);
1078 val = dev->interface->read_register(REG_0x6D);
1079 dev->interface->write_register(REG_0x6D, val & ~0x80);
1082 if (dev->model->gpio_id == GpioId::DP685)
1084 std::uint8_t val = dev->interface->read_register(REG_0x6B);
1085 dev->interface->write_register(REG_0x6B, val & ~REG_0x6B_GPO17);
1086 dev->reg.find_reg(0x6b).value &= ~REG_0x6B_GPO17;
1087 dev->initial_regs.find_reg(0x6b).value &= ~REG_0x6B_GPO17;
1090 set_fe(dev, sensor, AFE_POWER_SAVE);
1095 if (dev->model->gpio_id == GpioId::CANON_LIDE_35)
1102 std::uint8_t val = dev->interface->read_register(REG_0x6D);
1103 dev->interface->write_register(REG_0x6D, val | 0x80);
1105 dev->interface->sleep_ms(10);
1108 val = dev->interface->read_register(REG_0x6C);
1109 dev->interface->write_register(REG_0x6C, val & ~0x01);
1112 val = dev->interface->read_register(REG_0x6C);
1113 dev->interface->write_register(REG_0x6C, val | 0x02);
1116 val = dev->interface->read_register(REG_0x6B);
1117 dev->interface->write_register(REG_0x6B, val | REG_0x6B_GPO17);
1118 dev->reg.find_reg(0x6b).value |= REG_0x6B_GPO17;
1119 dev->initial_regs.find_reg(0x6b).value |= REG_0x6B_GPO17;
1122 val = dev->interface->read_register(REG_0x6B);
1123 dev->interface->write_register(REG_0x6B, val | REG_0x6B_GPO18);
1124 dev->reg.find_reg(0x6b).value |= REG_0x6B_GPO18;
1125 dev->initial_regs.find_reg(0x6b).value |= REG_0x6B_GPO18;
1128 if (dev->model->gpio_id == GpioId::DP665
1129 || dev->model->gpio_id == GpioId::DP685)
1131 std::uint8_t val = dev->interface->read_register(REG_0x6B);
1132 dev->interface->write_register(REG_0x6B, val | REG_0x6B_GPO17);
1133 dev->reg.find_reg(0x6b).value |= REG_0x6B_GPO17;
1134 dev->initial_regs.find_reg(0x6b).value |= REG_0x6B_GPO17;
1140 void CommandSetGl841::set_powersaving(Genesys_Device* dev, int delay /* in minutes */) const
1147 local_reg.init_reg(0x01, dev->reg.get8(0x01)); /* disable fastmode */
1148 local_reg.init_reg(0x03, dev->reg.get8(0x03)); /* Lamp power control */
1149 local_reg.init_reg(0x05, dev->reg.get8(0x05)); /*& ~REG_0x05_BASESEL*/; /* 24 clocks/pixel */
1155 local_reg.init_reg(0x1c, dev->reg.get8(0x05) & ~REG_0x1C_TGTIME);
1201 dev->interface->write_registers(local_reg);
1204 static bool gl841_get_paper_sensor(Genesys_Device* dev)
1208 std::uint8_t val = dev->interface->read_register(REG_0x6D);
1213 void CommandSetGl841::eject_document(Genesys_Device* dev) const
1221 if (!dev->model->is_sheetfed) {
1230 scanner_read_status(*dev);
1231 scanner_stop_action(*dev);
1233 local_reg = dev->reg;
1235 regs_set_optical_off(dev->model->asic_type, local_reg);
1237 const auto& sensor = sanei_genesys_find_sensor_any(dev);
1238 gl841_init_motor_regs_feed(dev, sensor, &local_reg, 65536, ScanFlag::NONE);
1240 dev->interface->write_registers(local_reg);
1243 scanner_start_action(*dev, true);
1245 catch_all_exceptions(__func__, [&]() { scanner_stop_action(*dev); });
1249 dev->interface->write_registers(dev->reg);
1255 dev->interface->test_checkpoint("eject_document");
1256 scanner_stop_action(*dev);
1260 if (gl841_get_paper_sensor(dev)) {
1263 dev->document = true;
1264 dev->set_head_pos_zero(ScanHeadId::PRIMARY);
1270 if (!gl841_get_paper_sensor(dev)) {
1274 dev->interface->sleep_ms(100);
1282 catch_all_exceptions(__func__, [&](){ scanner_stop_action(*dev); });
1288 feed_mm = dev->model->eject_feed;
1289 if (dev->document) {
1290 feed_mm += dev->model->post_scan;
1293 sanei_genesys_read_feed_steps(dev, &init_steps);
1301 sanei_genesys_read_feed_steps(dev, &steps);
1305 if (steps > init_steps + (feed_mm * dev->motor.base_ydpi) / MM_PER_INCH)
1310 dev->interface->sleep_ms(100);
1314 scanner_stop_action(*dev);
1316 dev->document = false;
1319 void CommandSetGl841::update_home_sensor_gpio(Genesys_Device& dev) const
1321 if (dev.model->gpio_id == GpioId::CANON_LIDE_35) {
1322 dev.interface->read_register(REG_0x6C);
1323 dev.interface->write_register(REG_0x6C, dev.gpo.regs.get_value(0x6c));
1325 if (dev.model->gpio_id == GpioId::CANON_LIDE_80) {
1326 dev.interface->read_register(REG_0x6B);
1327 dev.interface->write_register(REG_0x6B, REG_0x6B_GPO18 | REG_0x6B_GPO17);
1331 void CommandSetGl841::load_document(Genesys_Device* dev) const
1337 if (gl841_get_paper_sensor(dev)) {
1341 dev->document = true;
1344 dev->interface->sleep_ms(1000);
1347 dev->interface->sleep_ms(100);
1363 void CommandSetGl841::detect_document_end(Genesys_Device* dev) const
1366 bool paper_loaded = gl841_get_paper_sensor(dev);
1369 if (dev->document && !paper_loaded) {
1371 dev->document = false;
1379 sanei_genesys_read_scancnt(dev, &scanned_lines);
1381 dev->total_bytes_to_read = dev->total_bytes_read;
1385 if (dev->settings.scan_mode == ScanColorMode::COLOR_SINGLE_PASS && dev->model->is_cis) {
1389 std::size_t output_lines = dev->session.output_line_count;
1392 (dev->model->post_scan / MM_PER_INCH) * dev->settings.yres);
1396 std::size_t remaining_lines = dev->get_pipeline_source().remaining_bytes() /
1397 dev->session.output_line_bytes_raw;
1409 dev->get_pipeline_source().set_remaining_bytes(remaining_lines *
1410 dev->session.output_line_bytes_raw);
1411 dev->total_bytes_to_read -= skip_lines * dev->session.output_line_bytes_requested;
1419 void CommandSetGl841::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
1428 if (dev->model->gpio_id == GpioId::CANON_LIDE_80) {
1429 val = dev->interface->read_register(REG_0x6B);
1431 dev->interface->write_register(REG_0x6B, val);
1434 if (dev->model->model_id == ModelId::CANON_LIDE_50 ||
1435 dev->model->model_id == ModelId::CANON_LIDE_60)
1437 if (dev->session.params.yres >= 1200) {
1438 dev->interface->write_register(REG_0x6C, 0x82);
1440 dev->interface->write_register(REG_0x6C, 0x02);
1442 if (dev->session.params.yres >= 600) {
1443 dev->interface->write_register(REG_0x6B, 0x01);
1445 dev->interface->write_register(REG_0x6B, 0x03);
1449 if (dev->model->sensor_id != SensorId::CCD_PLUSTEK_OPTICPRO_3600) {
1459 // scanner_start_action(dev, start_motor)
1467 dev->interface->write_registers(local_reg);
1469 dev->advance_head_pos_by_session(ScanHeadId::PRIMARY);
1474 void CommandSetGl841::end_scan(Genesys_Device* dev, Genesys_Register_Set __sane_unused__* reg,
1479 if (!dev->model->is_sheetfed) {
1480 scanner_stop_action(*dev);
1485 void CommandSetGl841::move_back_home(Genesys_Device* dev, bool wait_until_home) const
1487 scanner_move_back_home(*dev, wait_until_home);
1491 void CommandSetGl841::init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
1499 const auto& calib_sensor = sanei_genesys_find_sensor(dev, resolution, channels,
1500 dev->settings.scan_method);
1503 static_cast<unsigned>(dev->model->y_size_calib_dark_white_mm * resolution / MM_PER_INCH);
1505 static_cast<unsigned>(dev->model->y_offset_calib_dark_white_mm * dev->motor.base_ydpi / MM_PER_INCH);
1511 session.params.pixels = dev->model->x_size_calib_mm * resolution / MM_PER_INCH;
1515 session.params.scan_method = dev->settings.scan_method;
1517 session.params.color_filter = dev->settings.color_filter;
1518 session.params.contrast_adjustment = dev->settings.contrast;
1519 session.params.brightness_adjustment = dev->settings.brightness;
1522 compute_session(dev, session, calib_sensor);
1524 init_regs_for_scan_session(dev, calib_sensor, ®s, session);
1526 dev->calib_session = session;
1530 void CommandSetGl841::send_gamma_table(Genesys_Device* dev, const Genesys_Sensor& sensor) const
1537 auto gamma = generate_gamma_buffer(dev, sensor, 16, 65535, size);
1539 dev->interface->write_gamma(0x28, 0x0000, gamma.data(), size * 2 * 3);
1548 SensorExposure CommandSetGl841::led_calibration(Genesys_Device* dev, const Genesys_Sensor& sensor,
1551 return scanner_led_calibration(*dev, sensor, regs);
1561 static void ad_fe_offset_calibration(Genesys_Device* dev, const Genesys_Sensor& sensor,
1572 if (dev->model->sensor_id == SensorId::CCD_PLUSTEK_OPTICPRO_3600) {
1578 const auto& calib_sensor = sanei_genesys_find_sensor(dev, resolution, 3,
1579 dev->settings.scan_method);
1581 unsigned num_pixels = dev->model->x_size_calib_mm * resolution / MM_PER_INCH;
1584 session.params.yres = dev->settings.yres;
1591 session.params.scan_method = dev->settings.scan_method;
1593 session.params.color_filter = dev->settings.color_filter;
1594 session.params.contrast_adjustment = dev->settings.contrast;
1595 session.params.brightness_adjustment = dev->settings.brightness;
1601 compute_session(dev, session, calib_sensor);
1603 dev->cmd_set->init_regs_for_scan_session(dev, calib_sensor, ®s, session);
1609 dev->frontend.set_gain(0, 0);
1610 dev->frontend.set_gain(1, 0);
1611 dev->frontend.set_gain(2, 0);
1620 dev->frontend.set_offset(0, (top + bottom) / 2);
1621 dev->frontend.set_offset(1, (top + bottom) / 2);
1622 dev->frontend.set_offset(2, (top + bottom) / 2);
1626 dev->interface->write_registers(regs);
1627 dev->cmd_set->set_fe(dev, calib_sensor, AFE_SET);
1628 dev->cmd_set->begin_scan(dev, calib_sensor, ®s, true);
1631 dev->interface->test_checkpoint("ad_fe_offset_calibration");
1632 scanner_stop_action(*dev);
1636 sanei_genesys_read_data_from_scanner(dev, line.data(), total_size);
1637 scanner_stop_action(*dev);
1667 dev->frontend.get_offset(0),
1668 dev->frontend.get_offset(1),
1669 dev->frontend.get_offset(2));
1677 void CommandSetGl841::offset_calibration(Genesys_Device* dev, const Genesys_Sensor& sensor,
1688 if ((dev->reg.find_reg(0x04).value & REG_0x04_FESET) == 0x02) {
1689 ad_fe_offset_calibration(dev, sensor, regs);
1698 const auto& calib_sensor = sanei_genesys_find_sensor(dev, resolution, channels,
1699 dev->settings.scan_method);
1703 session.params.yres = dev->settings.yres;
1706 session.params.pixels = dev->model->x_size_calib_mm * resolution / MM_PER_INCH;
1710 session.params.scan_method = dev->settings.scan_method;
1712 session.params.color_filter = dev->settings.color_filter;
1713 session.params.contrast_adjustment = dev->settings.contrast;
1714 session.params.brightness_adjustment = dev->settings.brightness;
1721 compute_session(dev, session, calib_sensor);
1723 init_regs_for_scan_session(dev, calib_sensor, ®s, session);
1744 dev->frontend.set_gain(0, 0);
1745 dev->frontend.set_gain(1, 0);
1746 dev->frontend.set_gain(2, 0);
1760 dev->interface->write_registers(regs);
1764 dev->frontend.set_offset(j, off[j]);
1767 dev->cmd_set->set_fe(dev, calib_sensor, AFE_SET);
1770 dev->cmd_set->begin_scan(dev, calib_sensor, ®s, true);
1773 dev->interface->test_checkpoint("offset_calibration");
1777 first_line = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes);
1803 if (dev->model->sensor_id == SensorId::CCD_DP685) {
1809 if (dev->model->is_cis)
1816 if (dev->model->is_cis)
1826 if (dev->model->is_cis) {
1831 scanner_stop_action(*dev);
1864 dev->frontend.set_offset(j, off[j]);
1867 dev->cmd_set->set_fe(dev, calib_sensor, AFE_SET);
1870 dev->interface->write_registers(regs);
1871 dev->cmd_set->begin_scan(dev, calib_sensor, ®s, true);
1872 second_line = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes);
1899 if (dev->model->is_cis)
1906 if (dev->model->is_cis)
1916 if (dev->model->is_cis) {
1921 scanner_stop_action(*dev);
1986 dev->frontend.set_offset(ch, off[ch]);
1991 if (dev->model->is_cis) {
1996 dev->frontend.set_offset(0, off[0]);
1997 dev->frontend.set_offset(1, off[0]);
1998 dev->frontend.set_offset(2, off[0]);
2003 dev->frontend.set_offset(1, dev->frontend.get_offset(0));
2004 dev->frontend.set_offset(2, dev->frontend.get_offset(0));
2018 void CommandSetGl841::coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sensor& sensor,
2021 scanner_coarse_gain_calibration(*dev, sensor, regs, dpi);
2026 void CommandSetGl841::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
2031 *local_reg = dev->reg;
2034 dev->frontend.set_gain(0, 0);
2035 dev->frontend.set_gain(1, 0);
2036 dev->frontend.set_gain(2, 0);
2037 dev->frontend.set_offset(0, 0x80);
2038 dev->frontend.set_offset(1, 0x80);
2039 dev->frontend.set_offset(2, 0x80);
2046 if (dev->settings.scan_method == ScanMethod::TRANSPARENCY ||
2047 dev->settings.scan_method == ScanMethod::TRANSPARENCY_INFRARED)
2054 session.params.yres = dev->settings.yres;
2059 session.params.depth = dev->model->bpp_color_values.front();
2061 session.params.scan_method = dev->settings.scan_method;
2063 session.params.color_filter = dev->settings.color_filter;
2068 compute_session(dev, session, sensor);
2070 init_regs_for_scan_session(dev, sensor, local_reg, session);
2077 void CommandSetGl841::init(Genesys_Device* dev) const
2081 sanei_genesys_asic_init(dev);
2091 if (s->dev->model->gpio_id == GpioId::CANON_LIDE_35
2092 || s->dev->model->gpio_id == GpioId::CANON_LIDE_80)
2094 val = s->dev->interface->read_register(REG_0x6D);
2101 if (s->dev->model->gpio_id == GpioId::XP300 ||
2102 s->dev->model->gpio_id == GpioId::DP665 ||
2103 s->dev->model->gpio_id == GpioId::DP685)
2105 val = s->dev->interface->read_register(REG_0x6D);
2116 void CommandSetGl841::send_shading_data(Genesys_Device* dev, const Genesys_Sensor& sensor,
2123 if ((dev->reg.find_reg(0x01).value & REG_0x01_SHDAREA) == 0) {
2126 dev->interface->write_buffer(0x3c, 0x0000, data, size);
2134 pixels = dev->session.pixel_endx - dev->session.pixel_startx;
2139 unsigned beginpixel = dev->session.params.startx * dev->session.optical_resolution /
2140 dev->session.params.xres;
2144 dev->interface->record_key_value("shading_offset", std::to_string(beginpixel));
2145 dev->interface->record_key_value("shading_pixels", std::to_string(pixels));
2146 dev->interface->record_key_value("shading_length", std::to_string(length));
2177 dev->interface->write_buffer(0x3c, 0x5400 * i, buffer.data(), pixels);
2181 bool CommandSetGl841::needs_home_before_init_regs_for_scan(Genesys_Device* dev) const
2183 (void) dev;
2187 void CommandSetGl841::wait_for_motor_stop(Genesys_Device* dev) const
2189 (void) dev;
2192 void CommandSetGl841::asic_boot(Genesys_Device *dev, bool cold) const
2196 dev->interface->write_register(0x0e, 0x01);
2197 dev->interface->write_register(0x0e, 0x00);
2200 gl841_init_registers(dev);
2203 dev->interface->write_registers(dev->reg);
2206 // dev->reg.remove_reg(0x0b);
2208 if (dev->model->model_id == ModelId::CANON_LIDE_60) {
2209 dev->interface->write_0x8c(0x10, 0xa4);
2213 const auto& sensor = sanei_genesys_find_sensor_any(dev);
2214 dev->cmd_set->set_fe(dev, sensor, AFE_INIT);