diff -r 000000000000 -r 05c992bf5847 drivers/ec_command.h --- /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