Hallo,
du solltest dir zwei Schnittstellen überlegen:
(a) Wie soll der Treiber auf Kernel & Hardware zugreifen können, d.h. Ressourcenzuteilung bzw. -verteilung?
Ein Ansatz ist die simple Zuteilung von nicht näher bezeichneten (busabhängigen) Ressourcen (z.B. IRQs, DRQs, I/O-Ports oder physischen & virtuellen [nicht-auslagerbaren] Speicheradressen) an Treiber, die diese vom System anfordern können und dann direkt darauf zugreifen können - wenn die Treiber der Meinung sind, mit dieser Hardware etwas anfangen zu können. Diese Ressourcenverteilung muss exklusiv sein, d.h. es darf nur einen Treiber je Hardware geben.
(b) Wie sollen die Anwendungsprogramme auf den Treiber zugreifen können?
Hier brauchst du eine Abstraktion je Geräteklasse, eine Tastatur ist ein Eingabegerät für Zeichen (eine serielle Schnittstelle auch), ein Bildschirm ist eine zweidimensionale (oder zeilenweise) Ansammlung von Zeichen und/oder Pixeln, eine Diskette/Festplatte/CDROM/USB-Stick ist eine eindimensionale Ansammlung von Datenblöcken.
Ob du diese beiden Teile getrennt (Abstraktion der Bussysteme) oder zusammen (es gibt nur PCI, der Rest sind Ausnahmen) behandelst, bleibt dir überlassen. Genauso, ob du beide Teile verschachtelbar einplanst (USB ist ein Bussystem, welches Ressourcen für den Hostcontroller benötigt, aber selbst wieder Ressourcen bereitstellt) oder das ganze lieber in Bibliotheken verpackst ("USB" ist ein Gerät, der einzige Nutzer ist die "lib-usb").
Wichtig ist, dass du einerseits diese Schnittstellen möglichst einfach entwickelst, andererseits aber so komplex aufbaust, dass du dich nicht zu sehr einschränkst.
Die serielle Schnittstelle braucht IRQ und I/O-Ports und liefert eine Folge von Zeichen und Fehlern. Der USB-Stick liefert Datenblöcke, ist aber nur über ein vollwertiges und initialisiertes Bussystem erreichbar, welches wiederum IRQ- und DMA-Leitungen und Speicheradressen benötigt.
Gruß,
Sebastian