drivers/ec_command.h
author Wilhelm Hagemeister <hm@igh-essen.com>
Fri, 04 Nov 2005 17:05:20 +0000
changeset 6 e36a85dc2730
parent 2 b0a7a4745bf9
child 13 db0742533c10
permissions -rw-r--r--
ISR-Aufruf in read_process_data
/****************************************************************
 *
 *  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 */
}
EtherCAT_command_t;

/***************************************************************/

void EtherCAT_command_init(EtherCAT_command_t *);
void EtherCAT_command_clear(EtherCAT_command_t *);

/***************************************************************/

#endif