Common Driver Interface — Änderungen 5151 → 5229

Zeile 50: Zeile 50:
  
 
== Dinge, die ein Betriebssystem zur Verfügung stellen muss ==
 
== Dinge, die ein Betriebssystem zur Verfügung stellen muss ==
 +
Hinweis: Der hier angegeben Inhalt der Strukturen ist nur ein Mindestmaß; Man darf beliebig viel in einer CDI-Struktur speichern, wenn das Betriebssystem mehr Informationen benötigt.
 +
 
=== CDI.core ===
 
=== CDI.core ===
 
==== Datentypen ====
 
==== Datentypen ====
Zeile 107: Zeile 109:
 
};</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).
−
<c>typedef ??? *cdi_list_t;</c>
+
<c>typedef ??? cdi_list_t;</c>
 
"cdi_list_t" repräsentiert eine Linked-List. Dieser Datentyp muss ein Pointer sein, in týndur ist er ein Pointer auf eine Struktur mit den Elementen "anchor" (zeigt auf das erste Element der Liste) und "size" (Anzahl der Elemente in der Liste). Die Elemente der Liste wiederum müssen einen Pointer speichern können (der Wert des Elements) und sollten desweiteren einen Pointer auf das nächste Element enthalten (eine Linked-List eben).
 
"cdi_list_t" repräsentiert eine Linked-List. Dieser Datentyp muss ein Pointer sein, in týndur ist er ein Pointer auf eine Struktur mit den Elementen "anchor" (zeigt auf das erste Element der Liste) und "size" (Anzahl der Elemente in der Liste). Die Elemente der Liste wiederum müssen einen Pointer speichern können (der Wert des Elements) und sollten desweiteren einen Pointer auf das nächste Element enthalten (eine Linked-List eben).
  
 
==== Funktionen ====
 
==== Funktionen ====
 
<c>void cdi_init(void);</c>
 
<c>void cdi_init(void);</c>
−
Initialisiert CDI, muss vor Benutzung anderer CDI-Funktionen aufgerufen werden - wiederholte Aufrufe müssen ohne Effekt bleiben.
+
Initialisiert die CDI-Strukturen des Betriebssystems, muss vor Benutzung anderer CDI-Funktionen aufgerufen werden - wiederholte Aufrufe müssen ohne Effekt bleiben.
 
<c>void cdi_run_drivers(void);</c>
 
<c>void cdi_run_drivers(void);</c>
−
Diese Funktion startet alle registrierten Treiber.
+
Diese Funktion startet alle registrierten Treiber. Das Betriebssystem sollte alle registrierten Treiber durchgehen und bei allen für einen Treiber registrierten Geräten (Die Liste "(struct cdi_driver *)->devices") im Feld "driver" (in "struct cdi_device") den entsprechenden Treiber eintragen sowie, wenn "(struct cdi_driver *)->init_device" ungleich NULL ist, diese Funktion mit dem Gerät als Parameter aufrufen.
 
<c>void cdi_driver_init(struct cdi_driver *driver);</c>
 
<c>void cdi_driver_init(struct cdi_driver *driver);</c>
−
Initialisiert den angegebenen Treiber.
+
Initialisiert den angegebenen Treiber. Der Treiber hat bereits alle Felder in "driver" initialisiert, lediglich die "devices"-Liste muss vom Betriebssystem mittels cdi_list_create() erstellt werden.
 
<c>void cdi_driver_destroy(struct cdi_driver *driver);</c>
 
<c>void cdi_driver_destroy(struct cdi_driver *driver);</c>
−
Deinitialisiert den angegebenen Treiber.
+
Deinitialisiert den angegebenen Treiber. Ist der Funktionspointer "driver->remove_device" ungleich NULL, so sollte diese Funktion für alle registrierten Geräte (in der Liste "driver->devices") aufgerufen werden.
 
<c>void cdi_driver_register(struct cdi_driver *driver);</c>
 
