genesys: Move motor direction register adjustment to low level functions

merge-requests/228/merge
Povilas Kanapickas 2019-11-30 19:06:42 +02:00
rodzic 50149e9064
commit 3ada79c35a
8 zmienionych plików z 79 dodań i 73 usunięć

Wyświetl plik

@ -425,6 +425,7 @@ enum class ScanFlag : unsigned
USE_XPA = 1 << 8,
ENABLE_LEDADD = 1 << 9,
USE_XCORRECTION = 1 << 10,
REVERSE = 1 << 11,
};
inline ScanFlag operator|(ScanFlag left, ScanFlag right)
@ -472,6 +473,7 @@ enum class MotorFlag : unsigned
DISABLE_BUFFER_FULL_MOVE = 1 << 2,
FEED = 1 << 3,
USE_XPA = 1 << 4,
REVERSE = 1 << 5,
};
inline MotorFlag operator|(MotorFlag left, MotorFlag right)

Wyświetl plik

@ -576,6 +576,9 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev,
{
r02 |= REG_0x02_ACDCDIS;
}
if (has_flag(flags, MotorFlag::REVERSE)) {
r02 |= REG_0x02_MTRREV;
}
reg->set8(REG_0x02, r02);
sanei_genesys_set_motor_power(*reg, true);
@ -933,6 +936,9 @@ static void gl124_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
if (has_flag(session.params.flags, ScanFlag::FEEDING)) {
mflags |= MotorFlag::FEED;
}
if (has_flag(session.params.flags, ScanFlag::REVERSE)) {
mflags |= MotorFlag::REVERSE;
}
gl124_init_motor_regs_scan(dev, sensor, reg, motor_profile, exposure_time, slope_dpi,
dev->model->is_cis ? session.output_line_count * session.params.channels :
session.output_line_count,
@ -1204,7 +1210,6 @@ void CommandSetGl124::slow_back_home(Genesys_Device* dev, bool wait_until_home)
{
DBG_HELPER_ARGS(dbg, "wait_until_home = %d", wait_until_home);
Genesys_Register_Set local_reg;
GenesysRegister *r;
uint8_t val;
int loop = 0;
@ -1260,7 +1265,8 @@ void CommandSetGl124::slow_back_home(Genesys_Device* dev, bool wait_until_home)
session.params.color_filter = ColorFilter::RED;
session.params.flags = ScanFlag::DISABLE_SHADING |
ScanFlag::DISABLE_GAMMA |
ScanFlag::IGNORE_LINE_DISTANCE;
ScanFlag::IGNORE_LINE_DISTANCE |
ScanFlag::REVERSE;
compute_session(dev, session, sensor);
gl124_init_scan_regs(dev, sensor, &local_reg, session);
@ -1268,9 +1274,6 @@ void CommandSetGl124::slow_back_home(Genesys_Device* dev, bool wait_until_home)
// clear scan and feed count
dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT | REG_0x0D_CLRMCNT);
/* set up for reverse and no scan */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
r->value |= REG_0x02_MTRREV;
dev->interface->write_registers(local_reg);
@ -1356,6 +1359,9 @@ static void gl124_feed(Genesys_Device* dev, unsigned int steps, int reverse)
ScanFlag::FEEDING |
ScanFlag::DISABLE_BUFFER_FULL_MOVE |
ScanFlag::IGNORE_LINE_DISTANCE;
if (reverse) {
session.params.flags |= ScanFlag::REVERSE;
}
compute_session(dev, session, sensor);
gl124_init_scan_regs(dev, sensor, &local_reg, session);
@ -1372,13 +1378,6 @@ static void gl124_feed(Genesys_Device* dev, unsigned int steps, int reverse)
r = sanei_genesys_get_address (&local_reg, REG_0x01);
r->value &= ~REG_0x01_SCAN;
/* set up for reverse if needed */
if(reverse)
{
r = sanei_genesys_get_address (&local_reg, REG_0x02);
r->value |= REG_0x02_MTRREV;
}
// send registers
dev->interface->write_registers(local_reg);

Wyświetl plik

@ -303,7 +303,12 @@ static void gl646_setup_registers(Genesys_Device* dev,
/* setup motor power and direction */
sanei_genesys_set_motor_power(*regs, true);
regs->find_reg(0x02).value &= ~REG_0x02_MTRREV;
if (has_flag(session.params.flags, ScanFlag::REVERSE)) {
regs->find_reg(0x02).value |= REG_0x02_MTRREV;
} else {
regs->find_reg(0x02).value &= ~REG_0x02_MTRREV;
}
/* fastfed enabled (2 motor slope tables) */
if (motor->fastfed) {
@ -1585,10 +1590,9 @@ void CommandSetGl646::slow_back_home(Genesys_Device* dev, bool wait_until_home)
const auto& sensor = sanei_genesys_find_sensor(dev, settings.xres, 3,
dev->model->default_method);
setup_for_scan(dev, sensor, &dev->reg, settings, true, true, true);
setup_for_scan(dev, sensor, &dev->reg, settings, true, true, true, true);
/* backward , no actual data scanned TODO more setup flags to avoid this register manipulations ? */
dev->reg.find_reg(0x02).value |= REG_0x02_MTRREV;
dev->reg.find_reg(0x01).value &= ~REG_0x01_SCAN;
dev->reg.set24(REG_FEEDL, 65535);
@ -1779,7 +1783,7 @@ void CommandSetGl646::init_regs_for_shading(Genesys_Device* dev, const Genesys_S
// we don't want top offset, but we need right margin to be the same than the one for the final
// scan
setup_for_scan(dev, calib_sensor, &dev->reg, settings, true, false, false);
setup_for_scan(dev, calib_sensor, &dev->reg, settings, true, false, false, false);
/* used when sending shading calibration data */
dev->calib_pixels = settings.pixels;
@ -1861,7 +1865,8 @@ static void setup_for_scan(Genesys_Device* dev,
Genesys_Settings settings,
bool split,
bool xcorrection,
bool ycorrection)
bool ycorrection,
bool reverse)
{
DBG_HELPER(dbg);
@ -1918,6 +1923,9 @@ static void setup_for_scan(Genesys_Device* dev,
if (xcorrection) {
session.params.flags |= ScanFlag::USE_XCORRECTION;
}
if (reverse) {
session.params.flags |= ScanFlag::REVERSE;
}
compute_session(dev, session, sensor);
std::vector<uint16_t> slope_table0;
@ -2702,7 +2710,7 @@ void CommandSetGl646::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
settings.threshold = 0;
// setup for scan
setup_for_scan(dev, local_sensor, &dev->reg, settings, true, false, false);
setup_for_scan(dev, local_sensor, &dev->reg, settings, true, false, false, false);
/* we are not going to move, so clear these bits */
dev->reg.find_reg(0x02).value &= ~(REG_0x02_FASTFED | REG_0x02_AGOHOME);
@ -2756,7 +2764,7 @@ static void gl646_repark_head(Genesys_Device* dev)
const auto& sensor = sanei_genesys_find_sensor(dev, settings.xres, 3,
dev->model->default_method);
setup_for_scan(dev, sensor, &dev->reg, settings, false, false, false);
setup_for_scan(dev, sensor, &dev->reg, settings, false, false, false, false);
/* TODO seems wrong ... no effective scan */
dev->reg.find_reg(0x01).value &= ~REG_0x01_SCAN;
@ -2967,7 +2975,7 @@ static void simple_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
/* setup for move then scan */
split = !(move && settings.tl_y > 0);
setup_for_scan(dev, sensor, &dev->reg, settings, split, false, false);
setup_for_scan(dev, sensor, &dev->reg, settings, split, false, false, !forward);
/* allocate memory fo scan : LINCNT may have been adjusted for CCD reordering */
if (dev->model->is_cis) {
@ -3011,11 +3019,6 @@ static void simple_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
/* no automatic go home if no movement */
dev->reg.find_reg(0x02).value &= ~REG_0x02_AGOHOME;
}
if (!forward) {
dev->reg.find_reg(0x02).value |= REG_0x02_MTRREV;
} else {
dev->reg.find_reg(0x02).value &= ~REG_0x02_MTRREV;
}
/* no automatic go home when using XPA */
if (settings.scan_method == ScanMethod::TRANSPARENCY) {

Wyświetl plik

@ -73,7 +73,8 @@ static void setup_for_scan(Genesys_Device* device,
Genesys_Settings settings,
bool split,
bool xcorrection,
bool ycorrection);
bool ycorrection,
bool reverse);
/**
* Does a simple move of the given distance by doing a scan at lowest resolution

Wyświetl plik

@ -957,6 +957,10 @@ HOME_FREE: 3
r->value &= ~0x40;
if (has_flag(flags, MotorFlag::REVERSE)) {
r->value |= REG_0x02_MTRREV;
}
gl841_send_slope_table(dev, 3, fast_slope_table, 256);
r = sanei_genesys_get_address(reg, 0x67);
@ -2308,11 +2312,9 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home)
const auto& sensor = sanei_genesys_find_sensor_any(dev);
gl841_init_motor_regs(dev, sensor, &local_reg, 65536, MOTOR_ACTION_GO_HOME, MotorFlag::NONE);
gl841_init_motor_regs(dev, sensor, &local_reg, 65536, MOTOR_ACTION_GO_HOME, MotorFlag::REVERSE);
/* set up for reverse and no scan */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
r->value |= REG_0x02_MTRREV;
// set up for no scan
r = sanei_genesys_get_address(&local_reg, REG_0x01);
r->value &= ~REG_0x01_SCAN;

Wyświetl plik

@ -873,6 +873,12 @@ static void gl843_init_motor_regs_scan(Genesys_Device* dev,
r->value |= REG_0x02_ACDCDIS;
}
if (has_flag(flags, MotorFlag::REVERSE)) {
r->value |= REG_0x02_MTRREV;
} else {
r->value &= ~REG_0x02_MTRREV;
}
/* scan and backtracking slope table */
auto scan_table = sanei_genesys_slope_table(scan_yres, exposure, dev->motor.base_ydpi,
factor, motor_profile);
@ -1220,6 +1226,9 @@ static void gl843_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
if (has_flag(session.params.flags, ScanFlag::USE_XPA)) {
mflags |= MotorFlag::USE_XPA;
}
if (has_flag(session.params.flags, ScanFlag::REVERSE)) {
mflags |= MotorFlag::REVERSE;
}
unsigned scan_lines = dev->model->is_cis ? session.output_line_count * session.params.channels
: session.output_line_count;
@ -1859,7 +1868,8 @@ void CommandSetGl843::slow_back_home(Genesys_Device* dev, bool wait_until_home)
session.params.flags = ScanFlag::DISABLE_SHADING |
ScanFlag::DISABLE_GAMMA |
ScanFlag::DISABLE_BUFFER_FULL_MOVE |
ScanFlag::IGNORE_LINE_DISTANCE;
ScanFlag::IGNORE_LINE_DISTANCE |
ScanFlag::REVERSE;
compute_session(dev, session, sensor);
gl843_init_scan_regs(dev, sensor, &local_reg, session);
@ -1867,9 +1877,7 @@ void CommandSetGl843::slow_back_home(Genesys_Device* dev, bool wait_until_home)
// clear scan and feed count
dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT | REG_0x0D_CLRMCNT);
/* set up for reverse and no scan */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
r->value |= REG_0x02_MTRREV;
// set up for no scan
r = sanei_genesys_get_address(&local_reg, REG_0x01);
r->value &= ~REG_0x01_SCAN;
@ -3136,7 +3144,6 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
Genesys_Register_Set local_reg;
int dpi;
unsigned int pass, count, found, x, y;
GenesysRegister *r;
dev->cmd_set->set_fe(dev, sensor, AFE_SET);
gl843_stop_action(dev);
@ -3171,18 +3178,13 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
session.params.scan_mode = ScanColorMode::GRAY;
session.params.color_filter = ColorFilter::RED;
session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_SHADING;
if (!forward) {
session.params.flags = ScanFlag::REVERSE;
}
compute_session(dev, session, calib_sensor);
gl843_init_scan_regs(dev, calib_sensor, &local_reg, session);
/* set up for reverse or forward */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
if (forward) {
r->value &= ~REG_0x02_MTRREV;
} else {
r->value |= REG_0x02_MTRREV;
}
dev->interface->write_registers(local_reg);
dev->cmd_set->begin_scan(dev, calib_sensor, &local_reg, true);

Wyświetl plik

@ -423,6 +423,11 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev,
if (has_flag(flags, MotorFlag::DISABLE_BUFFER_FULL_MOVE) ||(scan_yres>=sensor.optical_res)) {
r->value |= REG_0x02_ACDCDIS;
}
if (has_flag(flags, MotorFlag::REVERSE)) {
r->value |= REG_0x02_MTRREV;
} else {
r->value &= ~REG_0x02_MTRREV;
}
/* scan and backtracking slope table */
auto scan_table = sanei_genesys_slope_table(scan_yres, scan_exposure_time, dev->motor.base_ydpi,
@ -785,6 +790,9 @@ static void gl846_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
if (has_flag(session.params.flags, ScanFlag::FEEDING)) {
mflags |= MotorFlag::FEED;
}
if (has_flag(session.params.flags, ScanFlag::REVERSE)) {
mflags |= MotorFlag::REVERSE;
}
gl846_init_motor_regs_scan(dev, sensor, reg, motor_profile, exposure_time, slope_dpi,
dev->model->is_cis ? session.output_line_count * session.params.channels
@ -957,7 +965,6 @@ void CommandSetGl846::slow_back_home(Genesys_Device* dev, bool wait_until_home)
{
DBG_HELPER_ARGS(dbg, "wait_until_home = %d", wait_until_home);
Genesys_Register_Set local_reg;
GenesysRegister *r;
uint8_t val;
int loop = 0;
ScanColorMode scan_mode;
@ -1014,7 +1021,8 @@ void CommandSetGl846::slow_back_home(Genesys_Device* dev, bool wait_until_home)
session.params.color_filter = ColorFilter::RED;
session.params.flags = ScanFlag::DISABLE_SHADING |
ScanFlag::DISABLE_GAMMA |
ScanFlag::IGNORE_LINE_DISTANCE;
ScanFlag::IGNORE_LINE_DISTANCE |
ScanFlag::REVERSE;
compute_session(dev, session, sensor);
gl846_init_scan_regs(dev, sensor, &local_reg, session);
@ -1024,10 +1032,6 @@ void CommandSetGl846::slow_back_home(Genesys_Device* dev, bool wait_until_home)
// clear scan and feed count
dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT | REG_0x0D_CLRMCNT);
/* set up for reverse */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
r->value |= REG_0x02_MTRREV;
dev->interface->write_registers(local_reg);
try {
@ -1835,7 +1839,6 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
size_t size;
unsigned int pass, count, found, x, y;
char title[80];
GenesysRegister *r;
set_fe(dev, sensor, AFE_SET);
@ -1868,6 +1871,9 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
session.params.color_filter = ColorFilter::RED;
session.params.flags = ScanFlag::DISABLE_SHADING |
ScanFlag::DISABLE_GAMMA;
if (!forward) {
session.params.flags |= ScanFlag::REVERSE;
}
compute_session(dev, session, sensor);
gl846_init_scan_regs(dev, sensor, &local_reg, session);
@ -1875,14 +1881,6 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
size = pixels * channels * lines * (session.params.depth / 8);
std::vector<uint8_t> data(size);
/* set up for reverse or forward */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
if (forward) {
r->value &= ~REG_0x02_MTRREV;
} else {
r->value |= REG_0x02_MTRREV;
}
dev->interface->write_registers(local_reg);
begin_scan(dev, sensor, &local_reg, true);

Wyświetl plik

@ -462,6 +462,12 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev,
r->value |= REG_0x02_ACDCDIS;
}
if (has_flag(flags, MotorFlag::REVERSE)) {
r->value |= REG_0x02_MTRREV;
} else {
r->value &= ~REG_0x02_MTRREV;
}
/* scan and backtracking slope table */
auto scan_table = sanei_genesys_slope_table(scan_yres, scan_exposure_time, dev->motor.base_ydpi,
factor, motor_profile);
@ -797,6 +803,9 @@ static void gl847_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
if (has_flag(session.params.flags, ScanFlag::FEEDING)) {
mflags |= MotorFlag::FEED;
}
if (has_flag(session.params.flags, ScanFlag::REVERSE)) {
mflags |= MotorFlag::REVERSE;
}
gl847_init_motor_regs_scan(dev, sensor, reg, motor_profile, exposure_time, slope_dpi,
dev->model->is_cis ? session.output_line_count * session.params.channels
@ -1007,7 +1016,6 @@ void CommandSetGl847::slow_back_home(Genesys_Device* dev, bool wait_until_home)
{
DBG_HELPER_ARGS(dbg, "wait_until_home = %d", wait_until_home);
Genesys_Register_Set local_reg;
GenesysRegister *r;
uint8_t val;
int loop = 0;
ScanColorMode scan_mode;
@ -1064,7 +1072,8 @@ void CommandSetGl847::slow_back_home(Genesys_Device* dev, bool wait_until_home)
session.params.color_filter = ColorFilter::RED;
session.params.flags = ScanFlag::DISABLE_SHADING |
ScanFlag::DISABLE_GAMMA |
ScanFlag::IGNORE_LINE_DISTANCE;
ScanFlag::IGNORE_LINE_DISTANCE |
ScanFlag::REVERSE;
compute_session(dev, session, sensor);
gl847_init_scan_regs(dev, sensor, &local_reg, session);
@ -1074,10 +1083,6 @@ void CommandSetGl847::slow_back_home(Genesys_Device* dev, bool wait_until_home)
// clear scan and feed count
dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT | REG_0x0D_CLRMCNT);
/* set up for reverse */
r = sanei_genesys_get_address (&local_reg, REG_0x02);
r->value |= REG_0x02_MTRREV;
dev->interface->write_registers(local_reg);
try {
@ -1905,7 +1910,6 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
size_t size;
unsigned int pass, count, found, x, y;
char title[80];
GenesysRegister *r;
set_fe(dev, sensor, AFE_SET);
gl847_stop_action(dev);
@ -1937,6 +1941,9 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
session.params.color_filter = ColorFilter::RED;
session.params.flags = ScanFlag::DISABLE_SHADING |
ScanFlag::DISABLE_GAMMA;
if (!forward) {
session.params.flags |= ScanFlag::REVERSE;
}
compute_session(dev, session, sensor);
size = pixels * channels * lines * (session.params.depth / 8);
@ -1944,14 +1951,6 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
gl847_init_scan_regs(dev, sensor, &local_reg, session);
/* set up for reverse or forward */
r = sanei_genesys_get_address(&local_reg, REG_0x02);
if (forward) {
r->value &= ~REG_0x02_MTRREV;
} else {
r->value |= REG_0x02_MTRREV;
}
dev->interface->write_registers(local_reg);
begin_scan(dev, sensor, &local_reg, true);