* 610P gray levels shading calibration fix

* added timer to let 610P ASIC settle down after probing
merge-requests/1/head
Stéphane Voltz 2004-06-15 05:45:09 +00:00
rodzic 6de2f54c0c
commit e4892c69cf
4 zmienionych plików z 105 dodań i 36 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2004-06-15 Stéphane Voltz <svoltz@wanadoo.fr>
* backend/umax_pp_low.h backend/umax_pp_low.c backend/umax_pp_mid.c:
610P gray level shading calibration fix. Added timer to let 610P
ASIC to settle down after probing.
2004-06-13 Julien Blache <jb@jblache.org> 2004-06-13 Julien Blache <jb@jblache.org>
* doc/Makefile.in: saned is in /usr/sbin, its manpage should go to * doc/Makefile.in: saned is in /usr/sbin, its manpage should go to
section 8. Fixed everything referring to saned(1) to refer to saned(8). section 8. Fixed everything referring to saned(1) to refer to saned(8).
@ -11,7 +17,7 @@
* backend/sane_usb.c: Added Perfection 1650 back in that was removed by * backend/sane_usb.c: Added Perfection 1650 back in that was removed by
mistake and finally removed Perfection 1250. mistake and finally removed Perfection 1250.
2004-06-15 Stéphane Voltz <svoltz@wanadoo.fr> 2004-06-12 Stéphane Voltz <svoltz@wanadoo.fr>
* backend/umax_pp_low.c tools/umax_pp.c: final fixes for 610P color * backend/umax_pp_low.c tools/umax_pp.c: final fixes for 610P color
scanning, parallel port autodetection for the umax_pp tool. scanning, parallel port autodetection for the umax_pp tool.

Wyświetl plik

