drivers/ec_command.h
changeset 0 05c992bf5847
child 2 b0a7a4745bf9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/drivers/ec_command.h	Fri Oct 21 11:21:42 2005 +0000
@@ -0,0 +1,93 @@
+/****************************************************************
+ *
+ *  e c _ c o m m a n d . h
+ *
+ *  Struktur für ein EtherCAT-Kommando.
+ *
+ *  $Date$
+ *  $Author$
+ *
+ ***************************************************************/
+
+#ifndef _EC_COMMAND_H_
+#define _EC_COMMAND_H_
+
+#include "ec_globals.h"
+
+/**
+   Status eines EtherCAT-Kommandos.
+*/
+
+typedef enum
+{
+  ECAT_CS_READY, ECAT_CS_SENT, ECAT_CS_RECEIVED
+}
+EtherCAT_command_state_t;
+
+/**
+   EtherCAT-Adresse.
+
+   Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die
+   ja nach Kommandoty eine andere bedeutung haben: Bei Autoinkrement-
+   befehlen sind die ersten zwei Bytes die (negative)
+   Autoinkrement-Adresse, bei Knoten-adressierten Befehlen entsprechen
+   sie der Knotenadresse. Das dritte und vierte Byte entspricht in
+   diesen Fällen der physikalischen Speicheradresse auf dem Slave.
+   Bei einer logischen Adressierung entsprechen alle vier Bytes
+   der logischen Adresse.
+*/
+
+typedef union
+{
+  struct
+  {
+    union
+    {
+      short pos; /**< (Negative) Ring-Position des Slaves */
+      unsigned short node; /**< Konfigurierte Knotenadresse */
+    }
+    dev;
+
+    unsigned short mem; /**< Physikalische Speicheradresse im Slave */
+  }
+  phy;
+
+  unsigned long logical; /**< Logische Adresse */
+  unsigned char raw[4]; /**< Rohdaten für die generierung des Frames */
+}
+EtherCAT_address_t;
+
+/***************************************************************/
+
+/**
+   EtherCAT-Kommando.
+*/
+
+typedef struct EtherCAT_command
+{
+  EtherCAT_cmd_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc...) */
+  EtherCAT_address_t address; /**< Adresse des/der Empfänger */
+  unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen Daten */
+
+  struct EtherCAT_command *next; /**< (Für den Master) Zeiger auf nächstes Kommando
+                                    in der Liste */
+
+  EtherCAT_command_state_t state; /**< Zustand des Kommandos (bereit, gesendet, etc...) */
+  unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet wurde (wird
+                          vom Master beim Senden gesetzt. */
+  unsigned int working_counter; /**< Working-Counter bei Empfang (wird vom Master gesetzt) */
+
+  unsigned char data[ECAT_FRAME_BUFFER_SIZE]; /**< Kommandodaten */
+
+  unsigned char reserved; /**< Markiert, das das Kommando gerade benutzt wird */
+}
+EtherCAT_command_t;
+
+/***************************************************************/
+
+void EtherCAT_command_init(EtherCAT_command_t *);
+void EtherCAT_command_clear(EtherCAT_command_t *);
+
+/***************************************************************/
+
+#endif