genesys: Cache physical register state in the device on reads

merge-requests/111/head
Povilas Kanapickas 2019-08-02 22:38:58 +03:00
rodzic 5bd9ab4941
commit 6014645664
10 zmienionych plików z 219 dodań i 247 usunięć

Wyświetl plik

@ -72,6 +72,23 @@ void Genesys_Device::clear()
dark_average_data.clear();
}
uint8_t Genesys_Device::read_register(uint16_t address)
{
uint8_t value;
sanei_genesys_read_register(this, address, &value);
update_register_state(address, value);
return value;
}
void Genesys_Device::update_register_state(uint16_t address, uint8_t value)
{
if (physical_regs.has_reg(address)) {
physical_regs.set8(address, value);
} else {
physical_regs.init_reg(address, value);
}
}
void apply_reg_settings_to_device(Genesys_Device& dev, const GenesysRegisterSettingSet& regs)
{
for (const auto& reg : regs) {

Wyświetl plik

@ -331,6 +331,14 @@ struct Genesys_Device
// binary logger file
FILE *binary = nullptr;
// A snapshot of the last known physical state of the device registers. This variable is updated
// whenever a register is written or read to the scanner.
Genesys_Register_Set physical_regs;
uint8_t read_register(uint16_t address);
private:
void update_register_state(uint16_t address, uint8_t value);
};
void apply_reg_settings_to_device(Genesys_Device& dev, const GenesysRegisterSettingSet& regs);

Wyświetl plik

@ -152,9 +152,8 @@ static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi, int half_ccd
static void gl124_homsnr_gpio(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val;
sanei_genesys_read_register(dev, REG32, &val);
uint8_t val = dev->read_register(REG32);
val &= ~REG32_GPIO10;
sanei_genesys_write_register(dev, REG32, val);
}
@ -585,7 +584,7 @@ static void gl124_set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint
dev->frontend = dev->frontend_initial;
}
sanei_genesys_read_register(dev, REG0A, &val);
val = dev->read_register(REG0A);
/* route to correct analog FE */
switch ((val & REG0A_SIFSEL)>>REG0AS_SIFSEL)
@ -1530,7 +1529,7 @@ static void gl124_stop_action(Genesys_Device* dev)
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, REG100, &val40);
val40 = dev->read_register(REG100);
/* only stop action if needed */
if (!(val40 & REG100_DATAENB) && !(val40 & REG100_MOTMFLG))
@ -1555,7 +1554,7 @@ static void gl124_stop_action(Genesys_Device* dev)
{
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, REG100, &val40);
val40 = dev->read_register(REG100);
/* if scanner is in command mode, we are done */
if (!(val40 & REG100_DATAENB) && !(val40 & REG100_MOTMFLG)
@ -1580,10 +1579,9 @@ static void gl124_stop_action(Genesys_Device* dev)
*/
static void gl124_setup_scan_gpio(Genesys_Device* dev, int resolution)
{
uint8_t val;
DBG_HELPER(dbg);
sanei_genesys_read_register(dev, REG32, &val);
uint8_t val = dev->read_register(REG32);
/* LiDE 110, 210 and 220 cases */
if(dev->model->gpo_type != GPO_CANONLIDE120)
@ -1635,8 +1633,6 @@ static void gl124_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
(void) sensor;
(void) reg;
uint8_t val;
// set up GPIO for scan
gl124_setup_scan_gpio(dev,dev->settings.yres);
@ -1644,8 +1640,8 @@ static void gl124_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
sanei_genesys_write_register(dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT);
// enable scan and motor
sanei_genesys_read_register(dev, REG01, &val);
val |= REG01_SCAN;
uint8_t val = dev->read_register(REG01);
val |= REG01_SCAN;
sanei_genesys_write_register(dev, REG01, val);
if (start_motor) {
@ -1675,11 +1671,10 @@ static void gl124_end_scan(Genesys_Device* dev, Genesys_Register_Set* reg, SANE_
static void gl124_rewind(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t byte;
// set motor reverse
sanei_genesys_read_register(dev, 0x02, &byte);
byte |= 0x04;
uint8_t byte = dev->read_register(0x02);
byte |= 0x04;
sanei_genesys_write_register(dev, 0x02, byte);
const auto& sensor = sanei_genesys_find_sensor_any(dev);
@ -1689,14 +1684,14 @@ static void gl124_rewind(Genesys_Device* dev)
do
{
sanei_genesys_sleep_ms(100);
sanei_genesys_read_register(dev, REG100, &byte);
byte = dev->read_register(REG100);
}
while(byte & REG100_MOTMFLG);
gl124_end_scan(dev, &dev->reg, SANE_TRUE);
// restore direction
sanei_genesys_read_register(dev, 0x02, &byte);
byte &= 0xfb;
byte = dev->read_register(0x02);
byte &= 0xfb;
sanei_genesys_write_register(dev, 0x02, byte);
}
@ -2095,10 +2090,10 @@ static void gl124_init_regs_for_shading(Genesys_Device* dev, const Genesys_Senso
static void gl124_wait_for_motor_stop(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val40, val;
uint8_t val;
sanei_genesys_get_status(dev, &val);
sanei_genesys_read_register(dev, REG100, &val40);
uint8_t val40 = dev->read_register(REG100);
if ((val & MOTORENB) == 0 && (val40 & REG100_MOTMFLG) == 0)
return;
@ -2106,7 +2101,7 @@ static void gl124_wait_for_motor_stop(Genesys_Device* dev)
do {
sanei_genesys_sleep_ms(10);
sanei_genesys_get_status(dev, &val);
sanei_genesys_read_register(dev, REG100, &val40);
val40 = dev->read_register(REG100);
} while ((val & MOTORENB) ||(val40 & REG100_MOTMFLG));
sanei_genesys_sleep_ms(50);
}
@ -2196,7 +2191,7 @@ static void gl124_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
uint32_t addr, length, strpixel ,endpixel, x, factor, segcnt, pixels, i;
uint32_t lines, channels;
uint16_t dpiset,dpihw;
uint8_t val,*ptr,*src;
uint8_t *ptr, *src;
/* logical size of a color as seen by generic code of the frontend */
length = (uint32_t) (size / 3);
@ -2291,7 +2286,7 @@ static void gl124_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
/* next shading coefficient */
ptr+=4;
}
sanei_genesys_read_register(dev, 0xd0+i, &val);
uint8_t val = dev->read_register(0xd0+i);
addr = val * 8192 + 0x10000000;
sanei_genesys_write_ahb(dev, addr, pixels*dev->segnb, buffer.data());
}
@ -2546,14 +2541,13 @@ static void gl124_offset_calibration(Genesys_Device* dev, const Genesys_Sensor&
Genesys_Register_Set& regs)
{
DBG_HELPER(dbg);
uint8_t reg0a;
unsigned int channels, bpp;
int pass = 0, avg, total_size;
int topavg, bottomavg, resolution, lines;
int top, bottom, black_pixels, pixels;
// no gain nor offset for TI AFE
sanei_genesys_read_register(dev, REG0A, &reg0a);
uint8_t reg0a = dev->read_register(REG0A);
if(((reg0a & REG0A_SIFSEL)>>REG0AS_SIFSEL)==3)
{
return;
@ -2697,7 +2691,6 @@ static void gl124_coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sen
DBG_HELPER_ARGS(dbg, "dpi = %d", dpi);
int pixels;
int total_size;
uint8_t reg0a;
int i, j, channels;
int max[3];
float gain[3],coeff;
@ -2706,7 +2699,7 @@ static void gl124_coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sen
int bpp;
// no gain nor offset for TI AFE
sanei_genesys_read_register(dev, REG0A, &reg0a);
uint8_t reg0a = dev->read_register(REG0A);
if(((reg0a & REG0A_SIFSEL)>>REG0AS_SIFSEL)==3)
{
return;
@ -2990,7 +2983,6 @@ static void gl124_init(Genesys_Device* dev)
static void gl124_boot(Genesys_Device* dev, SANE_Bool cold)
{
DBG_HELPER(dbg);
uint8_t val;
// reset ASIC in case of cold boot
if (cold) {
@ -3002,14 +2994,14 @@ static void gl124_boot(Genesys_Device* dev, SANE_Bool cold)
sanei_genesys_write_register(dev, 0x36, 0x01);
// set GPIO 17
sanei_genesys_read_register(dev, 0x33, &val);
val |= 0x01;
uint8_t val = dev->read_register(0x33);
val |= 0x01;
sanei_genesys_write_register(dev, 0x33, val);
// test CHKVER
sanei_genesys_read_register(dev, REG100, &val);
val = dev->read_register(REG100);
if (val & REG100_CHKVER) {
sanei_genesys_read_register(dev, 0x00, &val);
val = dev->read_register(0x00);
DBG(DBG_info, "%s: reported version for genesys chip is 0x%02x\n", __func__, val);
}
@ -3046,9 +3038,7 @@ static void gl124_update_hardware_sensors(Genesys_Scanner* s)
any of them.
*/
DBG_HELPER(dbg);
uint8_t val = 0;
sanei_genesys_read_register(s->dev, REG31, &val);
uint8_t val = s->dev->read_register(REG31);
/* TODO : for the next scanner special case,
* add another per scanner button profile struct to avoid growing

Wyświetl plik

@ -1024,7 +1024,6 @@ gl646_setup_sensor (Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys_
static void gl646_asic_test(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val;
size_t size, verify_size;
unsigned int i;
@ -1033,14 +1032,14 @@ static void gl646_asic_test(Genesys_Device* dev)
sanei_genesys_write_register(dev, 0x39, 0xad);
sanei_genesys_read_register(dev, 0x4e, &val);
uint8_t val = dev->read_register(0x4e);
if (val != 0xde) /* value of register 0x38 */
{
throw SaneException("register contains invalid value");
}
sanei_genesys_read_register(dev, 0x4f, &val);
val = dev->read_register(0x4f);
if (val != 0xad) /* value of register 0x39 */
{

Wyświetl plik

@ -292,7 +292,6 @@ static void sanei_gl841_asic_test(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val;
size_t size, verify_size;
unsigned int i;
@ -302,14 +301,14 @@ static void sanei_gl841_asic_test(Genesys_Device* dev)
sanei_genesys_write_register(dev, 0x38, 0xde);
sanei_genesys_write_register(dev, 0x39, 0xad);
sanei_genesys_read_register(dev, 0x38, &val);
uint8_t val = dev->read_register(0x38);
if (val != 0xde) /* value of register 0x38 */
{
throw SaneException("register contains invalid value");
}
sanei_genesys_read_register(dev, 0x39, &val);
val = dev->read_register(0x39);
if (val != 0xad) /* value of register 0x39 */
{
@ -483,28 +482,30 @@ gl841_init_lide80 (Genesys_Device * dev)
INITREG (0x88, 0x00);
INITREG (0x89, 0x00);
/* specific scanner settings, clock and gpio first */
sanei_genesys_read_register (dev, REG6B, &val);
// specific scanner settings, clock and gpio first
val = dev->read_register(REG6B);
sanei_genesys_write_register (dev, REG6B, 0x0c);
sanei_genesys_write_register (dev, 0x06, 0x10);
sanei_genesys_write_register (dev, REG6E, 0x6d);
sanei_genesys_write_register (dev, REG6F, 0x80);
sanei_genesys_write_register (dev, REG6B, 0x0e);
sanei_genesys_read_register (dev, REG6C, &val);
val = dev->read_register(REG6C);
sanei_genesys_write_register (dev, REG6C, 0x00);
sanei_genesys_read_register (dev, REG6D, &val);
val = dev->read_register(REG6D);
sanei_genesys_write_register (dev, REG6D, 0x8f);
sanei_genesys_read_register (dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register (dev, REG6B, 0x0e);
sanei_genesys_read_register (dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register (dev, REG6B, 0x0e);
sanei_genesys_read_register (dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register (dev, REG6B, 0x0a);
sanei_genesys_read_register (dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register (dev, REG6B, 0x02);
sanei_genesys_read_register (dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register (dev, REG6B, 0x06);
(void) val; // FIXME: we don't use the information read from registers
sanei_genesys_write_0x8c(dev, 0x10, 0x94);
sanei_genesys_write_register (dev, 0x09, 0x10);
@ -2288,7 +2289,6 @@ dummy \ scanned lines
static void gl841_save_power(Genesys_Device* dev, SANE_Bool enable)
{
DBG_HELPER_ARGS(dbg, "enable = %d", enable);
uint8_t val;
const auto& sensor = sanei_genesys_find_sensor_any(dev);
@ -2301,32 +2301,32 @@ static void gl841_save_power(Genesys_Device* dev, SANE_Bool enable)
/* final state: GPIO8 disabled, GPIO9 enabled, GPIO17 disabled,
GPIO18 disabled*/
sanei_genesys_read_register(dev, REG6D, &val);
uint8_t val = dev->read_register(REG6D);
sanei_genesys_write_register(dev, REG6D, val | 0x80);
sanei_genesys_sleep_ms(1);
/*enable GPIO9*/
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
sanei_genesys_write_register(dev, REG6C, val | 0x01);
/*disable GPO17*/
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO17);
/*disable GPO18*/
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO18);
sanei_genesys_sleep_ms(1);
sanei_genesys_read_register(dev, REG6D, &val);
val = dev->read_register(REG6D);
sanei_genesys_write_register(dev, REG6D, val & ~0x80);
}
if (dev->model->gpo_type == GPO_DP685)
{
sanei_genesys_read_register(dev, REG6B, &val);
uint8_t val = dev->read_register(REG6B);
sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO17);
dev->reg.find_reg(0x6b).value &= ~REG6B_GPO17;
dev->calib_reg.find_reg(0x6b).value &= ~REG6B_GPO17;
@ -2344,27 +2344,27 @@ static void gl841_save_power(Genesys_Device* dev, SANE_Bool enable)
/* final state: GPIO8 enabled, GPIO9 disabled, GPIO17 enabled,
GPIO18 enabled*/
sanei_genesys_read_register(dev, REG6D, &val);
uint8_t val = dev->read_register(REG6D);
sanei_genesys_write_register(dev, REG6D, val | 0x80);
sanei_genesys_sleep_ms(10);
/*disable GPIO9*/
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
sanei_genesys_write_register(dev, REG6C, val & ~0x01);
/*enable GPIO10*/
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
sanei_genesys_write_register(dev, REG6C, val | 0x02);
/*enable GPO17*/
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register(dev, REG6B, val | REG6B_GPO17);
dev->reg.find_reg(0x6b).value |= REG6B_GPO17;
dev->calib_reg.find_reg(0x6b).value |= REG6B_GPO17;
/*enable GPO18*/
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
sanei_genesys_write_register(dev, REG6B, val | REG6B_GPO18);
dev->reg.find_reg(0x6b).value |= REG6B_GPO18;
dev->calib_reg.find_reg(0x6b).value |= REG6B_GPO18;
@ -2373,7 +2373,7 @@ static void gl841_save_power(Genesys_Device* dev, SANE_Bool enable)
if (dev->model->gpo_type == GPO_DP665
|| dev->model->gpo_type == GPO_DP685)
{
sanei_genesys_read_register(dev, REG6B, &val);
uint8_t val = dev->read_register(REG6B);
sanei_genesys_write_register(dev, REG6B, val | REG6B_GPO17);
dev->reg.find_reg(0x6b).value |= REG6B_GPO17;
dev->calib_reg.find_reg(0x6b).value |= REG6B_GPO17;
@ -2457,7 +2457,7 @@ static void gl841_stop_action(Genesys_Device* dev)
{
DBG_HELPER(dbg);
Genesys_Register_Set local_reg;
uint8_t val40, val;
uint8_t val;
unsigned int loop;
sanei_genesys_get_status(dev, &val);
@ -2466,7 +2466,7 @@ static void gl841_stop_action(Genesys_Device* dev)
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, 0x40, &val40);
uint8_t val40 = dev->read_register(0x40);
/* only stop action if needed */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG))
@ -2488,7 +2488,7 @@ static void gl841_stop_action(Genesys_Device* dev)
loop = 10;
while (loop > 0) {
sanei_genesys_read_register(dev, 0x40, &val40);
val40 = dev->read_register(0x40);
if (DBG_LEVEL >= DBG_io) {
sanei_genesys_print_status(val);
}
@ -2509,9 +2509,8 @@ static void gl841_stop_action(Genesys_Device* dev)
static void gl841_get_paper_sensor(Genesys_Device* dev, SANE_Bool * paper_loaded)
{
DBG_HELPER(dbg);
uint8_t val;
sanei_genesys_read_register(dev, REG6D, &val);
uint8_t val = dev->read_register(REG6D);
*paper_loaded = (val & 0x1) == 0;
}
@ -2701,11 +2700,11 @@ static void gl841_detect_document_end(Genesys_Device* dev)
}
DBG(DBG_io, "%s: scancnt=%u lines\n", __func__, scancnt);
sanei_genesys_read_register(dev, 0x25, &val);
val = dev->read_register(0x25);
lincnt = 65536 * val;
sanei_genesys_read_register(dev, 0x26, &val);
val = dev->read_register(0x26);
lincnt += 256 * val;
sanei_genesys_read_register(dev, 0x27, &val);
val = dev->read_register(0x27);
lincnt += val;
DBG(DBG_io, "%s: lincnt=%u lines\n", __func__, lincnt);
postcnt = (SANE_UNFIX(dev->model->post_scan)/MM_PER_INCH) * dev->settings.yres;
@ -2740,7 +2739,7 @@ static void gl841_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
uint8_t val;
if (dev->model->gpo_type == GPO_CANONLIDE80) {
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
val = REG6B_GPO18;
sanei_genesys_write_register(dev, REG6B, val);
}
@ -2837,7 +2836,6 @@ static void gl841_slow_back_home(Genesys_Device* dev, SANE_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;
if (dev->model->is_sheetfed == SANE_TRUE)
@ -2848,13 +2846,14 @@ static void gl841_slow_back_home(Genesys_Device* dev, SANE_Bool wait_until_home)
}
// reset gpio pin
uint8_t val;
if (dev->model->gpo_type == GPO_CANONLIDE35) {
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
val = dev->gpo.value[0];
sanei_genesys_write_register(dev, REG6C, val);
}
if (dev->model->gpo_type == GPO_CANONLIDE80) {
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
val = REG6B_GPO18 | REG6B_GPO17;
sanei_genesys_write_register(dev, REG6B, val);
}
@ -4325,7 +4324,7 @@ static void gl841_update_hardware_sensors(Genesys_Scanner* s)
if (s->dev->model->gpo_type == GPO_CANONLIDE35
|| s->dev->model->gpo_type == GPO_CANONLIDE80)
{
sanei_genesys_read_register(s->dev, REG6D, &val);
val = s->dev->read_register(REG6D);
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_FILE_SW].write((val & 0x02) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
@ -4336,7 +4335,7 @@ static void gl841_update_hardware_sensors(Genesys_Scanner* s)
s->dev->model->gpo_type == GPO_DP665 ||
s->dev->model->gpo_type == GPO_DP685)
{
sanei_genesys_read_register(s->dev, REG6D, &val);
val = s->dev->read_register(REG6D);
s->buttons[BUTTON_PAGE_LOADED_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_SCAN_SW].write((val & 0x02) == 0);

Wyświetl plik

@ -759,7 +759,6 @@ static void gl843_set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint
set == AFE_SET ? "set" :
set == AFE_POWER_SAVE ? "powersave" : "huh?");
(void) sensor;
uint8_t val;
int i;
if (set == AFE_INIT)
@ -770,7 +769,7 @@ static void gl843_set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint
// check analog frontend type
// FIXME: looks like we write to that register with initial data
sanei_genesys_read_register(dev, REG04, &val);
uint8_t val = dev->read_register(REG04);
if ((val & REG04_FESET) != 0x00)
{
// for now there is no support for AD fe
@ -1673,11 +1672,10 @@ gl843_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
static void gl843_save_power(Genesys_Device* dev, SANE_Bool enable)
{
DBG_HELPER_ARGS(dbg, "enable = %d", enable);
uint8_t val;
// switch KV-SS080 lamp off
if (dev->model->gpo_type == GPO_KVSS080) {
sanei_genesys_read_register(dev, REG6C, &val);
uint8_t val = dev->read_register(REG6C);
if (enable) {
val &= 0xef;
} else {
@ -1712,7 +1710,7 @@ static void gl843_stop_action_no_move(Genesys_Device* dev, Genesys_Register_Set*
static void gl843_stop_action(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val40, val;
uint8_t val;
unsigned int loop;
sanei_genesys_get_status(dev, &val);
@ -1721,8 +1719,7 @@ static void gl843_stop_action(Genesys_Device* dev)
sanei_genesys_print_status (val);
}
val40 = 0;
sanei_genesys_read_register(dev, REG40, &val40);
uint8_t val40 = dev->read_register(REG40);
/* only stop action if needed */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG))
@ -1747,8 +1744,7 @@ static void gl843_stop_action(Genesys_Device* dev)
{
sanei_genesys_print_status (val);
}
val40 = 0;
sanei_genesys_read_register(dev, 0x40, &val40);
val40 = dev->read_register(0x40);
/* if scanner is in command mode, we are done */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG)
@ -1767,9 +1763,8 @@ static void gl843_stop_action(Genesys_Device* dev)
static void gl843_get_paper_sensor(Genesys_Device* dev, SANE_Bool * paper_loaded)
{
DBG_HELPER(dbg);
uint8_t val;
sanei_genesys_read_register(dev, REG6D, &val);
uint8_t val = dev->read_register(REG6D);
*paper_loaded = (val & 0x1) == 0;
}
@ -1917,47 +1912,47 @@ static void gl843_set_xpa_motor_power(Genesys_Device* dev, bool set)
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
if (set) {
sanei_genesys_read_register(dev, 0x6c, &val);
val = dev->read_register(0x6c);
val &= ~(REG6C_GPIO16 | REG6C_GPIO13);
if (dev->current_setup.xres >= 2400) {
val &= ~REG6C_GPIO10;
}
sanei_genesys_write_register(dev, 0x6c, val);
sanei_genesys_read_register(dev, 0xa9, &val);
val = dev->read_register(0xa9);
val |= REGA9_GPO30;
val &= ~REGA9_GPO29;
sanei_genesys_write_register(dev, 0xa9, val);
} else {
sanei_genesys_read_register(dev, 0x6c, &val);
val = dev->read_register(0x6c);
val |= REG6C_GPIO16 | REG6C_GPIO13;
sanei_genesys_write_register(dev, 0x6c, val);
sanei_genesys_read_register(dev, 0xa9, &val);
val = dev->read_register(0xa9);
val &= ~REGA9_GPO30;
val |= REGA9_GPO29;
sanei_genesys_write_register(dev, 0xa9, val);
}
} else if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F) {
if (set) {
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
val &= ~REG6C_GPIO14;
if (dev->current_setup.xres >= 2400) {
val |= REG6C_GPIO10;
}
sanei_genesys_write_register(dev, REG6C, val);
sanei_genesys_read_register(dev, REGA6, &val);
val = dev->read_register(REGA6);
val |= REGA6_GPIO17;
val &= ~REGA6_GPIO23;
sanei_genesys_write_register(dev, REGA6, val);
} else {
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
val |= REG6C_GPIO14;
val &= ~REG6C_GPIO10;
sanei_genesys_write_register(dev, REG6C, val);
sanei_genesys_read_register(dev, REGA6, &val);
val = dev->read_register(REGA6);
val &= ~REGA6_GPIO17;
val &= ~REGA6_GPIO23;
sanei_genesys_write_register(dev, REGA6, val);
@ -1965,37 +1960,37 @@ static void gl843_set_xpa_motor_power(Genesys_Device* dev, bool set)
} else if (dev->model->model_id == MODEL_HP_SCANJET_G4050) {
if (set) {
// set MULTFILM et GPOADF
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
val |=REG6B_MULTFILM|REG6B_GPOADF;
sanei_genesys_write_register(dev, REG6B, val);
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
val &= ~REG6C_GPIO15;
sanei_genesys_write_register(dev, REG6C, val);
/* Motor power ? No move at all without this one */
sanei_genesys_read_register(dev, REGA6, &val);
val = dev->read_register(REGA6);
val |= REGA6_GPIO20;
sanei_genesys_write_register(dev,REGA6,val);
sanei_genesys_read_register(dev, REGA8, &val);
val = dev->read_register(REGA8);
val &= ~REGA8_GPO27;
sanei_genesys_write_register(dev, REGA8, val);
sanei_genesys_read_register(dev, REGA9, &val);
val = dev->read_register(REGA9);
val |= REGA9_GPO32|REGA9_GPO31;
sanei_genesys_write_register(dev, REGA9, val);
} else {
// unset GPOADF
sanei_genesys_read_register(dev, REG6B, &val);
val = dev->read_register(REG6B);
val &= ~REG6B_GPOADF;
sanei_genesys_write_register(dev, REG6B, val);
sanei_genesys_read_register(dev, REGA8, &val);
val = dev->read_register(REGA8);
val |= REGA8_GPO27;
sanei_genesys_write_register(dev, REGA8, val);
sanei_genesys_read_register(dev, REGA9, &val);
val = dev->read_register(REGA9);
val &= ~REGA9_GPO31;
sanei_genesys_write_register(dev, REGA9, val);
}
@ -2084,7 +2079,6 @@ static void gl843_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
Genesys_Register_Set* reg, SANE_Bool start_motor)
{
DBG_HELPER(dbg);
uint8_t val;
uint16_t dpiset, dpihw;
/* get back the target dpihw */
@ -2149,8 +2143,8 @@ static void gl843_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
sanei_genesys_write_register(dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT);
// enable scan and motor
sanei_genesys_read_register(dev, REG01, &val);
val |= REG01_SCAN;
uint8_t val = dev->read_register(REG01);
val |= REG01_SCAN;
sanei_genesys_write_register(dev, REG01, val);
if (start_motor) {
@ -3520,9 +3514,9 @@ static void gl843_boot(Genesys_Device* dev, SANE_Bool cold)
sanei_genesys_write_0x8c(dev, 0x0f, val);
// test CHKVER
sanei_genesys_read_register(dev, REG40, &val);
val = dev->read_register(REG40);
if (val & REG40_CHKVER) {
sanei_genesys_read_register(dev, 0x00, &val);
val = dev->read_register(0x00);
DBG(DBG_info, "%s: reported version for genesys chip is 0x%02x\n", __func__, val);
}
@ -3607,9 +3601,8 @@ static void gl843_update_hardware_sensors(Genesys_Scanner* s)
/* do what is needed to get a new set of events, but try to not lose
any of them.
*/
uint8_t val;
sanei_genesys_read_register(s->dev, REG6D, &val);
uint8_t val = s->dev->read_register(REG6D);
switch (s->dev->model->gpo_type)
{

Wyświetl plik

@ -495,10 +495,9 @@ static void gl846_set_adi_fe(Genesys_Device* dev, uint8_t set)
static void gl846_homsnr_gpio(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val;
sanei_genesys_read_register(dev, REG6C, &val);
val |= 0x41;
uint8_t val = dev->read_register(REG6C);
val |= 0x41;
sanei_genesys_write_register(dev, REG6C, val);
}
@ -664,7 +663,7 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev,
/* hi res motor speed GPIO */
/*
sanei_genesys_read_register(dev, REG6C, &effective);
uint8_t effective = dev->read_register(REG6C);
*/
/* if quarter step, bipolar Vref2 */
@ -689,7 +688,7 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev,
/* effective scan */
/*
sanei_genesys_read_register(dev, REG6C, &effective);
effective = dev->read_register(REG6C);
val = effective | REG6C_GPIO10;
sanei_genesys_write_register(dev, REG6C, val);
*/
@ -1360,7 +1359,7 @@ static void gl846_start_action(Genesys_Device* dev)
static void gl846_stop_action(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val40, val;
uint8_t val;
unsigned int loop;
// post scan gpio : without that HOMSNR is unreliable
@ -1371,7 +1370,7 @@ static void gl846_stop_action(Genesys_Device* dev)
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, REG40, &val40);
uint8_t val40 = dev->read_register(REG40);
/* only stop action if needed */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG))
@ -1395,7 +1394,7 @@ static void gl846_stop_action(Genesys_Device* dev)
{
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, REG40, &val40);
val40 = dev->read_register(REG40);
/* if scanner is in command mode, we are done */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG)
@ -1422,7 +1421,7 @@ static void gl846_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
/* XXX STEF XXX SCAN GPIO */
/*
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
sanei_genesys_write_register(dev, REG6C, val);
*/
@ -1431,8 +1430,8 @@ static void gl846_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
val = REG0D_CLRMCNT;
sanei_genesys_write_register(dev, REG0D, val);
sanei_genesys_read_register(dev, REG01, &val);
val |= REG01_SCAN;
val = dev->read_register(REG01);
val |= REG01_SCAN;
sanei_genesys_write_register(dev, REG01, val);
r = sanei_genesys_get_address (reg, REG01);
r->value = val;
@ -2008,8 +2007,8 @@ static void gl846_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
ptr+=4;
}
sanei_genesys_read_register(dev, 0xd0+i, &val);
addr = val * 8192 + 0x10000000;
val = dev->read_register(0xd0+i);
addr = val * 8192 + 0x10000000;
sanei_genesys_write_ahb(dev, addr, pixels, buffer.data());
}
}
@ -2269,9 +2268,9 @@ static void gl846_boot(Genesys_Device* dev, SANE_Bool cold)
sanei_genesys_write_0x8c(dev, 0x0f, val);
// test CHKVER
sanei_genesys_read_register(dev, REG40, &val);
val = dev->read_register(REG40);
if (val & REG40_CHKVER) {
sanei_genesys_read_register(dev, 0x00, &val);
val = dev->read_register(0x00);
DBG(DBG_info, "%s: reported version for genesys chip is 0x%02x\n", __func__, val);
}
@ -2336,7 +2335,7 @@ static void gl846_update_hardware_sensors(Genesys_Scanner* s)
email=0x04;
copy=0x08;
}
sanei_genesys_read_register(s->dev, REG6D, &val);
val = s->dev->read_register(REG6D);
s->buttons[BUTTON_SCAN_SW].write((val & scan) == 0);
s->buttons[BUTTON_FILE_SW].write((val & file) == 0);
@ -2586,14 +2585,13 @@ static void gl846_offset_calibration(Genesys_Device* dev, const Genesys_Sensor&
Genesys_Register_Set& regs)
{
DBG_HELPER(dbg);
uint8_t reg04;
unsigned int channels, bpp;
int pass = 0, avg, total_size;
int topavg, bottomavg, resolution, lines;
int top, bottom, black_pixels, pixels;
// no gain nor offset for AKM AFE
sanei_genesys_read_register(dev, REG04, &reg04);
uint8_t reg04 = dev->read_register(REG04);
if ((reg04 & REG04_FESET) == 0x02)
{
return;
@ -2727,7 +2725,6 @@ static void gl846_coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sen
DBG_HELPER(dbg);
int pixels;
int total_size;
uint8_t reg04;
int i, j, channels;
int max[3];
float gain[3],coeff;
@ -2738,7 +2735,7 @@ static void gl846_coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sen
DBG(DBG_proc, "%s: dpi = %d\n", __func__, dpi);
// no gain nor offset for AKM AFE
sanei_genesys_read_register(dev, REG04, &reg04);
uint8_t reg04 = dev->read_register(REG04);
if ((reg04 & REG04_FESET) == 0x02)
{
return;

Wyświetl plik

@ -519,14 +519,14 @@ static void gl847_set_ad_fe(Genesys_Device* dev, uint8_t set)
static void gl847_homsnr_gpio(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val;
uint8_t val;
if (dev->model->gpo_type == GPO_CANONLIDE700) {
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
val &= ~REG6C_GPIO10;
sanei_genesys_write_register(dev, REG6C, val);
} else {
sanei_genesys_read_register(dev, REG6C, &val);
val = dev->read_register(REG6C);
val |= REG6C_GPIO10;
sanei_genesys_write_register(dev, REG6C, val);
}
@ -541,8 +541,7 @@ static void gl847_set_fe(Genesys_Device* dev, const Genesys_Sensor& sensor, uint
(void) sensor;
uint8_t val;
sanei_genesys_read_register(dev, REG04, &val);
uint8_t val = dev->read_register(REG04);
uint8_t frontend_type = val & REG04_FESET;
// route to AD devices
@ -581,7 +580,7 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev,
GenesysRegister *r;
uint32_t z1, z2;
unsigned int min_restep = 0x20;
uint8_t val, effective;
uint8_t val;
int fast_step_type;
unsigned int ccdlmt,tgtime;
@ -696,7 +695,7 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev,
tgtime=1<<(r->value & REG1C_TGTIME);
// hi res motor speed GPIO
sanei_genesys_read_register(dev, REG6C, &effective);
uint8_t effective = dev->read_register(REG6C);
/* if quarter step, bipolar Vref2 */
if (scan_step_type > 1)
@ -717,8 +716,8 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev,
sanei_genesys_write_register(dev, REG6C, val);
// effective scan
sanei_genesys_read_register(dev, REG6C, &effective);
val = effective | REG6C_GPIO10;
effective = dev->read_register(REG6C);
val = effective | REG6C_GPIO10;
sanei_genesys_write_register(dev, REG6C, val);
min_restep=scan_steps/2-1;
@ -1377,7 +1376,7 @@ static void gl847_start_action(Genesys_Device* dev)
static void gl847_stop_action(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val40, val;
uint8_t val;
unsigned int loop;
// post scan gpio : without that HOMSNR is unreliable
@ -1388,7 +1387,7 @@ static void gl847_stop_action(Genesys_Device* dev)
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, REG40, &val40);
uint8_t val40 = dev->read_register(REG40);
/* only stop action if needed */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG))
@ -1413,7 +1412,7 @@ static void gl847_stop_action(Genesys_Device* dev)
{
sanei_genesys_print_status (val);
}
sanei_genesys_read_register(dev, REG40, &val40);
val40 = dev->read_register(REG40);
/* if scanner is in command mode, we are done */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG)
@ -1440,8 +1439,8 @@ static void gl847_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
// clear GPIO 10
if (dev->model->gpo_type != GPO_CANONLIDE700) {
sanei_genesys_read_register(dev, REG6C, &val);
val &= ~REG6C_GPIO10;
val = dev->read_register(REG6C);
val &= ~REG6C_GPIO10;
sanei_genesys_write_register(dev, REG6C, val);
}
@ -1450,8 +1449,8 @@ static void gl847_begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
val = REG0D_CLRMCNT;
sanei_genesys_write_register(dev, REG0D, val);
sanei_genesys_read_register(dev, REG01, &val);
val |= REG01_SCAN;
val = dev->read_register(REG01);
val |= REG01_SCAN;
sanei_genesys_write_register(dev, REG01, val);
r = sanei_genesys_get_address (reg, REG01);
r->value = val;
@ -1487,8 +1486,8 @@ static void gl847_rewind(Genesys_Device* dev)
// set motor reverse
sanei_genesys_read_register(dev, 0x02, &byte);
byte |= 0x04;
uint8_t byte = dev->read_register(0x02);
byte |= 0x04;
sanei_genesys_write_register(dev, 0x02, byte);
// and start scan, then wait completion
@ -1496,14 +1495,14 @@ static void gl847_rewind(Genesys_Device* dev)
do
{
sanei_genesys_sleep_ms(100);
sanei_genesys_read_register(dev, REG40, &byte);
byte = dev->read_register(REG40);
}
while(byte & REG40_MOTMFLG);
gl847_end_scan(dev, dev->reg, SANE_TRUE);
// restore direction
sanei_genesys_read_register(dev, 0x02, &byte);
byte &= 0xfb;
byte = dev->read_register(0x02);
byte &= 0xfb;
sanei_genesys_write_register(dev, 0x02, byte);
}
#endif
@ -2061,8 +2060,8 @@ static void gl847_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
ptr+=4;
}
sanei_genesys_read_register(dev, 0xd0+i, &val);
addr = val * 8192 + 0x10000000;
val = dev->read_register(0xd0+i);
addr = val * 8192 + 0x10000000;
sanei_genesys_write_ahb(dev, addr, pixels, buffer.data());
}
}
@ -2352,7 +2351,6 @@ static void gl847_init_memory_layout(Genesys_Device* dev)
static void gl847_boot(Genesys_Device* dev, SANE_Bool cold)
{
DBG_HELPER(dbg);
uint8_t val;
// reset ASIC if cold boot
if (cold) {
@ -2361,9 +2359,9 @@ static void gl847_boot(Genesys_Device* dev, SANE_Bool cold)
}
// test CHKVER
sanei_genesys_read_register(dev, REG40, &val);
uint8_t val = dev->read_register(REG40);
if (val & REG40_CHKVER) {
sanei_genesys_read_register(dev, 0x00, &val);
val = dev->read_register(0x00);
DBG(DBG_info, "%s: reported version for genesys chip is 0x%02x\n", __func__, val);
}
@ -2431,7 +2429,7 @@ static void gl847_update_hardware_sensors(Genesys_Scanner* s)
email=0x04;
copy=0x08;
}
sanei_genesys_read_register(s->dev, REG6D, &val);
val = s->dev->read_register(REG6D);
s->buttons[BUTTON_SCAN_SW].write((val & scan) == 0);
s->buttons[BUTTON_FILE_SW].write((val & file) == 0);
@ -2680,14 +2678,13 @@ static void gl847_offset_calibration(Genesys_Device* dev, const Genesys_Sensor&
Genesys_Register_Set& regs)
{
DBG_HELPER(dbg);
uint8_t reg04;
unsigned int channels, bpp;
int pass = 0, avg, total_size;
int topavg, bottomavg, resolution, lines;
int top, bottom, black_pixels, pixels;
// no gain nor offset for AKM AFE
sanei_genesys_read_register(dev, REG04, &reg04);
uint8_t reg04 = dev->read_register(REG04);
if ((reg04 & REG04_FESET) == 0x02)
{
return;
@ -2821,7 +2818,6 @@ static void gl847_coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sen
DBG_HELPER_ARGS(dbg, "dpi = %d", dpi);
int pixels;
int total_size;
uint8_t reg04;
int i, j, channels;
int max[3];
float gain[3],coeff;
@ -2830,7 +2826,7 @@ static void gl847_coarse_gain_calibration(Genesys_Device* dev, const Genesys_Sen
int bpp;
// no gain nor offset for AKM AFE
sanei_genesys_read_register(dev, REG04, &reg04);
uint8_t reg04 = dev->read_register(REG04);
if ((reg04 & REG04_FESET) == 0x02)
{
return;

Wyświetl plik

@ -537,7 +537,6 @@ void sanei_genesys_set_buffer_address(Genesys_Device* dev, uint32_t addr)
void sanei_genesys_fe_read_data (Genesys_Device* dev, uint8_t addr, uint16_t* data)
{
DBG_HELPER(dbg);
uint8_t value;
Genesys_Register_Set reg;
reg.init_reg(0x50, addr);
@ -546,9 +545,9 @@ void sanei_genesys_fe_read_data (Genesys_Device* dev, uint8_t addr, uint16_t* da
dev->model->cmd_set->bulk_write_register(dev, reg);
// read data
sanei_genesys_read_register(dev, 0x46, &value);
uint8_t value = dev->read_register(0x46);
*data = 256 * value;
sanei_genesys_read_register(dev, 0x47, &value);
value = dev->read_register(0x47);
*data += value;
DBG(DBG_io, "%s (0x%02x, 0x%04x)\n", __func__, addr, *data);
@ -591,7 +590,7 @@ void sanei_genesys_get_status(Genesys_Device* dev, uint8_t* status)
sanei_genesys_read_hregister(dev, 0x101, status);
return;
}
sanei_genesys_read_register(dev, 0x41, status);
*status = dev->read_register(0x41);
}
/**
@ -656,54 +655,39 @@ genesys_dpiset (Genesys_Register_Set * reg)
void sanei_genesys_read_valid_words(Genesys_Device* dev, unsigned int* words)
{
DBG_HELPER(dbg);
uint8_t value;
switch (dev->model->asic_type)
{
case GENESYS_GL124:
sanei_genesys_read_hregister(dev, 0x102, &value);
*words = (value & 0x03);
sanei_genesys_read_hregister(dev, 0x103, &value);
*words = *words * 256 + value;
sanei_genesys_read_hregister(dev, 0x104, &value);
*words = *words * 256 + value;
sanei_genesys_read_hregister(dev, 0x105, &value);
*words = *words * 256 + value;
*words = dev->read_register(0x102) & 0x03;
*words = *words * 256 + dev->read_register(0x103);
*words = *words * 256 + dev->read_register(0x104);
*words = *words * 256 + dev->read_register(0x105);
break;
case GENESYS_GL845:
case GENESYS_GL846:
sanei_genesys_read_register(dev, 0x42, &value);
*words = value & 0x02;
sanei_genesys_read_register(dev, 0x43, &value);
*words = *words * 256 + value;
sanei_genesys_read_register(dev, 0x44, &value);
*words = *words * 256 + value;
sanei_genesys_read_register(dev, 0x45, &value);
*words = *words * 256 + value;
break;
*words = dev->read_register(0x42) & 0x02;
*words = *words * 256 + dev->read_register(0x43);
*words = *words * 256 + dev->read_register(0x44);
*words = *words * 256 + dev->read_register(0x45);
break;
case GENESYS_GL847:
sanei_genesys_read_register(dev, 0x42, &value);
*words = value & 0x03;
sanei_genesys_read_register(dev, 0x43, &value);
*words = *words * 256 + value;
sanei_genesys_read_register(dev, 0x44, &value);
*words = *words * 256 + value;
sanei_genesys_read_register(dev, 0x45, &value);
*words = *words * 256 + value;
break;
*words = dev->read_register(0x42) & 0x03;
*words = *words * 256 + dev->read_register(0x43);
*words = *words * 256 + dev->read_register(0x44);
*words = *words * 256 + dev->read_register(0x45);
break;
default:
sanei_genesys_read_register(dev, 0x44, &value);
*words = value;
sanei_genesys_read_register(dev, 0x43, &value);
*words += value * 256;
sanei_genesys_read_register(dev, 0x42, &value);
if (dev->model->asic_type == GENESYS_GL646)
*words += ((value & 0x03) * 256 * 256);
else
*words += ((value & 0x0f) * 256 * 256);
*words = dev->read_register(0x44);
*words += dev->read_register(0x43) * 256;
if (dev->model->asic_type == GENESYS_GL646) {
*words += ((dev->read_register(0x42) & 0x03) * 256 * 256);
} else {
*words += ((dev->read_register(0x42) & 0x0f) * 256 * 256);
}
}
DBG(DBG_proc, "%s: %d words\n", __func__, *words);
@ -715,28 +699,22 @@ void sanei_genesys_read_valid_words(Genesys_Device* dev, unsigned int* words)
void sanei_genesys_read_scancnt(Genesys_Device* dev, unsigned int* words)
{
DBG_HELPER(dbg);
uint8_t value;
if (dev->model->asic_type == GENESYS_GL124)
{
sanei_genesys_read_hregister(dev, 0x10b, &value);
*words = (value & 0x0f) << 16;
sanei_genesys_read_hregister(dev, 0x10c, &value);
*words += (value << 8);
sanei_genesys_read_hregister(dev, 0x10d, &value);
*words += value;
*words = (dev->read_register(0x10b) & 0x0f) << 16;
*words += (dev->read_register(0x10c) << 8);
*words += dev->read_register(0x10d);
}
else
{
sanei_genesys_read_register(dev, 0x4d, &value);
*words = value;
sanei_genesys_read_register(dev, 0x4c, &value);
*words += value * 256;
sanei_genesys_read_register(dev, 0x4b, &value);
if (dev->model->asic_type == GENESYS_GL646)
*words += ((value & 0x03) * 256 * 256);
else
*words += ((value & 0x0f) * 256 * 256);
*words = dev->read_register(0x4d);
*words += dev->read_register(0x4c) * 256;
if (dev->model->asic_type == GENESYS_GL646) {
*words += ((dev->read_register(0x4b) & 0x03) * 256 * 256);
} else {
*words += ((dev->read_register(0x4b) & 0x0f) * 256 * 256);
}
}
DBG(DBG_proc, "%s: %d lines\n", __func__, *words);
@ -803,30 +781,24 @@ void sanei_genesys_read_data_from_scanner(Genesys_Device* dev, uint8_t* data, si
void sanei_genesys_read_feed_steps(Genesys_Device* dev, unsigned int* steps)
{
DBG_HELPER(dbg);
uint8_t value;
if (dev->model->asic_type == GENESYS_GL124)
{
sanei_genesys_read_hregister(dev, 0x108, &value);
*steps = (value & 0x1f) << 16;
sanei_genesys_read_hregister(dev, 0x109, &value);
*steps += (value << 8);
sanei_genesys_read_hregister(dev, 0x10a, &value);
*steps += value;
*steps = (dev->read_register(0x108) & 0x1f) << 16;
*steps += (dev->read_register(0x109) << 8);
*steps += dev->read_register(0x10a);
}
else
{
sanei_genesys_read_register(dev, 0x4a, &value);
*steps = value;
sanei_genesys_read_register(dev, 0x49, &value);
*steps += value * 256;
sanei_genesys_read_register(dev, 0x48, &value);
if (dev->model->asic_type == GENESYS_GL646)
*steps += ((value & 0x03) * 256 * 256);
else if (dev->model->asic_type == GENESYS_GL841)
*steps += ((value & 0x0f) * 256 * 256);
else
*steps += ((value & 0x1f) * 256 * 256);
*steps = dev->read_register(0x4a);
*steps += dev->read_register(0x49) * 256;
if (dev->model->asic_type == GENESYS_GL646) {
*steps += ((dev->read_register(0x48) & 0x03) * 256 * 256);
} else if (dev->model->asic_type == GENESYS_GL841) {
*steps += ((dev->read_register(0x48) & 0x0f) * 256 * 256);
} else {
*steps += ((dev->read_register(0x48) & 0x1f) * 256 * 256);
}
}
DBG(DBG_proc, "%s: %d steps\n", __func__, *steps);
@ -1109,7 +1081,6 @@ void sanei_genesys_send_gamma_table(Genesys_Device* dev, const Genesys_Sensor& s
DBG_HELPER(dbg);
int size;
int i;
uint8_t val;
size = 256 + 1;
@ -1121,12 +1092,12 @@ void sanei_genesys_send_gamma_table(Genesys_Device* dev, const Genesys_Sensor& s
// loop sending gamma tables NOTE: 0x01000000 not 0x10000000
for (i = 0; i < 3; i++) {
// clear corresponding GMM_N bit
sanei_genesys_read_register(dev, 0xbd, &val);
val &= ~(0x01 << i);
uint8_t val = dev->read_register(0xbd);
val &= ~(0x01 << i);
sanei_genesys_write_register(dev, 0xbd, val);
// clear corresponding GMM_F bit
sanei_genesys_read_register(dev, 0xbe, &val);
val = dev->read_register(0xbe);
val &= ~(0x01 << i);
sanei_genesys_write_register(dev, 0xbe, val);
@ -1175,14 +1146,11 @@ void sanei_genesys_asic_init(Genesys_Device* dev, int /*max_regs*/)
dev->usb_mode = 2;
}
/* check if the device has already been initialized and powered up
* we read register 6 and check PWRBIT, if reset scanner has been
* freshly powered up. This bit will be set to later so that following
* reads can detect power down/up cycle*/
sanei_genesys_read_register(dev, 0x06, &val);
/* test for POWER bit */
if (val & 0x10)
{
/* Check if the device has already been initialized and powered up. We read register 0x06 and
check PWRBIT, if reset scanner has been freshly powered up. This bit will be set to later
so that following reads can detect power down/up cycle
*/
if (dev->read_register(0x06) & 0x10) {
cold = SANE_FALSE;
}
DBG (DBG_info, "%s: device is %s\n", __func__, cold ? "cold" : "warm");

Wyświetl plik

@ -111,6 +111,11 @@ public:
std::sort(registers_.begin(), registers_.end());
}
bool has_reg(uint16_t address) const
{
return find_reg_index(address) >= 0;
}
void remove_reg(uint16_t address)
{
int i = find_reg_index(address);