IgH EtherCAT Master  1.6.0-rc1
slave.h
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * $Id$
4  *
5  * Copyright (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH
6  *
7  * This file is part of the IgH EtherCAT Master.
8  *
9  * The IgH EtherCAT Master is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License version 2, as
11  * published by the Free Software Foundation.
12  *
13  * The IgH EtherCAT Master is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16  * Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with the IgH EtherCAT Master; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  *
22  * ---
23  *
24  * The license mentioned above concerns the source code only. Using the
25  * EtherCAT technology and brand is only permitted in compliance with the
26  * industrial property and similar rights of Beckhoff Automation GmbH.
27  *
28  *****************************************************************************/
29 
35 /*****************************************************************************/
36 
37 #ifndef __EC_SLAVE_H__
38 #define __EC_SLAVE_H__
39 
40 #include <linux/list.h>
41 #include <linux/kobject.h>
42 #include <linux/rtmutex.h>
43 
44 #include "globals.h"
45 #include "datagram.h"
46 #include "pdo.h"
47 #include "sync.h"
48 #include "sdo.h"
49 #include "fsm_slave.h"
50 
51 /*****************************************************************************/
52 
63 #define EC_SLAVE_INFO(slave, fmt, args...) \
64  printk(KERN_INFO "EtherCAT %u-%u: " fmt, slave->master->index, \
65  slave->ring_position, ##args)
66 
77 #define EC_SLAVE_ERR(slave, fmt, args...) \
78  printk(KERN_ERR "EtherCAT ERROR %u-%u: " fmt, slave->master->index, \
79  slave->ring_position, ##args)
80 
91 #define EC_SLAVE_WARN(slave, fmt, args...) \
92  printk(KERN_WARNING "EtherCAT WARNING %u-%u: " fmt, \
93  slave->master->index, slave->ring_position, ##args)
94 
107 #define EC_SLAVE_DBG(slave, level, fmt, args...) \
108  do { \
109  if (slave->master->debug_level >= level) { \
110  printk(KERN_DEBUG "EtherCAT DEBUG %u-%u: " fmt, \
111  slave->master->index, slave->ring_position, ##args); \
112  } \
113  } while (0)
114 
115 /*****************************************************************************/
116 
117 #ifdef EC_LOOP_CONTROL
118 
121 typedef enum {
122  EC_SLAVE_PORT_DOWN,
123  EC_SLAVE_PORT_WAIT,
124  EC_SLAVE_PORT_UP
125 } ec_slave_port_state_t;
126 
129 #define EC_PORT_WAIT_MS 2000
130 
131 #endif
132 
133 /*****************************************************************************/
134 
137 typedef struct {
141  uint32_t receive_time;
143  uint32_t delay_to_next_dc;
145 #ifdef EC_LOOP_CONTROL
146  ec_slave_port_state_t state;
147  unsigned long link_detection_jiffies;
148 #endif
150 
151 /*****************************************************************************/
152 
155 typedef struct {
156  // Non-category data
157  uint16_t alias;
158  uint32_t vendor_id;
159  uint32_t product_code;
160  uint32_t revision_number;
161  uint32_t serial_number;
170  uint16_t mailbox_protocols;
172  // Strings
173  char **strings;
174  unsigned int string_count;
176  // General
177  unsigned int has_general;
178  char *group;
179  char *image;
180  char *order;
181  char *name;
182  uint8_t physical_layer[EC_MAX_PORTS];
185  int16_t current_on_ebus;
187  // SyncM
189  unsigned int sync_count;
191  // [RT]XPDO
192  struct list_head pdos;
193 } ec_sii_t;
194 
195 /*****************************************************************************/
196 
199 struct ec_slave
200 {
205  // addresses
206  uint16_t ring_position;
207  uint16_t station_address;
208  uint16_t effective_alias;
212  // configuration
216  unsigned int error_flag;
217  unsigned int force_config;
226  // base data
227  uint8_t base_type;
228  uint8_t base_revision;
229  uint16_t base_build;
230  uint8_t base_fmmu_count;
231  uint8_t base_sync_count;
241  // SII
242  uint16_t *sii_words;
243  size_t sii_nwords;
245  // Slave information interface
248  struct list_head sdo_dictionary;
250  unsigned long jiffies_preop;
252  struct list_head sdo_requests;
253  struct list_head reg_requests;
254  struct list_head foe_requests;
255  struct list_head soe_requests;
256  struct list_head eoe_requests;
257  struct list_head dict_requests;
261  uint8_t read_mbox_busy;
262  struct rt_mutex mbox_sem;
264 #ifdef EC_EOE
267 #endif
273  uint8_t valid_mbox_data;
274 };
275 
276 /*****************************************************************************/
277 
278 // slave construction/destruction
280  uint16_t, uint16_t);
281 void ec_slave_clear(ec_slave_t *);
282 
284 
286 void ec_slave_set_dl_status(ec_slave_t *, uint16_t);
288 
289 // SII categories
290 int ec_slave_fetch_sii_strings(ec_slave_t *, const uint8_t *, size_t);
291 int ec_slave_fetch_sii_general(ec_slave_t *, const uint8_t *, size_t);
292 int ec_slave_fetch_sii_syncs(ec_slave_t *, const uint8_t *, size_t);
293 int ec_slave_fetch_sii_pdos(ec_slave_t *, const uint8_t *, size_t,
295 
296 // misc.
298 
300  unsigned int *, unsigned int *);
301 ec_sdo_t *ec_slave_get_sdo(ec_slave_t *, uint16_t);
302 const ec_sdo_t *ec_slave_get_sdo_const(const ec_slave_t *, uint16_t);
303 const ec_sdo_t *ec_slave_get_sdo_by_pos_const(const ec_slave_t *, uint16_t);
304 uint16_t ec_slave_sdo_count(const ec_slave_t *);
305 const ec_pdo_t *ec_slave_find_pdo(const ec_slave_t *, uint16_t);
307 
310 
313 
314 /*****************************************************************************/
315 
316 #endif
ec_sii_general_flags_t general_flags
General flags.
Definition: slave.h:184
ec_mbox_data_t mbox_eoe_frag_data
Received mailbox data for EoE, type frame fragment.
Definition: slave.h:265
Slave information interface general flags.
Definition: globals.h:171
uint16_t ring_position
Ring position.
Definition: slave.h:206
uint32_t revision_number
Revision number.
Definition: slave.h:160
uint16_t boot_rx_mailbox_offset
Bootstrap receive mailbox address.
Definition: slave.h:162
ec_sii_t sii
Extracted SII data.
Definition: slave.h:246
int ec_slave_fetch_sii_syncs(ec_slave_t *, const uint8_t *, size_t)
Fetches data from a SYNC MANAGER category.
Definition: slave.c:541
uint16_t configured_tx_mailbox_size
Configured send mailbox size.
Definition: slave.h:224
uint16_t base_build
Build number.
Definition: slave.h:229
ec_slave_port_desc_t
EtherCAT slave port descriptor.
Definition: ecrt.h:357
ec_mbox_data_t mbox_eoe_init_data
Received mailbox data for EoE, type eoe init reponse.
Definition: slave.h:266
void ec_slave_request_state(ec_slave_t *, ec_slave_state_t)
Request a slave state and resets the error flag.
Definition: slave.c:418
uint16_t configured_tx_mailbox_offset
Configured send mailbox offset.
Definition: slave.h:222
ec_slave_state_t current_state
Current application state.
Definition: slave.h:215
ec_mbox_data_t mbox_foe_data
Received mailbox data for FoE.
Definition: slave.h:269
ec_sync_t * ec_slave_get_sync(ec_slave_t *, uint8_t)
Get the sync manager given an index.
Definition: slave.c:712
ec_slave_port_link_t link
Port link status.
Definition: slave.h:139
EtherCAT mailbox response data.
Definition: datagram.h:122
uint32_t serial_number
Serial number.
Definition: slave.h:161
const ec_pdo_t * ec_slave_find_pdo(const ec_slave_t *, uint16_t)
Finds a mapped PDO.
Definition: slave.c:847
ec_sii_coe_details_t coe_details
CoE detail flags.
Definition: slave.h:183
char * order
Order number.
Definition: slave.h:180
int ec_slave_fetch_sii_general(ec_slave_t *, const uint8_t *, size_t)
Fetches data from a GENERAL category.
Definition: slave.c:490
Finite state machine of an EtherCAT slave.
Definition: fsm_slave.h:59
ec_fsm_slave_t fsm
Slave state machine.
Definition: slave.h:259
CANopen SDO.
Definition: sdo.h:49
int16_t current_on_ebus
Power consumption in mA.
Definition: slave.h:185
uint16_t boot_tx_mailbox_size
Bootstrap transmit mailbox size.
Definition: slave.h:165
void ec_read_mbox_lock_clear(ec_slave_t *)
Clears the mailbox lock.
Definition: slave.c:190
int ec_read_mbox_locked(ec_slave_t *)
Return the current mailbox lock status and lock it if not locked.
Definition: slave.c:203
uint16_t station_address
Configured station address.
Definition: slave.h:207
unsigned int sync_count
Number of sync managers.
Definition: slave.h:189
uint16_t std_rx_mailbox_size
Standard receive mailbox size.
Definition: slave.h:167
uint8_t base_type
Slave type.
Definition: slave.h:227
const ec_sdo_t * ec_slave_get_sdo_const(const ec_slave_t *, uint16_t)
Get an SDO from the dictionary.
Definition: slave.c:784
int ec_slave_fetch_sii_pdos(ec_slave_t *, const uint8_t *, size_t, ec_direction_t)
Fetches data from a [RT]xPDO category.
Definition: slave.c:607
Global definitions and macros.
uint16_t std_tx_mailbox_offset
Standard transmit mailbox address.
Definition: slave.h:168
uint16_t boot_tx_mailbox_offset
Bootstrap transmit mailbox address.
Definition: slave.h:164
void ec_slave_init(ec_slave_t *, ec_master_t *, ec_device_index_t, uint16_t, uint16_t)
Slave constructor.
Definition: slave.c:62
EtherCAT slave.
Definition: slave.h:199
uint16_t ec_slave_sdo_count(const ec_slave_t *)
Get the number of SDOs in the dictionary.
Definition: slave.c:828
Slave information interface CANopen over EtherCAT details flags.
Definition: globals.h:160
ec_slave_config_t * config
Current configuration.
Definition: slave.h:213
PDO description.
Definition: pdo.h:49
uint8_t sdo_dictionary_fetched
Dictionary has been fetched.
Definition: slave.h:249
uint16_t * sii_words
Complete SII image.
Definition: slave.h:242
uint16_t mailbox_protocols
Supported mailbox protocols.
Definition: slave.h:170
ec_slave_dc_range_t base_dc_range
DC range.
Definition: slave.h:234
Sync manager.
Definition: sync.h:47
uint16_t std_rx_mailbox_offset
Standard receive mailbox address.
Definition: slave.h:166
uint8_t base_fmmu_bit_operation
FMMU bit operation is supported.
Definition: slave.h:232
uint32_t transmission_delay
DC system time transmission delay (offset from reference clock).
Definition: slave.h:238
ec_device_index_t
Master devices.
Definition: globals.h:204
void ec_slave_calc_port_delays(ec_slave_t *)
Calculates the port transmission delays.
Definition: slave.c:1044
uint16_t alias
Configured station alias.
Definition: slave.h:157
ec_direction_t
Direction type for PDO assignment functions.
Definition: ecrt.h:435
uint8_t base_fmmu_count
Number of supported FMMUs.
Definition: slave.h:230
uint16_t configured_rx_mailbox_offset
Configured receive mailbox offset.
Definition: slave.h:218
void ec_slave_clear_sync_managers(ec_slave_t *)
Clear the sync manager array.
Definition: slave.c:337
ec_slave_dc_range_t
EtherCAT slave distributed clocks range.
Definition: globals.h:178
ec_slave_port_desc_t desc
Port descriptors.
Definition: slave.h:138
unsigned int string_count
Number of SII strings.
Definition: slave.h:174
ec_master_t * master
Master owning the slave.
Definition: slave.h:201
uint8_t has_dc_system_time
The slave supports the DC system time register.
Definition: slave.h:235
char ** strings
Strings in SII categories.
Definition: slave.h:173
ec_slave_state_t
State of an EtherCAT slave.
Definition: globals.h:127
void ec_slave_clear(ec_slave_t *)
Slave destructor.
Definition: slave.c:224
void ec_slave_set_dl_status(ec_slave_t *, uint16_t)
Sets the data-link state of a slave.
Definition: slave.c:356
EtherCAT datagram structure.
void ec_slave_set_al_status(ec_slave_t *, ec_slave_state_t)
Sets the application state of a slave.
Definition: slave.c:396
void ec_slave_calc_transmission_delays_rec(ec_slave_t *, uint32_t *)
Recursively calculates transmission delays.
Definition: slave.c:1090
void ec_slave_sdo_dict_info(const ec_slave_t *, unsigned int *, unsigned int *)
Counts the total number of SDOs and entries in the dictionary.
Definition: slave.c:730
uint8_t base_revision
Revision.
Definition: slave.h:228
uint8_t valid_mbox_data
Received mailbox data is valid.
Definition: slave.h:273
uint16_t effective_alias
Effective alias address.
Definition: slave.h:208
uint16_t boot_rx_mailbox_size
Bootstrap receive mailbox size.
Definition: slave.h:163
#define EC_MAX_PORTS
Maximum number of slave ports.
Definition: ecrt.h:227
uint8_t read_mbox_busy
Flag set during a mailbox read request.
Definition: slave.h:261
EtherCAT slave request state machine.
ec_slave_t * next_slave
Connected slaves.
Definition: slave.h:140
uint32_t receive_time
Port receive times for delay measurement.
Definition: slave.h:141
EtherCAT sync manager.
Slave port.
Definition: slave.h:137
char * image
Image name.
Definition: slave.h:179
ec_mbox_data_t mbox_voe_data
Received mailbox data for VoE.
Definition: slave.h:271
unsigned long jiffies_preop
Time, the slave went to PREOP.
Definition: slave.h:250
uint16_t configured_rx_mailbox_size
Configured receive mailbox size.
Definition: slave.h:220
uint8_t base_dc_supported
Distributed clocks are supported.
Definition: slave.h:233
Slave information interface data.
Definition: slave.h:155
size_t sii_nwords
Size of the SII contents in words.
Definition: slave.h:243
char * group
Group name.
Definition: slave.h:178
void ec_slave_attach_pdo_names(ec_slave_t *)
Attach PDO names.
Definition: slave.c:903
uint8_t base_sync_count
Number of supported sync managers.
Definition: slave.h:231
EtherCAT slave configuration.
Definition: slave_config.h:119
ec_device_index_t device_index
Index of device the slave responds on.
Definition: slave.h:202
uint32_t product_code
Vendor-specific product code.
Definition: slave.h:159
const ec_sdo_t * ec_slave_get_sdo_by_pos_const(const ec_slave_t *, uint16_t)
Get an SDO from the dictionary, given its position in the list.
Definition: slave.c:806
unsigned int error_flag
Stop processing after an error.
Definition: slave.h:216
ec_sync_t * syncs
SYNC MANAGER categories.
Definition: slave.h:188
uint16_t std_tx_mailbox_size
Standard transmit mailbox size.
Definition: slave.h:169
EtherCAT master.
Definition: master.h:189
ec_slave_state_t requested_state
Requested application state.
Definition: slave.h:214
int ec_slave_fetch_sii_strings(ec_slave_t *, const uint8_t *, size_t)
Fetches data from a STRING category.
Definition: slave.c:434
EtherCAT CANopen SDO structure.
char * name
Slave name.
Definition: slave.h:181
ec_mbox_data_t mbox_coe_data
Received mailbox data for CoE.
Definition: slave.h:268
ec_mbox_data_t mbox_soe_data
Received mailbox data for SoE.
Definition: slave.h:270
uint32_t vendor_id
Vendor ID.
Definition: slave.h:158
uint32_t delay_to_next_dc
Delay to next slave with DC support behind this port [ns].
Definition: slave.h:143
unsigned int force_config
Force (re-)configuration.
Definition: slave.h:217
unsigned int has_general
General category present.
Definition: slave.h:177
ec_sdo_t * ec_slave_get_sdo(ec_slave_t *, uint16_t)
Get an SDO from the dictionary.
Definition: slave.c:758
EtherCAT Process data object structure.