From c04c167ecd33ec264ad5cd58c119173bb917e814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Wed, 10 Oct 2012 06:49:59 +0200 Subject: [PATCH] improve power saving handling and fix Lide 50 parking - don't enable power save during head parking - enable power save at sane_close() - align gl841 parking on other ASICs --- backend/genesys.c | 26 ++++++--- backend/genesys_gl841.c | 116 +++++++++++++++++++++++++--------------- backend/genesys_gl841.h | 7 +++ 3 files changed, 100 insertions(+), 49 deletions(-) diff --git a/backend/genesys.c b/backend/genesys.c index a4795ec30..57be78fb5 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -6888,6 +6888,15 @@ sane_close (SANE_Handle handle) } } } + + /* enable power saving before leaving */ + status = s->dev->model->cmd_set->save_power (s->dev, SANE_TRUE); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "sane_close: failed to enable power saving mode: %s\n", + sane_strstatus (status)); + } /* here is the place to store calibration cache */ write_calibration (s->dev); @@ -7811,14 +7820,17 @@ sane_cancel (SANE_Handle handle) } } - /* enable power saving mode */ - status = s->dev->model->cmd_set->save_power (s->dev, SANE_TRUE); - if (status != SANE_STATUS_GOOD) + /* enable power saving mode unless no parking */ + if(s->dev->parking==SANE_FALSE) { - DBG (DBG_error, - "sane_cancel: failed to enable power saving mode: %s\n", - sane_strstatus (status)); - return; + status = s->dev->model->cmd_set->save_power (s->dev, SANE_TRUE); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "sane_cancel: failed to enable power saving mode: %s\n", + sane_strstatus (status)); + return; + } } DBGCOMPLETED; diff --git a/backend/genesys_gl841.c b/backend/genesys_gl841.c index 0ec3cd4e0..869bc13a3 100644 --- a/backend/genesys_gl841.c +++ b/backend/genesys_gl841.c @@ -1979,7 +1979,7 @@ gl841_init_optical_regs_scan(Genesys_Device * dev, if (dev->model->gpo_type == GPO_CANONLIDE35) { /* gpio part.*/ - r = sanei_genesys_get_address (reg, 0x6c); + r = sanei_genesys_get_address (reg, REG6C); if (half_ccd) r->value &= ~0x80; else @@ -2897,33 +2897,33 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) { /* final state: GPIO8 disabled, GPIO9 enabled, GPIO17 disabled, GPIO18 disabled*/ - sanei_genesys_read_register(dev, 0x6D, &val); - sanei_genesys_write_register(dev, 0x6D, val | 0x80); + sanei_genesys_read_register(dev, REG6D, &val); + sanei_genesys_write_register(dev, REG6D, val | 0x80); usleep(1000); /*enable GPIO9*/ - sanei_genesys_read_register(dev, 0x6C, &val); - sanei_genesys_write_register(dev, 0x6C, val | 0x01); + sanei_genesys_read_register(dev, REG6C, &val); + sanei_genesys_write_register(dev, REG6C, val | 0x01); /*disable GPO17*/ - sanei_genesys_read_register(dev, 0x6B, &val); - sanei_genesys_write_register(dev, 0x6B, val & ~REG6B_GPO17); + sanei_genesys_read_register(dev, REG6B, &val); + sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO17); /*disable GPO18*/ - sanei_genesys_read_register(dev, 0x6B, &val); - sanei_genesys_write_register(dev, 0x6B, val & ~REG6B_GPO18); + sanei_genesys_read_register(dev, REG6B, &val); + sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO18); usleep(1000); - sanei_genesys_read_register(dev, 0x6D, &val); - sanei_genesys_write_register(dev, 0x6D, val & ~0x80); + sanei_genesys_read_register(dev, REG6D, &val); + sanei_genesys_write_register(dev, REG6D, val & ~0x80); } if (dev->model->gpo_type == GPO_DP685) { - sanei_genesys_read_register(dev, 0x6B, &val); - sanei_genesys_write_register(dev, 0x6B, val & ~REG6B_GPO17); + sanei_genesys_read_register(dev, REG6B, &val); + sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO17); dev->reg[reg_0x6b].value &= ~REG6B_GPO17; dev->calib_reg[reg_0x6b].value &= ~REG6B_GPO17; } @@ -2940,34 +2940,34 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) { /* final state: GPIO8 enabled, GPIO9 disabled, GPIO17 enabled, GPIO18 enabled*/ - sanei_genesys_read_register(dev, 0x6D, &val); - sanei_genesys_write_register(dev, 0x6D, val | 0x80); + sanei_genesys_read_register(dev, REG6D, &val); + sanei_genesys_write_register(dev, REG6D, val | 0x80); dev->reg[reg_0x6d].value |= 0x80; dev->calib_reg[reg_0x6d].value |= 0x80; usleep(10000); /*disable GPIO9*/ - sanei_genesys_read_register(dev, 0x6C, &val); - sanei_genesys_write_register(dev, 0x6C, val & ~0x01); + sanei_genesys_read_register(dev, REG6C, &val); + sanei_genesys_write_register(dev, REG6C, val & ~0x01); dev->reg[reg_0x6c].value &= ~0x01; dev->calib_reg[reg_0x6c].value &= ~0x01; /*enable GPIO10*/ - sanei_genesys_read_register(dev, 0x6C, &val); - sanei_genesys_write_register(dev, 0x6C, val | 0x02); + sanei_genesys_read_register(dev, REG6C, &val); + sanei_genesys_write_register(dev, REG6C, val | 0x02); dev->reg[reg_0x6c].value |= 0x02; dev->calib_reg[reg_0x6c].value |= 0x02; /*enable GPO17*/ - sanei_genesys_read_register(dev, 0x6B, &val); - sanei_genesys_write_register(dev, 0x6B, val | REG6B_GPO17); + sanei_genesys_read_register(dev, REG6B, &val); + sanei_genesys_write_register(dev, REG6B, val | REG6B_GPO17); dev->reg[reg_0x6b].value |= REG6B_GPO17; dev->calib_reg[reg_0x6b].value |= REG6B_GPO17; /*enable GPO18*/ - sanei_genesys_read_register(dev, 0x6B, &val); - sanei_genesys_write_register(dev, 0x6B, val | REG6B_GPO18); + sanei_genesys_read_register(dev, REG6B, &val); + sanei_genesys_write_register(dev, REG6B, val | REG6B_GPO18); dev->reg[reg_0x6b].value |= REG6B_GPO18; dev->calib_reg[reg_0x6b].value |= REG6B_GPO18; @@ -2975,8 +2975,8 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) { if (dev->model->gpo_type == GPO_DP665 || dev->model->gpo_type == GPO_DP685) { - sanei_genesys_read_register(dev, 0x6B, &val); - sanei_genesys_write_register(dev, 0x6B, val | REG6B_GPO17); + sanei_genesys_read_register(dev, REG6B, &val); + sanei_genesys_write_register(dev, REG6B, val | REG6B_GPO17); dev->reg[reg_0x6b].value |= REG6B_GPO17; dev->calib_reg[reg_0x6b].value |= REG6B_GPO17; } @@ -3171,7 +3171,7 @@ gl841_get_paper_sensor(Genesys_Device * dev, SANE_Bool * paper_loaded) SANE_Status status; uint8_t val; - status = sanei_genesys_read_register(dev, 0x6d, &val); + status = sanei_genesys_read_register(dev, REG6D, &val); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, @@ -3630,6 +3630,7 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) Genesys_Register_Set local_reg[GENESYS_GL841_MAX_REGS+1]; SANE_Status status; uint8_t val; + int loop = 0; DBG (DBG_proc, "gl841_slow_back_home (wait_until_home = %d)\n", wait_until_home); @@ -3642,7 +3643,32 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) } memset (local_reg, 0, sizeof (local_reg)); - val = 0; + + /* reset gpio pin */ + if (dev->model->gpo_type == GPO_CANONLIDE35) + { + RIE (sanei_genesys_read_register (dev, REG6C, &val)); + val = dev->gpo.value[0]; + RIE (sanei_genesys_write_register (dev, REG6C, val)); + } + gl841_save_power(dev, SANE_FALSE); + + /* first read gives HOME_SENSOR true */ + status = sanei_genesys_get_status (dev, &val); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl847_slow_back_home: failed to read home sensor: %s\n", + sane_strstatus (status)); + return status; + } + if (DBG_LEVEL >= DBG_io) + { + sanei_genesys_print_status (val); + } + usleep (100000); /* sleep 100 ms */ + + /* second is reliable */ status = sanei_genesys_get_status (dev, &val); if (status != SANE_STATUS_GOOD) { @@ -3651,6 +3677,10 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) sane_strstatus (status)); return status; } + if (DBG_LEVEL >= DBG_io) + { + sanei_genesys_print_status (val); + } dev->scanhead_position_in_steps = 0; @@ -3662,13 +3692,18 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) return SANE_STATUS_GOOD; } - status = gl841_stop_action (dev); - if (status != SANE_STATUS_GOOD) + + /* if motor is on, stop current action */ + if (val & REG41_MOTORENB) { - DBG (DBG_error, - "gl841_slow_back_home: failed to stop motor: %s\n", - sane_strstatus (status)); - return SANE_STATUS_IO_ERROR; + status = gl841_stop_action (dev); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl841_slow_back_home: failed to stop motor: %s\n", + sane_strstatus (status)); + return SANE_STATUS_IO_ERROR; + } } memcpy (local_reg, dev->reg, (GENESYS_GL841_MAX_REGS+1) * sizeof (Genesys_Register_Set)); @@ -3702,8 +3737,6 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) if (wait_until_home) { - int loop = 0; - while (loop < 300) /* do not wait longer then 30 seconds */ { status = sanei_genesys_get_status (dev, &val); @@ -3715,10 +3748,9 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) return status; } - if (val & HOMESNR) /* home sensor */ + if (val & REG41_HOMESNR) /* home sensor */ { - DBG (DBG_info, - "gl841_slow_back_home: reached home position\n"); + DBG (DBG_info, "gl841_slow_back_home: reached home position\n"); DBG (DBG_proc, "gl841_slow_back_home: finished\n"); return SANE_STATUS_GOOD; } @@ -4012,7 +4044,7 @@ gl841_init_regs_for_scan (Genesys_Device * dev) dev->settings.yres, dev->settings.lines, dev->settings.pixels, dev->settings.tl_x, dev->settings.tl_y, dev->settings.scan_mode); - gl841_slow_back_home(dev,1); + gl841_slow_back_home(dev,SANE_TRUE); /* channels */ if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */ @@ -5112,7 +5144,7 @@ sanei_gl841_repark_head (Genesys_Device * dev) } /* toggle motor flag, put an huge step number and redo move backward */ - status = gl841_slow_back_home (dev, 1); + status = gl841_slow_back_home (dev, SANE_TRUE); DBG (DBG_proc, "gl841_park_head: completed\n"); return status; } @@ -5363,7 +5395,7 @@ gl841_update_hardware_sensors (Genesys_Scanner * s) if (s->dev->model->gpo_type == GPO_CANONLIDE35) { - RIE(sanei_genesys_read_register(s->dev, 0x6d, &val)); + RIE(sanei_genesys_read_register(s->dev, REG6D, &val)); if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b) s->val[OPT_SCAN_SW].b = (val & 0x01) == 0; @@ -5379,7 +5411,7 @@ gl841_update_hardware_sensors (Genesys_Scanner * s) s->dev->model->gpo_type == GPO_DP665 || s->dev->model->gpo_type == GPO_DP685) { - RIE(sanei_genesys_read_register(s->dev, 0x6d, &val)); + RIE(sanei_genesys_read_register(s->dev, REG6D, &val)); if (s->val[OPT_PAGE_LOADED_SW].b == s->last_val[OPT_PAGE_LOADED_SW].b) s->val[OPT_PAGE_LOADED_SW].b = (val & 0x01) == 0; diff --git a/backend/genesys_gl841.h b/backend/genesys_gl841.h index e60e79d54..e89de2aba 100644 --- a/backend/genesys_gl841.h +++ b/backend/genesys_gl841.h @@ -221,9 +221,16 @@ #define REG6B_GPO18 0x02 #define REG6B_GPO17 0x01 +#define REG6B 0x6b + +#define REG6C 0x6c #define REG6C_GPIOH 0xff #define REG6C_GPIOL 0xff +#define REG6D 0x6d + +#define REG6E 0x6e + #define REG87_LEDADD 0x04 enum