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