Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/uio/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  uio_cif.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * UIO Hilscher CIF card driver
 *
 * (C) 2007 Hans J. Koch <hjk@hansjkoch.de>
 * Original code (C) 2005 Benedikt Spranger <b.spranger@linutronix.de>
 */


#include <linux/device.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/uio_driver.h>

#include <asm/io.h>

#define PLX9030_INTCSR  0x4C
#define INTSCR_INT1_ENABLE 0x01
#define INTSCR_INT1_STATUS 0x04
#define INT1_ENABLED_AND_ACTIVE (INTSCR_INT1_ENABLE | INTSCR_INT1_STATUS)

#define PCI_SUBVENDOR_ID_PEP 0x1518
#define CIF_SUBDEVICE_PROFIBUS 0x430
#define CIF_SUBDEVICE_DEVICENET 0x432


static irqreturn_t hilscher_handler(int irq, struct uio_info *dev_info)
{
 void __iomem *plx_intscr = dev_info->mem[0].internal_addr
     + PLX9030_INTCSR;

 if ((ioread8(plx_intscr) & INT1_ENABLED_AND_ACTIVE)
     != INT1_ENABLED_AND_ACTIVE)
  return IRQ_NONE;

 /* Disable interrupt */
 iowrite8(ioread8(plx_intscr) & ~INTSCR_INT1_ENABLE, plx_intscr);
 return IRQ_HANDLED;
}

static int hilscher_pci_probe(struct pci_dev *dev,
     const struct pci_device_id *id)
{
 struct uio_info *info;

 info = devm_kzalloc(&dev->dev, sizeof(struct uio_info), GFP_KERNEL);
 if (!info)
  return -ENOMEM;

 if (pci_enable_device(dev))
  return -ENODEV;

 if (pci_request_regions(dev, "hilscher"))
  goto out_disable;

 info->mem[0].addr = pci_resource_start(dev, 0);
 if (!info->mem[0].addr)
  goto out_release;
 info->mem[0].internal_addr = pci_ioremap_bar(dev, 0);
 if (!info->mem[0].internal_addr)
  goto out_release;

 info->mem[0].size = pci_resource_len(dev, 0);
 info->mem[0].memtype = UIO_MEM_PHYS;
 info->mem[1].addr = pci_resource_start(dev, 2);
 info->mem[1].size = pci_resource_len(dev, 2);
 info->mem[1].memtype = UIO_MEM_PHYS;
 switch (id->subdevice) {
  case CIF_SUBDEVICE_PROFIBUS:
   info->name = "CIF_Profibus";
   break;
  case CIF_SUBDEVICE_DEVICENET:
   info->name = "CIF_Devicenet";
   break;
  default:
   info->name = "CIF_???";
 }
 info->version = "0.0.1";
 info->irq = dev->irq;
 info->irq_flags = IRQF_SHARED;
 info->handler = hilscher_handler;

 if (uio_register_device(&dev->dev, info))
  goto out_unmap;

 pci_set_drvdata(dev, info);

 return 0;
out_unmap:
 iounmap(info->mem[0].internal_addr);
out_release:
 pci_release_regions(dev);
out_disable:
 pci_disable_device(dev);
 return -ENODEV;
}

static void hilscher_pci_remove(struct pci_dev *dev)
{
 struct uio_info *info = pci_get_drvdata(dev);

 uio_unregister_device(info);
 pci_release_regions(dev);
 pci_disable_device(dev);
 iounmap(info->mem[0].internal_addr);
}

static struct pci_device_id hilscher_pci_ids[] = {
 {
  .vendor = PCI_VENDOR_ID_PLX,
  .device = PCI_DEVICE_ID_PLX_9030,
  .subvendor = PCI_SUBVENDOR_ID_PEP,
  .subdevice = CIF_SUBDEVICE_PROFIBUS,
 },
 {
  .vendor = PCI_VENDOR_ID_PLX,
  .device = PCI_DEVICE_ID_PLX_9030,
  .subvendor = PCI_SUBVENDOR_ID_PEP,
  .subdevice = CIF_SUBDEVICE_DEVICENET,
 },
 { 0, }
};

static struct pci_driver hilscher_pci_driver = {
 .name = "hilscher",
 .id_table = hilscher_pci_ids,
 .probe = hilscher_pci_probe,
 .remove = hilscher_pci_remove,
};

module_pci_driver(hilscher_pci_driver);
MODULE_DEVICE_TABLE(pci, hilscher_pci_ids);
MODULE_DESCRIPTION("UIO Hilscher CIF card driver");
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Hans J. Koch, Benedikt Spranger");

Messung V0.5
C=94 H=90 G=91

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.