diff options
Diffstat (limited to 'backend/hp3900_debug.c')
-rw-r--r-- | backend/hp3900_debug.c | 1581 |
1 files changed, 1581 insertions, 0 deletions
diff --git a/backend/hp3900_debug.c b/backend/hp3900_debug.c new file mode 100644 index 0000000..18f6136 --- /dev/null +++ b/backend/hp3900_debug.c @@ -0,0 +1,1581 @@ +/* HP Scanjet 3900 series - Debugging functions for standalone + + Copyright (C) 2005-2008 Jonathan Bravo Lopez <jkdsoft@gmail.com> + + This file is part of the SANE package. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, the authors of SANE give permission for + additional uses of the libraries contained in this release of SANE. + + The exception is that, if you link a SANE library with other files + to produce an executable, this does not by itself cause the + resulting executable to be covered by the GNU General Public + License. Your use of that executable is in no way restricted on + account of linking the SANE library code into it. + + This exception does not, however, invalidate any other reasons why + the executable file might be covered by the GNU General Public + License. + + If you submit changes to SANE to the maintainers to be included in + a subsequent release, you agree by submitting the changes that + those changes may be distributed with this exception intact. + + If you write modifications of your own for SANE, it is your choice + whether to permit this exception to apply to your modifications. + If you do not wish that, delete this exception notice. +*/ + +/* debugging level messages */ +#define DBG_ERR 0x00 /* Only important errors */ +#define DBG_VRB 0x01 /* verbose messages */ +#define DBG_FNC 0x02 /* Function names and parameters */ +#define DBG_CTL 0x03 /* USB Ctl data */ +#define DBG_BLK 0x04 /* USB Bulk data */ + +#include <stdarg.h> +#ifdef HAVE_TIFFIO_H +#include <tiffio.h> /* dbg_tiff_save */ +#endif + +/* headers */ + +static void dump_shading (struct st_calibration *myCalib); +static char *dbg_scantype (SANE_Int type); +static void dbg_scanmodes (struct st_device *dev); +static void dbg_motorcurves (struct st_device *dev); +static void dbg_motormoves (struct st_device *dev); +static void dbg_hwdcfg (struct st_hwdconfig *params); +static void dbg_ScanParams (struct st_scanparams *params); +static void dbg_calibtable (struct st_gain_offset *params); +static char *dbg_colour (SANE_Int colour); +static void dbg_motorcfg (struct st_motorcfg *motorcfg); +static void dbg_buttons (struct st_buttons *buttons); +static void dbg_sensor (struct st_sensorcfg *sensor); +static void dbg_timing (struct st_timing *mt); +static void dbg_sensorclock (struct st_cph *cph); +static void dbg_tiff_save (char *sFile, SANE_Int width, SANE_Int height, + SANE_Int depth, SANE_Int colortype, SANE_Int res_x, + SANE_Int res_y, SANE_Byte * buffer, SANE_Int size); +static void dbg_autoref (struct st_scanparams *scancfg, SANE_Byte * pattern, + SANE_Int ser1, SANE_Int ser2, SANE_Int ler); + +#ifdef developing +static void dbg_buffer (SANE_Int level, char *title, SANE_Byte * buffer, + SANE_Int size, SANE_Int start); +static void dbg_registers (SANE_Byte * buffer); +#endif + +#ifdef STANDALONE + +/* implementation */ + +int DBG_LEVEL = 0; + +static void +DBG (int level, const char *msg, ...) +{ + va_list ap; + va_start (ap, msg); + + if (level <= DBG_LEVEL) + vfprintf (stderr, msg, ap); + + va_end (ap); +} + +#endif + +/* debugging functions */ + +static void +dump_shading (struct st_calibration *myCalib) +{ + if (myCalib != NULL) + { + SANE_Int colour, a; + FILE *shadingfile[3]; + + shadingfile[0] = fopen ("RShading.txt", "w"); + shadingfile[1] = fopen ("GShading.txt", "w"); + shadingfile[2] = fopen ("BShading.txt", "w"); + + for (colour = 0; colour < 3; colour++) + { + if (shadingfile[colour] != NULL) + { + for (a = 0; a < myCalib->shadinglength; a++) + fprintf (shadingfile[colour], "%04i: %04x %04x\n", a, + (unsigned int) myCalib->white_shading[colour][a], + (unsigned int) myCalib->black_shading[colour][a]); + fclose (shadingfile[colour]); + } + } + } +} + +static char * +dbg_scantype (SANE_Int type) +{ + switch (type) + { + case ST_NORMAL: + return "ST_NORMAL"; + break; + case ST_TA: + return "ST_TA"; + break; + case ST_NEG: + return "ST_NEG"; + break; + default: + return "Unknown"; + break; + } +} + +static void +dbg_sensorclock (struct st_cph *cph) +{ + if (cph != NULL) + { + DBG (DBG_FNC, " -> cph->p1 = %f\n", cph->p1); + DBG (DBG_FNC, " -> cph->p2 = %f\n", cph->p2); + DBG (DBG_FNC, " -> cph->ps = %i\n", cph->ps); + DBG (DBG_FNC, " -> cph->ge = %i\n", cph->ge); + DBG (DBG_FNC, " -> cph->go = %i\n", cph->go); + } + else + DBG (DBG_FNC, " -> cph is NULL\n"); +} + +static void +dbg_timing (struct st_timing *mt) +{ + if (mt != NULL) + { + DBG (DBG_FNC, " -> mt->cdss[0] = %i\n", _B0 (mt->cdss[0])); + DBG (DBG_FNC, " -> mt->cdsc[0] = %i\n", _B0 (mt->cdsc[0])); + DBG (DBG_FNC, " -> mt->cdss[1] = %i\n", _B0 (mt->cdss[1])); + DBG (DBG_FNC, " -> mt->cdsc[1] = %i\n", _B0 (mt->cdsc[1])); + DBG (DBG_FNC, " -> mt->cnpp = %i\n", _B0 (mt->cnpp)); + DBG (DBG_FNC, " -> mt->cvtrp0 = %i\n", _B0 (mt->cvtrp[0])); + DBG (DBG_FNC, " -> mt->cvtrp1 = %i\n", _B0 (mt->cvtrp[1])); + DBG (DBG_FNC, " -> mt->cvtrp2 = %i\n", _B0 (mt->cvtrp[2])); + DBG (DBG_FNC, " -> mt->cvtrfpw = %i\n", _B0 (mt->cvtrfpw)); + DBG (DBG_FNC, " -> mt->cvtrbpw = %i\n", _B0 (mt->cvtrbpw)); + DBG (DBG_FNC, " -> mt->cvtrw = %i\n", _B0 (mt->cvtrw)); + DBG (DBG_FNC, " -> mt->clamps = 0x%08x\n", mt->clamps); + DBG (DBG_FNC, " -> mt->clampe = 0x%08x\n", mt->clampe); + DBG (DBG_FNC, " -> mt->adcclkp0 = %f\n", mt->adcclkp[0]); + DBG (DBG_FNC, " -> mt->adcclkp1 = %f\n", mt->adcclkp[1]); + DBG (DBG_FNC, " -> mt->adcclkp2e = %i\n", mt->adcclkp2e); + DBG (DBG_FNC, " -> mt->cphbp2s = %i\n", mt->cphbp2s); + DBG (DBG_FNC, " -> mt->cphbp2e = %i\n", mt->cphbp2e); + } + else + DBG (DBG_FNC, " -> mt is NULL\n"); +} + +static void +dbg_sensor (struct st_sensorcfg *sensor) +{ + if (sensor != NULL) + { + DBG (DBG_FNC, + " -> type, name, res , {chn_color }, {chn_gray}, {rgb_order }, line_dist, evnodd_dist\n"); + DBG (DBG_FNC, + " -> ----, ----, --- , {--, --, --}, {--, -- }, {--, --, --}, ---------, -----------\n"); + DBG (DBG_FNC, + " -> %4i, %4i, %4i, {%2i, %2i, %2i}, {%2i, %2i }, {%2i, %2i, %2i}, %9i, %11i\n", + sensor->type, sensor->name, sensor->resolution, + sensor->channel_color[0], sensor->channel_color[1], + sensor->channel_color[2], sensor->channel_gray[0], + sensor->channel_gray[1], sensor->rgb_order[0], + sensor->rgb_order[1], sensor->rgb_order[2], sensor->line_distance, + sensor->evenodd_distance); + } + else + DBG (DBG_FNC, " -> sensor is NULL\n"); +} + +static void +dbg_buttons (struct st_buttons *buttons) +{ + if (buttons != NULL) + { + DBG (DBG_FNC, " -> count, btn1, btn2, btn3, btn4, btn5, btn6\n"); + DBG (DBG_FNC, " -> -----, ----, ----, ----, ----, ----, ----\n"); + DBG (DBG_FNC, " -> %5i, %4i, %4i, %4i, %4i, %4i, %4i\n", + buttons->count, buttons->mask[0], buttons->mask[1], + buttons->mask[2], buttons->mask[3], buttons->mask[4], + buttons->mask[5]); + } + else + DBG (DBG_FNC, " -> buttons is NULL\n"); +} + +static void +dbg_scanmodes (struct st_device *dev) +{ + if (dev->scanmodes_count > 0) + { + SANE_Int a; + struct st_scanmode *reg; + + DBG (DBG_FNC, + " -> ##, ST , CM , RES , TM, CV, SR, CLK, CTPC , BKS , STT, DML, { Exposure times }, { Max exposure times }, MP , MExp16, MExpF, MExp, MRI, MSI, MMTIR, MMTIRH, SK\n"); + DBG (DBG_FNC, + " -> --, ---------, ----------, --- , --, --, --, ---, ------, ----, ---, ---, {------ ------ ------}, {------ ------ ------}, ---, ------, -----, ----, ---, ---, -----, ------, --\n"); + for (a = 0; a < dev->scanmodes_count; a++) + { + reg = dev->scanmodes[a]; + if (reg != NULL) + { + DBG (DBG_FNC, + " -> %2i, %9s, %10s, %4i, %2i, %2i, %2i, %3i, %6i, %4i, %3i, %3i, {%6i, %6i, %6i}, {%6i, %6i, %6i}, %3i, %6i, %5i, %4i, %3i, %3i, %5i, %6i, %2i\n", + a, dbg_scantype (reg->scantype), + dbg_colour (reg->colormode), reg->resolution, reg->timing, + reg->motorcurve, reg->samplerate, reg->systemclock, + reg->ctpc, reg->motorbackstep, reg->scanmotorsteptype, + reg->dummyline, reg->expt[0], reg->expt[1], reg->expt[2], + reg->mexpt[0], reg->mexpt[1], reg->mexpt[2], + reg->motorplus, reg->multiexposurefor16bitmode, + reg->multiexposureforfullspeed, reg->multiexposure, + reg->mri, reg->msi, reg->mmtir, reg->mmtirh, + reg->skiplinecount); + } + } + } +} + +static void +dbg_motorcurves (struct st_device *dev) +{ + if (dev->mtrsetting != NULL) + { + struct st_motorcurve *mtc; + SANE_Int a = 0; + + while (a < dev->mtrsetting_count) + { + DBG (DBG_FNC, " -> Motorcurve %2i: ", a); + mtc = dev->mtrsetting[a]; + if (mtc != NULL) + { + DBG (DBG_FNC, "mri=%i msi=%i skip=%i bckstp=%i\n", mtc->mri, + mtc->msi, mtc->skiplinecount, mtc->motorbackstep); + if (mtc->curve_count > 0) + { + char *sdata = (char *) malloc (256); + if (sdata != NULL) + { + char *sline = (char *) malloc (256); + if (sline != NULL) + { + SANE_Int count; + struct st_curve *crv; + + DBG (DBG_FNC, + " -> ##, dir, type , count, from, to , steps\n"); + DBG (DBG_FNC, + " -> --, ---, ----------, -----, ----, ----, -----\n"); + + count = 0; + while (count < mtc->curve_count) + { + memset (sline, 0, 256); + + snprintf (sdata, 256, " -> %02i, ", count); + strcat (sline, sdata); + + crv = mtc->curve[count]; + if (crv != NULL) + { + if (crv->crv_speed == ACC_CURVE) + strcat (sline, "ACC, "); + else + strcat (sline, "DEC, "); + + switch (crv->crv_type) + { + case CRV_NORMALSCAN: + strcat (sline, "NORMALSCAN, "); + break; + case CRV_PARKHOME: + strcat (sline, "PARKHOME , "); + break; + case CRV_SMEARING: + strcat (sline, "SMEARING , "); + break; + case CRV_BUFFERFULL: + strcat (sline, "BUFFERFULL, "); + break; + default: + snprintf (sdata, 256, "unknown %2i, ", + crv->crv_type); + strcat (sline, sdata); + break; + } + + snprintf (sdata, 256, "%5i, ", + crv->step_count); + strcat (sline, sdata); + if (crv->step_count > 0) + { + SANE_Int stpcount = 0; + + snprintf (sdata, 256, "%4i, %4i| ", + crv->step[0], + crv->step[crv->step_count - + 1]); + strcat (sline, sdata); + + while (stpcount < crv->step_count) + { + if (stpcount == 10) + { + strcat (sline, "..."); + break; + } + if (stpcount > 0) + strcat (sline, ", "); + + snprintf (sdata, 256, "%4i", + crv->step[stpcount]); + strcat (sline, sdata); + + stpcount++; + } + strcat (sline, "\n"); + } + else + strcat (sline, "NONE\n"); + } + else + strcat (sline, "NULL ...\n"); + + DBG (DBG_FNC, "%s", sline); + + count++; + } + + free (sline); + } + free (sdata); + } + } + } + else + DBG (DBG_FNC, "NULL\n"); + a++; + } + } +} + +static void +dbg_motormoves (struct st_device *dev) +{ + if (dev->motormove_count > 0) + { + SANE_Int a; + struct st_motormove *reg; + + DBG (DBG_FNC, " -> ##, CLK, CTPC, STT, CV\n"); + DBG (DBG_FNC, " -> --, ---, ----, ---, --\n"); + for (a = 0; a < dev->motormove_count; a++) + { + reg = dev->motormove[a]; + if (reg != NULL) + { + DBG (DBG_FNC, " -> %2i, %3i, %4i, %3i, %2i\n", + a, reg->systemclock, reg->ctpc, + reg->scanmotorsteptype, reg->motorcurve); + } + } + } +} + +static void +dbg_hwdcfg (struct st_hwdconfig *params) +{ + if (params != NULL) + { + DBG (DBG_FNC, " -> Low level config:\n"); + DBG (DBG_FNC, " -> startpos = %i\n", params->startpos); + DBG (DBG_FNC, " -> arrangeline = %s\n", + (params->arrangeline == + FIX_BY_SOFT) ? "FIX_BY_SOFT" : (params->arrangeline == + FIX_BY_HARD) ? "FIX_BY_HARD" : + "FIX_BY_NONE"); + DBG (DBG_FNC, " -> scantype = %s\n", + dbg_scantype (params->scantype)); + DBG (DBG_FNC, " -> compression = %i\n", params->compression); + DBG (DBG_FNC, " -> use_gamma_tables = %i\n", + params->use_gamma_tables); + DBG (DBG_FNC, " -> gamma_tablesize = %i\n", + params->gamma_tablesize); + DBG (DBG_FNC, " -> white_shading = %i\n", + params->white_shading); + DBG (DBG_FNC, " -> black_shading = %i\n", + params->black_shading); + DBG (DBG_FNC, " -> unk3 = %i\n", params->unk3); + DBG (DBG_FNC, " -> motorplus = %i\n", params->motorplus); + DBG (DBG_FNC, " -> static_head = %i\n", params->static_head); + DBG (DBG_FNC, " -> motor_direction = %s\n", + (params->motor_direction == MTR_FORWARD) ? "FORWARD" : "BACKWARD"); + DBG (DBG_FNC, " -> dummy_scan = %i\n", params->dummy_scan); + DBG (DBG_FNC, " -> highresolution = %i\n", + params->highresolution); + DBG (DBG_FNC, " -> sensorevenodddistance = %i\n", + params->sensorevenodddistance); + DBG (DBG_FNC, " -> calibrate = %i\n", params->calibrate); + } +} + +static void +dbg_ScanParams (struct st_scanparams *params) +{ + if (params != NULL) + { + DBG (DBG_FNC, " -> Scan params:\n"); + DBG (DBG_FNC, " -> colormode = %s\n", + dbg_colour (params->colormode)); + DBG (DBG_FNC, " -> depth = %i\n", params->depth); + DBG (DBG_FNC, " -> samplerate = %i\n", params->samplerate); + DBG (DBG_FNC, " -> timing = %i\n", params->timing); + DBG (DBG_FNC, " -> channel = %i\n", params->channel); + DBG (DBG_FNC, " -> sensorresolution = %i\n", params->sensorresolution); + DBG (DBG_FNC, " -> resolution_x = %i\n", params->resolution_x); + DBG (DBG_FNC, " -> resolution_y = %i\n", params->resolution_y); + DBG (DBG_FNC, " -> left = %i\n", params->coord.left); + DBG (DBG_FNC, " -> width = %i\n", params->coord.width); + DBG (DBG_FNC, " -> top = %i\n", params->coord.top); + DBG (DBG_FNC, " -> height = %i\n", params->coord.height); + DBG (DBG_FNC, " -> shadinglength = %i\n", params->shadinglength); + DBG (DBG_FNC, " -> v157c = %i\n", params->v157c); + DBG (DBG_FNC, " -> bytesperline = %i\n", params->bytesperline); + DBG (DBG_FNC, " -> expt = %i\n", params->expt); + DBG (DBG_FNC, " *> startpos = %i\n", params->startpos); + DBG (DBG_FNC, " *> leftleading = %i\n", params->leftleading); + DBG (DBG_FNC, " *> ser = %i\n", params->ser); + DBG (DBG_FNC, " *> ler = %i\n", params->ler); + DBG (DBG_FNC, " *> scantype = %s\n", + dbg_scantype (params->scantype)); + } +} + +static void +dbg_calibtable (struct st_gain_offset *params) +{ + if (params != NULL) + { + DBG (DBG_FNC, " -> Calib table:\n"); + DBG (DBG_FNC, " -> type R G B\n"); + DBG (DBG_FNC, " -> ----- --- --- ---B\n"); + DBG (DBG_FNC, " -> edcg1 = %3i , %3i , %3i\n", params->edcg1[0], + params->edcg1[1], params->edcg1[2]); + DBG (DBG_FNC, " -> edcg2 = %3i , %3i , %3i\n", params->edcg2[0], + params->edcg2[1], params->edcg2[2]); + DBG (DBG_FNC, " -> odcg1 = %3i , %3i , %3i\n", params->odcg1[0], + params->odcg1[1], params->odcg1[2]); + DBG (DBG_FNC, " -> odcg2 = %3i , %3i , %3i\n", params->odcg2[0], + params->odcg2[1], params->odcg2[2]); + DBG (DBG_FNC, " -> pag = %3i , %3i , %3i\n", params->pag[0], + params->pag[1], params->pag[2]); + DBG (DBG_FNC, " -> vgag1 = %3i , %3i , %3i\n", params->vgag1[0], + params->vgag1[1], params->vgag1[2]); + DBG (DBG_FNC, " -> vgag2 = %3i , %3i , %3i\n", params->vgag2[0], + params->vgag2[1], params->vgag2[2]); + } +} + +static char * +dbg_colour (SANE_Int colour) +{ + switch (colour) + { + case CM_COLOR: + return "CM_COLOR"; + break; + case CM_GRAY: + return "CM_GRAY"; + break; + case CM_LINEART: + return "CM_LINEART"; + break; + default: + return "Unknown"; + break; + } +} + +static void +dbg_motorcfg (struct st_motorcfg *motorcfg) +{ + if (motorcfg != NULL) + { + DBG (DBG_FNC, + " -> type, res , freq, speed, base, high, park, change\n"); + DBG (DBG_FNC, + " -> ----, --- , ----, -----, ----, ----, ----, ------\n"); + DBG (DBG_FNC, " -> %4i, %4i, %4i, %5i, %4i, %4i, %4i, %6i\n", + motorcfg->type, motorcfg->resolution, motorcfg->pwmfrequency, + motorcfg->basespeedpps, motorcfg->basespeedmotormove, + motorcfg->highspeedmotormove, motorcfg->parkhomemotormove, + motorcfg->changemotorcurrent); + } +} + +static void +dbg_tiff_save (char *sFile, SANE_Int width, SANE_Int height, SANE_Int depth, + SANE_Int colortype, SANE_Int res_x, SANE_Int res_y, + SANE_Byte * buffer, SANE_Int size) +{ +#ifdef HAVE_TIFFIO_H + if (buffer != NULL) + { + char *path = getenv ("HOME"); + + if (path != NULL) + { + char filename[512]; + TIFF *image; + + if (snprintf (filename, 512, "%s/%s", path, sFile) > 0) + { + /* Open the TIFF file */ + if ((image = TIFFOpen (filename, "w")) != NULL) + { + char desc[256]; + + SANE_Int spp = (colortype == CM_GRAY) ? 1 : 3; + SANE_Int ct = + (colortype == + CM_GRAY) ? PHOTOMETRIC_MINISBLACK : PHOTOMETRIC_RGB; + + snprintf (desc, 256, "Created with hp3900 %s", + BACKEND_VRSN); + + /* We need to set some values for basic tags before we can add any data */ + TIFFSetField (image, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField (image, TIFFTAG_IMAGELENGTH, height); + TIFFSetField (image, TIFFTAG_BITSPERSAMPLE, depth); + TIFFSetField (image, TIFFTAG_SAMPLESPERPIXEL, spp); + + TIFFSetField (image, TIFFTAG_PHOTOMETRIC, ct); + TIFFSetField (image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); + TIFFSetField (image, TIFFTAG_PLANARCONFIG, + PLANARCONFIG_CONTIG); + + TIFFSetField (image, TIFFTAG_XRESOLUTION, (double) res_x); + TIFFSetField (image, TIFFTAG_YRESOLUTION, (double) res_y); + TIFFSetField (image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); + TIFFSetField (image, TIFFTAG_IMAGEDESCRIPTION, desc); + + /* Write the information to the file */ + TIFFWriteRawStrip (image, 0, buffer, size); + TIFFClose (image); + } + } + else + DBG (DBG_ERR, "- dbg_tiff_save: Error generating filename\n"); + } + else + DBG (DBG_ERR, + "- dbg_tiff_save: Enviroment HOME variable does not exist\n"); + } +#else + /* silent gcc */ + sFile = sFile; + width = width; + height = height; + depth = depth; + colortype = colortype; + res_x = res_x; + res_y = res_y; + buffer = buffer; + size = size; + + DBG (DBG_ERR, "- dbg_tiff_save: tiffio not supported\n"); +#endif +} + +static void +dbg_autoref (struct st_scanparams *scancfg, SANE_Byte * pattern, + SANE_Int ser1, SANE_Int ser2, SANE_Int ler) +{ + /* this function generates post-autoref.tiff */ + SANE_Byte *img = + malloc (sizeof (SANE_Byte) * + (scancfg->coord.width * scancfg->coord.height * 3)); + + if (img != NULL) + { + SANE_Int c, value; + + /* generate image from 1 gray channel to 3 color channels */ + for (c = 0; c < (scancfg->coord.width * scancfg->coord.height); c++) + { + value = *(pattern + c); + *(img + (3 * c)) = value; + *(img + (3 * c) + 1) = value; + *(img + (3 * c) + 2) = value; + } + + for (c = 0; c < scancfg->coord.height; c++) + { + /* line for first SER */ + if (c < (ler + 5)) + { + *(img + (scancfg->coord.width * c * 3) + (3 * ser1)) = 0; + *(img + (scancfg->coord.width * c * 3) + (3 * ser1) + 1) = 255; + *(img + (scancfg->coord.width * c * 3) + (3 * ser1) + 2) = 0; + } + + /* line for second SER */ + if (c > (ler - 5)) + { + *(img + (scancfg->coord.width * c * 3) + (3 * ser2)) = 90; + *(img + (scancfg->coord.width * c * 3) + (3 * ser2) + 1) = 90; + *(img + (scancfg->coord.width * c * 3) + (3 * ser2) + 2) = 255; + } + + /* vertical lines of the pointer */ + if ((c > (ler - 5)) && (c < (ler + 5))) + { + if ((ser2 - 5) >= 0) + { + *(img + (scancfg->coord.width * c * 3) + (3 * (ser2 - 5))) = + 255; + *(img + (scancfg->coord.width * c * 3) + (3 * (ser2 - 5)) + + 1) = 255; + *(img + (scancfg->coord.width * c * 3) + (3 * (ser2 - 5)) + + 2) = 0; + } + + if ((ser2 + 5) < scancfg->coord.width) + { + *(img + (scancfg->coord.width * c * 3) + (3 * (ser2 + 5))) = + 255; + *(img + (scancfg->coord.width * c * 3) + (3 * (ser2 + 5)) + + 1) = 255; + *(img + (scancfg->coord.width * c * 3) + (3 * (ser2 + 5)) + + 2) = 0; + } + } + } + + /* line for first LER */ + for (c = 0; c < scancfg->coord.width; c++) + { + if ((c > (ser1 - 5)) && (c < (ser2 + 5))) + { + if (c != (ser2 - 5)) + { + *(img + (scancfg->coord.width * ler * 3) + (3 * c)) = 255; + *(img + (scancfg->coord.width * ler * 3) + (3 * c) + 1) = + 90; + *(img + (scancfg->coord.width * ler * 3) + (3 * c) + 2) = + 90; + } + + /* horizontal lines of the pointer */ + if ((c > (ser2 - 5)) && (c < (ser2 + 5))) + { + if ((ler - 5) >= 0) + { + *(img + (scancfg->coord.width * (ler - 5) * 3) + + (3 * c)) = 255; + *(img + (scancfg->coord.width * (ler - 5) * 3) + + (3 * c) + 1) = 255; + *(img + (scancfg->coord.width * (ler - 5) * 3) + + (3 * c) + 2) = 0; + } + + if ((ler + 5) < scancfg->coord.height) + { + *(img + (scancfg->coord.width * (ler + 5) * 3) + + (3 * c)) = 255; + *(img + (scancfg->coord.width * (ler + 5) * 3) + + (3 * c) + 1) = 255; + *(img + (scancfg->coord.width * (ler + 5) * 3) + + (3 * c) + 2) = 0; + } + } + } + } + + dbg_tiff_save ("post-autoref.tiff", scancfg->coord.width, + scancfg->coord.height, 8, CM_COLOR, + scancfg->resolution_x, scancfg->resolution_y, img, + scancfg->coord.height * scancfg->coord.width * 3); + + /* free generated image */ + free (img); + } +} + +#ifdef developing + +static void +dbg_buffer (SANE_Int level, char *title, SANE_Byte * buffer, SANE_Int size, + SANE_Int start) +{ + if (level <= DBG_LEVEL) + { + DBG (level, "%s ", title); + if ((size > 0) && (buffer != NULL)) + { + SANE_Int cont, data, offset = 0; + SANE_Int col = 0; + char text[9]; + char *sline = NULL; + char *sdata = NULL; + + sline = (char *) malloc (81); + if (sline != NULL) + { + sdata = (char *) malloc (81); + if (sdata != NULL) + { + for (cont = 0; cont < size; cont++) + { + if (col == 0) + { + if (cont == 0) + snprintf (sline, 80, " BF: "); + else + snprintf (sline, 80, " "); + bzero (&text, sizeof (text)); + } + data = _B0 (buffer[cont]); + text[col] = (data > 31) ? data : '·'; + snprintf (sdata, 80, "%02x ", data); + sline = strcat (sline, sdata); + col++; + offset++; + if (col == 8) + { + col = 0; + snprintf (sdata, 80, " : %s : 0x%04x\n", text, + start + offset - 8); + sline = strcat (sline, sdata); + DBG (level, "%s", sline); + bzero (sline, 81); + } + } + if (col > 0) + { + for (cont = col; cont < 8; cont++) + { + snprintf (sdata, 80, "-- "); + sline = strcat (sline, sdata); + offset++; + } + snprintf (sdata, 80, " : %s : 0x%04x\n", text, + start + offset - 8); + sline = strcat (sline, sdata); + DBG (level, "%s", sline); + bzero (sline, 81); + } + free (sdata); + } + free (sline); + } + } + else + DBG (level, " BF: Empty buffer\n"); + } +} + +static void +dbg_registers (SANE_Byte * buffer) +{ + /* buffer size must be RT_BUFFER_LEN bytes */ + /*SANE_Int iValue, iValue2; + double dValue; + + DBG(DBG_FNC, "\n----------------------------------------------------\n"); + DBG(DBG_FNC, """RTS8822 Control Registers Info""\nAddress Info\n------- ----\n"); + iValue = data_lsb_get(&buffer[0x000], 1); + DBG(DBG_FNC, "\n0x0000"); + DBG(DBG_FNC, " bit[0..3] = systemclock: 0x%02x\n", iValue & 0x0f); + DBG(DBG_FNC, " bit[4] = 0x%02x : MLOCK\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[5] = 0x%02x : Bit to reset scanner\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[6] = 0x%02x : ?\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = 0x%02x : RTS_IsExecuting\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x001], 1); + DBG(DBG_FNC, "0x0001 bit[0] = 0x%02x : ?\n", iValue & 1); + DBG(DBG_FNC, " bit[1] = 0x%02x : (is 1 if has motorcurves)\n", (iValue >> 1) & 1); + DBG(DBG_FNC, " bit[2] = 0x%02x : ?\n", (iValue >> 2) & 1); + DBG(DBG_FNC, " bit[3] = 0x%02x : ?\n", (iValue >> 3) & 1); + DBG(DBG_FNC, " bit[4] = 0x%02x : dummy scan\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[5..7] = 0x%02x : ?\n", (iValue >> 5) & 7); + + dbg_buffer(DBG_FNC, "\n0x0002", &buffer[0x002], 0x0e, 0x02); + + iValue = data_lsb_get(&buffer[0x010], 1); + DBG(DBG_FNC, "\n0x0010 bit[0..4] = 0x%02x : cvrs\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5] = 0x%02x : Enable CCD\n", ((iValue >> 5) & 1)); + DBG(DBG_FNC, " bit[6] = 0x%02x : Enable CCD channel 1\n", ((iValue >> 6) & 1)); + DBG(DBG_FNC, " bit[7] = 0x%02x : Enable CCD channel 2\n", ((iValue >> 7) & 1)); + + iValue = data_lsb_get(&buffer[0x011], 1); + DBG(DBG_FNC, "\n0x0011 bit[0..6] = ?: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[7] = 0x%02x : sensor type (CCD=0|CIS=1)\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x012], 1); + DBG(DBG_FNC, "0x0012 bit[0..5] = 0x%02x [0x%02x,0x%02x,0x%02x] rgb channel order\n", (iValue & 0x3f), (iValue >> 4) & 3, (iValue >> 2) & 3, iValue & 3); + DBG(DBG_FNC, " bit[6..7] = channels_per_dot : 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x013], 1); + DBG(DBG_FNC, "\n0x0013"); + DBG(DBG_FNC, " bit[0..1] = Pre-Amplifier Gain[RED] : 0x%02x\n", iValue & 3); + DBG(DBG_FNC, " bit[2..3] = Pre-Amplifier Gain[GREEN] : 0x%02x\n", (iValue >> 2) & 3); + DBG(DBG_FNC, " bit[4..5] = Pre-Amplifier Gain[BLUE] : 0x%02x\n", (iValue >> 4) & 3); + DBG(DBG_FNC, " bit[6] = ? : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = Enable CCD channel 3: : 0x%02x\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x014], 1); + DBG(DBG_FNC, "\n0x0014"); + DBG(DBG_FNC, " bit[0..4] = Variable Gain Amplifier 1 [RED] : 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = Top Reference Voltage: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x015], 1); + DBG(DBG_FNC, "0x0015"); + DBG(DBG_FNC, " bit[0..4] = Variable Gain Amplifier 1 [GREEN] : 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = Middle Reference Voltage: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x016], 1); + DBG(DBG_FNC, "0x0016"); + DBG(DBG_FNC, " bit[0..4] = Variable Gain Amplifier 1 [BLUE] : 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = Bottom Reference Voltage: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x017], 1); + DBG(DBG_FNC, "0x0017"); + DBG(DBG_FNC, " bit[0..4] = Variable Gain Amplifier 2 [RED] : 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = Top Reference Voltage: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x018], 1); + DBG(DBG_FNC, "0x0018"); + DBG(DBG_FNC, " bit[0..4] = Variable Gain Amplifier 2 [GREEN] : 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = Middle Reference Voltage: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x019], 1); + DBG(DBG_FNC, "0x0019"); + DBG(DBG_FNC, " bit[0..4] = Variable Gain Amplifier 2 [BLUE] : 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = Bottom Reference Voltage: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x01a], 1); + iValue2 = data_lsb_get(&buffer[0x01b], 1); + DBG(DBG_FNC, "\n0x001a-0x001b\n"); + DBG(DBG_FNC, " Red Even offset 1: 0x%02x\n", ((iValue2 & 0x80) << 1) | iValue); + DBG(DBG_FNC, " Red Even offset 2: 0x%02x\n", iValue2 & 0x3f); + + iValue = data_lsb_get(&buffer[0x01c], 1); + iValue2 = data_lsb_get(&buffer[0x01d], 1); + DBG(DBG_FNC, "0x001c-0x001d\n"); + DBG(DBG_FNC, " Red Odd offset 1: 0x%02x\n", ((iValue2 & 0x80) << 1) | iValue); + DBG(DBG_FNC, " Red Odd offset 2: 0x%02x\n", iValue2 & 0x3f); + + iValue = data_lsb_get(&buffer[0x01e], 1); + iValue2 = data_lsb_get(&buffer[0x01f], 1); + DBG(DBG_FNC, "0x001e-0x001f\n"); + DBG(DBG_FNC, " Green Even offset 1: 0x%02x\n", ((iValue2 & 0x80) << 1) | iValue); + DBG(DBG_FNC, " Green Even offset 2: 0x%02x\n", iValue2 & 0x3f); + + iValue = data_lsb_get(&buffer[0x020], 1); + iValue2 = data_lsb_get(&buffer[0x021], 1); + DBG(DBG_FNC, "0x0020-0x0021\n"); + DBG(DBG_FNC, " Green Odd offset 1: 0x%02x\n", ((iValue2 & 0x80) << 1) | iValue); + DBG(DBG_FNC, " Green Odd offset 2: 0x%02x\n", iValue2 & 0x3f); + + iValue = data_lsb_get(&buffer[0x022], 1); + iValue2 = data_lsb_get(&buffer[0x023], 1); + DBG(DBG_FNC, "0x0022-0x0023\n"); + DBG(DBG_FNC, " Blue Even offset 1: 0x%02x\n", ((iValue2 & 0x80) << 1) | iValue); + DBG(DBG_FNC, " Blue Even offset 2: 0x%02x\n", iValue2 & 0x3f); + + iValue = data_lsb_get(&buffer[0x024], 1); + iValue2 = data_lsb_get(&buffer[0x025], 1); + DBG(DBG_FNC, "0x0024-0x0025\n"); + DBG(DBG_FNC, " Blue Odd offset 1: 0x%02x\n", ((iValue2 & 0x80) << 1) | iValue); + DBG(DBG_FNC, " Blue Odd offset 2: 0x%02x\n", iValue2 & 0x3f); + + dbg_buffer(DBG_FNC, "\n0x0026", &buffer[0x026], 0x03, 0x26); + + iValue = data_lsb_get(&buffer[0x029], 1); + DBG(DBG_FNC, "\n0x0029"); + DBG(DBG_FNC, " First connection to scanner? : 0x%02x\n", iValue); + + dbg_buffer(DBG_FNC, "\n0x002a", &buffer[0x02a], 0x06, 0x2a); + + DBG(DBG_FNC, "\nExposure times:\n"); + iValue = data_lsb_get(&buffer[0x030], 3); + DBG(DBG_FNC, "0x0030 Line exposure time : %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x033], 3); + DBG(DBG_FNC, "\n0x0033 mexpts[RED] : %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x036], 3); + DBG(DBG_FNC, "0x0036 expts[RED] : %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x039], 3); + DBG(DBG_FNC, "0x0039 mexpts[GREEN]: %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x03c], 3); + DBG(DBG_FNC, "0x003c expts[GREEN]: %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x03f], 3); + DBG(DBG_FNC, "0x003f mexpts[BLUE] : %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x042], 3); + DBG(DBG_FNC, "0x0042 expts[BLUE] : %i us\n", iValue); + + iValue = data_lsb_get(&buffer[0x045], 1); + DBG(DBG_FNC, "\n0x0045 bit[0..4] = timing.cvtrfpw: 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5] = timing.cvtrp[2]: 0x%02x\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[6] = timing.cvtrp[1]: 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = timing.cvtrp[0]: 0x%02x\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x046], 1); + DBG(DBG_FNC, "0x0046"); + DBG(DBG_FNC, " bit[0..4] = timing.cvtrbpw: 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = ?: 0x%02x\n", (iValue >> 5) & 3); + + iValue = data_lsb_get(&buffer[0x047], 1); + DBG(DBG_FNC, "0x0047"); + DBG(DBG_FNC, " timing.cvtrw: 0x%02x\n", iValue); + + iValue = data_lsb_get(&buffer[0x04c], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x04a], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x048], 0x02); + DBG(DBG_FNC, "\n0x0048 Linear image sensor clock 1\n"); + DBG(DBG_FNC, " bit[0..35] = timing.cph0p1: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x04c], 0x01); + DBG(DBG_FNC, " bit[36] = timing.cph0go: 0x%02x\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[37] = timing.cph0ge: 0x%02x\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[38] = timing.cph0ps: 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x051], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x04f], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x04d], 0x02); + DBG(DBG_FNC, "0x004d"); + DBG(DBG_FNC, " bit[0..35] = timing.cph0p2: %.0f.\n", dValue); + + iValue = data_lsb_get(&buffer[0x056], 1) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x054], 2); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x052], 2); + DBG(DBG_FNC, "\n0x0052 Linear image sensor clock 2\n"); + DBG(DBG_FNC, " bit[0..35] = timing.cph1p1: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x056], 1); + DBG(DBG_FNC, " bit[36] = timing.cph1go: 0x%02x\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[37] = timing.cph1ge: 0x%02x\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[38] = timing.cph1ps: 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 7) & 1); + + + iValue = data_lsb_get(&buffer[0x05b], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x059], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x057], 0x02); + DBG(DBG_FNC, "0x0057"); + DBG(DBG_FNC, " bit[0..35] = timing.cph1p2: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x05b], 0x01); + DBG(DBG_FNC, " bits[36..39] = %02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: %02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: %02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: %02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: %02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x060], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x05e], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x05c], 0x02); + DBG(DBG_FNC, "\n0x005c Linear Image Sensor Clock 3\n"); + DBG(DBG_FNC, " bit[0..35] = timing.cph2p1: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x060], 0x01); + DBG(DBG_FNC, " bit[36] = timing.cph2go: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = timing.cph2ge: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = timing.cph2ps: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x065], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x063], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x061], 0x02); + DBG(DBG_FNC, "0x0061"); + DBG(DBG_FNC, " bit[0..35] = timing.cph2p2: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x065], 0x01); + DBG(DBG_FNC, " bits[36..39] = 0x%02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x06a], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x068], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x066], 0x02); + DBG(DBG_FNC, "\n0x0066 Linear Image Sensor Clock 4\n"); + DBG(DBG_FNC, " bit[0..35] = timing.cph3p1: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x06a], 0x01); + DBG(DBG_FNC, " bit[36] = timing.cph3go: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = timing.cph3ge: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = timing.cph3ps: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x06f], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x06d], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x06b], 0x02); + DBG(DBG_FNC, "0x006b"); + DBG(DBG_FNC, " bit[0..35] = timing.cph3p2: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x06f], 0x01); + DBG(DBG_FNC, " bits[36..39] = 0x%02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x074], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x072], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x070], 0x02); + DBG(DBG_FNC, "\n0x0070 Linear Image Sensor Clock 5\n"); + DBG(DBG_FNC, " bit[0..35] = timing.cph4p1: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x074], 0x01); + DBG(DBG_FNC, " bit[36] = timing.cph4go: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = timing.cph4ge: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = timing.cph4ps: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x079], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x077], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x075], 0x02); + DBG(DBG_FNC, "0x0075"); + DBG(DBG_FNC, " bit[0..35] = timing.cph4p2: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x079], 0x01); + DBG(DBG_FNC, " bits[36..39] = 0x%02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x07e], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x07c], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x07a], 0x02); + DBG(DBG_FNC, "\n0x007a Linear Image Sensor Clock 6\n"); + DBG(DBG_FNC, " bit[0..35] = timing.cph5p1: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x07e], 0x01); + DBG(DBG_FNC, " bit[36] = timing.cph5go: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = timing.cph5ge: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = timing.cph5ps: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x083], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x081], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x07f], 0x02); + DBG(DBG_FNC, "0x007f"); + DBG(DBG_FNC, " bit[0..35] = timing.cph5p2: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x083], 0x01); + DBG(DBG_FNC, " bits[36..39] = 0x%02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + iValue = data_lsb_get(&buffer[0x084], 3); + DBG(DBG_FNC, "\n0x0084"); + DBG(DBG_FNC, " timing.cphbp2s : 0x%06x\n", iValue); + + iValue = data_lsb_get(&buffer[0x087], 3); + DBG(DBG_FNC, "0x0087"); + DBG(DBG_FNC, " timing.cphbp2e : 0x%06x\n", iValue); + + iValue = data_lsb_get(&buffer[0x08a], 3); + DBG(DBG_FNC, "0x008a"); + DBG(DBG_FNC, " timing.clamps : 0x%08x\n", iValue); + + iValue = data_lsb_get(&buffer[0x08d], 3); + DBG(DBG_FNC, "0x008d"); + DBG(DBG_FNC, " timing.clampe or cphbp2e : 0x%08x\n", iValue); + + iValue = data_lsb_get(&buffer[0x092], 0x01); + DBG(DBG_FNC, "\n0x0092 Correlated-Double-Sample 1\n"); + DBG(DBG_FNC, " bit[0..5] = timing.cdss[0]: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x093], 0x01); + DBG(DBG_FNC, "0x0093"); + DBG(DBG_FNC, " bit[0..5] = timing.cdsc[0]: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x094], 0x01); + DBG(DBG_FNC, "\n0x0094 Correlated-Double-Sample 2\n"); + DBG(DBG_FNC, " bit[0..5] = timing.cdss[1]: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x095], 0x01); + DBG(DBG_FNC, "0x0095"); + DBG(DBG_FNC, " bit[0..5] = timing.cdsc[1]: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x096], 0x01); + DBG(DBG_FNC, "0x0096"); + DBG(DBG_FNC, " bit[0..5] = timing.cnpp: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x09b], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x099], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x097], 0x02); + DBG(DBG_FNC, "\n0x0097 Analog to Digital Converter clock 1\n"); + DBG(DBG_FNC, " bit[0..35] = timing.adcclkp[0]: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x09b], 0x01); + DBG(DBG_FNC, " bits[36..39] = 0x%02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: 0x%02x\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + dbg_buffer(DBG_FNC, "\n0x009c CIS sensor 1", &buffer[0x09c], 0x06, 0x9c); + dbg_buffer(DBG_FNC, "0x00a2 CIS sensor 2", &buffer[0x0a2], 0x06, 0xa2); + dbg_buffer(DBG_FNC, "0x00a8 CIS sensor 3", &buffer[0x0a8], 0x06, 0xa8); + + iValue = data_lsb_get(&buffer[0x0ae], 0x01); + DBG(DBG_FNC, "\n0x00ae"); + DBG(DBG_FNC, " bit[0..5] = ?: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x0af], 0x01); + DBG(DBG_FNC, "0x00af"); + DBG(DBG_FNC, " bit[0..2] = ?: 0x%02x\n", iValue & 7); + DBG(DBG_FNC, " bit[3..7] = ?: 0x%02x\n", (iValue >> 3) & 0x1f); + + iValue = data_lsb_get(&buffer[0x0b0], 2); + DBG(DBG_FNC, "\n0x00b0"); + DBG(DBG_FNC, " Left : 0x%04x\n", iValue); + + iValue = data_lsb_get(&buffer[0x0b2], 2); + DBG(DBG_FNC, "0x00b2"); + DBG(DBG_FNC, " Right: 0x%04x\n", iValue); + + dbg_buffer(DBG_FNC, "\n0x00b4", &buffer[0x0b4], 12, 0xb4); + + iValue = data_lsb_get(&buffer[0x0c0], 0x01); + DBG(DBG_FNC, "\n0x00c0"); + DBG(DBG_FNC, " bit[0..4] = resolution ratio: 0x%02x\n", iValue & 0x1f); + DBG(DBG_FNC, " bit[5..7] = ?: 0x%02x\n", (iValue >> 5) & 7); + + iValue = data_lsb_get(&buffer[0x0c5], 0x01) & 0x0f; + dValue = iValue * pow(2, 32); + iValue = data_lsb_get(&buffer[0x0c3], 0x02); + dValue = dValue + (iValue * pow(2, 16)) + data_lsb_get(&buffer[0x0c1], 2); + DBG(DBG_FNC, "\n0x00c1 Analog to Digital Converter clock 2\n"); + DBG(DBG_FNC, " bit[0..35] = timing.adcclkp[1]: %.0f.\n", dValue); + iValue = data_lsb_get(&buffer[0x0c5], 0x01); + DBG(DBG_FNC, " bits[36..39] = 0x%02x\n", (iValue >> 0x04) & 0x0f); + DBG(DBG_FNC, " bit[36] = ?: 0x%02x (equal to bit[32])\n", (iValue >> 0x04) & 0x01); + DBG(DBG_FNC, " bit[37] = ?: 0x%02x\n", (iValue >> 0x05) & 0x01); + DBG(DBG_FNC, " bit[38] = ?: 0x%02x\n", (iValue >> 0x06) & 0x01); + DBG(DBG_FNC, " bit[39] = ?: 0x%02x\n", (iValue >> 0x07) & 0x01); + + dbg_buffer(DBG_FNC, "\n0x00c6", &buffer[0x0c6], 0x0a, 0xc6); + + iValue = ((buffer[0x0d4] & 0x0f) << 0x10) + data_lsb_get(&buffer[0x0d0], 0x02); + DBG(DBG_FNC, "\n0x00d0"); + DBG(DBG_FNC, " Top : 0x%04x\n", iValue); + + iValue = ((buffer[0x0d4] & 0xf0) << 0x06)+ data_lsb_get(&buffer[0x0d2], 0x02); + DBG(DBG_FNC, "x00d2"); + DBG(DBG_FNC, " Down: 0x%04x\n", iValue); + + iValue = _B0(buffer[0x0d5]); + DBG(DBG_FNC, "0x00d5"); + DBG(DBG_FNC, " ?: 0x%04x\n", iValue); + + iValue = data_lsb_get(&buffer[0x0d6], 1); + DBG(DBG_FNC, "\n0x00d6"); + DBG(DBG_FNC, " bit[0..3] = ? : 0x%02x\n", iValue & 0xf); + DBG(DBG_FNC, " bit[4..7] = dummyline: 0x%02x\n", (iValue >> 4) & 0xf); + + iValue = data_lsb_get(&buffer[0x0d7], 0x01); + DBG(DBG_FNC, "\n0x00d7"); + DBG(DBG_FNC, " bit[0..5] = motor pwm frequency: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6] = ?: 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = motor type: 0x%02x ", (iValue >> 7) & 1); + if (((iValue >> 7) & 1) == MT_OUTPUTSTATE) + DBG(DBG_FNC, ": Output state machine\n"); + else DBG(DBG_FNC, "On-Chip PWM\n"); + + iValue = data_lsb_get(&buffer[0x0d8], 0x01); + DBG(DBG_FNC, "\n0x00d8"); + DBG(DBG_FNC, " bit[0..5] = ?: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6] = scantype (0=Normal|1=TMA) : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = enable head movement : 0x%02x :", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x0d9], 0x01); + DBG(DBG_FNC, "\n0x00d9"); + DBG(DBG_FNC, " bit[0..2] = ?: 0x%02x\n", iValue & 7); + DBG(DBG_FNC, " bit[3] = ?: 0x%02x\n", (iValue >> 3) & 1); + DBG(DBG_FNC, " bit[4..6] = motor step type: 0x%02x: ", (iValue >> 4) & 7); + switch((iValue >> 4) & 7) + { + case 0: DBG(DBG_FNC, "full (1)\n"); break; + case 1: DBG(DBG_FNC, "half (1/2)\n"); break; + case 2: DBG(DBG_FNC, "quart (1/4)\n"); break; + case 3: DBG(DBG_FNC, "(1/8)\n"); break; + default: DBG(DBG_FNC, "unknown\n"); break; + } + DBG(DBG_FNC, " bit[7] = Motor direction: 0x%02x = ", (iValue >> 7) & 1); + if (((iValue >> 7) & 1) == 0) + DBG(DBG_FNC, "Backward\n"); + else DBG(DBG_FNC, "Forward\n"); + + iValue = data_lsb_get(&buffer[0x0dd], 0x01); + DBG(DBG_FNC, "\n0x00da"); + DBG(DBG_FNC, " msi = 0x%03x\n", ((iValue & 3) << 8) + data_lsb_get(&buffer[0x0da], 1)); + + DBG(DBG_FNC, "0x00db"); + DBG(DBG_FNC, " motorbackstep1 = 0x%03x\n", ((iValue & 0x0c) << 6) + data_lsb_get(&buffer[0x0db], 1)); + + DBG(DBG_FNC, "0x00dc"); + DBG(DBG_FNC, " motorbackstep2 = 0x%03x\n", ((iValue & 0x30) << 4) + data_lsb_get(&buffer[0x0dc], 1)); + + iValue = data_lsb_get(&buffer[0x0dd], 0x01); + DBG(DBG_FNC, "0x00dd"); + DBG(DBG_FNC, " bit[7] = Motor enabled?: 0x%02x = ", (iValue >> 7) & 1); + if (((iValue >> 7) & 1) == 0) + DBG(DBG_FNC, "Yes\n"); + else DBG(DBG_FNC, "No\n"); + + iValue = data_lsb_get(&buffer[0x0de], 0x02); + DBG(DBG_FNC, "\n0x00de"); + DBG(DBG_FNC, " bit[00..11] = ?: 0x%02x\n", iValue & 0xfff); + DBG(DBG_FNC, " bit[12..15] = ?: 0x%02x\n", (iValue >> 12) & 0x0f); + + iValue = data_lsb_get(&buffer[0x0df], 0x01); + DBG(DBG_FNC, "\n0x00df"); + DBG(DBG_FNC, " bit[0..3] = ?: 0x%02x\n", iValue & 0x0f); + DBG(DBG_FNC, " bit[4] = has_motorcurves?: 0x%02x\n", (iValue >> 4) & 0x01); + DBG(DBG_FNC, " bit[5..7] = ?: 0x%02x\n", (iValue >> 5) & 7); + + iValue = data_lsb_get(&buffer[0x0e0], 1); + DBG(DBG_FNC, "\n0x00e0 step size - 1 : 0x%02x\n", iValue); + + iValue = data_lsb_get(&buffer[0x0e1], 3); + DBG(DBG_FNC, "\n0x00e1 0x%06x : last step of accurve.normalscan table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0e4], 3); + DBG(DBG_FNC, "0x00e4 0x%06x : last step of accurve.smearing table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0e7], 3); + DBG(DBG_FNC, "0x00e7 0x%06x : last step of accurve.parkhome table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0ea], 3); + DBG(DBG_FNC, "0x00ea 0x%06x : last step of deccurve.scanbufferfull table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0ed], 3); + DBG(DBG_FNC, "0x00ed 0x%06x : last step of deccurve.normalscan table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0f0], 3); + DBG(DBG_FNC, "0x00f0 0x%06x : last step of deccurve.smearing table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0f3], 3); + DBG(DBG_FNC, "0x00f3 0x%06x : last step of deccurve.parkhome table\n", iValue); + + iValue = data_lsb_get(&buffer[0x0f6], 2); + DBG(DBG_FNC, "\n0x00f6 bit[00..13] = 0x%04x : ptr to accurve.normalscan step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x0f8], 2); + DBG(DBG_FNC, "0x00f8"); + DBG(DBG_FNC, " bit[00..13] = 0x%04x : ptr to deccurve.scanbufferfull step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x0fa], 2); + DBG(DBG_FNC, "0x00fa"); + DBG(DBG_FNC, " bit[00..13] = 0x%04x : ptr to accurve.smearing step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x0fc], 2); + DBG(DBG_FNC, "0x00fc"); + DBG(DBG_FNC, " bit[00..13] = 0x%04x : ptr to deccurve.smearing step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x0fe], 2); + DBG(DBG_FNC, "0x00fe"); + DBG(DBG_FNC, " bit[00..13] = 0x%04x : ptr to deccurve.normalscan step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x100], 2); + DBG(DBG_FNC, "0x0100"); + DBG(DBG_FNC, " bit[00..13] = 0x%04x : ptr to accurve.parkhome step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x102], 2); + DBG(DBG_FNC, "0x0102"); + DBG(DBG_FNC, " bit[00..13] = 0x%04x : ptr to deccurve.parkhome step table\n", iValue & 0x3fff); + DBG(DBG_FNC, " bit[14..15] = 0x%04x : ?\n",(iValue >> 14) & 3); + + dbg_buffer(DBG_FNC, "\n0x0104 Motor resource", &buffer[0x104], 0x20, 0x104); + + dbg_buffer(DBG_FNC, "\n0x0124", &buffer[0x124], 0x22, 0x124); + + iValue = data_lsb_get(&buffer[0x146], 1); + DBG(DBG_FNC, "\n0x0146"); + DBG(DBG_FNC, " bit[0..3] = Lamp pulse-width modulation frequency : 0x%02x\n", iValue & 0xf); + DBG(DBG_FNC, " bit[4] = timer enabled? : 0x%02x\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[5] = ? : 0x%02x\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[6] = lamp turned on? : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = sensor type : 0x%02x ", (iValue >> 7) & 1); + if (((iValue >> 7) & 1) != 0) + DBG(DBG_FNC, "CCD\n"); + else DBG(DBG_FNC, "CIS\n"); + + iValue = data_lsb_get(&buffer[0x147], 1); + DBG(DBG_FNC, "\n0x0147"); + DBG(DBG_FNC, " time to turn off lamp = 0x%02x (minutes * 2.682163611980331)\n", iValue); + + iValue = data_lsb_get(&buffer[0x148], 1); + DBG(DBG_FNC, "\n0x0148"); + DBG(DBG_FNC, " bit[0..5] = Lamp pulse-width modulation duty cycle : 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ? : 0x%02x\n",(iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x149], 1); + DBG(DBG_FNC, "\n0x0149"); + DBG(DBG_FNC, " bit[0..5] = even_odd_distance : 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ? : 0x%02x\n",(iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x14a], 1); + DBG(DBG_FNC, "0x014a"); + DBG(DBG_FNC, " bit[0..5] = sensor line distance : 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n",(iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x14b], 1); + DBG(DBG_FNC, "0x014b"); + DBG(DBG_FNC, " bit[0..5] = sensor line distance + even_odd_distance: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n",(iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x14c], 1); + DBG(DBG_FNC, "0x014c"); + DBG(DBG_FNC, " bit[0..5] = sensor line distance * 2: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x14d], 1); + DBG(DBG_FNC, "0x014d"); + DBG(DBG_FNC, " bit[0..5] = (sensor line distance * 2) + even_odd_distance: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 3); + + iValue = data_lsb_get(&buffer[0x14e], 1); + DBG(DBG_FNC, "\n0x014e"); + DBG(DBG_FNC, " bit[0..3] = ?: 0x%02x\n", iValue & 0xf); + DBG(DBG_FNC, " bit[4] = ?: 0x%02x\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[5..7] = ?: 0x%02x\n", (iValue >> 5) & 7); + + dbg_buffer(DBG_FNC, "\n0x014f", &buffer[0x14f], 0x05, 0x14f); + + iValue = data_lsb_get(&buffer[0x154], 1); + DBG(DBG_FNC, "\n0x0154"); + DBG(DBG_FNC, " bit[0..3] = ?: 0x%02x\n", iValue & 0xf); + DBG(DBG_FNC, " bit[4..5] = ?: 0x%02x\n", (iValue >> 4) & 3); + DBG(DBG_FNC, " bit[6..7] = ?: 0x%02x\n", (iValue >> 6) & 7); + + iValue = data_lsb_get(&buffer[0x155], 1); + DBG(DBG_FNC, "\n0x0155"); + DBG(DBG_FNC, " bit[0..3] = ?: 0x%02x\n", iValue & 0x0f); + DBG(DBG_FNC, " bit[4] = 0x%02x : ", (iValue >> 4) & 1); + if (((iValue >> 4) & 1) == 0) + DBG(DBG_FNC, "flb lamp\n"); + else DBG(DBG_FNC, "tma lamp\n"); + DBG(DBG_FNC, " bit[5..7] = ? : 0x%02x\n", (iValue >> 5) & 7); + + dbg_buffer(DBG_FNC, "\n0x0156", &buffer[0x156], 0x02, 0x156); + + iValue = data_lsb_get(&buffer[0x158], 1); + DBG(DBG_FNC, "\n0x0158"); + DBG(DBG_FNC, " bit[0..3] = %02x : Scanner buttons ", iValue & 0x0f); + if ((iValue & 0x0f) == 0x0f) + DBG(DBG_FNC, "enabled\n"); + else DBG(DBG_FNC, "dissabled\n"); + DBG(DBG_FNC, " bit[4..7] = ? : 0x%02x\n", (iValue >> 4) & 0x0f); + + dbg_buffer(DBG_FNC, "\n0x0159", &buffer[0x159], 11, 0x159); + + iValue = data_lsb_get(&buffer[0x164], 1); + DBG(DBG_FNC, "\n0x0164"); + DBG(DBG_FNC, " bit[0..6] = ?: 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[7] = ? : 0x%02x\n", (iValue >> 7) & 1); + + dbg_buffer(DBG_FNC, "\n0x0165", &buffer[0x165], 3, 0x165); + + iValue = data_lsb_get(&buffer[0x168], 1); + DBG(DBG_FNC, "\n0x0168 Buttons status : 0x%02x\n", iValue); + DBG(DBG_FNC, " bit[0] = button 1 : 0x%02x\n", iValue & 1); + DBG(DBG_FNC, " bit[1] = button 2 : 0x%02x\n", (iValue >> 1) & 1); + DBG(DBG_FNC, " bit[2] = button 4 : 0x%02x\n", (iValue >> 2) & 1); + DBG(DBG_FNC, " bit[3] = button 3 : 0x%02x\n", (iValue >> 3) & 1); + DBG(DBG_FNC, " bit[4] = button ? : 0x%02x\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[5] = button ? : 0x%02x\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[6] = ? : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = ? : 0x%02x\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x169], 1); + DBG(DBG_FNC, "\n0x0169", iValue); + DBG(DBG_FNC, " bit[0] = ? : 0x%02x\n", iValue & 1); + DBG(DBG_FNC, " bit[1] = tma attached? : 0x%02x\n", (iValue >> 1) & 1); + DBG(DBG_FNC, " bit[2..7] = ? : 0x%02x\n", (iValue >> 2) & 0x3f); + + iValue = data_lsb_get(&buffer[0x16a], 1); + DBG(DBG_FNC, "\n0x016a Buttons status 2: 0x%02x\n", iValue); + DBG(DBG_FNC, " bit[0] = button 1 : 0x%02x\n", iValue & 1); + DBG(DBG_FNC, " bit[1] = button 2 : 0x%02x\n", (iValue >> 1) & 1); + DBG(DBG_FNC, " bit[2] = button 4 : 0x%02x\n", (iValue >> 2) & 1); + DBG(DBG_FNC, " bit[3] = button 3 : 0x%02x\n", (iValue >> 3) & 1); + DBG(DBG_FNC, " bit[4] = button ? : 0x%02x\n", (iValue >> 4) & 1); + DBG(DBG_FNC, " bit[5] = button ? : 0x%02x\n", (iValue >> 5) & 1); + DBG(DBG_FNC, " bit[6] = ? : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = ? : 0x%02x\n", (iValue >> 7) & 1); + + dbg_buffer(DBG_FNC, "\n0x016b", &buffer[0x16b], 4, 0x16b); + + iValue = data_lsb_get(&buffer[0x16f], 1); + DBG(DBG_FNC, "\n0x016f"); + DBG(DBG_FNC, " bit[0..5] = ? : 0x%02x\n", iValue & 0x3f); + DBG(DBG_FNC, " bit[6] = is lamp at home? : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = ?: %02x\n", (iValue >> 7) & 1); + + dbg_buffer(DBG_FNC, "\n0x0170", &buffer[0x170], 0x17, 0x170); + + iValue = data_lsb_get(&buffer[0x187], 1); + DBG(DBG_FNC, "\n0x0187"); + DBG(DBG_FNC, " bit[0..3] = ? : 0x%02x\n", iValue & 0xf); + DBG(DBG_FNC, " bit[4..7] = mclkioc : 0x%02x\n", (iValue >> 4) & 0xf); + + dbg_buffer(DBG_FNC, "\n0x0188", &buffer[0x188], 0x16, 0x188); + + iValue = data_lsb_get(&buffer[0x19e], 2); + DBG(DBG_FNC, "\n0x019e"); + DBG(DBG_FNC, " binary threshold low : 0x%04x\n", (iValue >> 8) + ((iValue << 8) & 0xff00)); + + iValue = data_lsb_get(&buffer[0x1a0], 2); + DBG(DBG_FNC, "\n0x01a0"); + DBG(DBG_FNC, " binary threshold high : 0x%04x\n", (iValue >> 8) + ((iValue << 8) & 0xff00)); + + dbg_buffer(DBG_FNC, "\n0x01a2", &buffer[0x1a2], 0x12, 0x1a2); + + iValue = data_lsb_get(&buffer[0x1b4], 2); + DBG(DBG_FNC, "\n0x01b4"); + DBG(DBG_FNC, " bit[00..13] = Ptr to red gamma table (table_size * 0) : 0x%04x\n", (iValue & 0x3fff)); + DBG(DBG_FNC, " bit[14..15] = ? : 0x%02x\n", (iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x1b6], 2); + DBG(DBG_FNC, "0x01b6"); + DBG(DBG_FNC, " bit[00..13] = Ptr to green gamma table (table_size * 1) : 0x%04x\n", (iValue & 0x3fff)); + DBG(DBG_FNC, " bit[14..15] = ? : 0x%02x\n", (iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x1b8], 2); + DBG(DBG_FNC, "0x01b8"); + DBG(DBG_FNC, " bit[00..13] = Ptr to blue gamma table (table_size * 2) : 0x%04x\n", (iValue & 0x3fff)); + DBG(DBG_FNC, " bit[14..15] = ? : 0x%02x\n", (iValue >> 14) & 3); + + iValue = data_lsb_get(&buffer[0x1ba], 1); + DBG(DBG_FNC, "\n0x01ba"); + DBG(DBG_FNC, " ? : 0x%02x\n", iValue); + + iValue = data_lsb_get(&buffer[0x1bb], 2); + DBG(DBG_FNC, "0x01bb"); + DBG(DBG_FNC, " ? : 0x%04x\n", iValue + ((data_lsb_get(&buffer[0x1bf], 1) & 1) << 16)); + + iValue = data_lsb_get(&buffer[0x1bd], 2); + DBG(DBG_FNC, "0x01bd"); + DBG(DBG_FNC, " ? : 0x%04x\n", iValue + (((data_lsb_get(&buffer[0x1bf], 1) >> 1) & 3) << 16)); + + iValue = data_lsb_get(&buffer[0x1c0], 3); + DBG(DBG_FNC, "0x01c0"); + DBG(DBG_FNC, " bit[0..19] = ? : 0x%06x\n", iValue & 0xfffff); + + iValue = data_lsb_get(&buffer[0x1bf], 2); + DBG(DBG_FNC, "\n0x01bf"); + DBG(DBG_FNC, " bit[3..4] = ? : 0x%02x\n", (iValue >> 3) & 3); + DBG(DBG_FNC, " bit[5..7] = ? : 0x%02x\n", (iValue >> 5) & 7); + + iValue = data_lsb_get(&buffer[0x1c2], 3); + DBG(DBG_FNC, "\n0x01c2"); + DBG(DBG_FNC, " bit[4..23] = ? : 0x%06x\n", ((iValue >> 8) & 0xffff) + (((iValue >> 4) & 0xf) << 16)); + + iValue = data_lsb_get(&buffer[0x1c5], 3); + DBG(DBG_FNC, "0x01c5"); + DBG(DBG_FNC, " bit[00..19] = ? : 0x%06x\n", iValue & 0xfffff); + DBG(DBG_FNC, " bit[20..23] = ? : 0x%02x\n", (iValue >> 20) & 0xf); + + dbg_buffer(DBG_FNC, "\n0x01c8", &buffer[0x1c8], 7, 0x1c8); + + iValue = data_lsb_get(&buffer[0x1cf], 3); + DBG(DBG_FNC, "\n0x01cf"); + DBG(DBG_FNC, " bit[0] = ? : 0x%02x\n", iValue & 1); + DBG(DBG_FNC, " bit[1] = shading base (0 = 0x4000|1= 0x2000) : 0x%02x\n", (iValue >> 1) & 1); + DBG(DBG_FNC, " bit[2] = white shading correction : 0x%02x\n", (iValue >> 2) & 1); + DBG(DBG_FNC, " bit[3] = black shading correction : 0x%02x\n", (iValue >> 3) & 1); + DBG(DBG_FNC, " bit[4..5] = 0x%02x : ", (iValue >> 4) & 3); + switch ((iValue >> 4) & 3) + { + case 0: DBG(DBG_FNC, "8 bits per channel"); break; + case 1: DBG(DBG_FNC, "12 bits per channel"); break; + case 2: DBG(DBG_FNC, "16 bits per channel"); break; + case 3: DBG(DBG_FNC, "lineart mode"); break; + } + DBG(DBG_FNC, "\n"); + DBG(DBG_FNC, " bit[6] = samplerate: 0x%02x ", (iValue >> 6) & 1); + if (((iValue >> 6) & 1) == PIXEL_RATE) + DBG(DBG_FNC, "PIXEL_RATE\n"); + else DBG(DBG_FNC, "LINE_RATE\n"); + DBG(DBG_FNC, " bit[7] = ? : 0x%02x\n", (iValue >> 7) & 1); + + iValue = data_lsb_get(&buffer[0x1d0], 1); + DBG(DBG_FNC, "\n0x01d0"); + DBG(DBG_FNC, " bit[0] = 0x%02x\n", iValue & 1); + DBG(DBG_FNC, " bit[1] = 0x%02x\n", (iValue >> 1) & 1); + DBG(DBG_FNC, " bit[2..3] = gamma table size : 0x%02x ", (iValue >> 2) & 3); + switch ((iValue >> 2) & 3) + { + case 0: DBG(DBG_FNC, "bit[0] + 0x100") ;break; + case 1: DBG(DBG_FNC, "bit[0] + 0x400") ;break; + case 2: DBG(DBG_FNC, "bit[0] + 0x1000") ;break; + } + DBG(DBG_FNC, "\n"); + DBG(DBG_FNC, " bit[4..5] = ? : 0x%02x\n", (iValue >> 4) & 3); + DBG(DBG_FNC, " bit[6] = use gamma tables? : 0x%02x\n", (iValue >> 6) & 1); + DBG(DBG_FNC, " bit[7] = ? : 0x%02x\n", (iValue >> 7) & 1); + + dbg_buffer(DBG_FNC, "\n0x01d1", &buffer[0x1d1], 0x430, 0x1d1); + + DBG(DBG_FNC, "----------------------------------------------------\n\n"); + */ + /*exit(0); */ +} +#endif |