|
Packit |
d36e9b |
#include <stdio.h>
|
|
Packit |
d36e9b |
#include <string.h>
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#include <ieee1284.h>
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
enum devid_field { devid_cls, devid_mfg, devid_mdl };
|
|
Packit |
d36e9b |
static char *field (char *id, enum devid_field f)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
char *result = "(?)";
|
|
Packit |
d36e9b |
char *p = NULL;
|
|
Packit |
d36e9b |
id += 2;
|
|
Packit |
d36e9b |
switch (f)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
case devid_cls:
|
|
Packit |
d36e9b |
p = strstr (id, "CLASS:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "class:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "CLS:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "cls:");
|
|
Packit |
d36e9b |
break;
|
|
Packit |
d36e9b |
case devid_mfg:
|
|
Packit |
d36e9b |
p = strstr (id, "MANUFACTURER:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "manufacturer:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "MFG:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "mfg:");
|
|
Packit |
d36e9b |
break;
|
|
Packit |
d36e9b |
case devid_mdl:
|
|
Packit |
d36e9b |
p = strstr (id, "MODEL:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "model:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "MDL:");
|
|
Packit |
d36e9b |
if (!p)
|
|
Packit |
d36e9b |
p = strstr (id, "mdl:");
|
|
Packit |
d36e9b |
break;
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
if (p)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
char *q;
|
|
Packit |
d36e9b |
char c;
|
|
Packit |
d36e9b |
p = strchr (p, ':') + 1;
|
|
Packit |
d36e9b |
q = strchr (p, ';');
|
|
Packit |
d36e9b |
if (q)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
c = *q;
|
|
Packit |
d36e9b |
*q = '\0';
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
result = strdup (p); // leaks, but this is just a test harness
|
|
Packit |
d36e9b |
if (q)
|
|
Packit |
d36e9b |
*q = c;
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
return result;
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
static void test_deviceid (struct parport_list *pl)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
int i, j;
|
|
Packit |
d36e9b |
printf ("Found %d ports:\n", pl->portc);
|
|
Packit |
d36e9b |
for (i = 0; i < pl->portc; i++)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
char id[500];
|
|
Packit |
d36e9b |
printf (" %s: ", pl->portv[i]->name);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
if (ieee1284_get_deviceid (pl->portv[i], -1, F1284_FRESH, id, 500) > -1)
|
|
Packit |
d36e9b |
printf ("%s, %s %s", field (id, devid_cls), field (id, devid_mfg),
|
|
Packit |
d36e9b |
field (id, devid_mdl));
|
|
Packit |
d36e9b |
else if (ieee1284_get_deviceid (pl->portv[i], -1, 0, id, 500) > -1)
|
|
Packit |
d36e9b |
printf ("(may be cached) %s, %s %s", field (id, devid_cls),
|
|
Packit |
d36e9b |
field (id, devid_mfg), field (id, devid_mdl));
|
|
Packit |
d36e9b |
printf ("\n");
|
|
Packit |
d36e9b |
for (j = 0; j < 4; j++)
|
|
Packit |
d36e9b |
if (ieee1284_get_deviceid (pl->portv[i], j, 0, id, 500) > -1)
|
|
Packit |
d36e9b |
printf (" Daisy chain address %d: (may be cached) %s, %s %s\n", j,
|
|
Packit |
d36e9b |
field (id, devid_cls), field (id, devid_mfg),
|
|
Packit |
d36e9b |
field (id, devid_mdl));
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
putchar ('\n');
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
static int show_capabilities (unsigned int cap)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
#define CAP(x) \
|
|
Packit |
d36e9b |
if (cap & CAP1284_##x) \
|
|
Packit |
d36e9b |
printf (#x " ");
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
CAP(RAW);
|
|
Packit |
d36e9b |
CAP(NIBBLE);
|
|
Packit |
d36e9b |
CAP(BYTE);
|
|
Packit |
d36e9b |
CAP(COMPAT);
|
|
Packit |
d36e9b |
CAP(BECP);
|
|
Packit |
d36e9b |
CAP(ECP);
|
|
Packit |
d36e9b |
CAP(ECPRLE);
|
|
Packit |
d36e9b |
CAP(ECPSWE);
|
|
Packit |
d36e9b |
CAP(EPP);
|
|
Packit |
d36e9b |
CAP(EPPSL);
|
|
Packit |
d36e9b |
CAP(EPPSWE);
|
|
Packit |
d36e9b |
CAP(IRQ);
|
|
Packit |
d36e9b |
CAP(DMA);
|
|
Packit |
d36e9b |
putchar ('\n');
|
|
Packit |
d36e9b |
return 0;
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
void test_open (struct parport_list *pl)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
int i;
|
|
Packit |
d36e9b |
for (i = 0; i < pl->portc; i++)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
struct parport *port = pl->portv[i];
|
|
Packit |
d36e9b |
unsigned int cap;
|
|
Packit |
d36e9b |
/* Just try to open the port, then close it. */
|
|
Packit |
d36e9b |
if (ieee1284_open (port, 0, &cap))
|
|
Packit |
d36e9b |
printf ("%s: inaccessible\n", port->name);
|
|
Packit |
d36e9b |
else
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
printf ("%s: %#lx", port->name, port->base_addr);
|
|
Packit |
d36e9b |
if (port->hibase_addr)
|
|
Packit |
d36e9b |
printf (" (ECR at %#lx)", port->hibase_addr);
|
|
Packit |
d36e9b |
printf ("\n ");
|
|
Packit |
d36e9b |
show_capabilities (cap);
|
|
Packit |
d36e9b |
if (cap & CAP1284_IRQ)
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
int fd = ieee1284_get_irq_fd (port);
|
|
Packit |
d36e9b |
if (fd < 0)
|
|
Packit |
d36e9b |
printf ("Couldn't get IRQ fd: %d\n", fd);
|
|
Packit |
d36e9b |
else
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
int r = ieee1284_claim (port);
|
|
Packit |
d36e9b |
if (r != E1284_OK)
|
|
Packit |
d36e9b |
printf ("Couldn't claim port: %d\n", r);
|
|
Packit |
d36e9b |
else
|
|
Packit |
d36e9b |
r = ieee1284_clear_irq (port, NULL);
|
|
Packit |
d36e9b |
if (r != E1284_OK)
|
|
Packit |
d36e9b |
printf ("Couldn't clear IRQ: %d\n", r);
|
|
Packit |
d36e9b |
ieee1284_release (port);
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
ieee1284_close (port);
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
}
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
int main ()
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
struct parport_list pl;
|
|
Packit |
d36e9b |
ieee1284_find_ports (&pl, 0);
|
|
Packit |
d36e9b |
test_deviceid (&pl);
|
|
Packit |
d36e9b |
test_open (&pl);
|
|
Packit |
d36e9b |
ieee1284_free_ports (&pl);
|
|
Packit |
d36e9b |
return 0;
|
|
Packit |
d36e9b |
}
|