include/EtherCAT_rt.h
author Florian Pose <fp@igh-essen.com>
Mon, 20 Feb 2006 08:30:30 +0000
changeset 70 6693d7e25d5e
parent 68 a452700db994
child 73 9f4ea66d89a3
permissions -rw-r--r--
Bug: NULL pointer dereference in master/device.c behoben.
/******************************************************************************
 *
 * Oeffentliche EtherCAT-Schnittstellen fuer Echtzeitprozesse.
 *
 * $Id$
 *
 *****************************************************************************/

#ifndef _ETHERCAT_RT_H_
#define _ETHERCAT_RT_H_

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

struct ec_master;
typedef struct ec_master ec_master_t;

struct ec_slave_type;
typedef struct ec_slave_type ec_slave_type_t;

struct ec_slave;
typedef struct ec_slave ec_slave_t;

struct ec_slave_init;
typedef struct ec_slave_init ec_slave_init_t;

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

ec_master_t *EtherCAT_rt_request_master(unsigned int master_index);

void EtherCAT_rt_release_master(ec_master_t *master);

ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master,
                                       const char *address,
                                       const char *vendor_name,
                                       const char *product_name,
                                       int domain);

int EtherCAT_rt_register_slave_list(ec_master_t *master,
                                    const ec_slave_init_t *slaves,
                                    unsigned int count);

int EtherCAT_rt_activate_slaves(ec_master_t *master);

int EtherCAT_rt_deactivate_slaves(ec_master_t *master);

int EtherCAT_rt_domain_xio(ec_master_t *master, unsigned int domain,
                           unsigned int timeout_us);

void EtherCAT_rt_debug_level(ec_master_t *master, int level);

int EtherCAT_rt_canopen_sdo_write(ec_master_t *master, ec_slave_t *slave,
                                  unsigned int sdo_index,
                                  unsigned char sdo_subindex,
                                  unsigned int value, unsigned int size);

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

/**
   EtherCAT-Slave
*/

struct ec_slave
{
    // Base data
    unsigned char base_type; /**< Slave-Typ */
    unsigned char base_revision; /**< Revision */
    unsigned short base_build; /**< Build-Nummer */

    // Addresses
    short ring_position; /**< (Negative) Position des Slaves im Bus */
    unsigned short station_address; /**< Konfigurierte Slave-Adresse */

    // Slave information interface
    unsigned int sii_vendor_id; /**< Identifikationsnummer des Herstellers */
    unsigned int sii_product_code; /**< Herstellerspezifischer Produktcode */
    unsigned int sii_revision_number; /**< Revisionsnummer */
    unsigned int sii_serial_number; /**< Seriennummer der Klemme */

    const ec_slave_type_t *type; /**< Zeiger auf die Beschreibung
                                    des Slave-Typs */

    unsigned int logical_address; /**< Konfigurierte, logische Adresse */

    void *process_data; /**< Zeiger auf den Speicherbereich
                           innerhalb eines Prozessdatenobjekts */
    void *private_data; /**< Zeiger auf privaten Datenbereich */
    int (*configure)(ec_slave_t *); /**< Zeiger auf die Funktion zur
                                     Konfiguration */

    unsigned char registered; /**< Der Slave wurde registriert */

    unsigned int domain; /**< Prozessdatendomäne */

    int error_reported; /**< Ein Zugriffsfehler wurde bereits gemeldet */
};

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

/**
   Beschreibung eines EtherCAT-Slave-Typs.

   Diese Beschreibung dient zur Konfiguration einer bestimmten
   Slave-Art. Sie enthält die Konfigurationsdaten für die
   Slave-internen Sync-Manager und FMMU's.
*/

struct ec_slave_init
{
    ec_slave_t **slave_ptr; /**< Zeiger auf den Slave-Zeiger, der später auf
                               die Slave-Struktur zeigen soll. */
    const char *address; /**< ASCII-kodierte Bus-Adresse des zu
                            registrierenden Slaves \sa ec_address */
    const char *vendor_name; /**< Name des Herstellers */
    const char *product_name; /**< Name des Slaves-Typs */
    unsigned int domain; /**< Domäne, in der registriert werden soll. */
};

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

#endif