kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Extract scanner_send_slope_table()
rodzic
11c3a67e47
commit
16fa00c13b
|
@ -591,6 +591,108 @@ void scanner_clear_scan_and_feed_counts(Genesys_Device& dev)
|
|||
}
|
||||
}
|
||||
|
||||
void scanner_send_slope_table(Genesys_Device* dev, const Genesys_Sensor& sensor, unsigned table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
|
||||
unsigned max_table_nr = 0;
|
||||
switch (dev->model->asic_type) {
|
||||
case AsicType::GL646: {
|
||||
max_table_nr = 2;
|
||||
break;
|
||||
}
|
||||
case AsicType::GL841:
|
||||
case AsicType::GL842:
|
||||
case AsicType::GL843:
|
||||
case AsicType::GL845:
|
||||
case AsicType::GL846:
|
||||
case AsicType::GL847:
|
||||
case AsicType::GL124: {
|
||||
max_table_nr = 4;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw SaneException("Unsupported ASIC type");
|
||||
}
|
||||
|
||||
if (table_nr > max_table_nr) {
|
||||
throw SaneException("invalid table number %d", table_nr);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
|
||||
switch (dev->model->asic_type) {
|
||||
case AsicType::GL646: {
|
||||
unsigned dpihw = dev->reg.find_reg(0x05).value >> 6;
|
||||
unsigned start_address = 0;
|
||||
if (dpihw == 0) { // 600 dpi
|
||||
start_address = 0x08000;
|
||||
} else if (dpihw == 1) { // 1200 dpi
|
||||
start_address = 0x10000;
|
||||
} else if (dpihw == 2) { // 2400 dpi
|
||||
start_address = 0x1f800;
|
||||
} else {
|
||||
throw SaneException("Unexpected dpihw");
|
||||
}
|
||||
dev->interface->write_buffer(0x3c, start_address + table_nr * 0x100, table.data(),
|
||||
slope_table.size() * 2);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL841: {
|
||||
unsigned start_address = 0;
|
||||
switch (sensor.register_dpihw) {
|
||||
case 600: start_address = 0x08000; break;
|
||||
case 1200: start_address = 0x10000; break;
|
||||
case 2400: start_address = 0x20000; break;
|
||||
default: throw SaneException("Unexpected dpihw");
|
||||
}
|
||||
dev->interface->write_buffer(0x3c, start_address + table_nr * 0x200, table.data(),
|
||||
slope_table.size() * 2);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL842: {
|
||||
// slope table addresses are fixed : 0x40000, 0x48000, 0x50000, 0x58000, 0x60000
|
||||
// XXX STEF XXX USB 1.1 ? sanei_genesys_write_0x8c (dev, 0x0f, 0x14);
|
||||
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||
dev->interface->write_buffer(0x3c, 0x010000 + 0x200 * table_nr, table.data(),
|
||||
slope_table.size() * 2);
|
||||
} else {
|
||||
dev->interface->write_gamma(0x28, 0x40000 + 0x8000 * table_nr, table.data(),
|
||||
slope_table.size() * 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AsicType::GL843: {
|
||||
// slope table addresses are fixed : 0x40000, 0x48000, 0x50000, 0x58000, 0x60000
|
||||
// XXX STEF XXX USB 1.1 ? sanei_genesys_write_0x8c (dev, 0x0f, 0x14);
|
||||
dev->interface->write_gamma(0x28, 0x40000 + 0x8000 * table_nr, table.data(),
|
||||
slope_table.size() * 2);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL845:
|
||||
case AsicType::GL846:
|
||||
case AsicType::GL847:
|
||||
case AsicType::GL124: {
|
||||
// slope table addresses are fixed
|
||||
dev->interface->write_ahb(0x10000000 + 0x4000 * table_nr, slope_table.size() * 2,
|
||||
table.data());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw SaneException("Unsupported ASIC type");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool scanner_is_motor_stopped(Genesys_Device& dev)
|
||||
{
|
||||
switch (dev.model->asic_type) {
|
||||
|
|
|
@ -372,38 +372,6 @@ gl124_init_registers (Genesys_Device * dev)
|
|||
sanei_genesys_set_dpihw(dev->reg, dpihw_sensor.register_dpihw);
|
||||
}
|
||||
|
||||
/**@brief send slope table for motor movement
|
||||
* Send slope_table in machine byte order
|
||||
* @param dev device to send slope table
|
||||
* @param table_nr index of the slope table in ASIC memory
|
||||
* Must be in the [0-4] range.
|
||||
* @param slope_table pointer to 16 bit values array of the slope table
|
||||
* @param steps number of elemnts in the slope table
|
||||
*/
|
||||
static void gl124_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
|
||||
/* sanity check */
|
||||
if(table_nr<0 || table_nr>4)
|
||||
{
|
||||
throw SaneException("invalid table number");
|
||||
}
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
// slope table addresses are fixed
|
||||
dev->interface->write_ahb(0x10000000 + 0x4000 * table_nr, slope_table.size() * 2, table.data());
|
||||
}
|
||||
|
||||
/** @brief * Set register values of 'special' ti type frontend
|
||||
* Registers value are taken from the frontend register data
|
||||
* set.
|
||||
|
@ -576,8 +544,8 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev,
|
|||
/* scan and backtracking slope table */
|
||||
auto scan_table = create_slope_table(dev->model->asic_type, dev->motor, yres,
|
||||
scan_exposure_time, 1, motor_profile);
|
||||
gl124_send_slope_table(dev, SCAN_TABLE, scan_table.table);
|
||||
gl124_send_slope_table(dev, BACKTRACK_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, SCAN_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, BACKTRACK_TABLE, scan_table.table);
|
||||
|
||||
reg->set16(REG_STEPNO, scan_table.table.size());
|
||||
|
||||
|
@ -592,8 +560,8 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev,
|
|||
*/
|
||||
auto fast_table = create_slope_table(dev->model->asic_type, dev->motor, fast_dpi,
|
||||
scan_exposure_time, 1, motor_profile);
|
||||
gl124_send_slope_table(dev, STOP_TABLE, fast_table.table);
|
||||
gl124_send_slope_table(dev, FAST_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, STOP_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, FAST_TABLE, fast_table.table);
|
||||
|
||||
reg->set16(REG_FASTNO, fast_table.table.size());
|
||||
reg->set16(REG_FSHDEC, fast_table.table.size());
|
||||
|
|
|
@ -63,8 +63,6 @@ namespace {
|
|||
constexpr unsigned CALIBRATION_LINES = 10;
|
||||
} // namespace
|
||||
|
||||
static void gl646_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table);
|
||||
static void write_control(Genesys_Device* dev, const Genesys_Sensor& sensor, int resolution);
|
||||
|
||||
|
||||
|
@ -872,8 +870,8 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
|
|||
}
|
||||
}
|
||||
|
||||
gl646_send_slope_table(dev, 0, slope_table1.table);
|
||||
gl646_send_slope_table(dev, 1, slope_table2.table);
|
||||
scanner_send_slope_table(dev, sensor, 0, slope_table1.table);
|
||||
scanner_send_slope_table(dev, sensor, 1, slope_table2.table);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1057,40 +1055,6 @@ gl646_init_regs (Genesys_Device * dev)
|
|||
dev->reg.find_reg(0x6c).value = 0x00; /* peroid times for LPeriod, expR,expG,expB, Z1MODE, Z2MODE (one period time) */
|
||||
}
|
||||
|
||||
|
||||
// Send slope table for motor movement slope_table in machine byte order
|
||||
static void gl646_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
int dpihw;
|
||||
int start_address;
|
||||
|
||||
dpihw = dev->reg.find_reg(0x05).value >> 6;
|
||||
|
||||
if (dpihw == 0) /* 600 dpi */
|
||||
start_address = 0x08000;
|
||||
else if (dpihw == 1) /* 1200 dpi */
|
||||
start_address = 0x10000;
|
||||
else if (dpihw == 2) /* 2400 dpi */
|
||||
start_address = 0x1f800;
|
||||
else {
|
||||
throw SaneException("Unexpected dpihw");
|
||||
}
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
dev->interface->write_buffer(0x3c, start_address + table_nr * 0x100, table.data(),
|
||||
slope_table.size() * 2);
|
||||
}
|
||||
|
||||
// Set values of Analog Device type frontend
|
||||
static void gl646_set_ad_fe(Genesys_Device* dev, uint8_t set)
|
||||
{
|
||||
|
@ -1442,7 +1406,8 @@ void CommandSetGl646::load_document(Genesys_Device* dev) const
|
|||
// send regs
|
||||
// start motor
|
||||
// wait e1 status to become e0
|
||||
gl646_send_slope_table(dev, 1, slope_table.table);
|
||||
const auto& sensor = sanei_genesys_find_sensor_any(dev);
|
||||
scanner_send_slope_table(dev, sensor, 1, slope_table.table);
|
||||
|
||||
dev->interface->write_registers(regs);
|
||||
|
||||
|
@ -1598,7 +1563,9 @@ void CommandSetGl646::eject_document(Genesys_Device* dev) const
|
|||
// send regs
|
||||
// start motor
|
||||
// wait c1 status to become c8 : HOMESNR and ~MOTFLAG
|
||||
gl646_send_slope_table(dev, 1, slope_table.table);
|
||||
// FIXME: sensor is not used.
|
||||
const auto& sensor = sanei_genesys_find_sensor_any(dev);
|
||||
scanner_send_slope_table(dev, sensor, 1, slope_table.table);
|
||||
|
||||
dev->interface->write_registers(regs);
|
||||
|
||||
|
|
|
@ -344,33 +344,6 @@ gl841_init_registers (Genesys_Device * dev)
|
|||
}
|
||||
}
|
||||
|
||||
// Send slope table for motor movement slope_table in machine byte order
|
||||
static void gl841_send_slope_table(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||
int table_nr, const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
int start_address;
|
||||
|
||||
switch (sensor.register_dpihw) {
|
||||
case 600: start_address = 0x08000; break;
|
||||
case 1200: start_address = 0x10000; break;
|
||||
case 2400: start_address = 0x20000; break;
|
||||
default: throw SaneException("Unexpected dpihw");
|
||||
}
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
dev->interface->write_buffer(0x3c, start_address + table_nr * 0x200, table.data(),
|
||||
slope_table.size() * 2);
|
||||
}
|
||||
|
||||
static void gl841_set_lide80_fe(Genesys_Device* dev, uint8_t set)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
|
@ -582,11 +555,11 @@ static void gl841_init_motor_regs_feed(Genesys_Device* dev, const Genesys_Sensor
|
|||
std::vector<uint16_t> table;
|
||||
table.resize(256, 0xffff);
|
||||
|
||||
gl841_send_slope_table(dev, sensor, 0, table);
|
||||
gl841_send_slope_table(dev, sensor, 1, table);
|
||||
gl841_send_slope_table(dev, sensor, 2, table);
|
||||
gl841_send_slope_table(dev, sensor, 3, table);
|
||||
gl841_send_slope_table(dev, sensor, 4, table);
|
||||
scanner_send_slope_table(dev, sensor, 0, table);
|
||||
scanner_send_slope_table(dev, sensor, 1, table);
|
||||
scanner_send_slope_table(dev, sensor, 2, table);
|
||||
scanner_send_slope_table(dev, sensor, 3, table);
|
||||
scanner_send_slope_table(dev, sensor, 4, table);
|
||||
}
|
||||
|
||||
gl841_write_freq(dev, dev->motor.base_ydpi / 4);
|
||||
|
@ -638,7 +611,7 @@ static void gl841_init_motor_regs_feed(Genesys_Device* dev, const Genesys_Sensor
|
|||
reg->find_reg(0x02).value &= ~REG_0x02_MTRREV;
|
||||
}
|
||||
|
||||
gl841_send_slope_table(dev, sensor, 3, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, 3, fast_table.table);
|
||||
|
||||
reg->set8(0x67, 0x3f);
|
||||
reg->set8(0x68, 0x3f);
|
||||
|
@ -681,11 +654,11 @@ static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor
|
|||
std::vector<uint16_t> table;
|
||||
table.resize(256, 0xffff);
|
||||
|
||||
gl841_send_slope_table(dev, sensor, 0, table);
|
||||
gl841_send_slope_table(dev, sensor, 1, table);
|
||||
gl841_send_slope_table(dev, sensor, 2, table);
|
||||
gl841_send_slope_table(dev, sensor, 3, table);
|
||||
gl841_send_slope_table(dev, sensor, 4, table);
|
||||
scanner_send_slope_table(dev, sensor, 0, table);
|
||||
scanner_send_slope_table(dev, sensor, 1, table);
|
||||
scanner_send_slope_table(dev, sensor, 2, table);
|
||||
scanner_send_slope_table(dev, sensor, 3, table);
|
||||
scanner_send_slope_table(dev, sensor, 4, table);
|
||||
}
|
||||
|
||||
|
||||
|
@ -800,16 +773,16 @@ static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor
|
|||
reg->find_reg(0x02).value &= ~0x40;
|
||||
}
|
||||
|
||||
gl841_send_slope_table(dev, sensor, 0, slow_table.table);
|
||||
gl841_send_slope_table(dev, sensor, 1, back_table.table);
|
||||
gl841_send_slope_table(dev, sensor, 2, slow_table.table);
|
||||
scanner_send_slope_table(dev, sensor, 0, slow_table.table);
|
||||
scanner_send_slope_table(dev, sensor, 1, back_table.table);
|
||||
scanner_send_slope_table(dev, sensor, 2, slow_table.table);
|
||||
|
||||
if (use_fast_fed) {
|
||||
gl841_send_slope_table(dev, sensor, 3, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, 3, fast_table.table);
|
||||
}
|
||||
|
||||
if (has_flag(flags, ScanFlag::AUTO_GO_HOME)) {
|
||||
gl841_send_slope_table(dev, sensor, 4, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, 4, fast_table.table);
|
||||
}
|
||||
|
||||
/* now reg 0x21 and 0x24 are available, we can calculate reg 0x22 and 0x23,
|
||||
|
|
|
@ -181,33 +181,6 @@ static void gl842_init_registers(Genesys_Device& dev)
|
|||
scanner_setup_sensor(dev, sensor, dev.reg);
|
||||
}
|
||||
|
||||
// Send slope table for motor movement slope_table in machine byte order
|
||||
static void gl842_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
|
||||
// slope table addresses are fixed : 0x40000, 0x48000, 0x50000, 0x58000, 0x60000
|
||||
// XXX STEF XXX USB 1.1 ? sanei_genesys_write_0x8c (dev, 0x0f, 0x14);
|
||||
if (dev->model->model_id == ModelId::PLUSTEK_OPTICFILM_7200) {
|
||||
dev->interface->write_buffer(0x3c, 0x010000 + 0x200 * table_nr, table.data(),
|
||||
slope_table.size() * 2);
|
||||
} else {
|
||||
dev->interface->write_gamma(0x28, 0x40000 + 0x8000 * table_nr, table.data(),
|
||||
slope_table.size() * 2);
|
||||
}
|
||||
}
|
||||
|
||||
static void gl842_set_ad_fe(Genesys_Device* dev)
|
||||
{
|
||||
for (const auto& reg : dev->frontend.regs) {
|
||||
|
@ -320,9 +293,9 @@ static void gl842_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto scan_table = create_slope_table(dev->model->asic_type, dev->motor, scan_yres, exposure,
|
||||
step_multiplier, motor_profile);
|
||||
|
||||
gl842_send_slope_table(dev, SCAN_TABLE, scan_table.table);
|
||||
gl842_send_slope_table(dev, BACKTRACK_TABLE, scan_table.table);
|
||||
gl842_send_slope_table(dev, STOP_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, SCAN_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, BACKTRACK_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, STOP_TABLE, scan_table.table);
|
||||
|
||||
reg->set8(REG_STEPNO, scan_table.table.size() / step_multiplier);
|
||||
reg->set8(REG_FASTNO, scan_table.table.size() / step_multiplier);
|
||||
|
@ -337,8 +310,8 @@ static void gl842_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto fast_table = create_slope_table_fastest(dev->model->asic_type, step_multiplier,
|
||||
*fast_profile);
|
||||
|
||||
gl842_send_slope_table(dev, FAST_TABLE, fast_table.table);
|
||||
gl842_send_slope_table(dev, HOME_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, FAST_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, HOME_TABLE, fast_table.table);
|
||||
|
||||
reg->set8(REG_FMOVNO, fast_table.table.size() / step_multiplier);
|
||||
|
||||
|
|
|
@ -631,28 +631,6 @@ gl843_init_registers (Genesys_Device * dev)
|
|||
}
|
||||
}
|
||||
|
||||
// Send slope table for motor movement slope_table in machine byte order
|
||||
static void gl843_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
|
||||
// slope table addresses are fixed : 0x40000, 0x48000, 0x50000, 0x58000, 0x60000
|
||||
// XXX STEF XXX USB 1.1 ? sanei_genesys_write_0x8c (dev, 0x0f, 0x14);
|
||||
dev->interface->write_gamma(0x28, 0x40000 + 0x8000 * table_nr, table.data(),
|
||||
slope_table.size() * 2);
|
||||
}
|
||||
|
||||
static void gl843_set_ad_fe(Genesys_Device* dev)
|
||||
{
|
||||
for (const auto& reg : dev->frontend.regs) {
|
||||
|
@ -769,9 +747,9 @@ static void gl843_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto scan_table = create_slope_table(dev->model->asic_type, dev->motor, scan_yres, exposure,
|
||||
step_multiplier, motor_profile);
|
||||
|
||||
gl843_send_slope_table(dev, SCAN_TABLE, scan_table.table);
|
||||
gl843_send_slope_table(dev, BACKTRACK_TABLE, scan_table.table);
|
||||
gl843_send_slope_table(dev, STOP_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, SCAN_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, BACKTRACK_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, STOP_TABLE, scan_table.table);
|
||||
|
||||
reg->set8(REG_STEPNO, scan_table.table.size() / step_multiplier);
|
||||
reg->set8(REG_FASTNO, scan_table.table.size() / step_multiplier);
|
||||
|
@ -786,8 +764,8 @@ static void gl843_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto fast_table = create_slope_table_fastest(dev->model->asic_type, step_multiplier,
|
||||
*fast_profile);
|
||||
|
||||
gl843_send_slope_table(dev, FAST_TABLE, fast_table.table);
|
||||
gl843_send_slope_table(dev, HOME_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, FAST_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, HOME_TABLE, fast_table.table);
|
||||
|
||||
reg->set8(REG_FMOVNO, fast_table.table.size() / step_multiplier);
|
||||
|
||||
|
|
|
@ -304,38 +304,6 @@ gl846_init_registers (Genesys_Device * dev)
|
|||
sanei_genesys_set_dpihw(dev->reg, dpihw_sensor.register_dpihw);
|
||||
}
|
||||
|
||||
/**@brief send slope table for motor movement
|
||||
* Send slope_table in machine byte order
|
||||
* @param dev device to send slope table
|
||||
* @param table_nr index of the slope table in ASIC memory
|
||||
* Must be in the [0-4] range.
|
||||
* @param slope_table pointer to 16 bit values array of the slope table
|
||||
* @param steps number of elements in the slope table
|
||||
*/
|
||||
static void gl846_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
|
||||
/* sanity check */
|
||||
if(table_nr<0 || table_nr>4)
|
||||
{
|
||||
throw SaneException("invalid table number %d", table_nr);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
// slope table addresses are fixed
|
||||
dev->interface->write_ahb(0x10000000 + 0x4000 * table_nr, slope_table.size() * 2, table.data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set register values of Analog Device type frontend
|
||||
* */
|
||||
|
@ -444,9 +412,9 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto scan_table = create_slope_table(dev->model->asic_type, dev->motor, scan_yres,
|
||||
scan_exposure_time, step_multiplier, motor_profile);
|
||||
|
||||
gl846_send_slope_table(dev, SCAN_TABLE, scan_table.table);
|
||||
gl846_send_slope_table(dev, BACKTRACK_TABLE, scan_table.table);
|
||||
gl846_send_slope_table(dev, STOP_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, SCAN_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, BACKTRACK_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, STOP_TABLE, scan_table.table);
|
||||
|
||||
reg->set8(REG_STEPNO, scan_table.table.size() / step_multiplier);
|
||||
reg->set8(REG_FASTNO, scan_table.table.size() / step_multiplier);
|
||||
|
@ -461,8 +429,8 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto fast_table = create_slope_table_fastest(dev->model->asic_type, step_multiplier,
|
||||
*fast_profile);
|
||||
|
||||
gl846_send_slope_table(dev, FAST_TABLE, fast_table.table);
|
||||
gl846_send_slope_table(dev, HOME_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, FAST_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, HOME_TABLE, fast_table.table);
|
||||
|
||||
reg->set8(REG_FMOVNO, fast_table.table.size() / step_multiplier);
|
||||
reg->set8(REG_FMOVDEC, fast_table.table.size() / step_multiplier);
|
||||
|
|
|
@ -215,39 +215,6 @@ gl847_init_registers (Genesys_Device * dev)
|
|||
sanei_genesys_set_dpihw(dev->reg, dpihw_sensor.register_dpihw);
|
||||
}
|
||||
|
||||
/**@brief send slope table for motor movement
|
||||
* Send slope_table in machine byte order
|
||||
* @param dev device to send slope table
|
||||
* @param table_nr index of the slope table in ASIC memory
|
||||
* Must be in the [0-4] range.
|
||||
* @param slope_table pointer to 16 bit values array of the slope table
|
||||
* @param steps number of elements in the slope table
|
||||
*/
|
||||
static void gl847_send_slope_table(Genesys_Device* dev, int table_nr,
|
||||
const std::vector<uint16_t>& slope_table)
|
||||
{
|
||||
DBG_HELPER_ARGS(dbg, "table_nr = %d, steps = %zu", table_nr, slope_table.size());
|
||||
|
||||
/* sanity check */
|
||||
if(table_nr<0 || table_nr>4)
|
||||
{
|
||||
throw SaneException("invalid table number %d", table_nr);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> table(slope_table.size() * 2);
|
||||
for (std::size_t i = 0; i < slope_table.size(); i++) {
|
||||
table[i * 2] = slope_table[i] & 0xff;
|
||||
table[i * 2 + 1] = slope_table[i] >> 8;
|
||||
}
|
||||
|
||||
if (dev->interface->is_mock()) {
|
||||
dev->interface->record_slope_table(table_nr, slope_table);
|
||||
}
|
||||
// slope table addresses are fixed
|
||||
dev->interface->write_ahb(0x10000000 + 0x4000 * table_nr, slope_table.size() * 2,
|
||||
table.data());
|
||||
}
|
||||
|
||||
// Set values of analog frontend
|
||||
void CommandSetGl847::set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint8_t set) const
|
||||
{
|
||||
|
@ -337,8 +304,8 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev,
|
|||
// scan and backtracking slope table
|
||||
auto scan_table = create_slope_table(dev->model->asic_type, dev->motor, scan_yres,
|
||||
scan_exposure_time, step_multiplier, motor_profile);
|
||||
gl847_send_slope_table(dev, SCAN_TABLE, scan_table.table);
|
||||
gl847_send_slope_table(dev, BACKTRACK_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, SCAN_TABLE, scan_table.table);
|
||||
scanner_send_slope_table(dev, sensor, BACKTRACK_TABLE, scan_table.table);
|
||||
|
||||
// fast table
|
||||
unsigned fast_dpi = sanei_genesys_get_lowest_ydpi(dev);
|
||||
|
@ -355,9 +322,9 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev,
|
|||
auto fast_table = create_slope_table(dev->model->asic_type, dev->motor, fast_dpi,
|
||||
scan_exposure_time, step_multiplier, fast_motor_profile);
|
||||
|
||||
gl847_send_slope_table(dev, STOP_TABLE, fast_table.table);
|
||||
gl847_send_slope_table(dev, FAST_TABLE, fast_table.table);
|
||||
gl847_send_slope_table(dev, HOME_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, STOP_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, FAST_TABLE, fast_table.table);
|
||||
scanner_send_slope_table(dev, sensor, HOME_TABLE, fast_table.table);
|
||||
|
||||
// correct move distance by acceleration and deceleration amounts
|
||||
unsigned feedl = feed_steps;
|
||||
|
|
|
@ -327,6 +327,9 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor
|
|||
|
||||
void scanner_clear_scan_and_feed_counts(Genesys_Device& dev);
|
||||
|
||||
void scanner_send_slope_table(Genesys_Device* dev, const Genesys_Sensor& sensor, unsigned table_nr,
|
||||
const std::vector<uint16_t>& slope_table);
|
||||
|
||||
extern void sanei_genesys_write_file(const char* filename, const std::uint8_t* data,
|
||||
std::size_t length);
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue