kopia lustrzana https://gitlab.com/sane-project/backends
rodzic
c1cd998a52
commit
b2b0d37acb
|
@ -116,7 +116,7 @@ static void SetEPPMode (int mode);
|
||||||
static int GetEPPMode (void);
|
static int GetEPPMode (void);
|
||||||
static void SetModel (int model);
|
static void SetModel (int model);
|
||||||
static int GetModel (void);
|
static int GetModel (void);
|
||||||
static int RingScanner (void);
|
static int RingScanner (int count, unsigned long delay);
|
||||||
static int TestVersion (int no);
|
static int TestVersion (int no);
|
||||||
|
|
||||||
static int SendCommand (int cmd);
|
static int SendCommand (int cmd);
|
||||||
|
@ -2537,10 +2537,14 @@ SendWord (int *cmd)
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* RingScanner: returns 1 if scanner present, else 0 */
|
/* RingScanner: returns 1 if scanner present, else 0 */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#define UMAX_PP_PAUSE 100
|
/*
|
||||||
|
* in fact this function is really close to CPP macro in
|
||||||
|
* /usr/src/linux/drivers/block/paride/epat.c .....
|
||||||
|
* we have almost CPP(8)
|
||||||
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
RingScanner (void)
|
RingScanner (int count, unsigned long delay)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
int data;
|
int data;
|
||||||
|
@ -2563,29 +2567,74 @@ RingScanner (void)
|
||||||
|
|
||||||
/* send ring string */
|
/* send ring string */
|
||||||
Outb (DATA, 0x22);
|
Outb (DATA, 0x22);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0x22);
|
Outb (DATA, 0x22);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0x22);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x22);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x22);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
Outb (DATA, 0xAA);
|
Outb (DATA, 0xAA);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0xAA);
|
Outb (DATA, 0xAA);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0xAA);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0xAA);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0xAA);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
Outb (DATA, 0x55);
|
Outb (DATA, 0x55);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0x55);
|
Outb (DATA, 0x55);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0x55);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x55);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x55);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
Outb (DATA, 0x00);
|
Outb (DATA, 0x00);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0x00);
|
Outb (DATA, 0x00);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0x00);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x00);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x00);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
Outb (DATA, 0xFF);
|
Outb (DATA, 0xFF);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0xFF);
|
Outb (DATA, 0xFF);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0xFF);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0xFF);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0xFF);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
|
|
||||||
/* OK ? */
|
/* OK ? */
|
||||||
status = Inb (STATUS);
|
status = Inb (STATUS);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
if ((status & 0xB8) != 0xB8)
|
if ((status & 0xB8) != 0xB8)
|
||||||
{
|
{
|
||||||
DBG (1, "status %d doesn't match! %s:%d\n", status, __FILE__, __LINE__);
|
DBG (1, "status %d doesn't match! %s:%d\n", status, __FILE__, __LINE__);
|
||||||
|
@ -2596,11 +2645,19 @@ RingScanner (void)
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
Outb (DATA, 0x87);
|
Outb (DATA, 0x87);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0x87);
|
Outb (DATA, 0x87);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0x87);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x87);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x87);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
status = Inb (STATUS);
|
status = Inb (STATUS);
|
||||||
usleep (UMAX_PP_PAUSE);
|
|
||||||
/* status = 126 when scanner not connected .... */
|
/* status = 126 when scanner not connected .... */
|
||||||
if ((status & 0xB8) != 0x18)
|
if ((status & 0xB8) != 0x18)
|
||||||
{
|
{
|
||||||
|
@ -2614,9 +2671,18 @@ RingScanner (void)
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
Outb (DATA, 0x78);
|
Outb (DATA, 0x78);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0x78);
|
Outb (DATA, 0x78);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0x78);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x78);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x78);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
status = Inb (STATUS);
|
status = Inb (STATUS);
|
||||||
if ((status & 0x30) != 0x30)
|
if ((status & 0x30) != 0x30)
|
||||||
{
|
{
|
||||||
|
@ -2630,13 +2696,31 @@ RingScanner (void)
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
Outb (DATA, 0x08);
|
Outb (DATA, 0x08);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0x08);
|
Outb (DATA, 0x08);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0x08);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x08);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0x08);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
Outb (DATA, 0xFF);
|
Outb (DATA, 0xFF);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
Outb (DATA, 0xFF);
|
Outb (DATA, 0xFF);
|
||||||
usleep (UMAX_PP_PAUSE);
|
usleep (delay);
|
||||||
|
if (count == 5)
|
||||||
|
{
|
||||||
|
Outb (DATA, 0xFF);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0xFF);
|
||||||
|
usleep (delay);
|
||||||
|
Outb (DATA, 0xFF);
|
||||||
|
usleep (delay);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* restore state */
|
/* restore state */
|
||||||
|
@ -4176,12 +4260,12 @@ Probe610P (int recover)
|
||||||
sanei_umax_pp_setastra (610);
|
sanei_umax_pp_setastra (610);
|
||||||
if (!Test610P (0x87))
|
if (!Test610P (0x87))
|
||||||
{
|
{
|
||||||
DBG (1, "Ring610P(0x87) failed (%s:%d)\n", __FILE__, __LINE__);
|
DBG (1, "Test610P(0x87) failed (%s:%d)\n", __FILE__, __LINE__);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG (16, "Ring610P(0x87) passed...\n");
|
DBG (16, "Test610P(0x87) passed...\n");
|
||||||
}
|
}
|
||||||
if (!In256 ())
|
if (!In256 ())
|
||||||
{
|
{
|
||||||
|
@ -4263,14 +4347,27 @@ sanei_umax_pp_ProbeScanner (int recover)
|
||||||
tmp = Inb (DATA);
|
tmp = Inb (DATA);
|
||||||
|
|
||||||
/* any scanner ? */
|
/* any scanner ? */
|
||||||
tmp = RingScanner ();
|
/* fast detect */
|
||||||
if (tmp)
|
tmp = RingScanner (2, 0);
|
||||||
|
if (!tmp)
|
||||||
{
|
{
|
||||||
i = 0;
|
DBG (1, "No scanner detected by 'RingScanner(2,0)'...\n");
|
||||||
while ((i < 50) && (tmp))
|
tmp = RingScanner (5, 0);
|
||||||
|
if (!tmp)
|
||||||
{
|
{
|
||||||
tmp = RingScanner ();
|
DBG (1, "No scanner detected by 'RingScanner(5,0)'...\n");
|
||||||
i++;
|
tmp = RingScanner (5, 10000);
|
||||||
|
if (!tmp)
|
||||||
|
{
|
||||||
|
DBG (1, "No scanner detected by 'RingScanner(5,10000)'...\n");
|
||||||
|
tmp = RingScanner (5, 10000);
|
||||||
|
if (!tmp)
|
||||||
|
{
|
||||||
|
DBG (1,
|
||||||
|
"No scanner detected by 'RingScanner(5,10000)'...\n");
|
||||||
|
tmp = Test610P (0x87);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
|
@ -6228,13 +6325,28 @@ static int
|
||||||
EvalGain (int sum, int count)
|
EvalGain (int sum, int count)
|
||||||
{
|
{
|
||||||
int gn;
|
int gn;
|
||||||
|
float pct;
|
||||||
|
float avg;
|
||||||
|
|
||||||
|
|
||||||
|
/*if(getenv("CORRECTION"))
|
||||||
|
return(atoi(getenv("CORRECTION"))); */
|
||||||
|
|
||||||
/* 19000 is a little too bright */
|
/* 19000 is a little too bright */
|
||||||
gn = (int) ((double) (18500 * count) / sum - 100 + 0.5);
|
/* gn = (int) ((double) (18500 * count) / sum - 100 + 0.5); */
|
||||||
|
|
||||||
|
/* after ~ 60 * 10 scans , it looks like 1 step is a 0.57% increase */
|
||||||
|
/* so we take the value and compute the percent increase to reach 250 */
|
||||||
|
/* no 255, because we want some room inaccuracy */
|
||||||
|
/* pct=100-(value*100)/250 */
|
||||||
|
/* then correction is pct/0.57 */
|
||||||
|
avg = (float) (sum) / (float) (count);
|
||||||
|
pct = 100.0 - (avg * 100.0) / 250.0;
|
||||||
|
gn = (int) (pct / 0.57);
|
||||||
if (gn < 0)
|
if (gn < 0)
|
||||||
gn = 0;
|
gn = 0;
|
||||||
else if (gn > 255)
|
else if (gn > 127)
|
||||||
gn = 255;
|
gn = 127;
|
||||||
return (gn);
|
return (gn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue