[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lost] [PATCH] + cdi: Header fuer cdi/scsi (ungetestet)



Hi,

Im Anhang ist meine Version von cdi/scsi.h. Tut mir leid, dass das jetzt
alles neu und auch noch in meinem Codestil geschrieben ist, aber der
Header ist nun mal für meinOS und deswegen schreibe ich den lieber
selber. Eigentlich habe ich nur ein paar uint32_t's mit size_t's
ersetzt, struct cdi_scsi_packet nach oben verschoben (da das in struct
cdi_scsi_driver benötigt wird) und struct cdi_scsi_command hinzugefügt.
Da das ehemalige Data-Field auch zum empfangen ist, also vorher keine
Daten enthalten muss, denke ich, dass sich der Begriff "buffer" besser
eignet, ist aber eigentlich vollkommen egal (Jetzt wo ich drüber nachdenke).
Das Command-Struct wird benötigt, da jeder SCSI-Treiber ja
unterschiedliche Kommandos sendet und es macht auch nicht wirklich Sinn,
das in das ehemalige Data-Feld zu packen. Es wäre nur gut, sich
irgendwas für die Größe des Arrays "parameters" auszudenken. So daß die
Größe automatisch gesetzt wird (eventuell union) und man das ganze
Command-Struct per PIO direkt versenden kann.

Antoine Kaufmann schrieb:
> So ich habe mich hier mal an einem Header fuer CDI/scsi versucht. Ich
> weiss aber nicht wirklich ob das reicht was ich da habe, da ich SCSI bis
> jetzt noch nie implementiert habe. ;-)
--- /dev/null	2006-05-02 08:45:04.000000000 +0200
+++ scsi.h	2008-09-25 20:31:29.000000000 +0200
@@ -0,0 +1,80 @@
+#ifndef _CDI_SCSI_H_
+#define _CDI_SCSI_H_
+
+#include <stdint.h>
+#include <stddef.h>
+
+#include "cdi.h"
+
+// SCSI Command
+struct cdi_scsi_command {
+  // SCSI Operation Code
+  uint8_t opcode;
+
+  // SCSI Command Parameter
+  // Es gibt verschiedene Groessen, diese sind vom Operation Code abhaengig.
+  uint8_t parameters[14];
+
+  // Control-Feld
+  uint8_t control;
+};
+
+// SCSI-Paket
+struct cdi_scsi_packet {
+  // Buffer zum Senden oder Empfangen von Daten
+  void *buffer;
+
+  // Groesse des Buffers
+  size_t bufsize;
+
+  // SCSI Command
+  struct cdi_scsi_command command;
+
+  // Groesse des SCSI Commands
+  size_t cmdsize;
+};
+
+// SCSI-Geraet
+struct cdi_scsi_device {
+  struct cdi_device dev;
+};
+
+// SCSI-Driver
+struct cdi_scsi_driver {
+  struct cdi_driver drv;
+
+  struct cdi_scsi_packet* (*request)(struct cdi_scsi_device *device,struct cdi_scsi_packet *packet);
+};
+
+/**
+ * Ein SCSI-Paket allozieren
+ *
+ * @param size Benoetigte Groesse
+ *
+ * @return Pointer auf das Paket oder NULL im Fehlerfall
+ */
+struct cdi_scsi_packet* cdi_scsi_packet_alloc(size_t size);
+
+/**
+ * Ein SCSI-Paket freigeben
+ *
+ * @param packet Pointer auf das Paket
+ */
+void cdi_scsi_packet_free(struct cdi_scsi_packet* packet);
+
+/**
+ * Initialisiert die Datenstrukturen fuer einen SCSI-Treiber
+ */
+void cdi_scsi_driver_init(struct cdi_scsi_driver* driver);
+
+/**
+ * Deinitialisiert die Datenstrukturen fuer einen SCSI-Treiber
+ */
+void cdi_scsi_driver_destroy(struct cdi_scsi_driver* driver);
+
+/**
+ * Registiert einen SCSI-Treiber
+ */
+void cdi_scsi_driver_register(struct cdi_scsi_driver* driver);
+
+#endif