IgH EtherCAT Master 1.5.2
ecrt.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 userspace library.
8 *
9 * The IgH EtherCAT master userspace library is free software; you can
10 * redistribute it and/or modify it under the terms of the GNU Lesser General
11 * Public License as published by the Free Software Foundation; version 2.1
12 * of the License.
13 *
14 * The IgH EtherCAT master userspace library is distributed in the hope that
15 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
16 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with the IgH EtherCAT master userspace library. If not, see
21 * <http://www.gnu.org/licenses/>.
22 *
23 * ---
24 *
25 * The license mentioned above concerns the source code only. Using the
26 * EtherCAT technology and brand is only permitted in compliance with the
27 * industrial property and similar rights of Beckhoff Automation GmbH.
28 *
29 *****************************************************************************/
30
123/*****************************************************************************/
124
125#ifndef __ECRT_H__
126#define __ECRT_H__
127
128#ifdef __KERNEL__
129#include <asm/byteorder.h>
130#include <linux/types.h>
131#include <linux/time.h>
132#else
133#include <stdlib.h> // for size_t
134#include <stdint.h>
135#include <sys/time.h> // for struct timeval
136#endif
137
138/******************************************************************************
139 * Global definitions
140 *****************************************************************************/
141
144#define ECRT_VER_MAJOR 1
145
148#define ECRT_VER_MINOR 5
149
152#define ECRT_VERSION(a, b) (((a) << 8) + (b))
153
156#define ECRT_VERSION_MAGIC ECRT_VERSION(ECRT_VER_MAJOR, ECRT_VER_MINOR)
157
158/******************************************************************************
159 * Feature flags
160 *****************************************************************************/
161
167#define EC_HAVE_REDUNDANCY
168
173#define EC_HAVE_EMERGENCY
174
181#define EC_HAVE_REG_ACCESS
182
185#define EC_HAVE_SELECT_REF_CLOCK
186
189#define EC_HAVE_REF_CLOCK_TIME
190
193#define EC_HAVE_REG_BY_POS
194
197#define EC_HAVE_SYNC_TO
198
201#define EC_HAVE_FLAGS
202
203/*****************************************************************************/
204
209#define EC_END ~0U
210
213#define EC_MAX_SYNC_MANAGERS 16
214
219#define EC_MAX_STRING_LENGTH 64
220
222#define EC_MAX_PORTS 4
223
232#define EC_TIMEVAL2NANO(TV) \
233 (((TV).tv_sec - 946684800ULL) * 1000000000ULL + (TV).tv_usec * 1000ULL)
234
239#define EC_COE_EMERGENCY_MSG_SIZE 8
240
241/******************************************************************************
242 * Data types
243 *****************************************************************************/
244
245struct ec_master;
246typedef struct ec_master ec_master_t;
248struct ec_slave_config;
251struct ec_domain;
252typedef struct ec_domain ec_domain_t;
254struct ec_sdo_request;
257struct ec_voe_handler;
260struct ec_reg_request;
263/*****************************************************************************/
264
271typedef struct {
272 unsigned int slaves_responding;
274 unsigned int al_states : 4;
283 unsigned int link_up : 1;
286
287/*****************************************************************************/
288
295typedef struct {
296 unsigned int slaves_responding;
298 unsigned int al_states : 4;
307 unsigned int link_up : 1;
310
311/*****************************************************************************/
312
319typedef struct {
320 unsigned int online : 1;
321 unsigned int operational : 1;
323 unsigned int al_state : 4;
332
333/*****************************************************************************/
334
341typedef struct {
342 unsigned int slave_count;
343 unsigned int link_up : 1;
344 uint8_t scan_busy;
345 uint64_t app_time;
347
348/*****************************************************************************/
349
352typedef enum {
358
359/*****************************************************************************/
360
363typedef struct {
364 uint8_t link_up;
365 uint8_t loop_closed;
368
369/*****************************************************************************/
370
377typedef struct {
378 uint16_t position;
379 uint32_t vendor_id;
380 uint32_t product_code;
382 uint32_t serial_number;
383 uint16_t alias;
385 struct {
388 uint32_t receive_time;
390 uint16_t next_slave;
393 } ports[EC_MAX_PORTS];
394 uint8_t al_state;
395 uint8_t error_flag;
396 uint8_t sync_count;
397 uint16_t sdo_count;
400
401/*****************************************************************************/
402
407typedef enum {
413
414/*****************************************************************************/
415
420typedef struct {
421 unsigned int working_counter;
423 unsigned int redundancy_active;
425
426/*****************************************************************************/
427
430typedef enum {
436
437/*****************************************************************************/
438
443typedef enum {
448
449/*****************************************************************************/
450
457typedef struct {
458 uint16_t index;
459 uint8_t subindex;
460 uint8_t bit_length;
462
463/*****************************************************************************/
464
471typedef struct {
472 uint16_t index;
473 unsigned int n_entries;
481
482/*****************************************************************************/
483
490typedef struct {
491 uint8_t index;
495 unsigned int n_pdos;
500
501/*****************************************************************************/
502
508typedef struct {
509 uint16_t alias;
510 uint16_t position;
511 uint32_t vendor_id;
512 uint32_t product_code;
513 uint16_t index;
514 uint8_t subindex;
515 unsigned int *offset;
517 unsigned int *bit_position;
522
523/*****************************************************************************/
524
530typedef enum {
536
537/*****************************************************************************/
538
541typedef enum {
547
548/******************************************************************************
549 * Global functions
550 *****************************************************************************/
551
552#ifdef __cplusplus
553extern "C" {
554#endif
555
560unsigned int ecrt_version_magic(void);
561
578 unsigned int master_index
579 );
580
581#ifndef __KERNEL__
582
594ec_master_t *ecrt_open_master(
595 unsigned int master_index
596 );
597
598#endif // #ifndef __KERNEL__
599
611 ec_master_t *master
612 );
613
614/******************************************************************************
615 * Master methods
616 *****************************************************************************/
617
618#ifndef __KERNEL__
619
627int ecrt_master_reserve(
628 ec_master_t *master
629 );
630
631#endif // #ifndef __KERNEL__
632
633#ifdef __KERNEL__
634
653 ec_master_t *master,
654 void (*send_cb)(void *),
655 void (*receive_cb)(void *),
656 void *cb_data
658 );
659
660#endif /* __KERNEL__ */
661
675 ec_master_t *master
676 );
677
709 ec_master_t *master,
710 uint16_t alias,
711 uint16_t position,
712 uint32_t vendor_id,
713 uint32_t product_code
714 );
715
725 ec_master_t *master,
728 );
729
739int ecrt_master(
740 ec_master_t *master,
741 ec_master_info_t *master_info
743 );
744
756 ec_master_t *master,
757 uint16_t slave_position,
758 ec_slave_info_t *slave_info
760 );
761
762#ifndef __KERNEL__
763
772int ecrt_master_get_sync_manager(
773 ec_master_t *master,
774 uint16_t slave_position,
775 uint8_t sync_index,
777 ec_sync_info_t *sync
778 );
779
789int ecrt_master_get_pdo(
790 ec_master_t *master,
791 uint16_t slave_position,
792 uint8_t sync_index,
794 uint16_t pos,
795 ec_pdo_info_t *pdo
796 );
797
805int ecrt_master_get_pdo_entry(
806 ec_master_t *master,
807 uint16_t slave_position,
808 uint8_t sync_index,
810 uint16_t pdo_pos,
811 uint16_t entry_pos,
812 ec_pdo_entry_info_t *entry
813 );
814
815#endif /* #ifndef __KERNEL__ */
816
827 ec_master_t *master,
828 uint16_t slave_position,
829 uint16_t index,
830 uint8_t subindex,
831 uint8_t *data,
832 size_t data_size,
833 uint32_t *abort_code
834 );
835
847 ec_master_t *master,
848 uint16_t slave_position,
849 uint16_t index,
850 uint8_t *data,
851 size_t data_size,
852 uint32_t *abort_code
853 );
854
865 ec_master_t *master,
866 uint16_t slave_position,
867 uint16_t index,
868 uint8_t subindex,
869 uint8_t *target,
870 size_t target_size,
871 size_t *result_size,
872 uint32_t *abort_code
873 );
874
884 ec_master_t *master,
885 uint16_t slave_position,
886 uint8_t drive_no,
887 uint16_t idn,
888 uint8_t *data,
889 size_t data_size,
890 uint16_t *error_code
892 );
893
903 ec_master_t *master,
904 uint16_t slave_position,
905 uint8_t drive_no,
906 uint16_t idn,
907 uint8_t *target,
909 size_t target_size,
910 size_t *result_size,
911 uint16_t *error_code
913 );
914
933 ec_master_t *master
934 );
935
947 ec_master_t *master
948 );
949
961 ec_master_t *master,
962 size_t send_interval
963 );
964
974 ec_master_t *master
975 );
976
988 ec_master_t *master
989 );
990
997 ec_master_t *master
998 );
999
1008 const ec_master_t *master,
1009 ec_master_state_t *state
1010 );
1011
1019 const ec_master_t *master,
1020 unsigned int dev_idx,
1024 );
1025
1047 ec_master_t *master,
1048 uint64_t app_time
1049 );
1050
1057 ec_master_t *master
1058 );
1059
1066 ec_master_t *master,
1067 uint64_t sync_time
1068 );
1069
1075 ec_master_t *master
1076 );
1077
1095 ec_master_t *master,
1096 uint32_t *time
1097 );
1098
1106 ec_master_t *master
1107 );
1108
1118 ec_master_t *master
1119 );
1120
1129 ec_master_t *master
1130 );
1131
1132/******************************************************************************
1133 * Slave configuration methods
1134 *****************************************************************************/
1135
1147 ec_slave_config_t *sc,
1148 uint8_t sync_index,
1150 ec_direction_t direction,
1151 ec_watchdog_mode_t watchdog_mode
1152 );
1153
1160 ec_slave_config_t *sc,
1161 uint16_t watchdog_divider,
1165 uint16_t watchdog_intervals
1169 );
1170
1180 ec_slave_config_t *sc,
1181 uint8_t sync_index,
1183 uint16_t index
1184 );
1185
1198 ec_slave_config_t *sc,
1199 uint8_t sync_index
1201 );
1202
1212 ec_slave_config_t *sc,
1213 uint16_t pdo_index,
1214 uint16_t entry_index,
1216 uint8_t entry_subindex,
1218 uint8_t entry_bit_length
1219 );
1220
1232 ec_slave_config_t *sc,
1233 uint16_t pdo_index
1234 );
1235
1308 ec_slave_config_t *sc,
1309 unsigned int n_syncs,
1311 const ec_sync_info_t syncs[]
1313 );
1314
1334 ec_slave_config_t *sc,
1335 uint16_t entry_index,
1336 uint8_t entry_subindex,
1337 ec_domain_t *domain,
1338 unsigned int *bit_position
1340 );
1341
1356 ec_slave_config_t *sc,
1357 uint8_t sync_index,
1358 unsigned int pdo_pos,
1359 unsigned int entry_pos,
1360 ec_domain_t *domain,
1361 unsigned int *bit_position
1363 );
1364
1380 ec_slave_config_t *sc,
1381 uint16_t assign_activate,
1382 uint32_t sync0_cycle,
1383 int32_t sync0_shift,
1384 uint32_t sync1_cycle,
1385 int32_t sync1_shift
1386 );
1387
1414 ec_slave_config_t *sc,
1415 uint16_t index,
1416 uint8_t subindex,
1417 const uint8_t *data,
1418 size_t size
1419 );
1420
1432 ec_slave_config_t *sc,
1433 uint16_t sdo_index,
1434 uint8_t sdo_subindex,
1435 uint8_t value
1436 );
1437
1449 ec_slave_config_t *sc,
1450 uint16_t sdo_index,
1451 uint8_t sdo_subindex,
1452 uint16_t value
1453 );
1454
1466 ec_slave_config_t *sc,
1467 uint16_t sdo_index,
1468 uint8_t sdo_subindex,
1469 uint32_t value
1470 );
1471
1486 ec_slave_config_t *sc,
1487 uint16_t index,
1488 const uint8_t *data,
1489 size_t size
1490 );
1491
1503 ec_slave_config_t *sc,
1504 size_t elements
1505 );
1506
1519 ec_slave_config_t *sc,
1520 uint8_t *target
1522 );
1523
1530 );
1531
1542 );
1543
1555 ec_slave_config_t *sc,
1556 uint16_t index,
1557 uint8_t subindex,
1558 size_t size
1559 );
1560
1577 ec_slave_config_t *sc,
1578 size_t size
1579 );
1580
1596 ec_slave_config_t *sc,
1597 size_t size
1598 );
1599
1610 const ec_slave_config_t *sc,
1612 );
1613
1637 ec_slave_config_t *sc,
1638 uint8_t drive_no,
1639 uint16_t idn,
1640 ec_al_state_t state,
1642 const uint8_t *data,
1643 size_t size
1644 );
1645
1666 ec_slave_config_t *sc,
1667 const char *key,
1668 int32_t value
1669 );
1670
1671/******************************************************************************
1672 * Domain methods
1673 *****************************************************************************/
1674
1687 ec_domain_t *domain,
1688 const ec_pdo_entry_reg_t *pdo_entry_regs
1690 );
1691
1696size_t ecrt_domain_size(
1697 const ec_domain_t *domain
1698 );
1699
1700#ifdef __KERNEL__
1701
1715 ec_domain_t *domain,
1716 uint8_t *memory
1718 );
1719
1720#endif /* __KERNEL__ */
1721
1735uint8_t *ecrt_domain_data(
1736 ec_domain_t *domain
1737 );
1738
1747 ec_domain_t *domain
1748 );
1749
1756 ec_domain_t *domain
1757 );
1758
1766 const ec_domain_t *domain,
1767 ec_domain_state_t *state
1769 );
1770
1771/*****************************************************************************
1772 * SDO request methods.
1773 ****************************************************************************/
1774
1782 ec_sdo_request_t *req,
1783 uint16_t index,
1784 uint8_t subindex
1785 );
1786
1796 ec_sdo_request_t *req,
1797 uint32_t timeout
1799 );
1800
1824uint8_t *ecrt_sdo_request_data(
1825 ec_sdo_request_t *req
1826 );
1827
1837 const ec_sdo_request_t *req
1838 );
1839
1844#ifdef __KERNEL__
1846 const ec_sdo_request_t *req
1847 );
1848#else
1850 ec_sdo_request_t *req
1851 );
1852#endif
1853
1860 ec_sdo_request_t *req
1861 );
1862
1873 ec_sdo_request_t *req
1874 );
1875
1876/*****************************************************************************
1877 * VoE handler methods.
1878 ****************************************************************************/
1879
1888 ec_voe_handler_t *voe,
1889 uint32_t vendor_id,
1890 uint16_t vendor_type
1891 );
1892
1902 const ec_voe_handler_t *voe,
1903 uint32_t *vendor_id,
1904 uint16_t *vendor_type
1905 );
1906
1927uint8_t *ecrt_voe_handler_data(
1928 ec_voe_handler_t *voe
1929 );
1930
1944 const ec_voe_handler_t *voe
1945 );
1946
1954 ec_voe_handler_t *voe,
1955 size_t size
1956 );
1957
1973 ec_voe_handler_t *voe
1974 );
1975
1992 ec_voe_handler_t *voe
1993 );
1994
2003 ec_voe_handler_t *voe
2004 );
2005
2006/*****************************************************************************
2007 * Register request methods.
2008 ****************************************************************************/
2009
2029uint8_t *ecrt_reg_request_data(
2030 ec_reg_request_t *req
2031 );
2032
2037#ifdef __KERNEL__
2039 const ec_reg_request_t *req
2040 );
2041#else
2043 ec_reg_request_t *req
2044 );
2045#endif
2046
2056 ec_reg_request_t *req,
2057 uint16_t address,
2058 size_t size
2059 );
2060
2070 ec_reg_request_t *req,
2071 uint16_t address,
2072 size_t size
2073 );
2074
2075/******************************************************************************
2076 * Bitwise read/write macros
2077 *****************************************************************************/
2078
2084#define EC_READ_BIT(DATA, POS) ((*((uint8_t *) (DATA)) >> (POS)) & 0x01)
2085
2092#define EC_WRITE_BIT(DATA, POS, VAL) \
2093 do { \
2094 if (VAL) *((uint8_t *) (DATA)) |= (1 << (POS)); \
2095 else *((uint8_t *) (DATA)) &= ~(1 << (POS)); \
2096 } while (0)
2097
2098/******************************************************************************
2099 * Byte-swapping functions for user space
2100 *****************************************************************************/
2101
2102#ifndef __KERNEL__
2103
2104#if __BYTE_ORDER == __LITTLE_ENDIAN
2105
2106#define le16_to_cpu(x) x
2107#define le32_to_cpu(x) x
2108#define le64_to_cpu(x) x
2109
2110#define cpu_to_le16(x) x
2111#define cpu_to_le32(x) x
2112#define cpu_to_le64(x) x
2113
2114#elif __BYTE_ORDER == __BIG_ENDIAN
2115
2116#define swap16(x) \
2117 ((uint16_t)( \
2118 (((uint16_t)(x) & 0x00ffU) << 8) | \
2119 (((uint16_t)(x) & 0xff00U) >> 8) ))
2120#define swap32(x) \
2121 ((uint32_t)( \
2122 (((uint32_t)(x) & 0x000000ffUL) << 24) | \
2123 (((uint32_t)(x) & 0x0000ff00UL) << 8) | \
2124 (((uint32_t)(x) & 0x00ff0000UL) >> 8) | \
2125 (((uint32_t)(x) & 0xff000000UL) >> 24) ))
2126#define swap64(x) \
2127 ((uint64_t)( \
2128 (((uint64_t)(x) & 0x00000000000000ffULL) << 56) | \
2129 (((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \
2130 (((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \
2131 (((uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \
2132 (((uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \
2133 (((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \
2134 (((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \
2135 (((uint64_t)(x) & 0xff00000000000000ULL) >> 56) ))
2136
2137#define le16_to_cpu(x) swap16(x)
2138#define le32_to_cpu(x) swap32(x)
2139#define le64_to_cpu(x) swap64(x)
2140
2141#define cpu_to_le16(x) swap16(x)
2142#define cpu_to_le32(x) swap32(x)
2143#define cpu_to_le64(x) swap64(x)
2144
2145#endif
2146
2147#define le16_to_cpup(x) le16_to_cpu(*((uint16_t *)(x)))
2148#define le32_to_cpup(x) le32_to_cpu(*((uint32_t *)(x)))
2149#define le64_to_cpup(x) le64_to_cpu(*((uint64_t *)(x)))
2150
2151#endif /* ifndef __KERNEL__ */
2152
2153/******************************************************************************
2154 * Read macros
2155 *****************************************************************************/
2156
2161#define EC_READ_U8(DATA) \
2162 ((uint8_t) *((uint8_t *) (DATA)))
2163
2169#define EC_READ_S8(DATA) \
2170 ((int8_t) *((uint8_t *) (DATA)))
2171
2177#define EC_READ_U16(DATA) \
2178 ((uint16_t) le16_to_cpup((void *) (DATA)))
2179
2185#define EC_READ_S16(DATA) \
2186 ((int16_t) le16_to_cpup((void *) (DATA)))
2187
2193#define EC_READ_U32(DATA) \
2194 ((uint32_t) le32_to_cpup((void *) (DATA)))
2195
2201#define EC_READ_S32(DATA) \
2202 ((int32_t) le32_to_cpup((void *) (DATA)))
2203
2209#define EC_READ_U64(DATA) \
2210 ((uint64_t) le64_to_cpup((void *) (DATA)))
2211
2217#define EC_READ_S64(DATA) \
2218 ((int64_t) le64_to_cpup((void *) (DATA)))
2219
2220/******************************************************************************
2221 * Floating-point read functions and macros (userspace only)
2222 *****************************************************************************/
2223
2224#ifndef __KERNEL__
2225
2231float ecrt_read_real(const void *data);
2232
2238#define EC_READ_REAL(DATA) ecrt_read_real(DATA)
2239
2245double ecrt_read_lreal(const void *data);
2246
2252#define EC_READ_LREAL(DATA) ecrt_read_lreal(DATA)
2253
2254#endif // ifndef __KERNEL__
2255
2256/******************************************************************************
2257 * Write macros
2258 *****************************************************************************/
2259
2265#define EC_WRITE_U8(DATA, VAL) \
2266 do { \
2267 *((uint8_t *)(DATA)) = ((uint8_t) (VAL)); \
2268 } while (0)
2269
2275#define EC_WRITE_S8(DATA, VAL) EC_WRITE_U8(DATA, VAL)
2276
2282#define EC_WRITE_U16(DATA, VAL) \
2283 do { \
2284 *((uint16_t *) (DATA)) = cpu_to_le16((uint16_t) (VAL)); \
2285 } while (0)
2286
2292#define EC_WRITE_S16(DATA, VAL) EC_WRITE_U16(DATA, VAL)
2293
2299#define EC_WRITE_U32(DATA, VAL) \
2300 do { \
2301 *((uint32_t *) (DATA)) = cpu_to_le32((uint32_t) (VAL)); \
2302 } while (0)
2303
2309#define EC_WRITE_S32(DATA, VAL) EC_WRITE_U32(DATA, VAL)
2310
2316#define EC_WRITE_U64(DATA, VAL) \
2317 do { \
2318 *((uint64_t *) (DATA)) = cpu_to_le64((uint64_t) (VAL)); \
2319 } while (0)
2320
2326#define EC_WRITE_S64(DATA, VAL) EC_WRITE_U64(DATA, VAL)
2327
2328/******************************************************************************
2329 * Floating-point write functions and macros (userspace only)
2330 *****************************************************************************/
2331
2332#ifndef __KERNEL__
2333
2339void ecrt_write_real(void *data, float value);
2340
2346#define EC_WRITE_REAL(DATA, VAL) ecrt_write_real(DATA, VAL)
2347
2353void ecrt_write_lreal(void *data, double value);
2354
2360#define EC_WRITE_LREAL(DATA, VAL) ecrt_write_lreal(DATA, VAL)
2361
2362#endif // ifndef __KERNEL__
2363
2364/*****************************************************************************/
2365
2366#ifdef __cplusplus
2367}
2368#endif
2369
2370/*****************************************************************************/
2371
2374#endif
ec_wc_state_t
Domain working counter interpretation.
Definition: ecrt.h:407
void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle, int32_t sync0_shift, uint32_t sync1_cycle, int32_t sync1_shift)
Configure distributed clocks.
Definition: slave_config.c:937
uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
Processes the DC synchrony monitoring datagram.
Definition: master.c:2867
int ecrt_slave_config_sdo32(ec_slave_config_t *sc, uint16_t sdo_index, uint8_t sdo_subindex, uint32_t value)
Add a configuration value for a 32-bit SDO.
void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type)
Sets the VoE header for future send operations.
Definition: voe_handler.c:123
ec_slave_config_t * ecrt_master_slave_config(ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code)
Obtains a slave configuration.
Definition: master.c:2636
ec_slave_port_desc_t
EtherCAT slave port descriptor.
Definition: ecrt.h:352
ec_al_state_t
Application-layer state.
Definition: ecrt.h:541
#define EC_MAX_PORTS
Maximum number of slave ports.
Definition: ecrt.h:222
void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size)
Start a VoE write operation.
Definition: voe_handler.c:177
unsigned int ecrt_version_magic(void)
Returns the version magic of the realtime interface.
Definition: module.c:647
ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe)
Execute the handler.
Definition: voe_handler.c:187
int ecrt_master_select_reference_clock(ec_master_t *master, ec_slave_config_t *sc)
Selects the reference clock for distributed clocks.
Definition: master.c:2647
uint8_t * ecrt_sdo_request_data(ec_sdo_request_t *req)
Access to the SDO request's data.
Definition: sdo_request.c:203
int ecrt_master_sdo_download_complete(ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t *data, size_t data_size, uint32_t *abort_code)
Executes an SDO download request to write data to a slave via complete access.
Definition: master.c:2962
int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, uint16_t pdo_index, uint16_t entry_index, uint8_t entry_subindex, uint8_t entry_bit_length)
Add a PDO entry to the given PDO's mapping.
Definition: slave_config.c:688
void ecrt_reg_request_write(ec_reg_request_t *req, uint16_t address, size_t size)
Schedule an register write operation.
Definition: reg_request.c:100
void ecrt_master_sync_monitor_queue(ec_master_t *master)
Queues the DC synchrony monitoring datagram for sending.
Definition: master.c:2859
ec_reg_request_t * ecrt_slave_config_create_reg_request(ec_slave_config_t *sc, size_t size)
Create a register request to exchange EtherCAT register contents during realtime operation.
int ecrt_slave_config_complete_sdo(ec_slave_config_t *sc, uint16_t index, const uint8_t *data, size_t size)
Add configuration data for a complete SDO.
int ecrt_slave_config_reg_pdo_entry(ec_slave_config_t *sc, uint16_t entry_index, uint8_t entry_subindex, ec_domain_t *domain, unsigned int *bit_position)
Registers a PDO entry for process data exchange in a domain.
Definition: slave_config.c:817
void ecrt_master_send(ec_master_t *master)
Sends all datagrams in the queue.
Definition: master.c:2465
void ecrt_master_deactivate(ec_master_t *master)
Deactivates the master.
Definition: master.c:2395
int ecrt_slave_config_sync_manager(ec_slave_config_t *sc, uint8_t sync_index, ec_direction_t direction, ec_watchdog_mode_t watchdog_mode)
Configure a sync manager.
Definition: slave_config.c:601
ec_voe_handler_t * ecrt_slave_config_create_voe_handler(ec_slave_config_t *sc, size_t size)
Create an VoE handler to exchange vendor-specific data during realtime operation.
int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t subindex, uint8_t *data, size_t data_size, uint32_t *abort_code)
Executes an SDO download request to write data to a slave.
Definition: master.c:2878
void ecrt_domain_queue(ec_domain_t *domain)
(Re-)queues all domain datagrams in the master's datagram queue.
Definition: domain.c:648
void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
Sets the application time.
Definition: master.c:2796
ec_master_t * ecrt_request_master(unsigned int master_index)
Requests an EtherCAT master for realtime operation.
Definition: module.c:613
int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size, uint16_t *error_code)
Executes an SoE write request.
Definition: master.c:3131
void ecrt_master_send_ext(ec_master_t *master)
Sends non-application datagrams.
Definition: master.c:2561
void ecrt_release_master(ec_master_t *master)
Releases a requested EtherCAT master.
Definition: module.c:621
void ecrt_master_callbacks(ec_master_t *master, void(*send_cb)(void *), void(*receive_cb)(void *), void *cb_data)
Sets the locking callbacks.
Definition: master.c:2743
int ecrt_slave_config_emerg_pop(ec_slave_config_t *sc, uint8_t *target)
Read and remove one record from the CoE emergency ring buffer.
void ecrt_slave_config_state(const ec_slave_config_t *sc, ec_slave_config_state_t *state)
Outputs the state of the slave configuration.
ec_direction_t
Direction type for PDO assignment functions.
Definition: ecrt.h:430
void ecrt_voe_handler_read(ec_voe_handler_t *voe)
Start a VoE read operation.
Definition: voe_handler.c:159
int ecrt_slave_config_reg_pdo_entry_pos(ec_slave_config_t *sc, uint8_t sync_index, unsigned int pdo_pos, unsigned int entry_pos, ec_domain_t *domain, unsigned int *bit_position)
Registers a PDO entry using its position.
Definition: slave_config.c:872
ec_request_state_t ecrt_sdo_request_state(const ec_sdo_request_t *req)
Get the current state of the SDO request.
Definition: sdo_request.c:217
int ecrt_slave_config_pdos(ec_slave_config_t *sc, unsigned int n_syncs, const ec_sync_info_t syncs[])
Specify a complete PDO configuration.
Definition: slave_config.c:750
void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, uint16_t pdo_index)
Clear the mapping of a given PDO.
Definition: slave_config.c:725
void ecrt_sdo_request_read(ec_sdo_request_t *req)
Schedule an SDO read operation.
Definition: sdo_request.c:224
int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position, ec_slave_info_t *slave_info)
Obtains slave information.
Definition: master.c:2681
uint8_t * ecrt_voe_handler_data(ec_voe_handler_t *voe)
Access to the VoE handler's data.
Definition: voe_handler.c:145
int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t subindex, uint8_t *target, size_t target_size, size_t *result_size, uint32_t *abort_code)
Executes an SDO upload request to read data from a slave.
Definition: master.c:3048
int ecrt_slave_config_flag(ec_slave_config_t *sc, const char *key, int32_t value)
Adds a feature flag to a slave configuration.
size_t ecrt_sdo_request_data_size(const ec_sdo_request_t *req)
Returns the current SDO data size.
Definition: sdo_request.c:210
int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx, ec_master_link_state_t *state)
Reads the current state of a redundant link.
Definition: master.c:2780
int ecrt_slave_config_sdo8(ec_slave_config_t *sc, uint16_t sdo_index, uint8_t sdo_subindex, uint8_t value)
Add a configuration value for an 8-bit SDO.
Definition: slave_config.c:996
void ecrt_master_receive(ec_master_t *master)
Fetches received frames from the hardware and processes the datagrams.
Definition: master.c:2509
uint8_t * ecrt_domain_data(ec_domain_t *domain)
Returns the domain's process data.
Definition: domain.c:451
ec_domain_t * ecrt_master_create_domain(ec_master_t *master)
Creates a new process data domain.
Definition: master.c:2311
void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
Reads the current master state.
Definition: master.c:2757
ec_watchdog_mode_t
Watchdog mode for sync manager configuration.
Definition: ecrt.h:443
int ecrt_domain_reg_pdo_entry_list(ec_domain_t *domain, const ec_pdo_entry_reg_t *pdo_entry_regs)
Registers a bunch of PDO entries for a domain.
Definition: domain.c:398
int ecrt_slave_config_idn(ec_slave_config_t *sc, uint8_t drive_no, uint16_t idn, ec_al_state_t state, const uint8_t *data, size_t size)
Add an SoE IDN configuration.
int ecrt_master_activate(ec_master_t *master)
Finishes the configuration phase and prepares for cyclic operation.
Definition: master.c:2321
void ecrt_master_sync_reference_clock_to(ec_master_t *master, uint64_t sync_time)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:2836
void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state)
Reads the state of a domain.
Definition: domain.c:678
size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe)
Returns the current data size.
Definition: voe_handler.c:152
int ecrt_slave_config_sdo16(ec_slave_config_t *sc, uint16_t sdo_index, uint8_t sdo_subindex, uint16_t value)
Add a configuration value for a 16-bit SDO.
void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type)
Reads the header data of a received VoE message.
Definition: voe_handler.c:132
void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *memory)
Provide external memory to store the domain's process data.
Definition: domain.c:434
void ecrt_master_reset(ec_master_t *master)
Retry configuring slaves.
Definition: master.c:3291
void ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t watchdog_divider, uint16_t watchdog_intervals)
Configure a slave's watchdog times.
Definition: slave_config.c:628
void ecrt_master_sync_reference_clock(ec_master_t *master)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:2826
ec_request_state_t ecrt_reg_request_state(const ec_reg_request_t *req)
Get the current state of the register request.
Definition: reg_request.c:93
int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size, size_t *result_size, uint16_t *error_code)
Executes an SoE read request.
Definition: master.c:3207
void ecrt_domain_process(ec_domain_t *domain)
Determines the states of the domain's datagrams.
Definition: domain.c:458
int ecrt_slave_config_sdo(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, const uint8_t *data, size_t size)
Add an SDO configuration.
Definition: slave_config.c:956
void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe)
Start a VoE read operation without querying the sync manager status.
Definition: voe_handler.c:168
#define EC_MAX_STRING_LENGTH
Maximum string length.
Definition: ecrt.h:219
int ecrt_slave_config_emerg_overruns(ec_slave_config_t *sc)
Read the number of CoE emergency overruns.
int ecrt_slave_config_emerg_clear(ec_slave_config_t *sc)
Clears CoE emergency ring buffer and the overrun counter.
void ecrt_reg_request_read(ec_reg_request_t *req, uint16_t address, size_t size)
Schedule a register read operation.
Definition: reg_request.c:111
void ecrt_master_sync_slave_clocks(ec_master_t *master)
Queues the DC clock drift compensation datagram for sending.
Definition: master.c:2849
size_t ecrt_domain_size(const ec_domain_t *domain)
Returns the current size of the domain's process data.
Definition: domain.c:427
void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex)
Set the SDO index and subindex.
Definition: sdo_request.c:187
int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements)
Set the size of the CoE emergency ring buffer.
int ecrt_master_set_send_interval(ec_master_t *master, size_t send_interval)
Set interval between calls to ecrt_master_send().
ec_sdo_request_t * ecrt_slave_config_create_sdo_request(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, size_t size)
Create an SDO request to exchange SDOs during realtime operation.
void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout)
Set the timeout for an SDO request.
Definition: sdo_request.c:196
ec_request_state_t
Request state.
Definition: ecrt.h:530
int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc, uint8_t sync_index, uint16_t index)
Add a PDO to a sync manager's PDO assignment.
Definition: slave_config.c:640
int ecrt_master_reference_clock_time(ec_master_t *master, uint32_t *time)
Get the lower 32 bit of the reference clock system time.
Definition: master.c:2807
int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
Obtains master information.
Definition: master.c:2667
void ecrt_sdo_request_write(ec_sdo_request_t *req)
Schedule an SDO write operation.
Definition: sdo_request.c:235
uint8_t * ecrt_reg_request_data(ec_reg_request_t *req)
Access to the register request's data.
Definition: reg_request.c:86
void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index)
Clear a sync manager's PDO assignment.
Definition: slave_config.c:670
@ EC_WC_COMPLETE
All registered process data were exchanged.
Definition: ecrt.h:411
@ EC_WC_ZERO
No registered process data were exchanged.
Definition: ecrt.h:408
@ EC_WC_INCOMPLETE
Some of the registered process data were exchanged.
Definition: ecrt.h:409
@ EC_PORT_MII
Port is a MII.
Definition: ecrt.h:356
@ EC_PORT_NOT_CONFIGURED
Port is not configured.
Definition: ecrt.h:354
@ EC_PORT_NOT_IMPLEMENTED
Port is not implemented.
Definition: ecrt.h:353
@ EC_PORT_EBUS
Port is an E-Bus.
Definition: ecrt.h:355
@ EC_AL_STATE_INIT
Init.
Definition: ecrt.h:542
@ EC_AL_STATE_OP
Operational.
Definition: ecrt.h:545
@ EC_AL_STATE_PREOP
Pre-operational.
Definition: ecrt.h:543
@ EC_AL_STATE_SAFEOP
Safe-operational.
Definition: ecrt.h:544
@ EC_DIR_INVALID
Invalid direction.
Definition: ecrt.h:431
@ EC_DIR_COUNT
Number of directions.
Definition: ecrt.h:434
@ EC_DIR_INPUT
Values read by the master.
Definition: ecrt.h:433
@ EC_DIR_OUTPUT
Values written by the master.
Definition: ecrt.h:432
@ EC_WD_DEFAULT
Use the default setting of the sync manager.
Definition: ecrt.h:444
@ EC_WD_DISABLE
Disable the watchdog.
Definition: ecrt.h:446
@ EC_WD_ENABLE
Enable the watchdog.
Definition: ecrt.h:445
@ EC_REQUEST_ERROR
Request processing failed.
Definition: ecrt.h:534
@ EC_REQUEST_UNUSED
Not requested.
Definition: ecrt.h:531
@ EC_REQUEST_SUCCESS
Request was processed successfully.
Definition: ecrt.h:533
@ EC_REQUEST_BUSY
Request is being processed.
Definition: ecrt.h:532
Domain state.
Definition: ecrt.h:420
ec_wc_state_t wc_state
Working counter interpretation.
Definition: ecrt.h:422
unsigned int working_counter
Value of the last working counter.
Definition: ecrt.h:421
unsigned int redundancy_active
Redundant link is in use.
Definition: ecrt.h:423
EtherCAT domain.
Definition: domain.h:55
Master information.
Definition: ecrt.h:341
unsigned int slave_count
Number of slaves in the bus.
Definition: ecrt.h:342
uint64_t app_time
Application time.
Definition: ecrt.h:345
uint8_t scan_busy
true, while the master is scanning the bus
Definition: ecrt.h:344
unsigned int link_up
true, if the network link is up.
Definition: ecrt.h:343
Master state.
Definition: ecrt.h:271
unsigned int al_states
Application-layer states of all slaves.
Definition: ecrt.h:274
unsigned int slaves_responding
Sum of responding slaves on all Ethernet devices.
Definition: ecrt.h:272
unsigned int link_up
true, if at least one Ethernet link is up.
Definition: ecrt.h:283
EtherCAT master.
Definition: master.h:194
PDO entry configuration information.
Definition: ecrt.h:457
uint8_t subindex
PDO entry subindex.
Definition: ecrt.h:459
uint8_t bit_length
Size of the PDO entry in bit.
Definition: ecrt.h:460
uint16_t index
PDO entry index.
Definition: ecrt.h:458
List record type for PDO entry mass-registration.
Definition: ecrt.h:508
uint32_t product_code
Slave product code.
Definition: ecrt.h:512
unsigned int * offset
Pointer to a variable to store the PDO entry's (byte-)offset in the process data.
Definition: ecrt.h:515
unsigned int * bit_position
Pointer to a variable to store a bit position (0-7) within the offset.
Definition: ecrt.h:517
uint8_t subindex
PDO entry subindex.
Definition: ecrt.h:514
uint16_t index
PDO entry index.
Definition: ecrt.h:513
uint16_t alias
Slave alias address.
Definition: ecrt.h:509
uint32_t vendor_id
Slave vendor ID.
Definition: ecrt.h:511
uint16_t position
Slave position.
Definition: ecrt.h:510
PDO configuration information.
Definition: ecrt.h:471
ec_pdo_entry_info_t * entries
Array of PDO entries to map.
Definition: ecrt.h:477
unsigned int n_entries
Number of PDO entries in entries to map.
Definition: ecrt.h:473
uint16_t index
PDO index.
Definition: ecrt.h:472
Register request.
Definition: reg_request.h:48
CANopen SDO request.
Definition: sdo_request.h:48
Slave configuration state.
Definition: ecrt.h:319
unsigned int online
The slave is online.
Definition: ecrt.h:320
unsigned int operational
The slave was brought into OP state using the specified configuration.
Definition: ecrt.h:321
unsigned int al_state
The application-layer state of the slave.
Definition: ecrt.h:323
EtherCAT slave configuration.
Definition: slave_config.h:119
Slave information.
Definition: ecrt.h:377
uint32_t delay_to_next_dc
Delay [ns] to next DC slave.
Definition: ecrt.h:392
uint32_t revision_number
Revision-Number stored on the slave.
Definition: ecrt.h:381
uint8_t error_flag
Error flag for that slave.
Definition: ecrt.h:395
int16_t current_on_ebus
Used current in mA.
Definition: ecrt.h:384
uint16_t position
Offset of the slave in the ring.
Definition: ecrt.h:378
uint16_t next_slave
Ring position of next DC slave on that port.
Definition: ecrt.h:390
uint8_t al_state
Current state of the slave.
Definition: ecrt.h:394
uint32_t product_code
Product-Code stored on the slave.
Definition: ecrt.h:380
ec_slave_port_link_t link
Port link state.
Definition: ecrt.h:387
uint32_t vendor_id
Vendor-ID stored on the slave.
Definition: ecrt.h:379
uint16_t alias
The slaves alias if not equal to 0.
Definition: ecrt.h:383
uint32_t serial_number
Serial-Number stored on the slave.
Definition: ecrt.h:382
ec_slave_port_desc_t desc
Physical port type.
Definition: ecrt.h:386
uint16_t sdo_count
Number of SDOs.
Definition: ecrt.h:397
uint8_t sync_count
Number of sync managers.
Definition: ecrt.h:396
uint32_t receive_time
Receive time on DC transmission delay measurement.
Definition: ecrt.h:388
Sync manager configuration information.
Definition: ecrt.h:490
ec_pdo_info_t * pdos
Array with PDOs to assign.
Definition: ecrt.h:496
unsigned int n_pdos
Number of PDOs in pdos.
Definition: ecrt.h:495
ec_direction_t dir
Sync manager direction.
Definition: ecrt.h:494
uint8_t index
Sync manager index.
Definition: ecrt.h:491
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
Definition: ecrt.h:498
Vendor specific over EtherCAT handler.
Definition: voe_handler.h:49