- prepare for hp3670 buttons
- add specific init code
merge-requests/1/head
Stphane Voltz 2010-01-18 21:23:07 +01:00
rodzic e363557cdb
commit 397f3faece
2 zmienionych plików z 154 dodań i 55 usunięć

Wyświetl plik

@ -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
}; };

Wyświetl plik

@ -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];