Common Driver Interface — Änderungen 5499 → 5559

Zeile 56: Zeile 56:
 
<c>typedef enum
 
<c>typedef enum
 
{
 
{
−
    CDI_UNKNOWN = 0,
+
  CDI_UNKNOWN = 0,
−
    CDI_NETWORK = 1,
+
  CDI_NETWORK = 1,
−
    CDI_STORAGE = 2,
+
  CDI_STORAGE = 2,
−
    CDI_SCSI = 3,
+
  CDI_SCSI = 3,
 
} cdi_device_type_t;</c>
 
} cdi_device_type_t;</c>
 
cdi_device_type_t gibt den Typ eines Gerätes bzw. eines Treibers an.
 
cdi_device_type_t gibt den Typ eines Gerätes bzw. eines Treibers an.
 
<c>struct cdi_device
 
<c>struct cdi_device
 
{
 
{
−
    cdi_device_type_t type;
+
  cdi_device_type_t type;
−
    const char        *name;
+
  const char        *name;
−
    struct cdi_driver *driver;
+
  struct cdi_driver *driver;
 
};</c>
 
};</c>
 
Diese Struktur repräsentiert ein Gerät. "type" gibt den Typ an, "name" den Namen und "driver" einen Pointer zu einer Struktur, die den Gerätetreiber repräsentiert.
 
Diese Struktur repräsentiert ein Gerät. "type" gibt den Typ an, "name" den Namen und "driver" einen Pointer zu einer Struktur, die den Gerätetreiber repräsentiert.
 
<c>struct cdi_driver
 
<c>struct cdi_driver
 
{
 
{
−
    cdi_device_type_t type;
+
  cdi_device_type_t type;
−
    const char        *name;
+
  const char        *name;
−
    cdi_list_t        devices;
+
  cdi_list_t        devices;
−
    void (*init_device)(struct cdi_device *device);
+
  void (*init_device)(struct cdi_device *device);
−
    void (*remove_device)(struct cdi_device *device);
+
  void (*remove_device)(struct cdi_device *device);
−
    void (*destroy)(struct cdi_driver *driver);
+
  void (*destroy)(struct cdi_driver *driver);
 
};</c>
 
};</c>
 
Diese Struktur wiederum repräsentiert einen Gerätetreiber. "type" gibt den Typ an, "name" den Namen und "devices" ist eine Liste der registrierten Geräte. Die Funktion init_device() muss vom Betriebssystem aufgerufen werden, um ein Gerät zu initialisieren, remove_device() entfernt ein Gerät und destroy() deinitialisiert den Treiber.
 
Diese Struktur wiederum repräsentiert einen Gerätetreiber. "type" gibt den Typ an, "name" den Namen und "devices" ist eine Liste der registrierten Geräte. Die Funktion init_device() muss vom Betriebssystem aufgerufen werden, um ein Gerät zu initialisieren, remove_device() entfernt ein Gerät und destroy() deinitialisiert den Treiber.
 
<c>struct cdi_pci_device
 
<c>struct cdi_pci_device
 
{
 
{
−
    uint16_t bus;
+
  uint16_t bus;
−
    uint16_t dev;
+
  uint16_t dev;
−
    uint16_t function;
+
  uint16_t function;
−
    uint16_t vendor_id;
+
  uint16_t vendor_id;
−
    uint16_t device_id;
+
  uint16_t device_id;
−
    uint8_t  class_id;
+
  uint8_t  class_id;
−
    uint8_t  subclass_id;
+
  uint8_t  subclass_id;
−
    uint8_t  interface_id;
+
  uint8_t  interface_id;
−
    uint8_t  rev_id;
+
  uint8_t  rev_id;
−
    uint8_t  irq;
+
  uint8_t  irq;
−
    cdi_list_t resources;
+
  cdi_list_t resources;
 
};</c>
 
};</c>
 
Mit dieser Struktur wird ein [[PCI]]-Gerät beschrieben. "bus" ist der Bus, auf dem es sich befindet, "dev" das Gerät und "function" die Funktion. "vendor_id" gibt die Hersteller-ID an, "device_id" die Geräte-ID. Die Classcodes befinden sich in "class_id" (Base class), "subclass_id" (Subclass) und "interface_id" (Programming interface). "rev_id" enthält die Revisions-ID. In "irq" steht der IRQ, den das Gerät verwendet. "resources" ist eine Liste mit den I/O- und Speicherresourcen, ihre Elemente sind vom Typ "struct cdi_pci_resource".
 
Mit dieser Struktur wird ein [[PCI]]-Gerät beschrieben. "bus" ist der Bus, auf dem es sich befindet, "dev" das Gerät und "function" die Funktion. "vendor_id" gibt die Hersteller-ID an, "device_id" die Geräte-ID. Die Classcodes befinden sich in "class_id" (Base class), "subclass_id" (Subclass) und "interface_id" (Programming interface). "rev_id" enthält die Revisions-ID. In "irq" steht der IRQ, den das Gerät verwendet. "resources" ist eine Liste mit den I/O- und Speicherresourcen, ihre Elemente sind vom Typ "struct cdi_pci_resource".
 