@ -1641,6 +1641,8 @@ Outsw (int port, unsigned char *source, int size)
/* and published it through an easy interface */ /* and published it through an easy interface */
/* will turn it into a struct when 610P code will be done */ /* will turn it into a struct when 610P code will be done */
static int scannerStatus = 0; static int scannerStatus = 0;
static time_t gTime = 0 ;
static time_t gDelay = 0 ;
static int epp32 = 1; static int epp32 = 1;
static int gMode = 0; static int gMode = 0;
static int gprobed = 0; static int gprobed = 0;
@ -1673,6 +1675,21 @@ sanei_umax_pp_UTA (void)
int int
sanei_umax_pp_scannerStatus (void) sanei_umax_pp_scannerStatus (void)
{ {
struct timeval tv;
/* the 610P ASIC needs some time to settle down after probe */
if((gTime>0)&&(gDelay>0))
{
gettimeofday(&tv,NULL);
/* delay elapsed ?*/
if(tv.tv_sec-gTime<gDelay)
/* still waiting */
return ASIC_BIT;
/* wait finished */
gDelay=0;
gTime=0;
}
/* 0x07 variant returns status with bit 0 or 1 allways set to 1 */ /* 0x07 variant returns status with bit 0 or 1 allways set to 1 */
/* so we mask it out */ /* so we mask it out */
return scannerStatus & 0xFC; return scannerStatus & 0xFC;
@ -5797,7 +5814,7 @@ sanei_umax_pp_endSession (void)
int int
initScanner610p (int recover) initScanner610p (int recover)
{ {
int first, rc; int first, rc, x;
int cmd55AA[9] = { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, -1 }; int cmd55AA[9] = { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, -1 };
int cmd02[17] = { 0x02, 0x80, 0x00, 0x40, 0x30, 0x00, 0xC0, 0x2F, int cmd02[17] = { 0x02, 0x80, 0x00, 0x40, 0x30, 0x00, 0xC0, 0x2F,
0x2F, 0x07, 0x00, 0x00, 0x00, 0x80, 0xF0, 0x00, -1 0x2F, 0x07, 0x00, 0x00, 0x00, 0x80, 0xF0, 0x00, -1
@ -5833,10 +5850,18 @@ initScanner610p (int recover)
}; };
int op03[9] = { 0x00, 0x00, 0x00, 0xAA, 0xCC, 0xEE, 0xFF, 0xFF, -1 }; int op03[9] = { 0x00, 0x00, 0x00, 0xAA, 0xCC, 0xEE, 0xFF, 0xFF, -1 };
struct timeval tv;
byteMode (); /* just to get sure */ byteMode (); /* just to get sure */
first = 0; first = 0;
rc = inquire (); rc = inquire ();
/* get time to handle settle time delay */
gettimeofday(&tv,NULL);
gTime=tv.tv_sec;
/* default delay */
gDelay=5;
if (rc == 0) if (rc == 0)
{ {
DBG (0, "inquire() failed ! (%s:%d) \n", __FILE__, __LINE__); DBG (0, "inquire() failed ! (%s:%d) \n", __FILE__, __LINE__);
@ -5844,6 +5869,8 @@ initScanner610p (int recover)
} }
if (rc == 2) if (rc == 2)
{ {
/* same value used by windows driver */
gDelay=45;
DBG (1, "inquire() signals re-homing needed ... (%s:%d) \n", DBG (1, "inquire() signals re-homing needed ... (%s:%d) \n",
__FILE__, __LINE__); __FILE__, __LINE__);
first = 1; first = 1;
@ -5948,6 +5975,14 @@ initScanner610p (int recover)
return 0; return 0;
} }
/* override gamma table with 610P defaults */
for (x = 0; x < 256; x++)
{
ggRed[x] = x;
ggGreen[x] = x;
ggBlue[x] = x;
}
DBG (1, "initScanner610p done ...\n"); DBG (1, "initScanner610p done ...\n");
return 1; return 1;
} }
@ -12203,6 +12238,7 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
}; };
int len, dpi, size; int len, dpi, size;
int bpp = 3; /* defaults to color scan value */
int w, h, x, y; int w, h, x, y;
int sum, i; int sum, i;
float avg, coeff = 0; float avg, coeff = 0;
@ -12231,7 +12267,17 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
bottom = 8; bottom = 8;
} }
data = (unsigned char *) malloc (w * h * 3); /* gray scanning handling */
if (color < RGB_MODE)
{
lm9811[7] = dcGreen << 4;
lm9811[6] = 0x40 | vgaGreen;
bpp = 1;
motor[13] = 0x6F;
}
data = (unsigned char *) malloc (w * h * bpp);
if (data == NULL) if (data == NULL)
{ {
DBG (0, "shadingCalibration: failed to allocate memory (%s:%d)\n", DBG (0, "shadingCalibration: failed to allocate memory (%s:%d)\n",
@ -12241,7 +12287,7 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
/* prepare scan command */ /* prepare scan command */
x = sanei_umax_pp_getLeft (); x = sanei_umax_pp_getLeft ();
encodeWX (w, x, dpi, color, ccd, 3 * w); encodeWX (w, x, dpi, color, ccd, bpp * w);
encodeHY (h, y, motor); encodeHY (h, y, motor);
encodeDC (dcRed, dcGreen, dcBlue, motor); encodeDC (dcRed, dcGreen, dcBlue, motor);
encodeVGA (vgaRed, vgaGreen, vgaBlue, motor); encodeVGA (vgaRed, vgaGreen, vgaBlue, motor);
@ -12259,18 +12305,14 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
CMDSETGET (4, 0x08, commit); CMDSETGET (4, 0x08, commit);
COMPLETIONWAIT; COMPLETIONWAIT;
if (color >= RGB_MODE)
{
/* picture height is scan area height minus y */ /* picture height is scan area height minus y */
/* then we substract 6 lines that aren't scanned */ /* then we substract 14 or 6 lines that aren't scanned */
h = h - y - 6; if (color < RGB_MODE)
size = w * 3 * h; h = h - y - 14;
}
else else
{ h = h - y - 6;
h = h - y - 1; size = w * bpp * h;
size = w * h;
}
DBG (128, "shadingCalibration: trying to read 0x%06X bytes ... (%s:%d)\n", DBG (128, "shadingCalibration: trying to read 0x%06X bytes ... (%s:%d)\n",
size, __FILE__, __LINE__); size, __FILE__, __LINE__);
/* since we know that each scan line matches CCD width, we signals /* since we know that each scan line matches CCD width, we signals
@ -12285,15 +12327,34 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
/* debug image files */ /* debug image files */
/* data is in R B G order */ /* data is in R B G order */
if (DBG_LEVEL > 128) if (DBG_LEVEL > 128)
DumpNB (w * 3, h, data, NULL); DumpNB (w * bpp, h, data, NULL);
/* in gray scans, we have only green component (i=3) */
if (color < RGB_MODE)
{
/* zeroes unused shading coefficients */
memset (calibration, 0x00, 2 * w);
/* build green only coefficients */
for (x = 4; x < w; x++)
{
sum = 0;
for (y = top; y < h - bottom; y++)
sum += data[y * w + x];
avg = ((float) (sum)) / ((float) (h - (top + bottom)));
coeff = (256.0 * (250.0 / avg - 1.0)) / 1.70;
calibration[x + 2 * w - 4] = (int) (coeff + 0.5);
}
}
else
{
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
for (x = 4; x < w; x++) for (x = 4; x < w; x++)
{ {
sum = 0; sum = 0;
for (y = top; y < h - bottom; y++) for (y = top; y < h - bottom; y++)
sum += data[(y * 3 + i) * w + x]; sum += data[(y * bpp + i) * w + x];
avg = ((float) (sum)) / ((float) (h - (top + bottom))); avg = ((float) (sum)) / ((float) (h - (top + bottom)));
/*coeff = (256.0 * (250.0 / avg - 1.0)) / 1.95; */ /*coeff = (256.0 * (250.0 / avg - 1.0)) / 1.95; */
switch (i) switch (i)
@ -12312,6 +12373,7 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
} }
/* 100 in coeffs -> +104 on picture */ /* 100 in coeffs -> +104 on picture */
} }
}
/* use default color tables */ /* use default color tables */
for (x = 0; x < 256; x++) for (x = 0; x < 256; x++)
@ -12323,8 +12385,8 @@ shadingCalibration (int color, int dcRed, int dcGreen, int dcBlue,
if (DBG_LEVEL > 128) if (DBG_LEVEL > 128)
{ {
DumpNB (w * 3, h, data, NULL); DumpNB (w * bpp, h, data, NULL);
DumpNB (w, h * 3, data, NULL); DumpNB (w, h * bpp, data, NULL);
} }
free (data); free (data);

Wyświetl plik

@ -78,6 +78,7 @@ extern void sanei_umax_pp_setauto (int mode);
#define LAMP_STATE 0x20 #define LAMP_STATE 0x20
#define MOTOR_BIT 0x40 #define MOTOR_BIT 0x40
#define ASIC_BIT 0x100
#define UMAX_PP_PARPORT_PS2 0x01 #define UMAX_PP_PARPORT_PS2 0x01
#define UMAX_PP_PARPORT_BYTE 0x02 #define UMAX_PP_PARPORT_BYTE 0x02

Wyświetl plik

@ -440,7 +440,7 @@ sanei_umax_pp_status (void)
status = sanei_umax_pp_scannerStatus (); status = sanei_umax_pp_scannerStatus ();
unlock_parport (); unlock_parport ();
DBG (8, "sanei_umax_pp_status=0x%02X\n", status); DBG (8, "sanei_umax_pp_status=0x%02X\n", status);
if ((status & MOTOR_BIT) == 0x00) if (((status & ASIC_BIT) != 0x00)||((status & MOTOR_BIT) == 0x00))
return UMAX1220P_BUSY; return UMAX1220P_BUSY;
return UMAX1220P_OK; return UMAX1220P_OK;