fp@39: /****************************************************************************** fp@0: * fp@0: * e c _ d e v i c e . h fp@0: * fp@0: * Struktur für ein EtherCAT-Gerät. fp@0: * fp@39: * $Id$ fp@0: * fp@39: *****************************************************************************/ fp@0: fp@0: #ifndef _EC_DEVICE_H_ fp@0: #define _EC_DEVICE_H_ fp@0: fp@25: #include fp@25: fp@0: #include "ec_globals.h" fp@0: fp@0: /** fp@0: Zustand eines EtherCAT-Gerätes. fp@13: fp@0: Eine Für EtherCAT reservierte Netzwerkkarte kann bestimmte Zustände haben. fp@0: */ fp@0: fp@0: typedef enum fp@0: { fp@0: ECAT_DS_READY, /**< Das Gerät ist bereit zum Senden */ fp@0: ECAT_DS_SENT, /**< Das Gerät hat einen Rahmen abgesendet, fp@0: aber noch keine Antwort enpfangen */ fp@0: ECAT_DS_RECEIVED, /**< Das Gerät hat eine Antwort auf einen fp@0: zuvor gesendeten Rahmen empfangen */ fp@0: ECAT_DS_TIMEOUT, /**< Nach dem Senden eines Rahmens meldete fp@0: das Gerät einen Timeout */ fp@0: ECAT_DS_ERROR /**< Nach dem Senden eines frames hat das fp@0: Gerät einen Fehler festgestellt. */ fp@0: } fp@0: EtherCAT_device_state_t; fp@0: fp@39: /*****************************************************************************/ fp@0: fp@0: /** fp@0: EtherCAT-Gerät. fp@0: fp@0: Ein EtherCAT-Gerät ist eine Netzwerkkarte, die vom fp@0: EtherCAT-Master dazu verwendet wird, um Frames zu senden fp@0: und zu empfangen. fp@0: */ fp@0: fp@0: typedef struct fp@0: { fp@0: struct net_device *dev; /**< Zeiger auf das reservierte net_device */ fp@0: struct sk_buff *tx_skb; /**< Zeiger auf Transmit-Socketbuffer */ fp@0: struct sk_buff *rx_skb; /**< Zeiger auf Receive-Socketbuffer */ fp@0: unsigned long tx_time; /**< Zeit des letzten Sendens */ fp@0: unsigned long rx_time; /**< Zeit des letzten Empfangs */ fp@0: unsigned long tx_intr_cnt; /**< Anzahl Tx-Interrupts */ fp@0: unsigned long rx_intr_cnt; /**< Anzahl Rx-Interrupts */ fp@0: unsigned long intr_cnt; /**< Anzahl Interrupts */ fp@0: volatile EtherCAT_device_state_t state; /**< Gesendet, Empfangen, fp@0: Timeout, etc. */ fp@0: unsigned char rx_data[ECAT_FRAME_BUFFER_SIZE]; /**< Puffer für fp@0: empfangene Rahmen */ fp@0: volatile unsigned int rx_data_length; /**< Länge des zuletzt fp@0: empfangenen Rahmens */ fp@25: irqreturn_t (*isr)(int, void *, struct pt_regs *); /**< Adresse der ISR */ fp@33: struct module *module; /**< Zeiger auf das Modul, das das Gerät zur fp@33: Verfügung stellt. */ fp@39: int error_reported; /**< Zeigt an, ob ein Fehler im zyklischen Code fp@39: bereits gemeldet wurde. */ fp@0: } fp@0: EtherCAT_device_t; fp@0: fp@39: /*****************************************************************************/ fp@0: fp@0: void EtherCAT_device_init(EtherCAT_device_t *); fp@0: int EtherCAT_device_assign(EtherCAT_device_t *, struct net_device *); fp@0: void EtherCAT_device_clear(EtherCAT_device_t *); fp@0: fp@0: int EtherCAT_device_open(EtherCAT_device_t *); fp@0: int EtherCAT_device_close(EtherCAT_device_t *); fp@0: fp@0: int EtherCAT_device_send(EtherCAT_device_t *, unsigned char *, unsigned int); fp@19: int EtherCAT_device_receive(EtherCAT_device_t *, unsigned char *); fp@5: void EtherCAT_device_call_isr(EtherCAT_device_t *); fp@0: fp@0: void EtherCAT_device_debug(EtherCAT_device_t *); fp@0: fp@39: /*****************************************************************************/ fp@0: fp@0: #endif