kopia lustrzana https://gitlab.com/sane-project/backends
HP3670 work
- prepare for hp3670 buttons - add specific init codemerge-requests/1/head
rodzic
e363557cdb
commit
397f3faece
|
@ -1078,7 +1078,7 @@ static Genesys_Model hp3670c_model = {
|
||||||
| GENESYS_FLAG_OFFSET_CALIBRATION until fully supported */
|
| GENESYS_FLAG_OFFSET_CALIBRATION until fully supported */
|
||||||
| GENESYS_FLAG_SKIP_WARMUP
|
| GENESYS_FLAG_SKIP_WARMUP
|
||||||
| GENESYS_FLAG_CUSTOM_GAMMA,
|
| GENESYS_FLAG_CUSTOM_GAMMA,
|
||||||
GENESYS_HAS_NO_BUTTONS, /* no buttons supported */
|
GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW,
|
||||||
20,
|
20,
|
||||||
200
|
200
|
||||||
};
|
};
|
||||||
|
|
|
@ -1521,11 +1521,8 @@ gl646_init_regs (Genesys_Device * dev)
|
||||||
dev->reg[reg_0x20].value = 0x10;
|
dev->reg[reg_0x20].value = 0x10;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (dev->model->motor_type != MOTOR_HP3670)
|
dev->reg[reg_0x1f].value = 0x01; /* XXX STEF XXX */
|
||||||
{
|
dev->reg[reg_0x20].value = 0x50; /* XXX STEF XXX */
|
||||||
dev->reg[reg_0x1f].value = 0x01; /* XXX STEF XXX */
|
|
||||||
dev->reg[reg_0x20].value = 0x50; /* XXX STEF XXX */
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->reg[reg_0x21].value = 0x08 /*0x20 */ ; /* table one steps number for forward slope curve of the acc/dec */
|
dev->reg[reg_0x21].value = 0x08 /*0x20 */ ; /* table one steps number for forward slope curve of the acc/dec */
|
||||||
dev->reg[reg_0x22].value = 0x10 /*0x08 */ ; /* steps number of the forward steps for start/stop */
|
dev->reg[reg_0x22].value = 0x10 /*0x08 */ ; /* steps number of the forward steps for start/stop */
|
||||||
|
@ -1727,8 +1724,13 @@ gl646_wm_hp3670 (Genesys_Device * dev, uint8_t set)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AFE_POWER_SAVE:
|
case AFE_POWER_SAVE:
|
||||||
/* we currently do nothing */
|
status = sanei_genesys_fe_write_data (dev, 0x01, 0x03);
|
||||||
DBG (DBG_proc, "gl646_wm_hp3670: AFE_POWERSAVE is currently a no op\n");
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error, "gl646_wm_hp3670: writing reg1 failed: %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default: /* AFE_SET */
|
default: /* AFE_SET */
|
||||||
/* mode setup */
|
/* mode setup */
|
||||||
|
@ -1740,19 +1742,22 @@ gl646_wm_hp3670 (Genesys_Device * dev, uint8_t set)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
/* offset */
|
/* offset */
|
||||||
status = sanei_genesys_fe_write_data (dev, 0x23, dev->frontend.offset[0]);
|
status =
|
||||||
if (status != SANE_STATUS_GOOD)
|
sanei_genesys_fe_write_data (dev, 0x23, dev->frontend.offset[0]);
|
||||||
{
|
if (status != SANE_STATUS_GOOD)
|
||||||
DBG (DBG_error, "gl646_wm_hp3670: writing gain failed: %s\n", sane_strstatus (status));
|
{
|
||||||
return status;
|
DBG (DBG_error, "gl646_wm_hp3670: writing gain failed: %s\n",
|
||||||
}
|
sane_strstatus (status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
/* gain */
|
/* gain */
|
||||||
status = sanei_genesys_fe_write_data (dev, 0x28, dev->frontend.gain[0]);
|
status = sanei_genesys_fe_write_data (dev, 0x28, dev->frontend.gain[0]);
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (DBG_error, "gl646_wm_hp3670: writing gain failed: %s\n", sane_strstatus (status));
|
DBG (DBG_error, "gl646_wm_hp3670: writing gain failed: %s\n",
|
||||||
return status;
|
sane_strstatus (status));
|
||||||
}
|
return status;
|
||||||
|
}
|
||||||
/* mode setup */
|
/* mode setup */
|
||||||
status = sanei_genesys_fe_write_data (dev, 0x01, dev->frontend.reg[1]);
|
status = sanei_genesys_fe_write_data (dev, 0x01, dev->frontend.reg[1]);
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
@ -1761,6 +1766,21 @@ gl646_wm_hp3670 (Genesys_Device * dev, uint8_t set)
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
status = gl646_gpio_output_enable (dev->dn, 0x07);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error, "gl646_wm_hp3670: failed to enable GPIO: %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
/* writes 0 to GPIO */
|
||||||
|
status = gl646_gpio_write (dev->dn, 0);
|
||||||
|
status = gl646_gpio_write (dev->dn, 0);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error, "gl646_wm_hp3670: GPIO write failed ... %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DBG (DBG_proc, "gl646_wm_hp3670: success \n");
|
DBG (DBG_proc, "gl646_wm_hp3670: success \n");
|
||||||
|
@ -4461,48 +4481,89 @@ gl646_init (Genesys_Device * dev)
|
||||||
sanei_genesys_write_register (dev, 0x66, 0x00);
|
sanei_genesys_write_register (dev, 0x66, 0x00);
|
||||||
sanei_genesys_write_register (dev, 0x66, 0x10);
|
sanei_genesys_write_register (dev, 0x66, 0x10);
|
||||||
}
|
}
|
||||||
|
if (dev->model->ccd_type == CCD_HP3670)
|
||||||
|
{
|
||||||
|
sanei_genesys_write_register (dev, 0x68, dev->gpo.enable[0]);
|
||||||
|
sanei_genesys_write_register (dev, 0x69, dev->gpo.enable[1]);
|
||||||
|
|
||||||
|
/* enable GPIO */
|
||||||
|
status = gl646_gpio_output_enable (dev->dn, 0x07);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error, "gl646_init: GPO enable failed ... %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
}
|
||||||
|
val = 0;
|
||||||
|
|
||||||
|
/* writes 0 to GPIO */
|
||||||
|
status = gl646_gpio_write (dev->dn, 0);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error, "gl646_init: GPO write failed ... %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
}
|
||||||
|
|
||||||
|
sanei_genesys_write_register (dev, 0x66, 0x20);
|
||||||
|
sanei_genesys_write_register (dev, 0x66, 0x00);
|
||||||
|
sanei_genesys_write_register (dev, 0x66, 0x20);
|
||||||
|
}
|
||||||
|
|
||||||
/* MD6471/G2410 and XP200 read/write data from an undocumented memory area which
|
/* MD6471/G2410 and XP200 read/write data from an undocumented memory area which
|
||||||
* is after the second slope table */
|
* is after the second slope table */
|
||||||
switch (dev->sensor.optical_res)
|
if (dev->model->gpo_type != GPO_HP3670)
|
||||||
{
|
{
|
||||||
case 600:
|
switch (dev->sensor.optical_res)
|
||||||
addr = 0x08200;
|
{
|
||||||
break;
|
case 600:
|
||||||
case 1200:
|
addr = 0x08200;
|
||||||
addr = 0x10200;
|
break;
|
||||||
break;
|
case 1200:
|
||||||
case 2400:
|
addr = 0x10200;
|
||||||
addr = 0x1fa00;
|
break;
|
||||||
break;
|
case 2400:
|
||||||
}
|
addr = 0x1fa00;
|
||||||
status = sanei_genesys_set_buffer_address (dev, addr);
|
break;
|
||||||
if (status != SANE_STATUS_GOOD)
|
}
|
||||||
{
|
status = sanei_genesys_set_buffer_address (dev, addr);
|
||||||
DBG (DBG_error, "gl646_init: failed to set up control address\n");
|
if (status != SANE_STATUS_GOOD)
|
||||||
return SANE_STATUS_INVAL;
|
{
|
||||||
}
|
DBG (DBG_error, "gl646_init: failed to set up control address\n");
|
||||||
sanei_usb_set_timeout (2 * 1000);
|
return SANE_STATUS_INVAL;
|
||||||
len = 6;
|
}
|
||||||
status = gl646_bulk_read_data (dev, 0x45, dev->control, len);
|
sanei_usb_set_timeout (2 * 1000);
|
||||||
/* for some reason, read fails here for MD6471, HP2300 and XP200
|
len = 6;
|
||||||
* one time out of 2 scanimage launches
|
|
||||||
*/
|
|
||||||
if (status != SANE_STATUS_GOOD)
|
|
||||||
{
|
|
||||||
DBG (DBG_warn, "gl646_init: failed to read control\n");
|
|
||||||
status = gl646_bulk_read_data (dev, 0x45, dev->control, len);
|
status = gl646_bulk_read_data (dev, 0x45, dev->control, len);
|
||||||
|
/* for some reason, read fails here for MD6471, HP2300 and XP200
|
||||||
|
* one time out of 2 scanimage launches
|
||||||
|
*/
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_warn, "gl646_init: failed to read control\n");
|
||||||
|
status = gl646_bulk_read_data (dev, 0x45, dev->control, len);
|
||||||
|
}
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_warn, "gl646_init: failed to read control\n");
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DBG (DBG_info,
|
||||||
|
"gl646_init: control read=0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
||||||
|
dev->control[0], dev->control[1], dev->control[2],
|
||||||
|
dev->control[3], dev->control[4], dev->control[5]);
|
||||||
|
}
|
||||||
|
sanei_usb_set_timeout (30 * 1000);
|
||||||
}
|
}
|
||||||
if (status != SANE_STATUS_GOOD)
|
else
|
||||||
{
|
{
|
||||||
DBG (DBG_warn, "gl646_init: failed to read control\n");
|
dev->control[0] = 0x00;
|
||||||
return SANE_STATUS_INVAL;
|
dev->control[1] = 0x00;
|
||||||
|
dev->control[2] = 0x01;
|
||||||
|
dev->control[3] = 0x00;
|
||||||
|
dev->control[4] = 0x00;
|
||||||
|
dev->control[5] = 0x00;
|
||||||
}
|
}
|
||||||
DBG (DBG_info,
|
|
||||||
"gl646_init: control read=0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
|
||||||
dev->control[0], dev->control[1], dev->control[2],
|
|
||||||
dev->control[3], dev->control[4], dev->control[5]);
|
|
||||||
sanei_usb_set_timeout (30 * 1000);
|
|
||||||
|
|
||||||
/* ensure head is correctly parked, and check lock */
|
/* ensure head is correctly parked, and check lock */
|
||||||
if (dev->model->is_sheetfed == SANE_FALSE)
|
if (dev->model->is_sheetfed == SANE_FALSE)
|
||||||
|
@ -4777,7 +4838,19 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
uint8_t value;
|
uint8_t value;
|
||||||
SANE_Status status;
|
SANE_Status status;
|
||||||
|
|
||||||
/* do what is needed to get a new set of events, but try to not lose
|
if (dev->model->gpo_type == GPO_HP3670)
|
||||||
|
{
|
||||||
|
status = gl646_gpio_write (dev->dn, 0x03);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error,
|
||||||
|
"gl646_update_hardware_sensors: failed to write GPIO %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do what is needed to get a new set of events, but try to not loose
|
||||||
any of them.
|
any of them.
|
||||||
*/
|
*/
|
||||||
status = gl646_gpio_read (dev->dn, &value);
|
status = gl646_gpio_read (dev->dn, &value);
|
||||||
|
@ -4790,6 +4863,18 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
}
|
}
|
||||||
DBG (DBG_io, "gl646_update_hardware_sensors: GPIO=0x%02x\n", value);
|
DBG (DBG_io, "gl646_update_hardware_sensors: GPIO=0x%02x\n", value);
|
||||||
|
|
||||||
|
if (dev->model->gpo_type == GPO_HP3670)
|
||||||
|
{
|
||||||
|
status = gl646_gpio_write (dev->dn, 0x01);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (DBG_error,
|
||||||
|
"gl646_update_hardware_sensors: failed to write GPIO %s\n",
|
||||||
|
sane_strstatus (status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* scan button */
|
/* scan button */
|
||||||
if ((dev->model->buttons & GENESYS_HAS_SCAN_SW)
|
if ((dev->model->buttons & GENESYS_HAS_SCAN_SW)
|
||||||
&& session->val[OPT_SCAN_SW].b == session->last_val[OPT_SCAN_SW].b)
|
&& session->val[OPT_SCAN_SW].b == session->last_val[OPT_SCAN_SW].b)
|
||||||
|
@ -4805,6 +4890,9 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
case GPO_HP2300:
|
case GPO_HP2300:
|
||||||
session->val[OPT_SCAN_SW].b = (value == 0x6c);
|
session->val[OPT_SCAN_SW].b = (value == 0x6c);
|
||||||
break;
|
break;
|
||||||
|
case GPO_HP3670:
|
||||||
|
session->val[OPT_SCAN_SW].b = ((value & 0x01) != 0);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -4819,6 +4907,9 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
case GPO_5345:
|
case GPO_5345:
|
||||||
session->val[OPT_EMAIL_SW].b = (value == 0x12);
|
session->val[OPT_EMAIL_SW].b = (value == 0x12);
|
||||||
break;
|
break;
|
||||||
|
case GPO_HP3670:
|
||||||
|
session->val[OPT_EMAIL_SW].b = ((value & 0x02) != 0);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -4836,6 +4927,9 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
case GPO_HP2300:
|
case GPO_HP2300:
|
||||||
session->val[OPT_COPY_SW].b = (value == 0x5c);
|
session->val[OPT_COPY_SW].b = (value == 0x5c);
|
||||||
break;
|
break;
|
||||||
|
case GPO_HP3670:
|
||||||
|
session->val[OPT_COPY_SW].b = ((value & 0x02) != 0);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -4928,8 +5022,13 @@ write_control (Genesys_Device * dev, int resolution)
|
||||||
control[2] = dev->control[4];
|
control[2] = dev->control[4];
|
||||||
control[3] = dev->control[5];
|
control[3] = dev->control[5];
|
||||||
break;
|
break;
|
||||||
case MOTOR_5345:
|
|
||||||
case MOTOR_HP3670:
|
case MOTOR_HP3670:
|
||||||
|
control[0] = 1;
|
||||||
|
control[1] = 0;
|
||||||
|
control[2] = 0;
|
||||||
|
control[3] = 0;
|
||||||
|
break;
|
||||||
|
case MOTOR_5345:
|
||||||
default:
|
default:
|
||||||
control[0] = dev->control[2];
|
control[0] = dev->control[2];
|
||||||
control[1] = dev->control[3];
|
control[1] = dev->control[3];
|
||||||
|
|
Ładowanie…
Reference in New Issue