diff --git a/backend/genesys.c b/backend/genesys.c index 30fc8b874..24dd341ea 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -699,7 +699,7 @@ Genesys_Register_Set * sanei_genesys_get_address (Genesys_Register_Set * regs, SANE_Byte addr) { int i; - for (i = 0; i < GENESYS_MAX_REGS && regs[i].address; i++) + for (i = 0; i < GENESYS_MAX_REGS; i++) { if (regs[i].address == addr) return ®s[i]; diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c index a5ef15832..55dc54920 100644 --- a/backend/genesys_devices.c +++ b/backend/genesys_devices.c @@ -887,8 +887,9 @@ static Genesys_Model canon_lide_200_model = { GENESYS_GL847, NULL, - {1200, 600, 300, 150, 75, 50, 0}, /* possible x-resolutions */ - {2400, 1200, 600, 300, 150, 75, 50, 0}, /* possible y-resolutions */ + /* XXX STEF XXX add 75 dpi mode at least, look at 2400 for motor */ + {1200, 600, 300, 150, 0}, /* possible x-resolutions */ + {1200, 600, 300, 150, 0}, /* possible y-resolutions */ {16, 8, 0}, /* possible depths in gray mode */ {16, 8, 0}, /* possible depths in color mode */ @@ -923,6 +924,7 @@ static Genesys_Model canon_lide_200_model = { GPO_CANONLIDE200, MOTOR_CANONLIDE200, GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */ + | GENESYS_FLAG_NO_CALIBRATION | GENESYS_FLAG_SKIP_WARMUP | GENESYS_FLAG_OFFSET_CALIBRATION | GENESYS_FLAG_DARK_WHITE_CALIBRATION diff --git a/backend/genesys_gl847.c b/backend/genesys_gl847.c index dd8995185..8a4fdbad6 100644 --- a/backend/genesys_gl847.c +++ b/backend/genesys_gl847.c @@ -1,7 +1,6 @@ /* sane - Scanner Access Now Easy. - Copyright (C) 2004 - 2010 Stéphane Voltz - Copyright (C) 2005 - 2009 Pierre Willenbrock + Copyright (C) 2010 Stéphane Voltz This file is part of the SANE package. @@ -147,82 +146,10 @@ gl847_bulk_write_register (Genesys_Device * dev, return status; } -/* Write bulk data (e.g. shading, gamma) */ -static SANE_Status -gl847_bulk_write_data (Genesys_Device * dev, uint8_t addr, - uint8_t * data, size_t len) -{ - SANE_Status status; - size_t size; - uint8_t outdata[8]; - - DBG (DBG_io, "gl847_bulk_write_data writing %lu bytes\n", (u_long) len); - - status = - sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER, - VALUE_SET_REGISTER, INDEX, 1, &addr); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_bulk_write_data failed while setting register: %s\n", - sane_strstatus (status)); - return status; - } - - while (len) - { - if (len > BULKOUT_MAXSIZE) - size = BULKOUT_MAXSIZE; - else - size = len; - - outdata[0] = BULK_OUT; - outdata[1] = BULK_RAM; - outdata[2] = VALUE_BUFFER & 0xff; - outdata[3] = (VALUE_BUFFER >> 8) & 0xff; - outdata[4] = (size & 0xff); - outdata[5] = ((size >> 8) & 0xff); - outdata[6] = ((size >> 16) & 0xff); - outdata[7] = ((size >> 24) & 0xff); - - status = - sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_BUFFER, - VALUE_BUFFER, INDEX, sizeof (outdata), - outdata); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_bulk_write_data failed while writing command: %s\n", - sane_strstatus (status)); - return status; - } - - status = sanei_usb_write_bulk (dev->dn, data, &size); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_bulk_write_data failed while writing bulk data: %s\n", - sane_strstatus (status)); - return status; - } - - DBG (DBG_io2, - "gl847_bulk_write_data wrote %lu bytes, %lu remaining\n", - (u_long) size, (u_long) (len - size)); - - len -= size; - data += size; - } - - DBG (DBG_io, "gl847_bulk_write_data: completed\n"); - - return status; -} - /** * Read bulk data (e.g. scanned data) - * first read is rounded to a multiple of 512 bytes, last raed fetches the - * remainder + * first read is rounded to a multiple of 512 bytes, last read fetches the + * remainder XXX STEF XXX check rounded is ASIC work not software */ static SANE_Status gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr, @@ -237,25 +164,14 @@ gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr, if (len == 0) return SANE_STATUS_GOOD; - status = - sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER, - VALUE_SET_REGISTER, INDEX, 1, &addr); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl847_bulk_read_data failed while setting register: %s\n", - sane_strstatus (status)); - return status; - } - - outdata[0] = BULK_IN; - outdata[1] = BULK_RAM; - outdata[2] = VALUE_BUFFER & 0xff; - outdata[3] = (VALUE_BUFFER >> 8) & 0xff; - outdata[4] = (len & 0xff); - outdata[5] = ((len >> 8) & 0xff); - outdata[6] = ((len >> 16) & 0xff); - outdata[7] = ((len >> 24) & 0xff); + outdata[0] = addr & 0xff; + outdata[1] = ((addr >> 8) & 0xff); + outdata[2] = ((addr >> 16) & 0xff); + outdata[3] = ((addr >> 24) & 0xff); + outdata[4] = (size & 0xff); + outdata[5] = ((size >> 8) & 0xff); + outdata[6] = ((size >> 16) & 0xff); + outdata[7] = ((size >> 24) & 0xff); status = sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_BUFFER, @@ -442,15 +358,15 @@ gl847_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs) for (i = 0x06; i < 0x0e; i++) { r = sanei_genesys_get_address (regs, 0x10 + i); - if(r) - r->value = dev->sensor.regs_0x10_0x1d[i]; + if (r) + r->value = dev->sensor.regs_0x10_0x1d[i]; } for (i = 0; i < 9; i++) { r = sanei_genesys_get_address (regs, 0x52 + i); - if(r) - r->value = dev->sensor.regs_0x52_0x5e[i]; + if (r) + r->value = dev->sensor.regs_0x52_0x5e[i]; } DBG (DBG_proc, "gl847_setup_sensor: completed \n"); @@ -489,8 +405,8 @@ gl847_init_registers (Genesys_Device * dev) SETREG (0x0b, 0x01); SETREG (0x0c, 0x02); SETREG (0x0d, 0x0d); - SETREG (0x6e, 0x7e); - SETREG (0x6c, 0x00); + SETREG (0x10, 0x00); + SETREG (0x11, 0x00); SETREG (0x12, 0x00); SETREG (0x13, 0x00); SETREG (0x14, 0x00); @@ -541,10 +457,12 @@ gl847_init_registers (Genesys_Device * dev) SETREG (0x5a, 0x55); SETREG (0x5e, 0x41); SETREG (0x5f, 0x40); - SETREG (0x61, 0x00); - SETREG (0x62, 0x00); - SETREG (0x64, 0x00); - SETREG (0x65, 0x00); + SETREG (0x60, 0x00); + SETREG (0x61, 0x21); + SETREG (0x62, 0x40); + SETREG (0x63, 0x00); + SETREG (0x64, 0x21); + SETREG (0x65, 0x40); SETREG (0x67, 0x80); SETREG (0x68, 0x80); SETREG (0x69, 0x20); @@ -577,6 +495,11 @@ gl847_init_registers (Genesys_Device * dev) SETREG (0xc8, 0x00); SETREG (0xc9, 0x00); SETREG (0xca, 0x00); + + /* initalize calibration reg */ + memcpy (dev->calib_reg, dev->reg, + (GENESYS_GL847_MAX_REGS + 1) * sizeof (Genesys_Register_Set)); + DBG (DBG_proc, "gl847_init_registers completed\n"); } @@ -591,6 +514,7 @@ gl847_send_slope_table (Genesys_Device * dev, int table_nr, SANE_Status status; uint8_t *table; int i; + char msg[2048]; DBG (DBG_proc, "gl847_send_slope_table (table_nr = %d, steps = %d)\n", table_nr, steps); @@ -602,6 +526,16 @@ gl847_send_slope_table (Genesys_Device * dev, int table_nr, table[i * 2 + 1] = slope_table[i] >> 8; } + if (DBG_LEVEL >= DBG_io) + { + sprintf (msg, "write slope %d (%d)=", table_nr, steps); + for (i = 0; i < steps; i++) + { + sprintf (msg, "%s,%d", msg, slope_table[i]); + } + DBG (DBG_io, "gl847_send_slope_table: %s\n", msg); + } + /* slope table addresses ae fixed */ status = write_ahb (dev->dn, 0x10000000 + 0x4000 * table_nr, steps * 2, table); @@ -730,8 +664,8 @@ gl847_set_fe (Genesys_Device * dev, uint8_t set) /* setup motor for given parameters */ static SANE_Status -gl847_init_motor_regs_off (Genesys_Device * dev, Genesys_Register_Set * reg, unsigned int scan_lines /*lines, scan resolution */ - ) +gl847_init_motor_regs_off (Genesys_Device * dev, Genesys_Register_Set * reg, + unsigned int scan_lines) { unsigned int feedl; Genesys_Register_Set *r; @@ -931,7 +865,7 @@ HOME_FREE: 3 r->value = 0; r = sanei_genesys_get_address (reg, 0x27); r->value = 0; - + ICI r = sanei_genesys_get_address (reg, 0x02); r->value &= ~0x01; /*LONGCURV OFF */ r->value &= ~0x80; /*NOT_HOME OFF */ @@ -1280,25 +1214,25 @@ HOME_FREE: 3 DBG (DBG_info, "gl847_init_motor_regs_scan: z1 = %d\n", z1); DBG (DBG_info, "gl847_init_motor_regs_scan: z2 = %d\n", z2); - r = sanei_genesys_get_address (reg, 0x60); - r->value = ((z1 >> 16) & 0xff); - r = sanei_genesys_get_address (reg, 0x61); - r->value = ((z1 >> 8) & 0xff); - r = sanei_genesys_get_address (reg, 0x62); - r->value = (z1 & 0xff); - r = sanei_genesys_get_address (reg, 0x63); - r->value = ((z2 >> 16) & 0xff); - r = sanei_genesys_get_address (reg, 0x64); - r->value = ((z2 >> 8) & 0xff); - r = sanei_genesys_get_address (reg, 0x65); - r->value = (z2 & 0xff); + r = sanei_genesys_get_address (reg, REG60); + r->value = ((z1 >> 16) & REG60_Z1MOD) | (scan_step_type << REG60S_STEPSEL); + r = sanei_genesys_get_address (reg, REG61); + r->value = ((z1 >> 8) & REG61_Z1MOD); + r = sanei_genesys_get_address (reg, REG62); + r->value = (z1 & REG62_Z1MOD); + r = sanei_genesys_get_address (reg, REG63); + r->value = ((z2 >> 16) & REG63_Z2MOD); + r = sanei_genesys_get_address (reg, REG64); + r->value = ((z2 >> 8) & REG64_Z2MOD); + r = sanei_genesys_get_address (reg, REG65); + r->value = (z2 & REG65_Z2MOD); r = sanei_genesys_get_address (reg, 0x1e); r->value &= 0xf0; /* 0 dummy lines */ r->value |= scan_dummy; /* dummy lines */ r = sanei_genesys_get_address (reg, 0x67); - r->value = 0x3f | (scan_step_type << 6); + r->value = 0x3f; r = sanei_genesys_get_address (reg, 0x68); r->value = 0x3f; @@ -1418,7 +1352,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, /* average looks better than deletion, and we are already set up to use one of the average enabled resolutions */ - r = sanei_genesys_get_address (reg, 0x03); + r = sanei_genesys_get_address (reg, REG03); r->value |= REG03_AVEENB; if (flags & OPTICAL_FLAG_DISABLE_LAMP) r->value &= ~REG03_LAMPPWR; @@ -1426,7 +1360,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev, r->value |= REG03_LAMPPWR; /* exposure times */ - for (i = 0; i < 6; i++, r++) + for (i = 0; i < 6; i++) { r = sanei_genesys_get_address (reg, 0x10 + i); if (flags & OPTICAL_FLAG_DISABLE_LAMP) @@ -2769,6 +2703,25 @@ gl847_detect_document_end (Genesys_Device * dev) return SANE_STATUS_GOOD; } +static void +dump_regs (Genesys_Register_Set * reg) +{ + static int scan = 0; + size_t i; + + fprintf (stderr, + "==================== SCAN %03d STATUS =================\n", scan); + for (i = 0; i < GENESYS_GL847_MAX_REGS; i++) + { + if (reg[i].address != 0) + { + fprintf (stderr, "R%02x=0x%02x\n", reg[i].address, reg[i].value); + } + } + fprintf (stderr, + "==================== SCAN STATUS END ============================="); +} + /* Send the low-level scan command */ /* todo : is this that useful ? */ static SANE_Status @@ -2778,6 +2731,8 @@ gl847_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg, SANE_Status status; Genesys_Register_Set local_reg[4]; + dump_regs (reg); + DBG (DBG_proc, "gl847_begin_scan\n"); local_reg[0].address = 0x03; @@ -2787,6 +2742,7 @@ gl847_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg, local_reg[1].address = 0x01; local_reg[1].value = sanei_genesys_read_reg_from_set (reg, 0x01) | REG01_SCAN; /* set scan bit */ + /* to clear SCANCNT */ local_reg[2].address = 0x0d; local_reg[2].value = 0x01; @@ -2919,7 +2875,7 @@ gl847_feed (Genesys_Device * dev, int steps) gl847_stop_action (dev); DBG (DBG_error, - "gl847_slow_back_home: timeout while waiting for scanhead to go home\n"); + "gl847_feed: timeout while waiting for scanhead to go home\n"); return SANE_STATUS_IO_ERROR; } @@ -2948,10 +2904,14 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) if (status != SANE_STATUS_GOOD) { DBG (DBG_error, - "gl847_slow_back_home: Failed to read home sensor: %s\n", + "gl847_slow_back_home: failed to read home sensor: %s\n", sane_strstatus (status)); return status; } + if (DBG_LEVEL >= DBG_io) + { + print_status (val); + } dev->scanhead_position_in_steps = 0; @@ -2962,13 +2922,17 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) return SANE_STATUS_GOOD; } - status = gl847_stop_action (dev); - if (status != SANE_STATUS_GOOD) + /* if motor is on, stop current action */ + if (val & REG41_MOTORENB) { - DBG (DBG_error, - "gl847_slow_back_home: failed to stop motor: %s\n", - sane_strstatus (status)); - return SANE_STATUS_IO_ERROR; + status = gl847_stop_action (dev); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl847_slow_back_home: failed to stop motor: %s\n", + sane_strstatus (status)); + return SANE_STATUS_IO_ERROR; + } } memcpy (local_reg, dev->reg, @@ -2982,7 +2946,7 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) if (status != SANE_STATUS_GOOD) { DBG (DBG_error, - "gl847_slow_back_home: Failed to bulk write registers: %s\n", + "gl847_slow_back_home: failed to bulk write registers: %s\n", sane_strstatus (status)); return status; } @@ -2991,7 +2955,7 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) if (status != SANE_STATUS_GOOD) { DBG (DBG_error, - "gl847_slow_back_home: Failed to start motor: %s\n", + "gl847_slow_back_home: failed to start motor: %s\n", sane_strstatus (status)); gl847_stop_action (dev); /* send original registers */ @@ -3014,7 +2978,7 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home) return status; } - if (val & 0x08) /* home sensor */ + if (val & REG41_HOMESNR) /* home sensor */ { DBG (DBG_info, "gl847_slow_back_home: reached home position\n"); DBG (DBG_proc, "gl847_slow_back_home: finished\n"); @@ -3481,7 +3445,7 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size) /* shading data is plit in 3 (up to 5 with IR) areas write(0x10014000,0x00000dd8) - URB 23429 bulk_out len 3544 wrote 0x33 0x10 0xec 0x3c 0x30 0x10 0xc2 0x3b 0x1c 0x0f 0x2b 0x3b 0x3c 0x10 0x72 0x3a 0x2e 0x10 0x8c 0x38 0x06 0x10 0x64 0x37 0x12 0x10 0xae 0x35 0x2a 0x0f 0x4f 0x35 0xf9 0x0f 0x35 0x33 0x0a 0x10 0xb6 0x34 0xee 0x0f 0x90 0x32 0xfa 0x0f 0x22 0x33 0xc9 0x0e 0x39 0x30 0xd6 0x0f 0xfa 0x2f 0xbd 0x0f 0xd7 0x2d 0xb8 0x0f 0xbe 0x2c 0xaa 0x0f 0x61 0x2c 0x9e 0x0e 0x17 0x2c 0xa0 0x0f 0x30 0x2b 0x8b 0x0f 0xa1 0x2a 0x96 0x0f 0x23 0x2a 0x7e 0x0f 0xc9 0x28 0x54 0x0e 0xd1 0x27 0x4e 0x0f 0x69 0x26 0x54 0x0f 0xd5 0x26 0x35 0x0f 0x17 0x25 0x35 0x0f 0xa1 0x25 0x32 0x0e 0x6c 0x24 0x3b 0x0f 0x44 0x25 0x19 0x0f 0x17 0x24 0x25 0x0f 0xb4 0x24 0x25 0x0f 0xda 0x23 0x2d 0x0e 0xbc 0x24 0x22 0x0f 0x34 0x24 0x24 0x0f 0x32 0x24 0x21 0x0f 0xc7 0x23 0x1b 0x0f 0x07 0x24 0x4a 0x0e 0xa2 0x24 0x2a 0x0f 0x99 0x24 0x36 0x0f 0x8e 0x24 0x10 0x0f 0xfe 0x23 0x20 0x0f 0xa0 0x24 0x10 0x0e 0x0d 0x24 0x4d 0x0f 0xcd 0x25 0x2b 0x0f 0x6f 0x25 0x4c 0x0f 0xdd 0x26 0x58 0x0f 0xec 0x25 0x55 0x0e 0xad 0x27 0x61 0x0f 0x1f 0x27 0x75 0x0f 0x76 0x28 0x6a 0x0f 0x4f 0x28 0x6f 0x0f 0xac 0x28 0x58 0x0e 0x56 0x28 0x56 0x0f 0x22 0x28 0x5d 0x0f 0xe6 0x27 0x4f 0x0f 0x33 0x28 0x84 0x0f 0xc8 0x29 0x8f 0x0e 0x5b 0x2a 0xbf 0x0f 0xe2 0x2b 0x9e 0x0f 0x4a 0x2a 0x8d 0x0f 0x9f 0x2a 0x8b 0x0f 0x1c 0x29 0x70 0x0e 0xf1 0x29 0x80 0x0f 0xc4 0x29 0x80 0x0f 0xcf 0x2a 0x85 0x0f 0x10 0x2b 0x9d 0x0f 0x22 0x2c 0x93 0x0e 0x42 0x2c 0x9f 0x0f 0xd8 0x2c 0xa7 0x0f 0xf1 0x2c 0xc2 0x0f 0x51 0x2d 0xb9 0x0f 0x7e 0x2d 0x8d 0x0e 0x48 0x2c 0x8c 0x0f 0x62 0x2c 0x89 0x0f 0xf0 0x2b 0xa1 0x0f 0x4e 0x2d 0x8c 0x0f 0x05 0x2c 0xa8 0x0e 0x63 0x2d 0x9c 0x0f 0xda 0x2c 0xba 0x0f 0xb7 0x2e 0x99 0x0f 0xad 0x2d 0xa6 0x0f 0x67 0x2e 0x88 0x0e 0x62 0x2d 0xae 0x0f 0x85 0x2e 0xa5 0x0f 0xbd 0x2e 0xba 0x0f 0xb7 0x2e 0x98 0x0f 0x53 0x2e 0xb3 0x0e 0x85 0x2e 0x97 0x0f 0x26 0x2e 0x94 0x0f 0x0b 0x2d 0x90 0x0f 0x97 0x2d 0x99 0x0f 0x40 0x2d 0x83 0x0e 0x39 0x2e 0x9a 0x0f 0x3d 0x2d 0xa9 0x0f 0x17 0x2e 0x8b 0x0f 0xe5 0x2c 0xa5 0x0f 0x35 0x2f 0xb1 0x0e 0xc2 0x2d 0xa9 0x0f 0x40 0x2f 0x9e 0x0f 0xf9 0x2d 0x93 0x0f 0x2e 0x2e 0x86 0x0f 0xc7 0x2c 0x6a 0x0e 0x1f 0x2c 0x8c 0x0f 0x3a 0x2c 0x94 0x0f 0x84 0x2c 0x97 0x0f 0xa1 0x2d 0x98 0x0f 0xb9 0x2d 0xad 0x0e 0xed 0x2e 0xad 0x0f 0x55 0x2d 0xaf 0x0f 0x1d 0x2e 0x9f 0x0f 0x18 0x2c 0x90 0x0f 0x2b 0x2d 0x72 0x0e 0x12 0x2c 0x9f 0x0f 0x93 0x2c 0x9d 0x0f 0x65 0x2c 0x9e 0x0f 0x26 0x2e 0x9d 0x0f 0x7b 0x2d 0x9f 0x0e 0x38 0x2e 0x9c 0x0f 0xd3 0x2d 0x8d 0x0f 0xe1 0x2d 0x96 0x0f 0x59 0x2d 0x97 0x0f 0xec 0x2c 0x9e 0x0e 0x3c 0x2d 0x98 0x0f 0x8a 0x2d 0xac 0x0f 0xe0 0x2e 0xa4 0x0f 0xf8 0x2d 0xa2 0x0f 0x68 0x2f 0x97 0x0e 0xbc 0x2d 0x68 0x10 0xb0 0x2f 0xd4 0x0f 0xd2 0x2e 0xc8 0x0f 0x52 0x2e 0xd4 0x0f 0x7e 0x2d 0xc4 0x0e 0xd0 0x2e 0xeb 0x0f 0xea 0x2e 0xb4 0x0f 0xdd 0x2d 0xda 0x0f 0xe2 0x2d 0xd4 0x0f 0x58 0x2e 0xd8 0x0e 0xa1 0x2e 0xf3 0x0f 0x4c 0x2e 0xe9 0x0f 0xfa 0x2e 0xd8 0x0f 0xd5 0x2e 0xeb 0x0f 0x1f 0x2f 0xf4 0x0e 0x71 0x2d 0x8e 0x10 0x79 0x2e 0x6e 0x10 0xb3 0x2d 0x79 0x10 0xf6 0x2e 0x5c 0x10 0xc5 0x2d 0x58 0x0f 0xef 0x2e 0x59 0x10 0x46 0x2d 0x51 0x10 0x98 0x2d 0x5d 0x10 0xd7 0x2d 0x54 0x10 0xbe 0x2e 0x4c 0x0f 0x40 0x2f 0x66 0x10 0x67 0x2f 0x68 0x10 0x5c 0x2f 0x61 0x10 0x0d 0x2f 0x63 0x10 0x4d 0x2f 0x2f 0x0f 0x7c 0x2e 0xee 0x0f 0x4d 0x2f 0x32 0x11 0xe1 0x2e 0xec 0x10 0x11 0x2f 0xe3 0x10 0xad 0x2d 0xe3 0x0f 0x7e 0x2e 0xcf 0x10 0xcf 0x2d 0xe5 0x10 0x57 0x2f 0xd9 0x10 0xd8 0x2d 0xef 0x10 0xe4 0x2f 0xf6 0x0f 0xb0 0x2e 0xfd 0x10 0x6a 0x2f 0xc6 0x10 0x11 0x2e 0xe6 0x10 0xbe 0x2e 0xe2 0x10 0x24 0x2e 0xb8 0x0f 0xce 0x2d 0xd9 0x10 0x7f 0x2d 0xdf 0x10 0x47 0x2e 0xd0 0x10 0xd7 0x2d 0xe3 0x10 0xa7 0x2d 0xf5 0x0f 0x81 0x2f 0xcc 0x10 0xf0 0x2e 0xe2 0x10 0x1e 0x30 0xc5 0x10 0x4e 0x2e 0xe0 0x10 0x5d 0x2f 0xcf 0x0f 0x5d 0x2d 0xd4 0x10 0x4c 0x2e 0xc4 0x10 0x70 0x2d 0xda 0x10 0x9a 0x2e 0xcd 0x10 0x0b 0x2e 0xec 0x0f 0x95 0x2f 0xdb 0x10 0x1f 0x2f 0xe6 0x10 0xff 0x2f 0xdd 0x10 0x39 0x30 0xd8 0x10 0x9a 0x2f 0xce 0x0f 0xdb 0x2f 0xe1 0x10 0xe4 0x2e 0xdd 0x10 0xa5 0x2e 0xc5 0x10 0xcb 0x2d 0xd6 0x10 0x9f 0x2f 0xd6 0x0f 0x30 0x2f 0xd5 0x10 0xf8 0x2f 0xd2 0x10 0x97 0x2e 0xdc 0x10 0x34 0x30 0xd4 0x10 0x74 0x2e 0xd2 0x0f 0xa8 0x2f 0xcf 0x10 0x12 0x2f 0xd8 0x10 0xea 0x2f 0xc5 0x10 0xb4 0x2e 0xc6 0x10 0xda 0x2e 0xda 0x0f 0x33 0x2f 0xbd 0x10 0x84 0x2f 0xd7 0x10 0x9a 0x2f 0xcb 0x10 0xfb 0x2e 0xc8 0x10 0x2d 0x2f 0xa3 0x0f 0x8f 0x2e 0xc2 0x10 0xf4 0x2f 0xb3 0x10 0x64 0x2e 0xd9 0x10 0xe9 0x2f 0xbe 0x10 0xdd 0x2e 0xeb 0x0f 0xc8 0x30 0xc9 0x10 0xcb 0x2e 0xe1 0x10 0x51 0x30 0xbb 0x10 0x38 0x2e 0xd2 0x10 0x0e 0x2e 0xa5 0x0f 0xb7 0x2d 0xbc 0x10 0xc5 0x2d 0xbe 0x10 0xbd 0x2d 0xc9 0x10 0x6d 0x2e 0xc7 0x10 0x2b 0x2e 0xe1 0x0f 0x82 0x2e 0xc5 0x10 0x80 0x2f 0xbc 0x10 0x8b 0x2e 0xdf 0x10 0x44 0x2f 0xd5 0x10 0xa6 0x2e 0xb4 0x0f 0x76 0x2f 0xb7 0x10 0x33 0x2d 0xc1 0x10 0xa4 0x2e 0xb1 0x10 0xd0 0x2d 0xa7 0x10 0xc0 0x2e 0xbd 0x0f 0x77 0x2d 0xd6 0x10 0x4b 0x2e 0xb6 0x10 0x72 0x2e 0xc3 0x10 0xcf 0x2e 0xe3 0x10 0xda 0x2e 0xa7 0x0f 0xcf 0x2d 0xb5 0x10 0xd6 0x2d 0xc3 0x10 0xc6 0x2d 0xba 0x10 0x70 0x2d 0xb3 0x10 0xff 0x2c 0xb7 0x0f 0x9a 0x2d 0xa7 0x10 0xfa 0x2c 0xad 0x10 0x6e 0x2d 0xa7 0x10 0xe0 0x2c 0xc0 0x10 0x4b 0x2e 0x95 0x0f 0xb5 0x2c 0xc8 0x10 0x06 0x2f 0xb3 0x10 0xb5 0x2d 0xba 0x10 0xbd 0x2e 0xa4 0x10 0xe9 0x2d 0xc1 0x0f 0xcd 0x2d 0xc8 0x10 0xa0 0x2d 0xb2 0x10 0x8a 0x2d 0xa8 0x10 0x1d 0x2e 0xc0 0x10 0x20 0x2e 0xb7 0x0f 0x38 0x2f 0xbc 0x10 0xfe 0x2d 0xb8 0x10 0xf5 0x2d 0xac 0x10 0x69 0x2c 0xba 0x10 0x7e 0x2d 0xc8 0x0f 0x87 0x2c 0xb6 0x10 0x7f 0x2e 0xbb 0x10 0x30 0x2e 0xd5 0x10 0x41 0x2f 0xb6 0x10 0xb3 0x2d 0xd0 0x10 0xda 0x2e 0xb9 0x0f 0x72 0x2e 0xb9 0x10 0x38 0x2e 0xc9 0x10 0x4f 0x2e 0xbf 0x10 0x20 0x2e 0xb4 0x10 0xcb 0x2d 0xc6 0x0f 0x70 0x2d 0xbb 0x10 0xd3 0x2e 0xba 0x10 0x58 0x2e 0xd6 0x10 0x9c 0x2f 0xa8 0x10 0xdb 0x2d 0xb7 0x0f 0x72 0x2e 0xa2 0x10 0xba 0x2c 0xcc 0x10 0xa0 0x2e 0xd3 0x10 0xa6 0x2e 0xce 0x10 0xf8 0x2f 0x56 0x10 0xa4 0x2e 0xc5 0x10 0x72 0x2f 0xce 0x10 0xc9 0x2e 0xd7 0x10 0x3c 0x2e 0xe5 0x10 0xdc 0x2e 0xd8 0x0f 0x5a 0x30 0xea 0x10 0x3c 0x30 0xf0 0x10 0xea 0x2e 0xe0 0x10 0xc1 0x2f 0xed 0x10 0x67 0x2e 0xf6 0x0f 0xf3 0x2e 0xd6 0x10 0x8c 0x2e 0xe3 0x10 0x00 0x30 0xef 0x10 0xac 0x2e 0xfe 0x10 0x43 0x30 0x4b 0x10 0x68 0x2f 0x82 0x11 0x17 0x30 0x72 0x11 0xae 0x2e 0x6f 0x11 0x1b 0x2f 0x5f 0x11 0x0a 0x2f 0x5f 0x10 0x1e 0x2f 0x5b 0x11 0xf4 0x2e 0x5e 0x11 0x2e 0x2f 0x64 0x11 0x50 0x2f 0x4b 0x11 0x72 0x2e 0x48 0x10 0xdf 0x2e 0x57 0x11 0xb3 0x2e 0x57 0x11 0x62 0x2f 0x40 0x11 0x22 0x2e 0x48 0x11 0xc5 0x2e 0xf0 0x0f 0x29 0x2e 0xcf 0x10 0x14 0x30 0x17 0x12 0xfd 0x2f 0x45 0x10 0xf4 0x2f 0x4e 0x10 0x7f 0x2e 0x27 0x0f 0xf3 0x2e 0x30 0x10 0xea 0x2d 0x53 0x10 0xbe 0x2e 0x2f 0x10 0x8b 0x2e 0x48 0x10 0x70 0x2f 0x4c 0x0f 0x7a 0x2f 0x4e 0x10 0x79 0x2f 0x1e 0x10 0x88 0x2f 0x47 0x10 0xc3 0x2e 0x31 0x10 0xe6 0x2d 0x11 0x0f 0x64 0x2d 0x2b 0x10 0x1f 0x2e 0x2d 0x10 0xf9 0x2d 0x32 0x10 0xa4 0x2e 0x3c 0x10 0x18 0x2e 0x44 0x0f 0x87 0x2f 0x1a 0x10 0x87 0x2d 0x22 0x10 0x2b 0x2e 0x3c 0x10 0xdb 0x2d 0x2c 0x10 0xf7 0x2d 0x16 0x0f 0x7f 0x2d 0x23 0x10 0x8a 0x2d 0x1f 0x10 0xa6 0x2d 0x15 0x10 0x8a 0x2d 0x27 0x10 0xa4 0x2d 0x2d 0x0f 0xd7 0x2d 0x29 0x10 0xe6 0x2d 0x35 0x10 0x0e 0x2e 0x35 0x10 0x80 0x2e 0x2c 0x10 0x4d 0x2e 0x3e 0x0f 0xf1 0x2f 0x36 0x10 0x7a 0x2e 0x35 0x10 0x79 0x2e 0x15 0x10 0x50 0x2d 0x1b 0x10 0x22 0x2e 0x2a 0x0f 0x27 0x2e 0x27 0x10 0xe3 0x2e 0x3a 0x10 0x5a 0x2f 0x26 0x10 0xee 0x2e 0x2b 0x10 0x16 0x2e 0x1b 0x0f 0x17 0x2e 0x2a 0x10 0x28 0x2e 0x2d 0x10 0x98 0x2e 0x25 0x10 0xed 0x2e 0x35 0x10 0xd7 0x2e 0x24 0x0f 0xa5 0x2e 0x14 0x10 0xb5 0x2d 0x34 0x10 0x8c 0x2e 0x2b 0x10 0xea 0x2d 0x3a 0x10 0xbd 0x2e 0x0b 0x0f 0xf1 0x2d 0x1e 0x10 0x5f 0x2e 0x26 0x10 0x76 0x2d 0x0d 0x10 0x07 0x2e 0x30 0x10 0x52 0x2e 0x2e 0x0f 0x86 0x2f 0x35 0x10 0x14 0x2f 0x2d 0x10 0x86 0x2e 0x35 0x10 0xa8 0x2d 0x0b 0x10 0xa8 0x2c 0xf1 0x0e 0xef 0x2b 0x0e 0x10 0x1e 0x2c 0x08 0x10 0xb4 0x2c 0x1a 0x10 0x06 0x2d 0x0e 0x10 0x84 0x2d 0x18 0x0f 0x63 0x2d 0x14 0x10 0xa9 0x2d 0x17 0x10 0x92 0x2c 0x23 0x10 0x09 0x2f 0x1b 0x10 0xc8 0x2d 0x13 0x0f 0x2b 0x2e 0x13 0x10 0xb9 0x2d 0x1e 0x10 0x62 0x2e 0x17 0x10 0xa7 0x2d 0x15 0x10 0xd3 0x2c 0x07 0x0f 0xbe 0x2c 0x03 0x10 0xf1 0x2c 0x19 0x10 0x67 0x2d 0x16 0x10 0x4b 0x2d 0x30 0x10 0x74 0x2e 0xed 0x0e 0x12 0x2d 0x26 0x10 0x95 0x2e 0x17 0x10 0x58 0x2d 0x0d 0x10 0x3f 0x2d 0x08 0x10 0xd4 0x2b 0x02 0x0f 0xdc 0x2c 0x0e 0x10 0x16 0x2d 0x09 0x10 0x8a 0x2c 0xfd 0x0f 0x3c 0x2c 0xf6 0x0f 0xc1 0x2b 0xe3 0x0e 0xa2 0x2b 0x00 0x10 0xdf 0x2b 0x08 0x10 0xc5 0x2c 0x07 0x10 0x1b 0x2d 0x0a 0x10 0x2c 0x2d 0x0a 0x0f 0x63 0x2c 0xf6 0x0f 0xd6 0x2b 0x11 0x10 0x22 0x2b 0xe8 0x0f 0xd4 0x2b 0xfb 0x0f 0xb8 0x2b 0xf0 0x0e 0x4d 0x2d 0xfb 0x0f 0x3c 0x2c 0x10 0x10 0x97 0x2d 0x0c 0x10 0x5c 0x2c 0x04 0x10 0xf0 0x2b 0xff 0x0e 0x38 0x2b 0xff 0x0f 0x32 0x2b 0x07 0x10 0xb5 0x2b 0x0a 0x10 0x9b 0x2b 0x02 0x10 0x6a 0x2b 0xf0 0x0e 0x72 0x2b 0xf7 0x0f 0x3c 0x2b 0x0a 0x10 0x09 0x2b 0x03 0x10 0x24 0x2b 0x0a 0x10 0x60 0x2b 0xff 0x0e 0xf5 0x2b 0xf8 0x0f 0x3e 0x2b 0x01 0x10 0xf3 0x2b 0x0d 0x10 0x01 0x2b 0x17 0x10 0xdf 0x2b 0xf6 0x0e 0x44 0x2b 0x02 0x10 0xb0 0x2c 0x19 0x10 0x68 0x2c 0x0e 0x10 0xe4 0x2c 0x12 0x10 0x91 0x2c 0xf7 0x0e 0x86 0x2c 0xbd 0x10 0x4b 0x2c 0x3a 0x10 0xa7 0x2c 0x25 0x10 0x94 0x2b 0x35 0x10 0x6d 0x2b 0x1c 0x0f 0x28 0x2b 0x2c 0x10 0x3f 0x2b 0x2d 0x10 0x66 0x2a 0x31 0x10 0xa1 0x2a 0x3b 0x10 0x6f 0x2b 0x28 0x0f 0x7e 0x2b 0x3a 0x10 0x87 0x2c 0x32 0x10 0x04 0x2c 0x3b 0x10 0x49 0x2c 0x47 0x10 0x2a 0x2c 0x61 0x0f 0xb6 0x2b 0xd0 0x10 0x91 0x2b 0xd6 0x10 0x82 0x2b 0xbe 0x10 0xb1 0x2b 0xc2 0x10 0xc3 0x2b 0xbf 0x0f 0x3e 0x2c 0xc5 0x10 0xbc 0x2b 0xc0 0x10 0x8c 0x2c 0xb5 0x10 0x73 0x2b 0xb3 0x10 0x3a 0x2c 0xa7 0x0f 0x36 0x2b 0xb6 0x10 0x42 0x2c 0xbe 0x10 0xbe 0x2b 0xd4 0x10 0xb9 0x2c 0xc8 0x10 0x70 0x2c 0xa0 0x0f 0xf8 0x2b 0x01 0x10 0x03 0x2c 0xb8 0x11 0x6b 0x2c 0x06 0x11 0x3c 0x2b 0x33 0x11 0xd9 0x2b 0x12 0x10 0x40 0x2c 0x1a 0x11 0xb9 0x2c 0x2b 0x11 0x90 0x2c 0x27 0x11 0xb0 0x2b 0x09 0x11 0x41 0x2b 0x1e 0x10 0xe3 0x2a 0x22 0x11 0x04 0x2b 0xff 0x10 0x1a 0x2b 0x23 0x11 0xd2 0x2c 0x0c 0x11 0x07 0x2c 0x11 0x10 0x45 0x2d 0x16 0x11 0x9a 0x2b 0x13 0x11 0x32 0x2c 0x00 0x11 0xd0 0x2a 0xf4 0x10 0x21 0x2b 0x20 0x10 0x62 0x2b 0x03 0x11 0x06 0x2c 0x12 0x11 0x10 0x2c 0x15 0x11 0xf2 0x2b 0x01 0x11 0x3c 0x2b 0xe6 0x0f 0x10 0x2b 0x04 0x11 0x85 0x2b 0x1b 0x11 0xb6 0x2b 0x24 0x11 0xc2 0x2c 0x11 0x11 0xfd 0x2b 0x05 0x10 0x9e 0x2c 0xef 0x10 0x13 0x2b 0x07 0x11 0xf7 0x2b 0x09 0x11 0xc7 0x2b 0xff 0x10 0xfd 0x2b 0xf2 0x0f 0x4a 0x2c 0x0f 0x11 0xf5 0x2b 0x11 0x11 0xd3 0x2b 0x01 0x11 0x9a 0x2b 0xfc 0x10 0xc6 0x2b 0x06 0x10 0xa8 0x2b 0x06 0x11 0xed 0x2b 0x0d 0x11 0x6a 0x2c 0x06 0x11 0xc1 0x2c 0x04 0x11 0x4c 0x2c 0x03 0x10 0x3a 0x2c 0x02 0x11 0x9f 0x2b 0xf4 0x10 0x66 0x2b 0xe8 0x10 0x81 0x2a 0x11 0x11 0x17 0x2c 0xfd 0x0f 0xeb 0x2b 0x02 0x11 0x73 0x2c 0x07 0x11 0xa7 0x2b 0x1a 0x11 0xba 0x2c 0xfb 0x10 0x15 0x2c 0xf9 0x0f 0x97 0x2b 0xfe 0x10 0x10 0x2c 0x16 0x11 0xe9 0x2b 0xf3 0x10 0x6b 0x2b 0x01 0x11 0x66 0x2b 0x17 0x10 0x8f 0x2c 0xfc 0x10 0xa8 0x2c 0x17 0x11 0x2d 0x2d 0x14 0x11 0x42 0x2b 0x0e 0x11 0x56 0x2c 0xdc 0x0f 0xb3 0x2a 0xfc 0x10 0x9d 0x2b 0x09 0x11 0xf4 0x2a 0x00 0x11 0x47 0x2c 0xfc 0x10 0xbb 0x2a 0xfb 0x0f 0xf7 0x2a 0xee 0x10 0x06 0x2b 0xfb 0x10 0x59 0x2b 0x0a 0x11 0x75 0x2b 0x07 0x11 0x29 0x2c 0x04 0x10 0xc2 0x2b 0xfd 0x10 0x62 0x2b 0xea 0x10 0x42 0x2b 0xe8 0x10 0xab 0x2a 0x16 0x11 0xb7 0x2b 0xf4 0x0f 0xf9 0x2a 0x04 0x11 0x24 0x2d 0xff 0x10 0xc7 0x2b 0x12 0x11 0xbe 0x2c 0xfe 0x10 0xc2 0x2b 0xe8 0x0f 0x9f 0x2a 0xde 0x10 0xc8 0x29 0xec 0x10 0x0a 0x2b 0xfc 0x10 0x90 0x2b 0x0d 0x11 0xb5 0x2b 0x0d 0x10 0x08 0x2c 0x0a 0x11 0xca 0x2c 0x02 0x11 0xbe 0x2b 0xeb 0x10 0x2f 0x2b 0xf6 0x10 0x4e 0x2b 0xdb 0x0f 0xce 0x2a 0xfe 0x10 0x35 0x2b 0xe8 0x10 0xae 0x2a 0xf6 0x10 0x3e 0x2b 0xe6 0x10 0xc9 0x2a 0xe7 0x0f 0x11 0x2b 0xe7 0x10 0xb8 0x2a 0x03 0x11 0x26 0x2c 0x04 0x11 0xc6 0x2b 0x14 0x11 0xcc 0x2c 0x13 0x10 0x9a 0x2c 0x14 0x11 0xad 0x2c 0x05 0x11 0x26 0x2c 0x02 0x11 0xe1 0x2b 0x0d 0x11 0xd9 0x2b 0x0b 0x10 0x4a 0x2b 0x04 0x11 0x5e 0x2b 0x0b 0x11 0x01 0x2b 0x08 0x11 0x16 0x2b 0xfc 0x10 0x1b 0x2a 0x20 0x11 0xa8 0x2b 0x00 0x10 0x8c 0x2b 0x38 0x11 0xd2 0x2d 0x20 0x11 0x43 0x2c 0x25 0x11 0x96 0x2c 0xfe 0x10 0x12 0x2b 0xfb 0x0f 0x11 0x2b 0xf2 0x10 0xe4 0x2a 0x08 0x11 0xe6 0x2a 0xef 0x10 0x80 0x2b 0x17 0x11 0x96 0x2c 0x0e 0x10 0x20 0x2d 0x1f 0x11 0x00 0x2d 0x21 0x11 0xb6 0x2d 0x1b 0x11 0x9c 0x2c 0x31 0x11 0x9f 0x2c 0x8c 0x10 0x32 0x2b 0x07 0x11 0xab 0x2c 0x22 0x11 0x17 0x2c 0x2c 0x11 0xc6 0x2c 0x2a 0x11 0x7a 0x2c 0x3b 0x10 0xd8 0x2e 0x47 0x11 0x18 0x2d 0x2f 0x11 0x0e 0x2d 0x37 0x11 0xa7 0x2c 0x4e 0x11 0xe1 0x2c 0x40 0x10 0x95 0x2c 0x3e 0x11 0xf5 0x2c 0x46 0x11 0x1d 0x2d 0x34 0x11 0xac 0x2c 0x39 0x11 0x8f 0x2c 0x8b 0x10 0x16 0x2c 0xd4 0x11 0xd8 0x2c 0xb2 0x11 0x1a 0x2c 0xc4 0x11 0x89 0x2c 0x9c 0x11 0xd7 0x2b 0xae 0x10 0x19 0x2d 0x9c 0x11 0x1f 0x2c 0xaf 0x11 0x50 0x2d 0xa8 0x11 0xcc 0x2c 0xb2 0x11 0xa6 0x2d 0xa8 0x10 0x5a 0x2d 0xba 0x11 0xc8 0x2d 0xad 0x11 0x8b 0x2d 0xb7 0x11 0x0a 0x2d 0xb3 0x11 0xd3 0x2c 0x50 0x10 0x32 0x2c 0x0d 0x11 0xb1 0x2b 0x03 0x12 0xf0 0x2b 0x5c 0x10 0x45 0x2b 0x72 0x10 0x83 0x2b 0x66 0x0f 0x0b 0x2d 0x5e 0x10 0x5e 0x2c 0x77 0x10 0x66 0x2d 0x64 0x10 0xd2 0x2b 0x88 0x10 0xda 0x2d 0x57 0x0f 0x28 0x2c 0x6b 0x10 0x22 0x2d 0x53 0x10 0x2d 0x2c 0x6c 0x10 0xe0 0x2c 0x67 0x10 0xea 0x2b 0x51 0x0f 0x82 0x2b 0x59 0x10 0x14 0x2c 0x60 0x10 0x61 0x2c 0x74 0x10 0xa4 0x2c 0x5d 0x10 0x1d 0x2c 0x5e 0x0f 0x32 0x2d 0x6a 0x10 0x72 0x2c 0x79 0x10 0x42 0x2d 0x47 0x10 0xd2 0x2b 0x62 0x10 0x0f 0x2c 0x35 0x0f 0xf4 0x2a 0x49 0x10 0xd2 0x2b 0x47 0x10 0x45 0x2b 0x6b 0x10 0x4e 0x2b 0x4a 0x10 0x64 0x2b 0x41 0x0f 0x15 0x2c 0x50 0x10 0x44 0x2b 0x65 0x10 0x2d 0x2c 0x54 0x10 0xb2 0x2c 0x5c 0x10 0xc6 0x2c 0x47 0x0f 0x36 0x2d 0x5d 0x10 0x3c 0x2c 0x37 0x10 0x5a 0x2c 0x48 0x10 0x3f 0x2b 0x4c 0x10 0x50 0x2b 0x35 0x0f 0x16 0x2b 0x41 0x10 0xc0 0x2b 0x3f 0x10 0x6c 0x2a 0x45 0x10 0x27 0x2b 0x39 0x10 0xdc 0x2a 0x49 0x0f 0x47 0x2c 0x3b 0x10 0x59 0x2b 0x39 0x10 0x40 0x2c 0x3e 0x10 0xd1 0x2b 0x37 0x10 0x20 0x2c 0x32 0x0f 0xa5 0x2b 0x47 0x10 0xcd 0x2b 0x4a 0x10 0x01 0x2c 0x44 0x10 0x99 0x2b 0x3c 0x10 0x4c 0x2b 0x10 0x0f 0x9b 0x2a 0x27 0x10 0xd0 0x2a 0x18 0x10 0xe3 0x29 0x32 0x10 0xaf 0x2a 0x23 0x10 0x2e 0x2a 0x49 0x0f 0xf7 0x2c 0x23 0x10 0x2c 0x2b 0x50 0x10 0xde 0x2c 0x35 0x10 0x26 0x2b 0x23 0x10 0x54 0x2b 0x00 0x0f 0xd6 0x29 0x17 0x10 0xbb 0x29 0x14 0x10 0xfa 0x29 0x1f 0x10 0x86 0x2a 0x36 0x10 0xe2 0x2a 0x1a 0x0f 0x9f 0x2a 0x22 0x10 0xb3 0x2b 0x23 0x10 0x66 0x2a 0x22 0x10 0x10 0x2c 0x1b 0x10 0x98 0x2a 0x1e 0x0f 0xd7 0x2a 0x25 0x10 0x69 0x29 0x1d 0x10 0x09 0x2a 0x19 0x10 0xad 0x29 0x2d 0x10 0xac 0x2a 0x16 0x0f 0x2c 0x2b 0x1e 0x10 0xb1 0x2b 0x2b 0x10 0xee 0x2a 0x3d 0x10 0x20 0x2b 0x1f 0x10 0xa9 0x2a 0x1a 0x0f 0x45 0x2a 0x30 0x10 0x2c 0x2b 0x17 0x10 0x92 0x2b 0x31 0x10 0xf9 0x2a 0x06 0x10 0xe1 0x29 0x23 0x0f 0xab 0x2b 0x25 0x10 0x5f 0x2a 0x16 0x10 0x96 0x2a 0x00 0x10 0xfc 0x29 0x07 0x10 0x71 0x2a 0xe1 0x0e 0x02 0x29 0xf8 0x0f 0x21 0x2a 0x0c 0x10 0xbe 0x2a 0x14 0x10 0xd2 0x2a 0xfa 0x0f 0x32 0x2a 0x09 0x0f 0xc0 0x2a 0x14 0x10 0xcd 0x2a 0x0e 0x10 0x6a 0x2a 0x07 0x10 0x13 0x2a 0x17 0x10 0x12 0x2a 0x08 0x0f 0x22 0x2b 0x0d 0x10 0xfd 0x29 0x2f 0x10 0x5d 0x2b 0x0f 0x10 0x4c 0x2a 0x1f 0x10 0xe1 0x2a 0xe7 0x0e 0xcb 0x28 0x1a 0x10 0x6a 0x29 0x10 0x10 0x10 0x29 0x0c 0x10 0x15 0x29 0x0a 0x10 0x34 0x29 0xef 0x0e 0x1f 0x2a 0x0f 0x10 0x43 0x2a 0x1e 0x10 0xa8 0x2a 0x2a 0x10 0x93 0x2a 0x12 0x10 0x36 0x2a 0x1c 0x0f 0x98 0x2a 0xfe 0x0f 0x5d 0x29 0xff 0x0f 0xe4 0x29 0xfc 0x0f 0x28 0x29 0xff 0x0f 0x58 0x29 0xd8 0x0e 0x70 0x28 0x0a 0x10 0x5f 0x2a 0xfd 0x0f 0xde 0x29 0x1f 0x10 0x46 0x2b 0x0f 0x10 0xfa 0x29 0x09 0x0f 0xaf 0x2a 0xc1 0x10 0x84 0x29 0x32 0x10 0xaf 0x2a 0x2a 0x10 0xbd 0x29 0x30 0x10 0xfa 0x29 0x3e 0x0f 0x98 0x2a 0x4d 0x10 0x40 0x2b 0x3d 0x10 0xb7 0x2a 0x2f 0x10 0x89 0x29 0x3b 0x10 0x5b 0x29 0x1b 0x0f 0xbb 0x28 0x2f 0x10 0xa2 0x29 0x38 0x10 0x1e 0x29 0x4e 0x10 0x67 0x2a 0x48 0x10 0x0c 0x2a 0x79 0x0f 0x49 0x2b 0xf8 0x10 0xda 0x29 0xd9 0x10 0xc7 0x29 0xc4 0x10 0xfa 0x28 0xc1 0x10 0xd0 0x28 0xb4 0x0f 0x2e 0x29 0xb8 0x10 0xbd 0x29 0xb7 0x10 0x42 0x2a 0xb2 0x10 0x6d 0x2a 0xe1 0x10 0x2c 0x2a 0x9b 0x0f 0x58 0x29 0xba 0x10 0x86 0x29 0x9d 0x10 0xd2 0x28 0xdc 0x10 0x70 0x2a 0xbd 0x10 0xf9 0x29 0x97 0x0f 0xa0 0x2b 0x01 0x10 0x51 0x2a 0x6d 0x11 0x1c 0x2b 0xab 0x10 0x7c 0x28 0xd2 0x10 0xcc 0x28 0xb8 0x0f 0xb3 0x28 0xd5 0x10 0x02 0x2a 0xdf 0x10 0x17 0x2a 0xe6 0x10 0x42 0x2b 0xc7 0x10 0x6c 0x2a 0xf2 0x0f 0x78 0x2a 0xe0 0x10 0xf1 0x29 0xa0 0x10 0x18 0x29 0xaf 0x10 0x9c 0x28 0xc5 0x10 0x85 0x28 0xb3 0x0f 0x9d 0x28 0xb7 0x10 0xa7 0x28 0xc4 0x10 0x5d 0x2a 0xc2 0x10 0x4b 0x29 0xd5 0x10 0xb9 0x2a 0xc6 0x0f 0x43 0x29 0xbb 0x10 0xf6 0x29 0xa8 0x10 0xfd 0x27 0xb3 0x10 0x79 0x28 0xb9 0x10 0x65 0x28 0x98 0x0f 0xd1 0x28 0xb3 0x10 0x97 0x28 0xc7 0x10 0x1a 0x29 0xaf 0x10 0xb8 0x28 0x94 0x10 0xa0 0x28 0xb1 0x0f 0x76 0x28 0xa5 0x10 0x4a 0x28 0xb1 0x10 0x5b 0x28 0xad 0x10 0xa9 0x28 0xc0 0x10 0x03 0x29 0xa8 0x0f 0xba 0x28 0xb1 0x10 0x49 0x29 0xa6 0x10 0x92 0x28 0xb3 0x10 0x18 0x29 0x9d 0x10 0x26 0x28 0xae 0x0f 0x59 0x29 0xab 0x10 0x5b 0x29 0xc7 0x10 0xa5 0x2a 0xac 0x10 0xbe 0x29 0x8d 0x10 0x39 0x29 0x8e 0x0f 0xb1 0x28 0x9b 0x10 0x9f 0x28 0xa2 0x10 0xf4 0x28 0xb1 0x10 0xe9 0x28 0xa5 0x10 0xd0 0x28 0xaa 0x0f 0xaf 0x28 0xa3 0x10 0x91 0x29 0x97 0x10 0x22 0x28 0xa6 0x10 0x4b 0x29 0xa9 0x10 0xb2 0x28 0xaf 0x0f 0x05 0x2a 0xaf 0x10 0xe4 0x28 0x97 0x10 0xd7 0x29 0xa2 0x10 0xd9 0x28 0xb2 0x10 0xf4 0x29 0xb7 0x0f 0xb6 0x29 0xb7 0x10 0xfa 0x29 0xb1 0x10 0xd3 0x29 0xb4 0x10 0xbe 0x29 0xae 0x10 0xf8 0x29 0xa2 0x0f 0x61 0x29 0xb6 0x10 0x12 0x29 0xaf 0x10 0xd2 0x28 0xb8 0x10 0x54 0x29 0x8d 0x10 0xee 0x27 0xa3 0x0f 0x9e 0x28 0x7c 0x10 0x79 0x28 0xa1 0x10 0x07 0x2a 0x94 0x10 0xb0 0x28 0xc1 0x10 0x8c 0x2a 0xa8 0x0f 0x4a 0x29 0x98 0x10 0x45 0x2a 0xae 0x10 0x2f 0x2a 0xa1 0x10 0xed 0x29 0xa0 0x10 0x7f 0x29 0xac 0x0f 0x7b 0x29 0xac 0x10 0x93 0x29 0xa0 0x10 0x1f 0x29 0x90 0x10 0x8a 0x28 0x8b 0x10 0xd3 0x28 0xa7 0x0f 0x3d 0x29 0x92 0x10 0x4d 0x28 + URB 23429 bulk_out len 3544 wrote 0x33 0x10 0x.... write(0x1003e000,0x00000dd8) write(0x10068000,0x00000dd8) */ @@ -5156,7 +5120,7 @@ static Genesys_Command_Set gl847_cmd_set = { gl847_slow_back_home, gl847_bulk_write_register, - gl847_bulk_write_data, + NULL, gl847_bulk_read_data, gl847_update_hardware_sensors, diff --git a/backend/genesys_gl847.h b/backend/genesys_gl847.h index f322352fb..2491b1829 100644 --- a/backend/genesys_gl847.h +++ b/backend/genesys_gl847.h @@ -65,8 +65,9 @@ #define REG01_CISSET 0x80 #define REG01_DOGENB 0x40 #define REG01_DVDSET 0x20 -#define REG01_M16DRAM 0x08 -#define REG01_DRAMSEL 0x04 +#define REG01_STAGGER 0x10 +#define REG01_COMPENB 0x08 +#define REG01_TRUEGRAY 0x04 #define REG01_SHDAREA 0x02 #define REG01_SCAN 0x01 @@ -79,6 +80,7 @@ #define REG02_HOMENEG 0x02 #define REG02_LONGCURV 0x01 +#define REG03 0x03 #define REG03_LAMPDOG 0x80 #define REG03_AVEENB 0x40 #define REG03_XPASEL 0x20 @@ -107,10 +109,7 @@ #define REG06_GAIN4 0x08 #define REG06_OPTEST 0x07 -#define REG07_SRAMSEL 0x08 -#define REG07_FASTDMA 0x04 -#define REG07_DMASEL 0x02 -#define REG07_DMARDWR 0x01 +#define REG07_LAMPSIM 0x80 #define REG08_DRAM2X 0x80 #define REG08_MPENB 0x20 @@ -120,7 +119,8 @@ #define REG08_ENB24M 0x01 #define REG09_MCNTSET 0xc0 -#define REG09_CLKSET 0x30 +#define REG09_EVEN1ST 0x20 +#define REG09_BLINE1ST 0x10 #define REG09_BACKSCAN 0x08 #define REG09_ENHANCE 0x04 #define REG09_SHORTTG 0x02 @@ -130,7 +130,7 @@ #define REG09S_CLKSET 4 -#define REG0A_SRAMBUF 0x01 +#define REG0A_LPWMEN 0x10 #define REG0B_DRAMSEL 0x07 #define REG0B_ENBDRAM 0x08 @@ -167,6 +167,8 @@ #define REG18_CKDELAY 0x0c #define REG18_CKSEL 0x03 +#define REG1A_SW2SET 0x80 +#define REG1A_SW1SET 0x40 #define REG1A_MANUAL3 0x02 #define REG1A_MANUAL1 0x01 #define REG1A_CK4INV 0x08 @@ -222,24 +224,35 @@ #define REG5E_STOPTIM 0x1f #define REG5ES_STOPTIM 0 -#define REG60_ZIMOD 0x1f +#define REG60 0x60 +#define REG60_Z1MOD 0x1f +#define REG61 0x61 #define REG61_Z1MOD 0xff +#define REG62 0x62 #define REG62_Z1MOD 0xff +#define REG63 0x63 #define REG63_Z2MOD 0x1f +#define REG64 0x64 #define REG64_Z2MOD 0xff +#define REG65 0x65 #define REG65_Z2MOD 0xff -#define REG67_STEPSEL 0xc0 -#define REG67_FULLSTEP 0x00 -#define REG67_HALFSTEP 0x40 -#define REG67_QUATERSTEP 0x80 +#define REG60S_STEPSEL 5 +#define REG60_FSTPSEL 0xe0 +#define REG60_FULLSTEP 0x00 +#define REG60_HALFSTEP 0x20 +#define REG60_EIGHTHSTEP 0x60 +#define REG60_16THSTEP 0x80 + +#define REG63_FSTPSEL 0xe0 +#define REG63_FULLSTEP 0x00 +#define REG63_HALFSTEP 0x20 +#define REG63_EIGHTHSTEP 0x60 +#define REG63_16THSTEP 0x80 + #define REG67_MTRPWM 0x3f -#define REG68_FSTPSEL 0xc0 -#define REG68_FULLSTEP 0x00 -#define REG68_HALFSTEP 0x40 -#define REG68_QUATERSTEP 0x80 #define REG68_FASTPWM 0x3f #define REG6B_MULTFILM 0x80