kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'release-1.0.33-backports' into 'release-1.0.33'
[1.0.33] Miscellaneous backports See merge request sane-project/backends!668release-1.1.x
commit
a38919bf7f
Plik diff jest za duży
Load Diff
|
@ -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>" */
|
||||
};
|
||||
|
|
|
@ -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 }
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -372,6 +372,7 @@ enum class GpioId : unsigned
|
|||
DP665,
|
||||
DP685,
|
||||
G4050,
|
||||
G4010,
|
||||
HP2300,
|
||||
HP2400,
|
||||
HP3670,
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
13
doc/sane.man
13
doc/sane.man
|
@ -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),
|
||||
|
|
Ładowanie…
Reference in New Issue