kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Implement support for LiDE 90
rodzic
ea15fb29b7
commit
b0c42c0f5f
|
@ -39,6 +39,9 @@ usb 0x04a9 0x221c
|
||||||
# Canon LiDE 80
|
# Canon LiDE 80
|
||||||
usb 0x04a9 0x2214
|
usb 0x04a9 0x2214
|
||||||
|
|
||||||
|
# Canon LiDE 90
|
||||||
|
usb 0x04a9 0x1900
|
||||||
|
|
||||||
# Canon 4400F
|
# Canon 4400F
|
||||||
usb 0x04a9 0x2228
|
usb 0x04a9 0x2228
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,7 @@ std::ostream& operator<<(std::ostream& out, ModelId id)
|
||||||
case ModelId::CANON_LIDE_50: out << "CANON_LIDE_50"; break;
|
case ModelId::CANON_LIDE_50: out << "CANON_LIDE_50"; break;
|
||||||
case ModelId::CANON_LIDE_60: out << "CANON_LIDE_60"; break;
|
case ModelId::CANON_LIDE_60: out << "CANON_LIDE_60"; break;
|
||||||
case ModelId::CANON_LIDE_80: out << "CANON_LIDE_80"; break;
|
case ModelId::CANON_LIDE_80: out << "CANON_LIDE_80"; break;
|
||||||
|
case ModelId::CANON_LIDE_90: out << "CANON_LIDE_90"; break;
|
||||||
case ModelId::CANON_LIDE_100: out << "CANON_LIDE_100"; break;
|
case ModelId::CANON_LIDE_100: out << "CANON_LIDE_100"; break;
|
||||||
case ModelId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
case ModelId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
||||||
case ModelId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
case ModelId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
||||||
|
@ -205,6 +206,7 @@ std::ostream& operator<<(std::ostream& out, SensorId id)
|
||||||
case SensorId::CIS_CANON_LIDE_35: out << "CIS_CANON_LIDE_35"; break;
|
case SensorId::CIS_CANON_LIDE_35: out << "CIS_CANON_LIDE_35"; break;
|
||||||
case SensorId::CIS_CANON_LIDE_60: out << "CIS_CANON_LIDE_60"; break;
|
case SensorId::CIS_CANON_LIDE_60: out << "CIS_CANON_LIDE_60"; break;
|
||||||
case SensorId::CIS_CANON_LIDE_80: out << "CIS_CANON_LIDE_80"; break;
|
case SensorId::CIS_CANON_LIDE_80: out << "CIS_CANON_LIDE_80"; break;
|
||||||
|
case SensorId::CIS_CANON_LIDE_90: out << "CIS_CANON_LIDE_90"; break;
|
||||||
case SensorId::CIS_CANON_LIDE_100: out << "CIS_CANON_LIDE_100"; break;
|
case SensorId::CIS_CANON_LIDE_100: out << "CIS_CANON_LIDE_100"; break;
|
||||||
case SensorId::CIS_CANON_LIDE_110: out << "CIS_CANON_LIDE_110"; break;
|
case SensorId::CIS_CANON_LIDE_110: out << "CIS_CANON_LIDE_110"; break;
|
||||||
case SensorId::CIS_CANON_LIDE_120: out << "CIS_CANON_LIDE_120"; break;
|
case SensorId::CIS_CANON_LIDE_120: out << "CIS_CANON_LIDE_120"; break;
|
||||||
|
@ -226,6 +228,7 @@ std::ostream& operator<<(std::ostream& out, AdcId id)
|
||||||
case AdcId::AD_XP200: out << "AD_XP200"; break;
|
case AdcId::AD_XP200: out << "AD_XP200"; break;
|
||||||
case AdcId::CANON_LIDE_35: out << "CANON_LIDE_35"; break;
|
case AdcId::CANON_LIDE_35: out << "CANON_LIDE_35"; break;
|
||||||
case AdcId::CANON_LIDE_80: out << "CANON_LIDE_80"; break;
|
case AdcId::CANON_LIDE_80: out << "CANON_LIDE_80"; break;
|
||||||
|
case AdcId::CANON_LIDE_90: out << "CANON_LIDE_90"; break;
|
||||||
case AdcId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
case AdcId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
||||||
case AdcId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
case AdcId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
||||||
case AdcId::CANON_LIDE_200: out << "CANON_LIDE_200"; break;
|
case AdcId::CANON_LIDE_200: out << "CANON_LIDE_200"; break;
|
||||||
|
@ -266,6 +269,7 @@ std::ostream& operator<<(std::ostream& out, GpioId id)
|
||||||
case GpioId::UNKNOWN: out << "UNKNOWN"; break;
|
case GpioId::UNKNOWN: out << "UNKNOWN"; break;
|
||||||
case GpioId::CANON_LIDE_35: out << "CANON_LIDE_35"; break;
|
case GpioId::CANON_LIDE_35: out << "CANON_LIDE_35"; break;
|
||||||
case GpioId::CANON_LIDE_80: out << "CANON_LIDE_80"; break;
|
case GpioId::CANON_LIDE_80: out << "CANON_LIDE_80"; break;
|
||||||
|
case GpioId::CANON_LIDE_90: out << "CANON_LIDE_90"; break;
|
||||||
case GpioId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
case GpioId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
||||||
case GpioId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
case GpioId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
||||||
case GpioId::CANON_LIDE_200: out << "CANON_LIDE_200"; break;
|
case GpioId::CANON_LIDE_200: out << "CANON_LIDE_200"; break;
|
||||||
|
@ -306,6 +310,7 @@ std::ostream& operator<<(std::ostream& out, MotorId id)
|
||||||
{
|
{
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case MotorId::UNKNOWN: out << "UNKNOWN"; break;
|
case MotorId::UNKNOWN: out << "UNKNOWN"; break;
|
||||||
|
case MotorId::CANON_LIDE_90: out << "CANON_LIDE_90"; break;
|
||||||
case MotorId::CANON_LIDE_100: out << "CANON_LIDE_100"; break;
|
case MotorId::CANON_LIDE_100: out << "CANON_LIDE_100"; break;
|
||||||
case MotorId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
case MotorId::CANON_LIDE_110: out << "CANON_LIDE_110"; break;
|
||||||
case MotorId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
case MotorId::CANON_LIDE_120: out << "CANON_LIDE_120"; break;
|
||||||
|
|
|
@ -182,6 +182,7 @@ enum class ModelId : unsigned
|
||||||
CANON_LIDE_50,
|
CANON_LIDE_50,
|
||||||
CANON_LIDE_60,
|
CANON_LIDE_60,
|
||||||
CANON_LIDE_80,
|
CANON_LIDE_80,
|
||||||
|
CANON_LIDE_90,
|
||||||
CANON_LIDE_100,
|
CANON_LIDE_100,
|
||||||
CANON_LIDE_110,
|
CANON_LIDE_110,
|
||||||
CANON_LIDE_120,
|
CANON_LIDE_120,
|
||||||
|
@ -276,6 +277,7 @@ enum class SensorId : unsigned
|
||||||
CIS_CANON_LIDE_35,
|
CIS_CANON_LIDE_35,
|
||||||
CIS_CANON_LIDE_60,
|
CIS_CANON_LIDE_60,
|
||||||
CIS_CANON_LIDE_80,
|
CIS_CANON_LIDE_80,
|
||||||
|
CIS_CANON_LIDE_90,
|
||||||
CIS_CANON_LIDE_100,
|
CIS_CANON_LIDE_100,
|
||||||
CIS_CANON_LIDE_110,
|
CIS_CANON_LIDE_110,
|
||||||
CIS_CANON_LIDE_120,
|
CIS_CANON_LIDE_120,
|
||||||
|
@ -308,6 +310,7 @@ enum class AdcId : unsigned
|
||||||
AD_XP200,
|
AD_XP200,
|
||||||
CANON_LIDE_35,
|
CANON_LIDE_35,
|
||||||
CANON_LIDE_80,
|
CANON_LIDE_80,
|
||||||
|
CANON_LIDE_90,
|
||||||
CANON_LIDE_110,
|
CANON_LIDE_110,
|
||||||
CANON_LIDE_120,
|
CANON_LIDE_120,
|
||||||
CANON_LIDE_200,
|
CANON_LIDE_200,
|
||||||
|
@ -358,6 +361,7 @@ enum class GpioId : unsigned
|
||||||
UNKNOWN = 0,
|
UNKNOWN = 0,
|
||||||
CANON_LIDE_35,
|
CANON_LIDE_35,
|
||||||
CANON_LIDE_80,
|
CANON_LIDE_80,
|
||||||
|
CANON_LIDE_90,
|
||||||
CANON_LIDE_110,
|
CANON_LIDE_110,
|
||||||
CANON_LIDE_120,
|
CANON_LIDE_120,
|
||||||
CANON_LIDE_200,
|
CANON_LIDE_200,
|
||||||
|
@ -406,6 +410,7 @@ enum class MotorId : unsigned
|
||||||
CANON_LIDE_60,
|
CANON_LIDE_60,
|
||||||
CANON_LIDE_700,
|
CANON_LIDE_700,
|
||||||
CANON_LIDE_80,
|
CANON_LIDE_80,
|
||||||
|
CANON_LIDE_90,
|
||||||
CANON_4400F,
|
CANON_4400F,
|
||||||
CANON_5600F,
|
CANON_5600F,
|
||||||
CANON_8400F,
|
CANON_8400F,
|
||||||
|
|
|
@ -544,9 +544,10 @@ void scanner_send_slope_table(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
table.push_back(slope_table[i] & 0xff);
|
table.push_back(slope_table[i] & 0xff);
|
||||||
table.push_back(slope_table[i] >> 8);
|
table.push_back(slope_table[i] >> 8);
|
||||||
}
|
}
|
||||||
if (dev->model->asic_type == AsicType::GL841) {
|
if (dev->model->asic_type == AsicType::GL841 ||
|
||||||
// BUG: some motor setup setting is wrong on GL841 scanners, as they need full motor table
|
dev->model->model_id == ModelId::CANON_LIDE_90)
|
||||||
// to be written even though this is not observed in the official scanners.
|
{
|
||||||
|
// BUG: do this on all gl842 scanners
|
||||||
auto max_table_size = get_slope_table_max_size(dev->model->asic_type);
|
auto max_table_size = get_slope_table_max_size(dev->model->asic_type);
|
||||||
table.reserve(max_table_size * 2);
|
table.reserve(max_table_size * 2);
|
||||||
while (table.size() < max_table_size * 2) {
|
while (table.size() < max_table_size * 2) {
|
||||||
|
@ -3540,6 +3541,7 @@ static void genesys_send_shading_coefficient(Genesys_Device* dev, const Genesys_
|
||||||
break;
|
break;
|
||||||
case SensorId::CIS_CANON_LIDE_35:
|
case SensorId::CIS_CANON_LIDE_35:
|
||||||
case SensorId::CIS_CANON_LIDE_60:
|
case SensorId::CIS_CANON_LIDE_60:
|
||||||
|
case SensorId::CIS_CANON_LIDE_90:
|
||||||
compute_averaged_planar (dev, sensor,
|
compute_averaged_planar (dev, sensor,
|
||||||
shading_data.data(),
|
shading_data.data(),
|
||||||
pixels_per_line,
|
pixels_per_line,
|
||||||
|
|
|
@ -46,6 +46,7 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
|
|
||||||
dev.reg.clear();
|
dev.reg.clear();
|
||||||
|
|
||||||
|
if (dev.model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev.reg.init_reg(0x01, 0x00);
|
dev.reg.init_reg(0x01, 0x00);
|
||||||
dev.reg.init_reg(0x02, 0x78);
|
dev.reg.init_reg(0x02, 0x78);
|
||||||
dev.reg.init_reg(0x03, 0xbf);
|
dev.reg.init_reg(0x03, 0xbf);
|
||||||
|
@ -59,6 +60,21 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
dev.reg.init_reg(0x09, 0x00);
|
dev.reg.init_reg(0x09, 0x00);
|
||||||
dev.reg.init_reg(0x0a, 0x00);
|
dev.reg.init_reg(0x0a, 0x00);
|
||||||
dev.reg.init_reg(0x0d, 0x01);
|
dev.reg.init_reg(0x0d, 0x01);
|
||||||
|
} else if (dev.model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
dev.reg.init_reg(0x01, 0x82);
|
||||||
|
dev.reg.init_reg(0x02, 0x10);
|
||||||
|
dev.reg.init_reg(0x03, 0x60);
|
||||||
|
dev.reg.init_reg(0x04, 0x10);
|
||||||
|
dev.reg.init_reg(0x05, 0x8c);
|
||||||
|
|
||||||
|
dev.reg.init_reg(0x06, 0x18);
|
||||||
|
|
||||||
|
//dev.reg.init_reg(0x07, 0x00);
|
||||||
|
dev.reg.init_reg(0x08, 0x00);
|
||||||
|
dev.reg.init_reg(0x09, 0x21);
|
||||||
|
dev.reg.init_reg(0x0a, 0x00);
|
||||||
|
dev.reg.init_reg(0x0d, 0x00);
|
||||||
|
}
|
||||||
|
|
||||||
dev.reg.init_reg(0x10, 0x00); // exposure, overwritten in scanner_setup_sensor() below
|
dev.reg.init_reg(0x10, 0x00); // exposure, overwritten in scanner_setup_sensor() below
|
||||||
dev.reg.init_reg(0x11, 0x00); // exposure, overwritten in scanner_setup_sensor() below
|
dev.reg.init_reg(0x11, 0x00); // exposure, overwritten in scanner_setup_sensor() below
|
||||||
|
@ -77,14 +93,20 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
|
|
||||||
// Various CCD clock settings.
|
// Various CCD clock settings.
|
||||||
dev.reg.init_reg(0x1a, 0x00); // SENSOR_DEF
|
dev.reg.init_reg(0x1a, 0x00); // SENSOR_DEF
|
||||||
|
if (dev.model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev.reg.init_reg(0x1b, 0x00); // SENSOR_DEF
|
dev.reg.init_reg(0x1b, 0x00); // SENSOR_DEF
|
||||||
|
}
|
||||||
dev.reg.init_reg(0x1c, 0x00); // SENSOR_DEF
|
dev.reg.init_reg(0x1c, 0x00); // SENSOR_DEF
|
||||||
dev.reg.init_reg(0x1d, 0x00); // SENSOR_DEF
|
dev.reg.init_reg(0x1d, 0x00); // SENSOR_DEF
|
||||||
dev.reg.init_reg(0x1e, 0x10); // WDTIME, LINESEL: setup during sensor and motor setup
|
dev.reg.init_reg(0x1e, 0x10); // WDTIME, LINESEL: setup during sensor and motor setup
|
||||||
|
|
||||||
|
if (dev.model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev.reg.init_reg(0x1f, 0x01);
|
dev.reg.init_reg(0x1f, 0x01);
|
||||||
|
|
||||||
dev.reg.init_reg(0x20, 0x27); // BUFSEL: buffer full condition
|
dev.reg.init_reg(0x20, 0x27); // BUFSEL: buffer full condition
|
||||||
|
} else if (dev.model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
dev.reg.init_reg(0x1f, 0x02);
|
||||||
|
dev.reg.init_reg(0x20, 0x02); // BUFSEL: buffer full condition
|
||||||
|
}
|
||||||
|
|
||||||
dev.reg.init_reg(0x21, 0x10); // STEPNO: set during motor setup
|
dev.reg.init_reg(0x21, 0x10); // STEPNO: set during motor setup
|
||||||
dev.reg.init_reg(0x22, 0x10); // FWDSTEP: set during motor setup
|
dev.reg.init_reg(0x22, 0x10); // FWDSTEP: set during motor setup
|
||||||
|
@ -127,7 +149,12 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
dev.reg.init_reg(0x59, 0x00); // SENSOR_DEF
|
dev.reg.init_reg(0x59, 0x00); // SENSOR_DEF
|
||||||
dev.reg.init_reg(0x5a, 0x00); // SENSOR_DEF
|
dev.reg.init_reg(0x5a, 0x00); // SENSOR_DEF
|
||||||
|
|
||||||
|
if (dev.model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev.reg.init_reg(0x5e, 0x01); // DECSEL, STOPTIM
|
dev.reg.init_reg(0x5e, 0x01); // DECSEL, STOPTIM
|
||||||
|
} else if (dev.model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
dev.reg.init_reg(0x5e, 0x41); // DECSEL, STOPTIM
|
||||||
|
dev.reg.init_reg(0x5d, 0x20);
|
||||||
|
}
|
||||||
dev.reg.init_reg(0x5f, 0x10); // FMOVDEC: set during motor setup
|
dev.reg.init_reg(0x5f, 0x10); // FMOVDEC: set during motor setup
|
||||||
|
|
||||||
dev.reg.init_reg(0x60, 0x00); // Z1MOD: overwritten during motor setup
|
dev.reg.init_reg(0x60, 0x00); // Z1MOD: overwritten during motor setup
|
||||||
|
@ -137,8 +164,14 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
dev.reg.init_reg(0x64, 0x00); // Z2MOD: overwritten during motor setup
|
dev.reg.init_reg(0x64, 0x00); // Z2MOD: overwritten during motor setup
|
||||||
dev.reg.init_reg(0x65, 0x00); // Z2MOD: overwritten during motor setup
|
dev.reg.init_reg(0x65, 0x00); // Z2MOD: overwritten during motor setup
|
||||||
|
|
||||||
dev.reg.init_reg(0x67, 0x7f); // STEPSEL, MTRPWM: overwritten during motor setup
|
if (dev.model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev.reg.init_reg(0x68, 0x7f); // FSTPSEL, FASTPWM: overwritten during motor setup
|
dev.reg.init_reg(0x67, 0x7f); // STEPSEL, MTRPWM: partially overwritten during motor setup
|
||||||
|
dev.reg.init_reg(0x68, 0x7f); // FSTPSEL, FASTPWM: partially overwritten during motor setup
|
||||||
|
} else if (dev.model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
dev.reg.init_reg(0x66, 0x00); // PHFREQ
|
||||||
|
dev.reg.init_reg(0x67, 0x40); // STEPSEL, MTRPWM: partially overwritten during motor setup
|
||||||
|
dev.reg.init_reg(0x68, 0x40); // FSTPSEL, FASTPWM: partially overwritten during motor setup
|
||||||
|
}
|
||||||
dev.reg.init_reg(0x69, 0x10); // FSHDEC: overwritten during motor setup
|
dev.reg.init_reg(0x69, 0x10); // FSHDEC: overwritten during motor setup
|
||||||
dev.reg.init_reg(0x6a, 0x10); // FMOVNO: overwritten during motor setup
|
dev.reg.init_reg(0x6a, 0x10); // FMOVNO: overwritten during motor setup
|
||||||
|
|
||||||
|
@ -167,6 +200,7 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
// moving in various situations.
|
// moving in various situations.
|
||||||
dev.reg.init_reg(0x80, 0x00); // MOTOR_PROFILE
|
dev.reg.init_reg(0x80, 0x00); // MOTOR_PROFILE
|
||||||
|
|
||||||
|
if (dev.model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev.reg.init_reg(0x81, 0x00);
|
dev.reg.init_reg(0x81, 0x00);
|
||||||
dev.reg.init_reg(0x82, 0x00);
|
dev.reg.init_reg(0x82, 0x00);
|
||||||
dev.reg.init_reg(0x83, 0x00);
|
dev.reg.init_reg(0x83, 0x00);
|
||||||
|
@ -174,6 +208,18 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
dev.reg.init_reg(0x85, 0x00);
|
dev.reg.init_reg(0x85, 0x00);
|
||||||
dev.reg.init_reg(0x86, 0x00);
|
dev.reg.init_reg(0x86, 0x00);
|
||||||
dev.reg.init_reg(0x87, 0x00);
|
dev.reg.init_reg(0x87, 0x00);
|
||||||
|
} else if (dev.model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
dev.reg.init_reg(0x7e, 0x00);
|
||||||
|
dev.reg.init_reg(0x81, 0x00);
|
||||||
|
dev.reg.init_reg(0x82, 0x0f);
|
||||||
|
dev.reg.init_reg(0x83, 0x00);
|
||||||
|
dev.reg.init_reg(0x84, 0x0e);
|
||||||
|
dev.reg.init_reg(0x85, 0x00);
|
||||||
|
dev.reg.init_reg(0x86, 0x0d);
|
||||||
|
dev.reg.init_reg(0x87, 0x00);
|
||||||
|
dev.reg.init_reg(0x88, 0x00);
|
||||||
|
dev.reg.init_reg(0x89, 0x00);
|
||||||
|
}
|
||||||
|
|
||||||
const auto& sensor = sanei_genesys_find_sensor_any(&dev);
|
const auto& sensor = sanei_genesys_find_sensor_any(&dev);
|
||||||
sanei_genesys_set_dpihw(dev.reg, sensor.register_dpihw);
|
sanei_genesys_set_dpihw(dev.reg, sensor.register_dpihw);
|
||||||
|
@ -181,13 +227,6 @@ static void gl842_init_registers(Genesys_Device& dev)
|
||||||
scanner_setup_sensor(dev, sensor, dev.reg);
|
scanner_setup_sensor(dev, sensor, dev.reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gl842_set_ad_fe(Genesys_Device* dev)
|
|
||||||
{
|
|
||||||
for (const auto& reg : dev->frontend.regs) {
|
|
||||||
dev->interface->write_fe_register(reg.address, reg.value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set values of analog frontend
|
// Set values of analog frontend
|
||||||
void CommandSetGl842::set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint8_t set) const
|
void CommandSetGl842::set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint8_t set) const
|
||||||
{
|
{
|
||||||
|
@ -203,8 +242,10 @@ void CommandSetGl842::set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
// check analog frontend type
|
// check analog frontend type
|
||||||
// FIXME: looks like we write to that register with initial data
|
// FIXME: looks like we write to that register with initial data
|
||||||
uint8_t fe_type = dev->interface->read_register(REG_0x04) & REG_0x04_FESET;
|
uint8_t fe_type = dev->interface->read_register(REG_0x04) & REG_0x04_FESET;
|
||||||
if (fe_type == 2) {
|
if (fe_type == 2 || dev->model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
gl842_set_ad_fe(dev);
|
for (const auto& reg : dev->frontend.regs) {
|
||||||
|
dev->interface->write_fe_register(reg.address, reg.value);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (fe_type != 0) {
|
if (fe_type != 0) {
|
||||||
|
@ -222,12 +263,6 @@ void CommandSetGl842::set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
dev->interface->write_fe_register(0x20 + i, dev->frontend.get_offset(i));
|
dev->interface->write_fe_register(0x20 + i, dev->frontend.get_offset(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->model->sensor_id == SensorId::CCD_KVSS080) {
|
|
||||||
for (unsigned i = 0; i < 3; i++) {
|
|
||||||
dev->interface->write_fe_register(0x24 + i, dev->frontend.regs.get_value(0x24 + i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 3; i++) {
|
for (unsigned i = 0; i < 3; i++) {
|
||||||
dev->interface->write_fe_register(0x28 + i, dev->frontend.get_gain(i));
|
dev->interface->write_fe_register(0x28 + i, dev->frontend.get_gain(i));
|
||||||
}
|
}
|
||||||
|
@ -482,7 +517,11 @@ static void gl842_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
|
||||||
reg->set16(REG_STRPIXEL, session.pixel_startx);
|
reg->set16(REG_STRPIXEL, session.pixel_startx);
|
||||||
reg->set16(REG_ENDPIXEL, session.pixel_endx);
|
reg->set16(REG_ENDPIXEL, session.pixel_endx);
|
||||||
|
|
||||||
|
if (dev->model->is_cis) {
|
||||||
|
reg->set24(REG_MAXWD, session.output_line_bytes_raw * session.params.channels);
|
||||||
|
} else {
|
||||||
reg->set24(REG_MAXWD, session.output_line_bytes_raw);
|
reg->set24(REG_MAXWD, session.output_line_bytes_raw);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned tgtime = exposure / 65536 + 1;
|
unsigned tgtime = exposure / 65536 + 1;
|
||||||
reg->set16(REG_LPERIOD, exposure / tgtime);
|
reg->set16(REG_LPERIOD, exposure / tgtime);
|
||||||
|
@ -516,6 +555,9 @@ void CommandSetGl842::init_regs_for_scan_session(Genesys_Device* dev, const Gene
|
||||||
if (exposure < 0) {
|
if (exposure < 0) {
|
||||||
throw std::runtime_error("Exposure not defined in sensor definition");
|
throw std::runtime_error("Exposure not defined in sensor definition");
|
||||||
}
|
}
|
||||||
|
if (dev->model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
exposure *= 2;
|
||||||
|
}
|
||||||
const auto& motor_profile = get_motor_profile(dev->motor.profiles, exposure, session);
|
const auto& motor_profile = get_motor_profile(dev->motor.profiles, exposure, session);
|
||||||
|
|
||||||
// now _LOGICAL_ optical values used are known, setup registers
|
// now _LOGICAL_ optical values used are known, setup registers
|
||||||
|
@ -643,6 +685,25 @@ void CommandSetGl842::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
|
||||||
dev->cmd_set->set_motor_mode(*dev, *reg, MotorMode::PRIMARY_AND_SECONDARY);
|
dev->cmd_set->set_motor_mode(*dev, *reg, MotorMode::PRIMARY_AND_SECONDARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
if (has_flag(dev->session.params.flags, ScanFlag::REVERSE)) {
|
||||||
|
dev->interface->write_register(REG_0x6B, 0x01);
|
||||||
|
dev->interface->write_register(REG_0x6C, 0x02);
|
||||||
|
} else {
|
||||||
|
dev->interface->write_register(REG_0x6B, 0x03);
|
||||||
|
switch (dev->session.params.xres) {
|
||||||
|
case 150: dev->interface->write_register(REG_0x6C, 0x74); break;
|
||||||
|
case 300: dev->interface->write_register(REG_0x6C, 0x38); break;
|
||||||
|
case 600: dev->interface->write_register(REG_0x6C, 0x1c); break;
|
||||||
|
case 1200: dev->interface->write_register(REG_0x6C, 0x2c); break;
|
||||||
|
case 2400: dev->interface->write_register(REG_0x6C, 0x0c); break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dev->interface->sleep_ms(100);
|
||||||
|
}
|
||||||
|
|
||||||
scanner_clear_scan_and_feed_counts(*dev);
|
scanner_clear_scan_and_feed_counts(*dev);
|
||||||
|
|
||||||
// enable scan and motor
|
// enable scan and motor
|
||||||
|
@ -902,6 +963,9 @@ void CommandSetGl842::asic_boot(Genesys_Device* dev, bool cold) const
|
||||||
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||||
dev->interface->write_0x8c(0x10, 0x94);
|
dev->interface->write_0x8c(0x10, 0x94);
|
||||||
}
|
}
|
||||||
|
if (dev->model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
dev->interface->write_0x8c(0x10, 0xd4);
|
||||||
|
}
|
||||||
|
|
||||||
// set RAM read address
|
// set RAM read address
|
||||||
dev->interface->write_register(REG_0x2A, 0x00);
|
dev->interface->write_register(REG_0x2A, 0x00);
|
||||||
|
@ -929,7 +993,11 @@ void CommandSetGl842::update_hardware_sensors(Genesys_Scanner* s) const
|
||||||
void CommandSetGl842::update_home_sensor_gpio(Genesys_Device& dev) const
|
void CommandSetGl842::update_home_sensor_gpio(Genesys_Device& dev) const
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
(void) dev;
|
if (dev.model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
std::uint8_t val = dev.interface->read_register(REG_0x6C);
|
||||||
|
val |= 0x02;
|
||||||
|
dev.interface->write_register(REG_0x6C, val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -791,7 +791,9 @@ void compute_session_pixel_offsets(const Genesys_Device* dev, ScanSession& s,
|
||||||
dev->model->asic_type == AsicType::GL847)
|
dev->model->asic_type == AsicType::GL847)
|
||||||
{
|
{
|
||||||
unsigned startx_xres = s.optical_resolution;
|
unsigned startx_xres = s.optical_resolution;
|
||||||
if (dev->model->model_id == ModelId::CANON_5600F) {
|
if (dev->model->model_id == ModelId::CANON_5600F ||
|
||||||
|
dev->model->model_id == ModelId::CANON_LIDE_90)
|
||||||
|
{
|
||||||
if (s.output_resolution == 1200) {
|
if (s.output_resolution == 1200) {
|
||||||
startx_xres /= 2;
|
startx_xres /= 2;
|
||||||
}
|
}
|
||||||
|
@ -1044,7 +1046,9 @@ void compute_session(const Genesys_Device* dev, ScanSession& s, const Genesys_Se
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->model->asic_type == AsicType::GL841) {
|
if (dev->model->asic_type == AsicType::GL841 ||
|
||||||
|
dev->model->asic_type == AsicType::GL842)
|
||||||
|
{
|
||||||
if (dev->model->is_cis) {
|
if (dev->model->is_cis) {
|
||||||
s.output_line_bytes_raw = s.output_channel_bytes;
|
s.output_line_bytes_raw = s.output_channel_bytes;
|
||||||
}
|
}
|
||||||
|
@ -1077,6 +1081,11 @@ void compute_session(const Genesys_Device* dev, ScanSession& s, const Genesys_Se
|
||||||
s.output_segment_pixel_group_count = s.output_pixels /
|
s.output_segment_pixel_group_count = s.output_pixels /
|
||||||
(s.full_resolution / s.optical_resolution * s.segment_count);
|
(s.full_resolution / s.optical_resolution * s.segment_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
s.output_segment_pixel_group_count = s.output_pixels / s.segment_count;
|
||||||
|
}
|
||||||
|
|
||||||
if (dev->model->asic_type == AsicType::GL845 ||
|
if (dev->model->asic_type == AsicType::GL845 ||
|
||||||
dev->model->asic_type == AsicType::GL846 ||
|
dev->model->asic_type == AsicType::GL846 ||
|
||||||
dev->model->asic_type == AsicType::GL847)
|
dev->model->asic_type == AsicType::GL847)
|
||||||
|
@ -1093,6 +1102,10 @@ void compute_session(const Genesys_Device* dev, ScanSession& s, const Genesys_Se
|
||||||
|
|
||||||
s.output_total_bytes_raw = s.output_line_bytes_raw * s.output_line_count;
|
s.output_total_bytes_raw = s.output_line_bytes_raw * s.output_line_count;
|
||||||
s.output_total_bytes = s.output_line_bytes * s.output_line_count;
|
s.output_total_bytes = s.output_line_bytes * s.output_line_count;
|
||||||
|
if (dev->model->model_id == ModelId::CANON_LIDE_90) {
|
||||||
|
s.output_total_bytes_raw *= s.params.channels;
|
||||||
|
s.output_total_bytes *= s.params.channels;
|
||||||
|
}
|
||||||
|
|
||||||
s.buffer_size_read = s.output_line_bytes_raw * 64;
|
s.buffer_size_read = s.output_line_bytes_raw * 64;
|
||||||
compute_session_pixel_offsets(dev, s, sensor);
|
compute_session_pixel_offsets(dev, s, sensor);
|
||||||
|
|
|
@ -219,6 +219,30 @@ void genesys_init_frontend_tables()
|
||||||
s_frontends->push_back(fe);
|
s_frontends->push_back(fe);
|
||||||
|
|
||||||
|
|
||||||
|
fe = Genesys_Frontend();
|
||||||
|
fe.id = AdcId::CANON_LIDE_90;
|
||||||
|
fe.layout = wolfson_layout;
|
||||||
|
fe.layout.type = FrontendType::WOLFSON;
|
||||||
|
fe.regs = {
|
||||||
|
{ 0x01, 0x23 },
|
||||||
|
{ 0x02, 0x07 },
|
||||||
|
{ 0x03, 0x29 },
|
||||||
|
{ 0x06, 0x0d },
|
||||||
|
{ 0x08, 0x00 },
|
||||||
|
{ 0x09, 0x16 },
|
||||||
|
{ 0x20, 0x4d },
|
||||||
|
{ 0x21, 0x4d },
|
||||||
|
{ 0x22, 0x4d },
|
||||||
|
{ 0x23, 0x4d },
|
||||||
|
{ 0x28, 0x14 },
|
||||||
|
{ 0x29, 0x14 },
|
||||||
|
{ 0x2a, 0x14 },
|
||||||
|
{ 0x2b, 0x14 },
|
||||||
|
};
|
||||||
|
fe.reg2 = {0x00, 0x00, 0x00};
|
||||||
|
s_frontends->push_back(fe);
|
||||||
|
|
||||||
|
|
||||||
fe = Genesys_Frontend();
|
fe = Genesys_Frontend();
|
||||||
fe.id = AdcId::AD_XP200;
|
fe.id = AdcId::AD_XP200;
|
||||||
fe.layout = wolfson_layout;
|
fe.layout = wolfson_layout;
|
||||||
|
|
|
@ -130,6 +130,18 @@ void genesys_init_gpo_tables()
|
||||||
s_gpo->push_back(gpo);
|
s_gpo->push_back(gpo);
|
||||||
|
|
||||||
|
|
||||||
|
gpo = Genesys_Gpo();
|
||||||
|
gpo.id = GpioId::CANON_LIDE_90;
|
||||||
|
gpo.regs = {
|
||||||
|
{ 0x6b, 0x03 },
|
||||||
|
{ 0x6c, 0x74 },
|
||||||
|
{ 0x6d, 0x80 },
|
||||||
|
{ 0x6e, 0x7f },
|
||||||
|
{ 0x6f, 0xe0 },
|
||||||
|
};
|
||||||
|
s_gpo->push_back(gpo);
|
||||||
|
|
||||||
|
|
||||||
gpo = Genesys_Gpo();
|
gpo = Genesys_Gpo();
|
||||||
gpo.id = GpioId::XP200;
|
gpo.id = GpioId::XP200;
|
||||||
gpo.regs = {
|
gpo.regs = {
|
||||||
|
|
|
@ -1177,6 +1177,65 @@ void genesys_init_usb_device_tables()
|
||||||
s_usb_devices->emplace_back(0x04a9, 0x2214, model);
|
s_usb_devices->emplace_back(0x04a9, 0x2214, model);
|
||||||
|
|
||||||
|
|
||||||
|
model = Genesys_Model();
|
||||||
|
model.name = "canon-lide-90";
|
||||||
|
model.vendor = "Canon";
|
||||||
|
model.model = "LiDE 90";
|
||||||
|
model.model_id = ModelId::CANON_LIDE_90;
|
||||||
|
model.asic_type = AsicType::GL842;
|
||||||
|
|
||||||
|
model.resolutions = {
|
||||||
|
{
|
||||||
|
{ ScanMethod::FLATBED },
|
||||||
|
{ 2400, 1200, 600, 300 },
|
||||||
|
{ 2400, 1200, 600, 300 },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
model.bpp_gray_values = { 8, 16 };
|
||||||
|
model.bpp_color_values = { 8, 16 };
|
||||||
|
model.x_offset = 3.50;
|
||||||
|
model.y_offset = 9.0;
|
||||||
|
model.x_size = 219.0;
|
||||||
|
model.y_size = 299.0;
|
||||||
|
|
||||||
|
model.y_offset_calib_white = 0.0;
|
||||||
|
model.y_size_calib_mm = 2.0;
|
||||||
|
model.y_offset_calib_dark_white_mm = 0.0;
|
||||||
|
model.y_size_calib_dark_white_mm = 0.0;
|
||||||
|
model.x_offset_calib_black = 0.0;
|
||||||
|
model.x_size_calib_mm = 221.5;
|
||||||
|
|
||||||
|
model.post_scan = 0.0;
|
||||||
|
model.eject_feed = 0.0;
|
||||||
|
|
||||||
|
model.ld_shift_r = 0;
|
||||||
|
model.ld_shift_g = 0;
|
||||||
|
model.ld_shift_b = 0;
|
||||||
|
|
||||||
|
model.line_mode_color_order = ColorOrder::RGB;
|
||||||
|
|
||||||
|
model.is_cis = true;
|
||||||
|
model.is_sheetfed = false;
|
||||||
|
model.sensor_id = SensorId::CIS_CANON_LIDE_90;
|
||||||
|
model.adc_id = AdcId::CANON_LIDE_90;
|
||||||
|
model.gpio_id = GpioId::CANON_LIDE_90;
|
||||||
|
model.motor_id = MotorId::CANON_LIDE_90;
|
||||||
|
model.flags = ModelFlag::DISABLE_ADC_CALIBRATION |
|
||||||
|
ModelFlag::HOST_SIDE_CALIBRATION_COMPLETE_SCAN |
|
||||||
|
ModelFlag::USE_CONSTANT_FOR_DARK_CALIBRATION |
|
||||||
|
ModelFlag::DISABLE_FAST_FEEDING |
|
||||||
|
ModelFlag::SHADING_REPARK |
|
||||||
|
ModelFlag::CUSTOM_GAMMA;
|
||||||
|
model.buttons = GENESYS_HAS_SCAN_SW |
|
||||||
|
GENESYS_HAS_FILE_SW |
|
||||||
|
GENESYS_HAS_EMAIL_SW |
|
||||||
|
GENESYS_HAS_COPY_SW;
|
||||||
|
model.search_lines = 400;
|
||||||
|
|
||||||
|
s_usb_devices->emplace_back(0x04a9, 0x1900, model);
|
||||||
|
|
||||||
|
|
||||||
model = Genesys_Model();
|
model = Genesys_Model();
|
||||||
model.name = "hewlett-packard-scanjet-2300c";
|
model.name = "hewlett-packard-scanjet-2300c";
|
||||||
model.vendor = "Hewlett Packard";
|
model.vendor = "Hewlett Packard";
|
||||||
|
|
|
@ -144,6 +144,23 @@ void genesys_init_motor_tables()
|
||||||
s_motors->push_back(std::move(motor));
|
s_motors->push_back(std::move(motor));
|
||||||
|
|
||||||
|
|
||||||
|
motor = Genesys_Motor();
|
||||||
|
motor.id = MotorId::CANON_LIDE_90;
|
||||||
|
motor.base_ydpi = 1200;
|
||||||
|
profile = {MotorSlope::create_from_steps(8000, 3000, 200), StepType::FULL, 0};
|
||||||
|
profile.resolutions = { 150, 300 };
|
||||||
|
motor.profiles.push_back(profile);
|
||||||
|
|
||||||
|
profile = {MotorSlope::create_from_steps(7000, 3000, 200), StepType::HALF, 0};
|
||||||
|
profile.resolutions = { 600, 1200 };
|
||||||
|
motor.profiles.push_back(profile);
|
||||||
|
|
||||||
|
profile = {MotorSlope::create_from_steps(7000, 3000, 200), StepType::QUARTER, 0};
|
||||||
|
profile.resolutions = { 2400 };
|
||||||
|
motor.profiles.push_back(profile);
|
||||||
|
s_motors->push_back(std::move(motor));
|
||||||
|
|
||||||
|
|
||||||
motor = Genesys_Motor();
|
motor = Genesys_Motor();
|
||||||
motor.id = MotorId::XP200;
|
motor.id = MotorId::XP200;
|
||||||
motor.base_ydpi = 600;
|
motor.base_ydpi = 600;
|
||||||
|
|
|
@ -563,6 +563,69 @@ void genesys_init_sensor_tables()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sensor = Genesys_Sensor();
|
||||||
|
sensor.sensor_id = SensorId::CIS_CANON_LIDE_90; // gl842
|
||||||
|
sensor.full_resolution = 2400;
|
||||||
|
sensor.black_pixels = 20;
|
||||||
|
sensor.dummy_pixel = 253;
|
||||||
|
sensor.fau_gain_white_ref = 150;
|
||||||
|
sensor.gain_white_ref = 150;
|
||||||
|
sensor.use_host_side_calib = true;
|
||||||
|
sensor.custom_regs = {
|
||||||
|
{ 0x16, 0x20 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0xff },
|
||||||
|
{ 0x1a, 0x24 }, { 0x1c, 0x00 }, { 0x1d, 0x04 },
|
||||||
|
{ 0x52, 0x02 }, { 0x53, 0x04 }, { 0x54, 0x02 }, { 0x55, 0x04 },
|
||||||
|
{ 0x56, 0x02 }, { 0x57, 0x04 }, { 0x58, 0x0a }, { 0x59, 0x71 }, { 0x5a, 0x55 },
|
||||||
|
{ 0x70, 0x00 }, { 0x71, 0x05 }, { 0x72, 0x07 }, { 0x73, 0x09 },
|
||||||
|
{ 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
|
||||||
|
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x3f },
|
||||||
|
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x1e }, { 0x7d, 0x11 }, { 0x7f, 0x50 }
|
||||||
|
};
|
||||||
|
sensor.gamma = { 1.0f, 1.0f, 1.0f };
|
||||||
|
{
|
||||||
|
struct CustomSensorSettings
|
||||||
|
{
|
||||||
|
ValueFilterAny<unsigned> resolutions;
|
||||||
|
unsigned optical_resolution;
|
||||||
|
unsigned register_dpihw;
|
||||||
|
unsigned register_dpiset;
|
||||||
|
unsigned shading_resolution;
|
||||||
|
unsigned shading_factor;
|
||||||
|
int output_pixel_offset;
|
||||||
|
SensorExposure exposure;
|
||||||
|
unsigned exposure_lperiod;
|
||||||
|
unsigned segment_size;
|
||||||
|
std::vector<unsigned> segment_order;
|
||||||
|
};
|
||||||
|
|
||||||
|
CustomSensorSettings custom_settings[] = {
|
||||||
|
{ { 300 }, 300, 600, 600, 300, 2, 280, { 955, 1235, 675 }, 6500, 5152,
|
||||||
|
std::vector<unsigned>{} },
|
||||||
|
{ { 600 }, 600, 600, 600, 600, 1, 250, { 1655, 2075, 1095 }, 6536, 5152,
|
||||||
|
std::vector<unsigned>{} },
|
||||||
|
{ { 1200 }, 1200, 1200, 1200, 1200, 1, 500, { 3055, 4175, 1935 }, 12688, 5152,
|
||||||
|
{0, 1} },
|
||||||
|
{ { 2400 }, 2400, 2400, 2400, 2400, 1, 1000, { 5855, 7535, 3615 }, 21500, 5152,
|
||||||
|
{0, 1, 2, 3} },
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const CustomSensorSettings& setting : custom_settings) {
|
||||||
|
sensor.resolutions = setting.resolutions;
|
||||||
|
sensor.optical_resolution = setting.optical_resolution;
|
||||||
|
sensor.register_dpihw = setting.register_dpihw;
|
||||||
|
sensor.register_dpiset = setting.register_dpiset;
|
||||||
|
sensor.shading_resolution = setting.shading_resolution;
|
||||||
|
sensor.shading_factor = setting.shading_factor;
|
||||||
|
sensor.output_pixel_offset = setting.output_pixel_offset;
|
||||||
|
sensor.exposure = setting.exposure;
|
||||||
|
sensor.exposure_lperiod = setting.exposure_lperiod;
|
||||||
|
sensor.segment_size = setting.segment_size;
|
||||||
|
sensor.segment_order = setting.segment_order;
|
||||||
|
s_sensors->push_back(sensor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sensor = Genesys_Sensor();
|
sensor = Genesys_Sensor();
|
||||||
sensor.sensor_id = SensorId::CIS_XP200; // gl646
|
sensor.sensor_id = SensorId::CIS_XP200; // gl646
|
||||||
sensor.full_resolution = 600;
|
sensor.full_resolution = 600;
|
||||||
|
@ -3803,7 +3866,7 @@ void verify_sensor_tables()
|
||||||
|
|
||||||
if (asic_type == AsicType::GL842) {
|
if (asic_type == AsicType::GL842) {
|
||||||
auto required_registers = {
|
auto required_registers = {
|
||||||
0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
|
0x16, 0x17, 0x18, 0x19, 0x1a, 0x1c, 0x1d,
|
||||||
0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
|
0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
|
||||||
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d,
|
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d,
|
||||||
0x7f
|
0x7f
|
||||||
|
|
|
@ -187,6 +187,12 @@
|
||||||
:status :basic
|
:status :basic
|
||||||
:comment "No 2400 dpi support, slow speed at lower resolution"
|
:comment "No 2400 dpi support, slow speed at lower resolution"
|
||||||
|
|
||||||
|
:model "CanoScan LiDE 90"
|
||||||
|
:interface "USB"
|
||||||
|
:usbid "0x04a9" "0x1900"
|
||||||
|
:status :good
|
||||||
|
:comment "resolutions from 300 to 2400 dpi are supported"
|
||||||
|
|
||||||
:model "CanoScan LiDE 100"
|
:model "CanoScan LiDE 100"
|
||||||
:interface "USB"
|
:interface "USB"
|
||||||
:usbid "0x04a9" "0x1904"
|
:usbid "0x04a9" "0x1904"
|
||||||
|
|
|
@ -395,13 +395,6 @@
|
||||||
:status :unsupported
|
:status :unsupported
|
||||||
:comment "Not supported. However, a stand-alone program for FreeBSD is available."
|
:comment "Not supported. However, a stand-alone program for FreeBSD is available."
|
||||||
|
|
||||||
:model "CanoScan LiDE 90"
|
|
||||||
:url "unsupported/canon-lide-90.html"
|
|
||||||
:interface "USB"
|
|
||||||
:usbid "0x04a9" "0x1900"
|
|
||||||
:status :unsupported
|
|
||||||
:comment "Unsupported. See link for details."
|
|
||||||
|
|
||||||
:model "CanoScan LiDE 500F"
|
:model "CanoScan LiDE 500F"
|
||||||
:url "unsupported/canon-canoscan-lide-500f.html"
|
:url "unsupported/canon-canoscan-lide-500f.html"
|
||||||
:interface "USB"
|
:interface "USB"
|
||||||
|
|
Ładowanie…
Reference in New Issue