Blame tests/test.c

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
}