<c>void cdi_driver_register(struct cdi_driver *driver);</c>
−
Registriert einen CDI-Treiber.
+
Registriert einen CDI-Treiber. Es bietet sich an, ihn in einer globalen Liste einzutragen und diese Liste dann beim cdi_run_drivers()-Aufruf abzuarbeiten.
 
<c>void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device*), struct cdi_device *device);</c>
 
<c>void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device*), struct cdi_device *device);</c>
−
Registriert eine ISR "handler" für den angegebenen IRQ "irq". Der ISR wird beim Aufruf das angegebene CDI-Gerät "device" als Parameter übergeben.
+
Registriert eine ISR "handler" für den angegebenen IRQ "irq". Der ISR muss beim Aufruf das angegebene CDI-Gerät "device" als Parameter übergeben werden.
 
<c>int cdi_wait_irq(uint8_t irq, uint32_t timeout);</c>
 
<c>int cdi_wait_irq(uint8_t irq, uint32_t timeout);</c>
 
Wartet, bis der angegeben IRQ aufgetreten ist. "timeout" gibt die Zeit in Millisekunden an, die maximal gewartet werden soll. Ist der IRQ seit dem letzten cdi_reset_wait_irq() und vor "timeout" aufgetreten, wird 0 zurückgegeben, sonst -1.
 
Wartet, bis der angegeben IRQ aufgetreten ist. "timeout" gibt die Zeit in Millisekunden an, die maximal gewartet werden soll. Ist der IRQ seit dem letzten cdi_reset_wait_irq() und vor "timeout" aufgetreten, wird 0 zurückgegeben, sonst -1.
Zeile 176: Zeile 178:
 
Gibt die Anzahl der Elemente in der Liste zurück.
 
Gibt die Anzahl der Elemente in der Liste zurück.
  
−
== Betriebssysteme welche CDI benutzen ==
+
=== CDI.net ===
 +
==== Datentypen ====
 +
<c>struct cdi_net_device
 +
{
 +
    struct cdi_device dev;
 +
    uint64_t          mac : 48;
 +
    int              number;
 +
    void (*send_packet)(struct cdi_net_device *device, void *data, size_t size);
 +
};</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.
 +
<c>struct cdi_net_driver
 +
{
 +
    struct cdi_driver drv;
 +
};</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.
 +
 
 +
==== Funktionen ====
 +
<c>void cdi_net_driver_init(struct cdi_net_driver *driver);</c>
 +
Diese Funktion wird aufgerufen, um einen CDI.net-Treiber "driver" zu initialisieren. Das Betriebssystem sollte "driver->drv.type" auf CDI_NETWORK setzen und anschließend "cdi_driver_init((struct cdi_driver *)driver)" aufrufen.
 +
<c>void cdi_net_driver_destroy(struct cdi_net_driver *driver);</c>
 +
Diese Funktion wiederum deinitialisiert einen CDI.net-Treiber.
 +
<c>void cdi_net_device_init(struct cdi_net_device *device);</c>
 +
Mit dieser Funktion werden CDI.net-Geräte (also Netzwerkkarten) initialisiert. Der Treiber hat alle vorgegebenen Felder in der "cdi_net_device"-Struktur "device" außer "number" bereits initialisiert. "number" muss vom Betriebssystem gesetzt werden.
 +
<c>void cdi_net_receive(struct cdi_net_device *device, void *buffer, size_t size);</c>
 +
Diese Funktion wird vom CDI.net-Treiber aufgerufen, wenn Daten von einer Netzwerkkarte empfangen wurden. "device" gibt die Netzwerkkarte an, "buffer" ist ein Pointer zum empfangenen Paket und "size" enthält die Größe des Pakets.
 +
 
 +
== Betriebssysteme, welche CDI benutzen ==
 
* [[meinOS]]
 
* [[meinOS]]
 
* [[MyXomycota]]
 
* [[MyXomycota]]