/****************************************************************************** * * m a s t e r . h * * EtherCAT master structure. * * $Id$ * *****************************************************************************/ #ifndef _EC_MASTER_H_ #define _EC_MASTER_H_ #include #include #include #include "device.h" #include "domain.h" /*****************************************************************************/ /** EtherCAT master mode. */ typedef enum { EC_MASTER_MODE_IDLE, EC_MASTER_MODE_FREERUN, EC_MASTER_MODE_RUNNING } ec_master_mode_t; /*****************************************************************************/ /** Cyclic EtherCAT statistics. */ typedef struct { unsigned int timeouts; /**< command timeouts */ unsigned int delayed; /**< delayed commands */ unsigned int corrupted; /**< corrupted frames */ unsigned int unmatched; /**< unmatched commands */ unsigned int eoe_errors; /**< Ethernet-over-EtherCAT errors */ cycles_t t_last; /**< time of last output */ } ec_stats_t; /*****************************************************************************/ /** EtherCAT-Master. Manages slaves, domains and IO. */ struct ec_master { struct list_head list; /**< list item */ struct kobject kobj; /**< kobject */ unsigned int index; /**< master index */ struct list_head slaves; /**< list of slaves on the bus */ unsigned int slave_count; /**< number of slaves on the bus */ ec_device_t *device; /**< EtherCAT device */ struct list_head command_queue; /**< command queue */ uint8_t command_index; /**< current command index */ struct list_head domains; /**< list of domains */ ec_command_t simple_command; /**< command structure for initialization */ ec_command_t watch_command; /**< command for watching the slaves */ unsigned int slaves_responding; /**< number of responding slaves */ ec_slave_state_t slave_states; /**< states of the responding slaves */ int debug_level; /**< master debug level */ ec_stats_t stats; /**< cyclic statistics */ unsigned int timeout; /**< timeout in synchronous IO */ struct list_head eoe_slaves; /**< Ethernet-over-EtherCAT slaves */ unsigned int reserved; /**< true, if the master is reserved for RT */ struct timer_list freerun_timer; /**< timer object for free run mode */ ec_master_mode_t mode; /**< master mode */ }; /*****************************************************************************/ // master creation and deletion int ec_master_init(ec_master_t *, unsigned int); void ec_master_clear(struct kobject *); void ec_master_reset(ec_master_t *); // free run void ec_master_freerun_start(ec_master_t *); void ec_master_freerun_stop(ec_master_t *); // IO void ec_master_receive(ec_master_t *, const uint8_t *, size_t); void ec_master_queue_command(ec_master_t *, ec_command_t *); int ec_master_simple_io(ec_master_t *, ec_command_t *); // slave management int ec_master_bus_scan(ec_master_t *); // misc. void ec_master_debug(const ec_master_t *); void ec_master_output_stats(ec_master_t *); void ec_master_run_eoe(ec_master_t *); /*****************************************************************************/ #endif