| Zeile 54: | Zeile 54: | ||
=== CDI.core === | === CDI.core === | ||
==== Datentypen ==== | ==== Datentypen ==== | ||
| − | <c>typedef enum | + | <syntaxhighlight lang="c">typedef enum |
{ | { | ||
CDI_UNKNOWN = 0, | CDI_UNKNOWN = 0, | ||
| Zeile 60: | Zeile 60: | ||
CDI_STORAGE = 2, | CDI_STORAGE = 2, | ||
CDI_SCSI = 3, | CDI_SCSI = 3, | ||
| − | } cdi_device_type_t;</ | + | } cdi_device_type_t;</syntaxhighlight> |
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 | + | <syntaxhighlight lang="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; | ||
| − | };</ | + | };</syntaxhighlight> |
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 | + | <syntaxhighlight lang="c">struct cdi_driver |
{ | { | ||
cdi_device_type_t type; | cdi_device_type_t type; | ||
| Zeile 77: | Zeile 77: | ||
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); | ||
| − | };</ | + | };</syntaxhighlight> |
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 | + | <syntaxhighlight lang="c">struct cdi_pci_device |
{ | { | ||
uint16_t bus; | uint16_t bus; | ||
| Zeile 92: | Zeile 92: | ||
uint8_t irq; | uint8_t irq; | ||
cdi_list_t resources; | cdi_list_t resources; | ||
| − | };</ | + | };</syntaxhighlight> |
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 | + | <syntaxhighlight lang="c">typedef enum |
{ | { | ||
CDI_PCI_MEMORY, | CDI_PCI_MEMORY, | ||
CDI_PCI_IOPORTS | CDI_PCI_IOPORTS | ||
| − | } cdi_res_t;</ | + | } cdi_res_t;</syntaxhighlight> |
„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 | + | <syntaxhighlight lang="c">struct cdi_pci_resource |
{ | { | ||
cdi_res_t type; | cdi_res_t type; | ||
| Zeile 107: | Zeile 107: | ||
unsigned int index; | unsigned int index; | ||
void *address; | void *address; | ||
| − | };</ | + | };</syntaxhighlight> |
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;</ | + | <syntaxhighlight lang="c">typedef ??? cdi_list_t;</syntaxhighlight> |
„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). | ||
| Zeile 115: | Zeile 115: | ||
===== cdi.h ===== | ===== cdi.h ===== | ||
| − | <c>void cdi_init(void);</ | + | <syntaxhighlight lang="c">void cdi_init(void);</syntaxhighlight> |
Initialisiert die CDI-Strukturen des Betriebssystems, 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);</ | + | <syntaxhighlight lang="c">void cdi_run_drivers(void);</syntaxhighlight> |
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. | 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);</ | + | <syntaxhighlight lang="c">void cdi_driver_init(struct cdi_driver *driver);</syntaxhighlight> |
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. | 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);</ | + | <syntaxhighlight lang="c">void cdi_driver_destroy(struct cdi_driver *driver);</syntaxhighlight> |
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. | 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);</ | + | <syntaxhighlight lang="c">void cdi_driver_register(struct cdi_driver *driver);</syntaxhighlight> |
Registriert einen CDI-Treiber. Es bietet sich an, ihn in einer globalen Liste einzutragen und diese Liste dann beim cdi_run_drivers()-Aufruf abzuarbeiten. | Registriert einen CDI-Treiber. Es bietet sich an, ihn in einer globalen Liste einzutragen und diese Liste dann beim cdi_run_drivers()-Aufruf abzuarbeiten. | ||
===== cdi/misc.h ===== | ===== cdi/misc.h ===== | ||
| − | <c>void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device*), struct cdi_device *device);</ | + | <syntaxhighlight lang="c">void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device*), struct cdi_device *device);</syntaxhighlight> |
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. | 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);</ | + | <syntaxhighlight lang="c">int cdi_wait_irq(uint8_t irq, uint32_t timeout);</syntaxhighlight> |
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. | ||
| − | <c>int cdi_reset_wait_irq(uint8_t irq);</ | + | <syntaxhighlight lang="c">int cdi_reset_wait_irq(uint8_t irq);</syntaxhighlight> |
Setzt den Status (aufgerufen oder nicht) des IRQs zurück. | Setzt den Status (aufgerufen oder nicht) des IRQs zurück. | ||
| − | <c>int cdi_alloc_phys_mem(size_t size, void **vaddr, void **paddr);</ | + | <syntaxhighlight lang="c">int cdi_alloc_phys_mem(size_t size, void **vaddr, void **paddr);</syntaxhighlight> |
Reserviert physisch kontinuierlichen Speicher der Größe „size“. Der Beginn wird in „**paddr“ gespeichert, die virtuelle Adresse in „**vaddr“. Bei Erfolg wird 0 zurückgegeben, sonst -1. | Reserviert physisch kontinuierlichen Speicher der Größe „size“. Der Beginn wird in „**paddr“ gespeichert, die virtuelle Adresse in „**vaddr“. Bei Erfolg wird 0 zurückgegeben, sonst -1. | ||
| − | <c>void *cdi_alloc_phys_addr(size_t size, uintptr_t paddr);</ | + | <syntaxhighlight lang="c">void *cdi_alloc_phys_addr(size_t size, uintptr_t paddr);</syntaxhighlight> |
Reserviert physisch kontinuierlichen Speicher der Größe „size“ an der physischen Adresse „paddr“. Bei Erfolg wird die virtuelle Adresse zurückgegeben, im Fehlerfall hingegen NULL. | Reserviert physisch kontinuierlichen Speicher der Größe „size“ an der physischen Adresse „paddr“. Bei Erfolg wird die virtuelle Adresse zurückgegeben, im Fehlerfall hingegen NULL. | ||
| − | <c>int cdi_ioports_alloc(uint16_t start, uint16_t count);</ | + | <syntaxhighlight lang="c">int cdi_ioports_alloc(uint16_t start, uint16_t count);</syntaxhighlight> |
Reserviert „count“ I/O-Ports ab dem Port „start“. Bei Erfolg wird 0 zurückgegeben, im Fehlerfall -1. | Reserviert „count“ I/O-Ports ab dem Port „start“. Bei Erfolg wird 0 zurückgegeben, im Fehlerfall -1. | ||
| − | <c>int cdi_ioports_free(uint16_t start, uint16_t count);</ | + | <syntaxhighlight lang="c">int cdi_ioports_free(uint16_t start, uint16_t count);</syntaxhighlight> |
Gibt reservierte „count“ I/O-Ports ab „start“ wieder frei. Bei Erfolg ist der Rückgabewert 0, sonst -1. | Gibt reservierte „count“ I/O-Ports ab „start“ wieder frei. Bei Erfolg ist der Rückgabewert 0, sonst -1. | ||
| − | <c>void cdi_sleep_ms(uint32_t ms);</ | + | <syntaxhighlight lang="c">void cdi_sleep_ms(uint32_t ms);</syntaxhighlight> |
Wartet „ms“ Millisekunden. | Wartet „ms“ Millisekunden. | ||
===== cdi/pci.h ===== | ===== cdi/pci.h ===== | ||
| − | <c>void cdi_pci_get_all_devices(cdi_list_t list);</ | + | <syntaxhighlight lang="c">void cdi_pci_get_all_devices(cdi_list_t list);</syntaxhighlight> |
Fügt alle vorhandenen PCI-Geräte in die Liste „list“ ein. | Fügt alle vorhandenen PCI-Geräte in die Liste „list“ ein. | ||
| − | <c>void cdi_pci_device_destroy(struct cdi_pci_device *device);</ | + | <syntaxhighlight lang="c">void cdi_pci_device_destroy(struct cdi_pci_device *device);</syntaxhighlight> |
Gibt die Informationen zum PCI-Gerät frei. | Gibt die Informationen zum PCI-Gerät frei. | ||
| − | <c>void cdi_pci_alloc_ioports(struct cdi_pci_device *device);</ | + | <syntaxhighlight lang="c">void cdi_pci_alloc_ioports(struct cdi_pci_device *device);</syntaxhighlight> |
Reserviert die I/O-Ports des angegebenen PCI-Geräts. | Reserviert die I/O-Ports des angegebenen PCI-Geräts. | ||
| − | <c>void cdi_pci_free_ioports(struct cdi_pci_device *device);</ | + | <syntaxhighlight lang="c">void cdi_pci_free_ioports(struct cdi_pci_device *device);</syntaxhighlight> |
Gibt selbige Reservierung wieder frei. | Gibt selbige Reservierung wieder frei. | ||
| − | <c>void cdi_pci_alloc_memory(struct cdi_pci_device *device);</ | + | <syntaxhighlight lang="c">void cdi_pci_alloc_memory(struct cdi_pci_device *device);</syntaxhighlight> |
Reserviert den Speicher des PCI-Geräts. | Reserviert den Speicher des PCI-Geräts. | ||
| − | <c>void cdi_pci_free_memory(struct cdi_pci_device *device);</ | + | <syntaxhighlight lang="c">void cdi_pci_free_memory(struct cdi_pci_device *device);</syntaxhighlight> |
Gibt selbigen Speicher wieder frei. | Gibt selbigen Speicher wieder frei. | ||
===== cdi/io.h ===== | ===== cdi/io.h ===== | ||
| − | <c>uint8_t cdi_inb(uint16_t port); | + | <syntaxhighlight lang="c">uint8_t cdi_inb(uint16_t port); |
uint16_t cdi_inw(uint16_t port); | uint16_t cdi_inw(uint16_t port); | ||
| − | uint32_t cdi_inl(uint16_t port);</ | + | uint32_t cdi_inl(uint16_t port);</syntaxhighlight> |
Liest ein Byte/Word/DWord vom angegeben I/O-Port ein und gibt es zurück | Liest ein Byte/Word/DWord vom angegeben I/O-Port ein und gibt es zurück | ||
| − | <c>void cdi_outb(uint16_t port, uint8_t data); | + | <syntaxhighlight lang="c">void cdi_outb(uint16_t port, uint8_t data); |
void cdi_outw(uint16_t port, uint16_t data); | void cdi_outw(uint16_t port, uint16_t data); | ||
| − | void cdi_outl(uint16_t port, uint32_t data);</ | + | void cdi_outl(uint16_t port, uint32_t data);</syntaxhighlight> |
Gibt ein Byte/Word/DWord am angegebenen I/O-Port aus. | Gibt ein Byte/Word/DWord am angegebenen I/O-Port aus. | ||
===== cdi/lists.h ===== | ===== cdi/lists.h ===== | ||
| − | <c>cdi_list_t cdi_list_create(void);</ | + | <syntaxhighlight lang="c">cdi_list_t cdi_list_create(void);</syntaxhighlight> |
Erstellt eine Linked-List (gibt NULL bei Fehler zurück). | Erstellt eine Linked-List (gibt NULL bei Fehler zurück). | ||
| − | <c>void cdi_list_destroy(cdi_list_t list);</ | + | <syntaxhighlight lang="c">void cdi_list_destroy(cdi_list_t list);</syntaxhighlight> |
Gibt eine Liste wieder frei. | Gibt eine Liste wieder frei. | ||
| − | <c>cdi_list_t cdi_list_push(cdi_list_t list, void *value);</ | + | <syntaxhighlight lang="c">cdi_list_t cdi_list_push(cdi_list_t list, void *value);</syntaxhighlight> |
Fügt ein Element am Anfang der Liste ein und gibt die Liste zurück (oder NULL bei Fehler). | Fügt ein Element am Anfang der Liste ein und gibt die Liste zurück (oder NULL bei Fehler). | ||
| − | <c>void *cdi_list_pop(cdi_list_t list);</ | + | <syntaxhighlight lang="c">void *cdi_list_pop(cdi_list_t list);</syntaxhighlight> |
Entfernt ein Element vom Anfang der Liste und gibt seinen Wert zurück (oder NULL bei Fehler). | Entfernt ein Element vom Anfang der Liste und gibt seinen Wert zurück (oder NULL bei Fehler). | ||
| − | <c>size_t cdi_list_empty(cdi_list_t list);</ | + | <syntaxhighlight lang="c">size_t cdi_list_empty(cdi_list_t list);</syntaxhighlight> |
Gibt 1 zurück, wenn die Liste leer ist, sonst 0. | Gibt 1 zurück, wenn die Liste leer ist, sonst 0. | ||
| − | <c>void *cdi_list_get(cdi_list_t list, size_t index);</ | + | <syntaxhighlight lang="c">void *cdi_list_get(cdi_list_t list, size_t index);</syntaxhighlight> |
Gibt den Wert des Elements am Index „index“ zurück (oder NULL bei Fehler). | Gibt den Wert des Elements am Index „index“ zurück (oder NULL bei Fehler). | ||
| − | <c>cdi_list_t cdi_list_insert(cdi_list_t list, size_t index, void *value);</ | + | <syntaxhighlight lang="c">cdi_list_t cdi_list_insert(cdi_list_t list, size_t index, void *value);</syntaxhighlight> |
Fügt ein Element in die Liste an der Position „index“ ein und gibt die Liste zurück (oder NULL bei Fehler). | Fügt ein Element in die Liste an der Position „index“ ein und gibt die Liste zurück (oder NULL bei Fehler). | ||
| − | <c>void *cdi_list_remove(cdi_list_t list, size_t index);</ | + | <syntaxhighlight lang="c">void *cdi_list_remove(cdi_list_t list, size_t index);</syntaxhighlight> |
Entfernt das Listenelement an der Stelle „index“ und gibt seinen Wert zurück (oder NULL bei Fehler). | Entfernt das Listenelement an der Stelle „index“ und gibt seinen Wert zurück (oder NULL bei Fehler). | ||
| − | <c>size_t cdi_list_size(cdi_list_t list);</ | + | <syntaxhighlight lang="c">size_t cdi_list_size(cdi_list_t list);</syntaxhighlight> |
Gibt die Anzahl der Elemente in der Liste zurück. | Gibt die Anzahl der Elemente in der Liste zurück. | ||
=== CDI.net === | === CDI.net === | ||
==== Datentypen ==== | ==== Datentypen ==== | ||
| − | <c>struct cdi_net_device | + | <syntaxhighlight lang="c">struct cdi_net_device |
{ | { | ||
struct cdi_device dev; | struct cdi_device dev; | ||
| Zeile 196: | Zeile 196: | ||
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); | ||
| − | };</ | + | };</syntaxhighlight> |
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 | + | <syntaxhighlight lang="c">struct cdi_net_driver |
{ | { | ||
struct cdi_driver drv; | struct cdi_driver drv; | ||
| − | };</ | + | };</syntaxhighlight> |
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. | ||
==== Funktionen ==== | ==== Funktionen ==== | ||
| − | <c>void cdi_net_driver_init(struct cdi_net_driver *driver);</ | + | <syntaxhighlight lang="c">void cdi_net_driver_init(struct cdi_net_driver *driver);</syntaxhighlight> |
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. | 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);</ | + | <syntaxhighlight lang="c">void cdi_net_driver_destroy(struct cdi_net_driver *driver);</syntaxhighlight> |
Diese Funktion wiederum deinitialisiert einen CDI.net-Treiber. | Diese Funktion wiederum deinitialisiert einen CDI.net-Treiber. | ||
| − | <c>void cdi_net_device_init(struct cdi_net_device *device);</ | + | <syntaxhighlight lang="c">void cdi_net_device_init(struct cdi_net_device *device);</syntaxhighlight> |
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. | 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);</ | + | <syntaxhighlight lang="c">void cdi_net_receive(struct cdi_net_device *device, void *buffer, size_t size);</syntaxhighlight> |
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. | 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. | ||