On 12/03/13 17:12, Ian Abbott wrote:
Advantech has their own Linux (non-Comedi) driver for the PCI-1753 which
detects whether the PCI-1753E expansion card is connected to the
PCI-1753 by fiddling with the control register of an emulated 8255 chip
in the address space of the expansion card.  The test doesn't actually
seem to make much sense for a _real_ 8255 chip, but let's assume it
works for whatever hardware is on this board.

I messed up there. Advantech's test uses register offset 53 whereas my test used register offset PCI1753E_DIO + 3 == 32 + 3 == 35. Offset 53 is not a register of any of the 8255 chips. The braino occurred when I converted 53 to hex 35, saw that as 0x32 + 3, noticed that PCI1753E_DIO was 32, but failed to notice the different radix. Oops.

+unsigned long pci_dio_detect_pci1753e(struct pci_dev *pcidev,
+                                     unsigned long cardtype)
+{
+       if (cardtype != TYPE_PCI1753)
+               return cardtype;
+
+       /*
+        * Change cardtype from TYPE_PCI1753 to TYPE_PCI1753E if expansion
+        * board available.  Need to enable PCI device temporarily to perform
+        * the test.
+        */
+       if (comedi_pci_enable(pcidev, "adv_pci_dio") == 0) {
+               /*
+                * This test is based on Advantech's "advdaq" driver source
+                * (which declares its module licence as "GPL" although the
+                * driver source does not include a "COPYING" file).  The test
+                * does not make a lot of sense for a real 8255 chip as the
+                * 8255 "single bit set/reset" commands used below shouldn't
+                * affect the values read back from the 8255 command register.
+                * However, the board only claims to emulate 8255 mode 0 and
+                * is not using real 8255 chips.  I assume Advantech know what
+                * they are doing in their own driver.  -- Ian Abbott
+                */
+               unsigned long cr = pci_resource_start(pcidev, PCIDIO_MAINREG) +
+                                  PCI1753E_DIO + 3;

I should just use offset 53 (from resource start) there and fix the remark about it not making sense. It makes perfect sense for a non-8255, custom register!

+
+               outb(0x05, cr);
+               if ((inb(cr) & 0x07) == 0x02) {
+                       outb(0x02, cr);
+                       if ((inb(cr) & 0x07) == 0x05)
+                               cardtype = TYPE_PCI1753E;
+               }
+               comedi_pci_disable(pcidev);
+       }
+       return cardtype;
+}

--
-=( Ian Abbott @ MEV Ltd.    E-mail: <[email protected]>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-
_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to