Merge branch 'release-1.0.33-backports' into 'release-1.0.33'

[1.0.33] Miscellaneous backports

See merge request sane-project/backends!668
This commit is contained in:
Povilas Kanapickas
2021-12-25 02:23:57 +00:00
24 changed files with 1010 additions and 113 deletions
+872 -97
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -184,6 +184,8 @@ SANE_Word sanei_epson_usb_product_ids[] = {
0x113e, /* XP-452 455 Series */
0x1141, /* L3100 Series */
0x1142, /* L3110 Series */
0x1188, /* L3210 Series */
0x1189, /* L3200 Series */
0 /* last entry - this is used for devices that are specified
in the config file as "usb <vendor> <product>" */
};
+3
View File
@@ -1255,6 +1255,9 @@ const epsonds_profile_map epsonds_models_predefined[] = {
{0x114F, "PID 114F","M3140 Series", 7},
{0x1143, "PID 1143","L3150 Series", 7},
{0x1143, "PID 1143","ET-2710 Series", 7},
{0x118A, "PID 118A","ET-2810 Series", 7},
{0x118A, "PID 118A","L3250 Series", 7},
{0x119B, "PID 119B","XP-2150 Series", 7},
{0x00, "","", 0x00 }
};
+1
View File
@@ -433,6 +433,7 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line,
SANE_Status status;
static ESCL_Device *escl_device = NULL;
if (*line == '#') return SANE_STATUS_GOOD;
if (!strncmp(line, "pdfblacklist", 12)) return SANE_STATUS_GOOD;
if (strncmp(line, "device", 6) == 0) {
char *name_str = NULL;
char *opt_model = NULL;
+2
View File
@@ -554,6 +554,8 @@ escl_capabilities(ESCL_Device *device, char *blacklist, SANE_Status *status)
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)var);
curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, header_callback);
curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)header);
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L);
CURLcode res = curl_easy_perform(curl_handle);
if (res == CURLE_OK)
DBG( 1, "Create NewJob : the scanner header responded : [%s]\n", header->memory);
+2
View File
@@ -277,6 +277,8 @@ wake_up_device:
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, upload->size);
curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, download_callback);
curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)download);
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L);
CURLcode res = curl_easy_perform(curl_handle);
if (res != CURLE_OK) {
DBG( 1, "Create NewJob : the scanner responded incorrectly: %s\n", curl_easy_strerror(res));
+2
View File
@@ -62,6 +62,8 @@ CURL_CALL:
scan_jobs, scanJob, result, scanner_start);
escl_curl_url(curl_handle, device, scan_cmd);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L);
if (curl_easy_perform(curl_handle) == CURLE_OK) {
curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &answer);
i++;
+2
View File
@@ -74,6 +74,8 @@ escl_scan(capabilities_t *scanner, const ESCL_Device *device, char *scanJob, cha
scan_jobs, scanJob, result, scanner_start);
escl_curl_url(curl_handle, device, scan_cmd);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L);
if (scanner->tmp)
fclose(scanner->tmp);
scanner->tmp = tmpfile();
+2
View File
@@ -220,6 +220,8 @@ reload:
escl_curl_url(curl_handle, device, scanner_status);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, memory_callback_s);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)var);
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L);
CURLcode res = curl_easy_perform(curl_handle);
if (res != CURLE_OK) {
DBG( 1, "The scanner didn't respond: %s\n", curl_easy_strerror(res));
+1
View File
@@ -279,6 +279,7 @@ std::ostream& operator<<(std::ostream& out, GpioId id)
case GpioId::CANON_8600F: out << "CANON_8600F"; break;
case GpioId::DP665: out << "DP665"; break;
case GpioId::DP685: out << "DP685"; break;
case GpioId::G4010: out << "G4010"; break;
case GpioId::G4050: out << "G4050"; break;
case GpioId::HP2300: out << "HP2300"; break;
case GpioId::HP2400: out << "HP2400"; break;
+1
View File
@@ -372,6 +372,7 @@ enum class GpioId : unsigned
DP665,
DP685,
G4050,
G4010,
HP2300,
HP2400,
HP3670,
+24 -10
View File
@@ -4992,16 +4992,28 @@ static void init_options(Genesys_Scanner* s)
s->opt[OPT_POWER_SW].cap = SANE_CAP_INACTIVE;
/* extra button */
s->opt[OPT_EXTRA_SW].name = "extra";
s->opt[OPT_EXTRA_SW].title = SANE_I18N ("Extra button");
s->opt[OPT_EXTRA_SW].desc = SANE_I18N ("Extra button");
s->opt[OPT_EXTRA_SW].type = SANE_TYPE_BOOL;
s->opt[OPT_EXTRA_SW].unit = SANE_UNIT_NONE;
if (model->buttons & GENESYS_HAS_EXTRA_SW)
s->opt[OPT_EXTRA_SW].cap =
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
else
s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE;
s->opt[OPT_EXTRA_SW].name = "extra";
s->opt[OPT_EXTRA_SW].title = SANE_I18N("Extra button");
s->opt[OPT_EXTRA_SW].desc = SANE_I18N("Extra button");
s->opt[OPT_EXTRA_SW].type = SANE_TYPE_BOOL;
s->opt[OPT_EXTRA_SW].unit = SANE_UNIT_NONE;
if (model->buttons & GENESYS_HAS_EXTRA_SW) {
s->opt[OPT_EXTRA_SW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
} else {
s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE;
}
// transparency/scan_film button
s->opt[OPT_TRANSP_SW].name = "transparency";
s->opt[OPT_TRANSP_SW].title = SANE_I18N ("Transparency button");
s->opt[OPT_TRANSP_SW].desc = SANE_I18N ("Transparency button");
s->opt[OPT_TRANSP_SW].type = SANE_TYPE_BOOL;
s->opt[OPT_TRANSP_SW].unit = SANE_UNIT_NONE;
if (model->buttons & GENESYS_HAS_TRANSP_SW) {
s->opt[OPT_TRANSP_SW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
} else {
s->opt[OPT_TRANSP_SW].cap = SANE_CAP_INACTIVE;
}
/* calibration needed */
s->opt[OPT_NEED_CALIBRATION_SW].name = "need-calibration";
@@ -5821,6 +5833,7 @@ static void get_option_value(Genesys_Scanner* s, int option, void* val)
case OPT_OCR_SW:
case OPT_POWER_SW:
case OPT_EXTRA_SW:
case OPT_TRANSP_SW:
s->dev->cmd_set->update_hardware_sensors(s);
*reinterpret_cast<SANE_Bool*>(val) = s->buttons[genesys_option_to_button(option)].read();
break;
@@ -6456,6 +6469,7 @@ GenesysButtonName genesys_option_to_button(int option)
case OPT_OCR_SW: return BUTTON_OCR_SW;
case OPT_POWER_SW: return BUTTON_POWER_SW;
case OPT_EXTRA_SW: return BUTTON_EXTRA_SW;
case OPT_TRANSP_SW: return BUTTON_TRANSP_SW;
default: throw std::runtime_error("Unknown option to convert to button index");
}
}
+2
View File
@@ -124,6 +124,7 @@ enum Genesys_Option
OPT_OCR_SW,
OPT_POWER_SW,
OPT_EXTRA_SW,
OPT_TRANSP_SW,
OPT_NEED_CALIBRATION_SW,
OPT_BUTTON_GROUP,
OPT_CALIBRATE,
@@ -144,6 +145,7 @@ enum GenesysButtonName : unsigned {
BUTTON_OCR_SW,
BUTTON_POWER_SW,
BUTTON_EXTRA_SW,
BUTTON_TRANSP_SW,
NUM_BUTTONS
};
+1 -1
View File
@@ -113,7 +113,7 @@ gl124_init_registers (Genesys_Device * dev)
dev->reg.init_reg(0x09, 0x00);
dev->reg.init_reg(0x0a, 0xc0);
dev->reg.init_reg(0x0b, 0x2a);
dev->reg.init_reg(0x0c, 0x12);
dev->reg.init_reg(0x0c, 0x12); // SENSOR_DEF
dev->reg.init_reg(0x11, 0x00);
dev->reg.init_reg(0x12, 0x00);
dev->reg.init_reg(0x13, 0x0f);
+8
View File
@@ -1240,6 +1240,7 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
dev->interface->write_register(0x7e, 0x04);
break;
case GpioId::G4050:
case GpioId::G4010:
dev->interface->write_register(REG_0xA7, 0xfe);
dev->interface->write_register(REG_0xA8, 0x3e);
dev->interface->write_register(REG_0xA9, 0x06);
@@ -1680,6 +1681,7 @@ void CommandSetGl843::update_hardware_sensors(Genesys_Scanner* s) const
*/
uint8_t val = s->dev->interface->read_register(REG_0x6D);
DBG(DBG_io, "%s: read buttons_gpio value=0x%x\n", __func__, (int)val);
switch (s->dev->model->gpio_id)
{
@@ -1692,6 +1694,12 @@ void CommandSetGl843::update_hardware_sensors(Genesys_Scanner* s) const
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
s->buttons[BUTTON_COPY_SW].write((val & 0x08) == 0);
break;
case GpioId::G4010:
s->buttons[BUTTON_FILE_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_COPY_SW].write((val & 0x04) == 0);
s->buttons[BUTTON_TRANSP_SW].write((val & 0x40) == 0);
s->buttons[BUTTON_SCAN_SW].write((val & 0x08) == 0);
break;
case GpioId::CANON_4400F:
case GpioId::CANON_8400F:
default:
+1 -1
View File
@@ -712,7 +712,7 @@ ImagePipelineNodeCalibrate::ImagePipelineNodeCalibrate(ImagePipelineNode& source
const std::vector<std::uint16_t>& bottom,
const std::vector<std::uint16_t>& top,
std::size_t x_start) :
source_{source}
source_(source)
{
std::size_t size = 0;
if (bottom.size() >= x_start && top.size() >= x_start) {
+1
View File
@@ -116,6 +116,7 @@
#define GENESYS_HAS_POWER_SW (1 << 6) /**< scanner has power button */
#define GENESYS_HAS_CALIBRATE (1 << 7) /**< scanner has 'calibrate' software button to start calibration */
#define GENESYS_HAS_EXTRA_SW (1 << 8) /**< scanner has extra function button */
#define GENESYS_HAS_TRANSP_SW (1 << 9) /**< scanner has TRANSPARCY/SCAN_FILM button */
/* USB control message values */
#define REQUEST_TYPE_IN (USB_TYPE_VENDOR | USB_DIR_IN)
+15
View File
@@ -257,6 +257,21 @@ void genesys_init_gpo_tables()
s_gpo->push_back(gpo);
gpo = Genesys_Gpo();
gpo.id = GpioId::G4010;
gpo.regs = {
{ 0x6c, 0x20 },
{ 0x6d, 0x00 },
{ 0x6e, 0xfc },
{ 0x6f, 0x00 },
{ 0xa6, 0x08 },
{ 0xa7, 0x1e },
{ 0xa8, 0x3e },
{ 0xa9, 0x06 },
};
s_gpo->push_back(gpo);
gpo = Genesys_Gpo();
gpo.id = GpioId::HP_N6310;
gpo.regs = {
+2 -2
View File
@@ -342,12 +342,12 @@ void genesys_init_usb_device_tables()
model.is_sheetfed = false;
model.sensor_id = SensorId::CCD_G4050;
model.adc_id = AdcId::G4050;
model.gpio_id = GpioId::G4050;
model.gpio_id = GpioId::G4010;
model.motor_id = MotorId::G4050;
model.flags = ModelFlag::WARMUP |
ModelFlag::DARK_CALIBRATION |
ModelFlag::CUSTOM_GAMMA;
model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW;
model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_TRANSP_SW;
model.search_lines = 100;
s_usb_devices->emplace_back(0x03f0, 0x4505, model);
+28
View File
@@ -2635,6 +2635,13 @@ void genesys_init_sensor_tables()
sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
sensor.channels = { 1 };
sensor.custom_regs.set_value(0x0c, 0x10);
s_sensors->push_back(sensor);
sensor.channels = { 3 };
sensor.custom_regs.set_value(0x0c, 0x12);
s_sensors->push_back(sensor);
}
}
@@ -2805,6 +2812,13 @@ void genesys_init_sensor_tables()
sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
sensor.channels = { 1 };
sensor.custom_regs.set_value(0x0c, 0x10);
s_sensors->push_back(sensor);
sensor.channels = { 3 };
sensor.custom_regs.set_value(0x0c, 0x12);
s_sensors->push_back(sensor);
}
}
@@ -3000,6 +3014,13 @@ void genesys_init_sensor_tables()
sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
sensor.channels = { 1 };
sensor.custom_regs.set_value(0x0c, 0x10);
s_sensors->push_back(sensor);
sensor.channels = { 3 };
sensor.custom_regs.set_value(0x0c, 0x12);
s_sensors->push_back(sensor);
}
}
@@ -3196,6 +3217,13 @@ void genesys_init_sensor_tables()
sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
sensor.channels = { 1 };
sensor.custom_regs.set_value(0x0c, 0x10);
s_sensors->push_back(sensor);
sensor.channels = { 3 };
sensor.custom_regs.set_value(0x0c, 0x12);
s_sensors->push_back(sensor);
}
}
+1 -1
View File
@@ -226,7 +226,7 @@ class BasicStreamStateSaver
{
public:
explicit BasicStreamStateSaver(std::basic_ios<Char, Traits>& stream) :
stream_{stream}
stream_(stream)
{
flags_ = stream_.flags();
width_ = stream_.width();
+10
View File
@@ -1122,6 +1122,16 @@
:usbid "0x04b8" "0x1142"
:status :complete
:model "L3200 Series"
:interface "USB"
:usbid "0x04b8" "0x1189"
:status :complete
:model "L3210 Series"
:interface "USB"
:usbid "0x04b8" "0x1188"
:status :complete
:model "LP-7900CS"
:status :untested
:comment "business all-in-one; scanner is a ES-7000H"
+15
View File
@@ -339,6 +339,21 @@
:usbid "0x04b8" "0x1143"
:status :complete
:model "ET-2810 Series"
:interface "USB"
:usbid "0x04b8" "0x118A"
:status :complete
:model "L3250 Series"
:interface "USB"
:usbid "0x04b8" "0x118A"
:status :complete
:model "XP-2150 Series"
:interface "USB"
:usbid "0x04b8" "0x119B"
:status :complete
:model ""
:interface "USB"
:usbid "0x04b8" "0x00"
+12 -1
View File
@@ -252,8 +252,18 @@ Supports Epson-based Fujitsu USB scanners. See
for details.
.TP
.B epson
Supports Epson SCSI, parallel port and USB flatbed scanners. See
Old driver for Epson SCSI, parallel port and USB flatbed scanners. See
.BR sane\-epson (5)
for details but try
.BR epson2
first.
.TP
.B epson2
Newer driver for Epson SCSI, parallel port, network and USB flatbed
scanners (try this before
.BR epson
which is outdated). See
.BR sane\-epson2 (5)
for details.
.TP
.B escl
@@ -878,6 +888,7 @@ for details).
.BR sane\-dll (5),
.BR sane\-dmc (5),
.BR sane\-epson (5),
.BR sane\-epson2 (5),
.BR sane\-escl (5),
.BR sane\-fujitsu (5),
.BR sane\-genesys (5),