<c>typedef enum
 
<c>typedef enum
 
{
 
{
−
    CDI_PCI_MEMORY,
+
  CDI_PCI_MEMORY,
−
    CDI_PCI_IOPORTS
+
  CDI_PCI_IOPORTS
 
} cdi_res_t;</c>
 
} cdi_res_t;</c>
 
"cdi_res_t" gibt den Typ einer PCI-Resource an (I/O-Ports oder Speicherbereich).
 
"cdi_res_t" gibt den Typ einer PCI-Resource an (I/O-Ports oder Speicherbereich).
 
<c>struct cdi_pci_resource
 
<c>struct cdi_pci_resource
 
{
 
{
−
    cdi_res_t    type;
+
  cdi_res_t    type;
−
    uintptr_t    start;
+
  uintptr_t    start;
−
    size_t      length;
+
  size_t      length;
−
    unsigned int index;
+
  unsigned int index;
−
    void        *address;
+
  void        *address;
 
};</c>
 
};</c>
 
Informationen zu einer Resource eines PCI-Gerätes erhält man aus dieser Struktur. "type" gibt den Typ an (I/O-Ports oder Speicherbereich), "start" den Beginn, "length" die Länge, "index" den Index der Resource (0 ist die erste usw.) und "address" gibt bei Speicherbereichen ihre virtuelle Adresse an (vorher muss der Bereich mit cdi_pci_alloc_memory() reserviert worden sein).
 
Informationen zu einer Resource eines PCI-Gerätes erhält man aus dieser Struktur. "type" gibt den Typ an (I/O-Ports oder Speicherbereich), "start" den Beginn, "length" die Länge, "index" den Index der Resource (0 ist die erste usw.) und "address" gibt bei Speicherbereichen ihre virtuelle Adresse an (vorher muss der Bereich mit cdi_pci_alloc_memory() reserviert worden sein).
Zeile 182: Zeile 182:
 
<c>struct cdi_net_device
 
<c>struct cdi_net_device
 
{
 
{
−
    struct cdi_device dev;
+
  struct cdi_device dev;
−
    uint64_t          mac : 48;
+
  uint64_t          mac : 48;
−
    int              number;
+
  int              number;
−
    void (*send_packet)(struct cdi_net_device *device, void *data, size_t size);
+
  void (*send_packet)(struct cdi_net_device *device, void *data, size_t size);
 
};</c>
 
};</c>
 
Diese Struktur beschreibt ein CDI.net-Gerät. "dev" ist eine Struktur, die das Gerät im Allgemeinen repräsentiert, "mac" gibt die MAC-Adresse an und "number" die Nummer der Netzwerkkarte. Mit der Funktion send_packet() können Pakete gesendet werden, wobei "device" ein Pointer auf diese Struktur ist, "data" ein Pointer auf die zu sendenden Daten, während "size" die Größe des Puffers "data" angibt. Wichtig: Man darf nicht erwarten, dass send_packet() reentrant (also gegen [[Race Condition|Race Conditions]] abgesichert) ist! Das Betriebssystem muss somit selbst dafür Sorge tragen, dass diese Funktion immer nur von maximal einem einzigen Prozess durchlaufen wird.
 
Diese Struktur beschreibt ein CDI.net-Gerät. "dev" ist eine Struktur, die das Gerät im Allgemeinen repräsentiert, "mac" gibt die MAC-Adresse an und "number" die Nummer der Netzwerkkarte. Mit der Funktion send_packet() können Pakete gesendet werden, wobei "device" ein Pointer auf diese Struktur ist, "data" ein Pointer auf die zu sendenden Daten, während "size" die Größe des Puffers "data" angibt. Wichtig: Man darf nicht erwarten, dass send_packet() reentrant (also gegen [[Race Condition|Race Conditions]] abgesichert) ist! Das Betriebssystem muss somit selbst dafür Sorge tragen, dass diese Funktion immer nur von maximal einem einzigen Prozess durchlaufen wird.
 
<c>struct cdi_net_driver
 
<c>struct cdi_net_driver
 
{
 
{
−
    struct cdi_driver drv;
+
  struct cdi_driver drv;
 
};</c>
 
};</c>
 
Mit dieser Struktur werden CDI.net-Treiber beschrieben. Sie enthält lediglich die Struktur "struct cdi_driver", die den Treiber im Allgmeinen repräsentiert.
 
Mit dieser Struktur werden CDI.net-Treiber beschrieben. Sie enthält lediglich die Struktur "struct cdi_driver", die den Treiber im Allgmeinen repräsentiert.