IgH EtherCAT Master  1.6.0-rc1
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 6
149 
152 #define ECRT_VER_PATCH 0
153 
156 #define ECRT_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
157 
160 #define ECRT_VERSION_MAGIC \
161  ECRT_VERSION(ECRT_VER_MAJOR, ECRT_VER_MINOR, ECRT_VER_PATCH)
162 
163 /******************************************************************************
164  * Feature flags
165  *****************************************************************************/
166 
172 #define EC_HAVE_REDUNDANCY
173 
178 #define EC_HAVE_EMERGENCY
179 
186 #define EC_HAVE_REG_ACCESS
187 
190 #define EC_HAVE_SELECT_REF_CLOCK
191 
194 #define EC_HAVE_REF_CLOCK_TIME
195 
198 #define EC_HAVE_REG_BY_POS
199 
202 #define EC_HAVE_SYNC_TO
203 
206 #define EC_HAVE_FLAGS
207 
208 /*****************************************************************************/
209 
214 #define EC_END ~0U
215 
218 #define EC_MAX_SYNC_MANAGERS 16
219 
224 #define EC_MAX_STRING_LENGTH 64
225 
227 #define EC_MAX_PORTS 4
228 
237 #define EC_TIMEVAL2NANO(TV) \
238  (((TV).tv_sec - 946684800ULL) * 1000000000ULL + (TV).tv_usec * 1000ULL)
239 
244 #define EC_COE_EMERGENCY_MSG_SIZE 8
245 
246 /******************************************************************************
247  * Data types
248  *****************************************************************************/
249 
250 struct ec_master;
251 typedef struct ec_master ec_master_t;
253 struct ec_slave_config;
256 struct ec_domain;
257 typedef struct ec_domain ec_domain_t;
259 struct ec_sdo_request;
262 struct ec_voe_handler;
265 struct ec_reg_request;
268 /*****************************************************************************/
269 
276 typedef struct {
277  unsigned int slaves_responding;
279  unsigned int al_states : 4;
288  unsigned int link_up : 1;
291 
292 /*****************************************************************************/
293 
300 typedef struct {
301  unsigned int slaves_responding;
303  unsigned int al_states : 4;
312  unsigned int link_up : 1;
315 
316 /*****************************************************************************/
317 
324 typedef struct {
325  unsigned int online : 1;
326  unsigned int operational : 1;
328  unsigned int al_state : 4;
337 
338 /*****************************************************************************/
339 
346 typedef struct {
347  unsigned int slave_count;
348  unsigned int link_up : 1;
349  uint8_t scan_busy;
350  uint64_t app_time;
352 
353 /*****************************************************************************/
354 
357 typedef enum {
363 
364 /*****************************************************************************/
365 
368 typedef struct {
369  uint8_t link_up;
370  uint8_t loop_closed;
371  uint8_t signal_detected;
373 
374 /*****************************************************************************/
375 
382 typedef struct {
383  uint16_t position;
384  uint32_t vendor_id;
385  uint32_t product_code;
386  uint32_t revision_number;
387  uint32_t serial_number;
388  uint16_t alias;
389  int16_t current_on_ebus;
390  struct {
393  uint32_t receive_time;
395  uint16_t next_slave;
397  uint32_t delay_to_next_dc;
398  } ports[EC_MAX_PORTS];
399  uint8_t al_state;
400  uint8_t error_flag;
401  uint8_t sync_count;
402  uint16_t sdo_count;
403  char name[EC_MAX_STRING_LENGTH];
405 
406 /*****************************************************************************/
407 
412 typedef enum {
417 } ec_wc_state_t;
418 
419 /*****************************************************************************/
420 
425 typedef struct {
426  unsigned int working_counter;
428  unsigned int redundancy_active;
430 
431 /*****************************************************************************/
432 
435 typedef enum {
441 
442 /*****************************************************************************/
443 
448 typedef enum {
453 
454 /*****************************************************************************/
455 
462 typedef struct {
463  uint16_t index;
464  uint8_t subindex;
465  uint8_t bit_length;
467 
468 /*****************************************************************************/
469 
476 typedef struct {
477  uint16_t index;
478  unsigned int n_entries;
485 } ec_pdo_info_t;
486 
487 /*****************************************************************************/
488 
495 typedef struct {
496  uint8_t index;
500  unsigned int n_pdos;
505 
506 /*****************************************************************************/
507 
513 typedef struct {
514  uint16_t alias;
515  uint16_t position;
516  uint32_t vendor_id;
517  uint32_t product_code;
518  uint16_t index;
519  uint8_t subindex;
520  unsigned int *offset;
522  unsigned int *bit_position;
527 
528 /*****************************************************************************/
529 
535 typedef enum {
541 
542 /*****************************************************************************/
543 
546 typedef enum {
551 } ec_al_state_t;
552 
553 /******************************************************************************
554  * Global functions
555  *****************************************************************************/
556 
557 #ifdef __cplusplus
558 extern "C" {
559 #endif
560 
565 unsigned int ecrt_version_magic(void);
566 
583  unsigned int master_index
584  );
585 
586 #ifndef __KERNEL__
587 
599 ec_master_t *ecrt_open_master(
600  unsigned int master_index
601  );
602 
603 #endif // #ifndef __KERNEL__
604 
616  ec_master_t *master
617  );
618 
619 /******************************************************************************
620  * Master methods
621  *****************************************************************************/
622 
623 #ifndef __KERNEL__
624 
632 int ecrt_master_reserve(
633  ec_master_t *master
634  );
635 
636 #endif // #ifndef __KERNEL__
637 
638 #ifdef __KERNEL__
639 
658  ec_master_t *master,
659  void (*send_cb)(void *),
660  void (*receive_cb)(void *),
661  void *cb_data
663  );
664 
665 #endif /* __KERNEL__ */
666 
680  ec_master_t *master
681  );
682 
694  ec_master_t *master
695  );
696 
728  ec_master_t *master,
729  uint16_t alias,
730  uint16_t position,
731  uint32_t vendor_id,
732  uint32_t product_code
733  );
734 
744  ec_master_t *master,
745  ec_slave_config_t *sc
747  );
748 
758 int ecrt_master(
759  ec_master_t *master,
760  ec_master_info_t *master_info
762  );
763 
775  ec_master_t *master,
776  uint16_t slave_position,
777  ec_slave_info_t *slave_info
779  );
780 
781 #ifndef __KERNEL__
782 
791 int ecrt_master_get_sync_manager(
792  ec_master_t *master,
793  uint16_t slave_position,
794  uint8_t sync_index,
796  ec_sync_info_t *sync
797  );
798 
808 int ecrt_master_get_pdo(
809  ec_master_t *master,
810  uint16_t slave_position,
811  uint8_t sync_index,
813  uint16_t pos,
814  ec_pdo_info_t *pdo
815  );
816 
824 int ecrt_master_get_pdo_entry(
825  ec_master_t *master,
826  uint16_t slave_position,
827  uint8_t sync_index,
829  uint16_t pdo_pos,
830  uint16_t entry_pos,
831  ec_pdo_entry_info_t *entry
832  );
833 
834 #endif /* #ifndef __KERNEL__ */
835 
846  ec_master_t *master,
847  uint16_t slave_position,
848  uint16_t index,
849  uint8_t subindex,
850  const uint8_t *data,
851  size_t data_size,
852  uint32_t *abort_code
853  );
854 
866  ec_master_t *master,
867  uint16_t slave_position,
868  uint16_t index,
869  const uint8_t *data,
870  size_t data_size,
871  uint32_t *abort_code
872  );
873 
884  ec_master_t *master,
885  uint16_t slave_position,
886  uint16_t index,
887  uint8_t subindex,
888  uint8_t *target,
889  size_t target_size,
890  size_t *result_size,
891  uint32_t *abort_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 *data,
908  size_t data_size,
909  uint16_t *error_code
911  );
912 
922  ec_master_t *master,
923  uint16_t slave_position,
924  uint8_t drive_no,
925  uint16_t idn,
926  uint8_t *target,
928  size_t target_size,
929  size_t *result_size,
930  uint16_t *error_code
932  );
933 
952  ec_master_t *master
953  );
954 
965  ec_master_t *master
966  );
967 
979  ec_master_t *master
980  );
981 
993  ec_master_t *master,
994  size_t send_interval
995  );
996 
1007 size_t ecrt_master_send(
1008  ec_master_t *master
1009  );
1010 
1021 void ecrt_master_receive(
1022  ec_master_t *master
1023  );
1024 
1031  ec_master_t *master
1032  );
1033 
1041 void ecrt_master_state(
1042  const ec_master_t *master,
1044  );
1045 
1053  const ec_master_t *master,
1054  unsigned int dev_idx,
1056  ec_master_link_state_t *state
1058  );
1059 
1081  ec_master_t *master,
1082  uint64_t app_time
1083  );
1084 
1091  ec_master_t *master
1092  );
1093 
1100  ec_master_t *master,
1101  uint64_t sync_time
1102  );
1103 
1109  ec_master_t *master
1110  );
1111 
1129  ec_master_t *master,
1130  uint32_t *time
1131  );
1132 
1141  ec_master_t *master
1142  );
1143 
1157  ec_master_t *master,
1158  uint64_t *time
1159  );
1160 
1168  ec_master_t *master
1169  );
1170 
1180  ec_master_t *master
1181  );
1182 
1190 void ecrt_master_reset(
1191  ec_master_t *master
1192  );
1193 
1194 /******************************************************************************
1195  * Slave configuration methods
1196  *****************************************************************************/
1197 
1209  ec_slave_config_t *sc,
1210  uint8_t sync_index,
1212  ec_direction_t direction,
1213  ec_watchdog_mode_t watchdog_mode
1214  );
1215 
1222  ec_slave_config_t *sc,
1223  uint16_t watchdog_divider,
1227  uint16_t watchdog_intervals
1231  );
1232 
1239  ec_slave_config_t *sc,
1240  uint8_t allow_overlapping_pdos
1241  );
1242 
1243 
1253  ec_slave_config_t *sc,
1254  uint8_t sync_index,
1256  uint16_t index
1257  );
1258 
1271  ec_slave_config_t *sc,
1272  uint8_t sync_index
1274  );
1275 
1285  ec_slave_config_t *sc,
1286  uint16_t pdo_index,
1287  uint16_t entry_index,
1289  uint8_t entry_subindex,
1291  uint8_t entry_bit_length
1292  );
1293 
1305  ec_slave_config_t *sc,
1306  uint16_t pdo_index
1307  );
1308 
1381  ec_slave_config_t *sc,
1382  unsigned int n_syncs,
1384  const ec_sync_info_t syncs[]
1386  );
1387 
1407  ec_slave_config_t *sc,
1408  uint16_t entry_index,
1409  uint8_t entry_subindex,
1410  ec_domain_t *domain,
1411  unsigned int *bit_position
1413  );
1414 
1429  ec_slave_config_t *sc,
1430  uint8_t sync_index,
1431  unsigned int pdo_pos,
1432  unsigned int entry_pos,
1433  ec_domain_t *domain,
1434  unsigned int *bit_position
1436  );
1437 
1453  ec_slave_config_t *sc,
1454  uint16_t assign_activate,
1455  uint32_t sync0_cycle,
1456  int32_t sync0_shift,
1457  uint32_t sync1_cycle,
1458  int32_t sync1_shift
1459  );
1460 
1487  ec_slave_config_t *sc,
1488  uint16_t index,
1489  uint8_t subindex,
1490  const uint8_t *data,
1491  size_t size
1492  );
1493 
1505  ec_slave_config_t *sc,
1506  uint16_t sdo_index,
1507  uint8_t sdo_subindex,
1508  uint8_t value
1509  );
1510 
1522  ec_slave_config_t *sc,
1523  uint16_t sdo_index,
1524  uint8_t sdo_subindex,
1525  uint16_t value
1526  );
1527 
1539  ec_slave_config_t *sc,
1540  uint16_t sdo_index,
1541  uint8_t sdo_subindex,
1542  uint32_t value
1543  );
1544 
1559  ec_slave_config_t *sc,
1560  uint16_t index,
1561  const uint8_t *data,
1562  size_t size
1563  );
1564 
1576  ec_slave_config_t *sc,
1577  size_t elements
1578  );
1579 
1592  ec_slave_config_t *sc,
1593  uint8_t *target
1595  );
1596 
1602  ec_slave_config_t *sc
1603  );
1604 
1614  ec_slave_config_t *sc
1615  );
1616 
1628  ec_slave_config_t *sc,
1629  uint16_t index,
1630  uint8_t subindex,
1631  size_t size
1632  );
1633 
1650  ec_slave_config_t *sc,
1651  size_t size
1652  );
1653 
1669  ec_slave_config_t *sc,
1670  size_t size
1671  );
1672 
1683  const ec_slave_config_t *sc,
1684  ec_slave_config_state_t *state
1685  );
1686 
1710  ec_slave_config_t *sc,
1711  uint8_t drive_no,
1712  uint16_t idn,
1713  ec_al_state_t state,
1715  const uint8_t *data,
1716  size_t size
1717  );
1718 
1739  ec_slave_config_t *sc,
1740  const char *key,
1741  int32_t value
1742  );
1743 
1744 /******************************************************************************
1745  * Domain methods
1746  *****************************************************************************/
1747 
1760  ec_domain_t *domain,
1761  const ec_pdo_entry_reg_t *pdo_entry_regs
1763  );
1764 
1769 size_t ecrt_domain_size(
1770  const ec_domain_t *domain
1771  );
1772 
1773 #ifdef __KERNEL__
1774 
1788  ec_domain_t *domain,
1789  uint8_t *memory
1791  );
1792 
1793 #endif /* __KERNEL__ */
1794 
1808 uint8_t *ecrt_domain_data(
1809  ec_domain_t *domain
1810  );
1811 
1819 void ecrt_domain_process(
1820  ec_domain_t *domain
1821  );
1822 
1828 void ecrt_domain_queue(
1829  ec_domain_t *domain
1830  );
1831 
1838 void ecrt_domain_state(
1839  const ec_domain_t *domain,
1840  ec_domain_state_t *state
1842  );
1843 
1844 /*****************************************************************************
1845  * SDO request methods.
1846  ****************************************************************************/
1847 
1855  ec_sdo_request_t *req,
1856  uint16_t index,
1857  uint8_t subindex
1858  );
1859 
1869  ec_sdo_request_t *req,
1870  uint32_t timeout
1872  );
1873 
1897 uint8_t *ecrt_sdo_request_data(
1898  ec_sdo_request_t *req
1899  );
1900 
1910  const ec_sdo_request_t *req
1911  );
1912 
1917 #ifdef __KERNEL__
1919  const ec_sdo_request_t *req
1920  );
1921 #else
1923  ec_sdo_request_t *req
1924  );
1925 #endif
1926 
1933  ec_sdo_request_t *req
1934  );
1935 
1946  ec_sdo_request_t *req
1947  );
1948 
1949 /*****************************************************************************
1950  * VoE handler methods.
1951  ****************************************************************************/
1952 
1961  ec_voe_handler_t *voe,
1962  uint32_t vendor_id,
1963  uint16_t vendor_type
1964  );
1965 
1975  const ec_voe_handler_t *voe,
1976  uint32_t *vendor_id,
1977  uint16_t *vendor_type
1978  );
1979 
2000 uint8_t *ecrt_voe_handler_data(
2001  ec_voe_handler_t *voe
2002  );
2003 
2017  const ec_voe_handler_t *voe
2018  );
2019 
2027  ec_voe_handler_t *voe,
2028  size_t size
2029  );
2030 
2046  ec_voe_handler_t *voe
2047  );
2048 
2065  ec_voe_handler_t *voe
2066  );
2067 
2076  ec_voe_handler_t *voe
2077  );
2078 
2079 /*****************************************************************************
2080  * Register request methods.
2081  ****************************************************************************/
2082 
2102 uint8_t *ecrt_reg_request_data(
2103  ec_reg_request_t *req
2104  );
2105 
2110 #ifdef __KERNEL__
2112  const ec_reg_request_t *req
2113  );
2114 #else
2116  ec_reg_request_t *req
2117  );
2118 #endif
2119 
2129  ec_reg_request_t *req,
2130  uint16_t address,
2131  size_t size
2132  );
2133 
2143  ec_reg_request_t *req,
2144  uint16_t address,
2145  size_t size
2146  );
2147 
2148 /******************************************************************************
2149  * Bitwise read/write macros
2150  *****************************************************************************/
2151 
2157 #define EC_READ_BIT(DATA, POS) ((*((uint8_t *) (DATA)) >> (POS)) & 0x01)
2158 
2165 #define EC_WRITE_BIT(DATA, POS, VAL) \
2166  do { \
2167  if (VAL) *((uint8_t *) (DATA)) |= (1 << (POS)); \
2168  else *((uint8_t *) (DATA)) &= ~(1 << (POS)); \
2169  } while (0)
2170 
2171 /******************************************************************************
2172  * Byte-swapping functions for user space
2173  *****************************************************************************/
2174 
2175 #ifndef __KERNEL__
2176 
2177 #if __BYTE_ORDER == __LITTLE_ENDIAN
2178 
2179 #define le16_to_cpu(x) x
2180 #define le32_to_cpu(x) x
2181 #define le64_to_cpu(x) x
2182 
2183 #define cpu_to_le16(x) x
2184 #define cpu_to_le32(x) x
2185 #define cpu_to_le64(x) x
2186 
2187 #elif __BYTE_ORDER == __BIG_ENDIAN
2188 
2189 #define swap16(x) \
2190  ((uint16_t)( \
2191  (((uint16_t)(x) & 0x00ffU) << 8) | \
2192  (((uint16_t)(x) & 0xff00U) >> 8) ))
2193 #define swap32(x) \
2194  ((uint32_t)( \
2195  (((uint32_t)(x) & 0x000000ffUL) << 24) | \
2196  (((uint32_t)(x) & 0x0000ff00UL) << 8) | \
2197  (((uint32_t)(x) & 0x00ff0000UL) >> 8) | \
2198  (((uint32_t)(x) & 0xff000000UL) >> 24) ))
2199 #define swap64(x) \
2200  ((uint64_t)( \
2201  (((uint64_t)(x) & 0x00000000000000ffULL) << 56) | \
2202  (((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \
2203  (((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \
2204  (((uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \
2205  (((uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \
2206  (((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \
2207  (((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \
2208  (((uint64_t)(x) & 0xff00000000000000ULL) >> 56) ))
2209 
2210 #define le16_to_cpu(x) swap16(x)
2211 #define le32_to_cpu(x) swap32(x)
2212 #define le64_to_cpu(x) swap64(x)
2213 
2214 #define cpu_to_le16(x) swap16(x)
2215 #define cpu_to_le32(x) swap32(x)
2216 #define cpu_to_le64(x) swap64(x)
2217 
2218 #endif
2219 
2220 #define le16_to_cpup(x) le16_to_cpu(*((uint16_t *)(x)))
2221 #define le32_to_cpup(x) le32_to_cpu(*((uint32_t *)(x)))
2222 #define le64_to_cpup(x) le64_to_cpu(*((uint64_t *)(x)))
2223 
2224 #endif /* ifndef __KERNEL__ */
2225 
2226 /******************************************************************************
2227  * Read macros
2228  *****************************************************************************/
2229 
2234 #define EC_READ_U8(DATA) \
2235  ((uint8_t) *((uint8_t *) (DATA)))
2236 
2242 #define EC_READ_S8(DATA) \
2243  ((int8_t) *((uint8_t *) (DATA)))
2244 
2250 #define EC_READ_U16(DATA) \
2251  ((uint16_t) le16_to_cpup((void *) (DATA)))
2252 
2258 #define EC_READ_S16(DATA) \
2259  ((int16_t) le16_to_cpup((void *) (DATA)))
2260 
2266 #define EC_READ_U32(DATA) \
2267  ((uint32_t) le32_to_cpup((void *) (DATA)))
2268 
2274 #define EC_READ_S32(DATA) \
2275  ((int32_t) le32_to_cpup((void *) (DATA)))
2276 
2282 #define EC_READ_U64(DATA) \
2283  ((uint64_t) le64_to_cpup((void *) (DATA)))
2284 
2290 #define EC_READ_S64(DATA) \
2291  ((int64_t) le64_to_cpup((void *) (DATA)))
2292 
2293 /******************************************************************************
2294  * Floating-point read functions and macros (userspace only)
2295  *****************************************************************************/
2296 
2297 #ifndef __KERNEL__
2298 
2304 float ecrt_read_real(const void *data);
2305 
2311 #define EC_READ_REAL(DATA) ecrt_read_real(DATA)
2312 
2318 double ecrt_read_lreal(const void *data);
2319 
2325 #define EC_READ_LREAL(DATA) ecrt_read_lreal(DATA)
2326 
2327 #endif // ifndef __KERNEL__
2328 
2329 /******************************************************************************
2330  * Write macros
2331  *****************************************************************************/
2332 
2338 #define EC_WRITE_U8(DATA, VAL) \
2339  do { \
2340  *((uint8_t *)(DATA)) = ((uint8_t) (VAL)); \
2341  } while (0)
2342 
2348 #define EC_WRITE_S8(DATA, VAL) EC_WRITE_U8(DATA, VAL)
2349 
2355 #define EC_WRITE_U16(DATA, VAL) \
2356  do { \
2357  *((uint16_t *) (DATA)) = cpu_to_le16((uint16_t) (VAL)); \
2358  } while (0)
2359 
2365 #define EC_WRITE_S16(DATA, VAL) EC_WRITE_U16(DATA, VAL)
2366 
2372 #define EC_WRITE_U32(DATA, VAL) \
2373  do { \
2374  *((uint32_t *) (DATA)) = cpu_to_le32((uint32_t) (VAL)); \
2375  } while (0)
2376 
2382 #define EC_WRITE_S32(DATA, VAL) EC_WRITE_U32(DATA, VAL)
2383 
2389 #define EC_WRITE_U64(DATA, VAL) \
2390  do { \
2391  *((uint64_t *) (DATA)) = cpu_to_le64((uint64_t) (VAL)); \
2392  } while (0)
2393 
2399 #define EC_WRITE_S64(DATA, VAL) EC_WRITE_U64(DATA, VAL)
2400 
2401 /******************************************************************************
2402  * Floating-point write functions and macros (userspace only)
2403  *****************************************************************************/
2404 
2405 #ifndef __KERNEL__
2406 
2412 void ecrt_write_real(void *data, float value);
2413 
2419 #define EC_WRITE_REAL(DATA, VAL) ecrt_write_real(DATA, VAL)
2420 
2426 void ecrt_write_lreal(void *data, double value);
2427 
2433 #define EC_WRITE_LREAL(DATA, VAL) ecrt_write_lreal(DATA, VAL)
2434 
2435 #endif // ifndef __KERNEL__
2436 
2437 /*****************************************************************************/
2438 
2439 #ifdef __cplusplus
2440 }
2441 #endif
2442 
2443 /*****************************************************************************/
2444 
2447 #endif
unsigned int working_counter
Value of the last working counter.
Definition: ecrt.h:426
size_t ecrt_domain_size(const ec_domain_t *domain)
Returns the current size of the domain&#39;s process data.
Definition: domain.c:512
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
uint32_t serial_number
Serial-Number stored on the slave.
Definition: ecrt.h:387
ec_internal_request_state_t state
Request state.
Definition: reg_request.h:56
ec_slave_port_desc_t desc
Physical port type.
Definition: ecrt.h:391
uint8_t subindex
PDO entry subindex.
Definition: ecrt.h:519
Pre-operational.
Definition: ecrt.h:548
uint16_t position
Slave position.
Definition: ecrt.h:515
int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements)
Set the size of the CoE emergency ring buffer.
uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
Processes the DC synchrony monitoring datagram.
Definition: master.c:3198
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:133
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
size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe)
Returns the current data size.
Definition: voe_handler.c:153
void ecrt_release_master(ec_master_t *master)
Releases a requested EtherCAT master.
Definition: module.c:622
uint8_t sync_count
Number of sync managers.
Definition: ecrt.h:401
unsigned int n_entries
Number of PDO entries in entries to map.
Definition: ecrt.h:478
uint8_t bit_length
Size of the PDO entry in bit.
Definition: ecrt.h:465
ec_direction_t dir
Sync manager direction.
Definition: ecrt.h:499
uint8_t error_flag
Error flag for that slave.
Definition: ecrt.h:400
ec_watchdog_mode_t
Watchdog mode for sync manager configuration.
Definition: ecrt.h:448
void ecrt_master_sync_slave_clocks(ec_master_t *master)
Queues the DC clock drift compensation datagram for sending.
Definition: master.c:3147
ec_slave_port_desc_t
EtherCAT slave port descriptor.
Definition: ecrt.h:357
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.
ec_al_state_t
Application-layer state.
Definition: ecrt.h:546
ec_pdo_info_t * pdos
Array with PDOs to assign.
Definition: ecrt.h:501
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&#39;s PDO assignment.
Definition: slave_config.c:721
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:3074
void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
Sets the application time.
Definition: master.c:3090
unsigned int redundancy_active
Redundant link is in use.
Definition: ecrt.h:428
CANopen SDO request.
Definition: sdo_request.h:48
unsigned int slave_count
Number of slaves in the bus.
Definition: ecrt.h:347
uint16_t index
PDO entry index.
Definition: ecrt.h:518
Operational.
Definition: ecrt.h:550
uint16_t address
Register address.
Definition: reg_request.h:54
uint32_t vendor_id
Vendor-ID stored on the slave.
Definition: ecrt.h:384
Register request.
Definition: reg_request.h:48
ec_slave_port_link_t link
Port link state.
Definition: ecrt.h:392
Safe-operational.
Definition: ecrt.h:549
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:483
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:3037
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:2975
Disable the watchdog.
Definition: ecrt.h:451
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:953
uint32_t delay_to_next_dc
Delay [ns] to next DC slave.
Definition: ecrt.h:397
void ecrt_master_send_ext(ec_master_t *master)
Sends non-application datagrams.
Definition: master.c:2849
Enable the watchdog.
Definition: ecrt.h:450
ec_wc_state_t wc_state
Working counter interpretation.
Definition: ecrt.h:427
PDO configuration information.
Definition: ecrt.h:476
ec_domain_t * ecrt_master_create_domain(ec_master_t *master)
Creates a new process data domain.
Definition: master.c:2532
void ecrt_voe_handler_read(ec_voe_handler_t *voe)
Start a VoE read operation.
Definition: voe_handler.c:160
int ecrt_master_setup_domain_memory(ec_master_t *master)
setup the domain&#39;s process data memory.
Definition: master.c:2542
Sync manager configuration information.
Definition: ecrt.h:495
ec_wc_state_t
Domain working counter interpretation.
Definition: ecrt.h:412
unsigned int slaves_responding
Sum of responding slaves on all Ethernet devices.
Definition: ecrt.h:277
void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
Reads the current master state.
Definition: master.c:3051
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:169
int ecrt_slave_config_emerg_clear(ec_slave_config_t *sc)
Clears CoE emergency ring buffer and the overrun counter.
void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *memory)
Provide external memory to store the domain&#39;s process data.
Definition: domain.c:519
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:3134
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_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_slave_config_flag(ec_slave_config_t *sc, const char *key, int32_t value)
Adds a feature flag to a slave configuration.
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.
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.
Some of the registered process data were exchanged.
Definition: ecrt.h:414
uint32_t revision_number
Revision-Number stored on the slave.
Definition: ecrt.h:386
uint8_t * ecrt_sdo_request_data(ec_sdo_request_t *req)
Access to the SDO request&#39;s data.
Definition: sdo_request.c:203
Use the default setting of the sync manager.
Definition: ecrt.h:449
int ecrt_master_64bit_reference_clock_time(ec_master_t *master, uint64_t *time)
Get the 64 bit DC reference slave clock time.
Definition: master.c:3167
uint16_t alias
Slave alias address.
Definition: ecrt.h:514
Not requested.
Definition: ecrt.h:536
uint16_t index
PDO index.
Definition: ecrt.h:477
void ecrt_sdo_request_read(ec_sdo_request_t *req)
Schedule an SDO read operation.
Definition: sdo_request.c:224
ec_master_t * ecrt_request_master(unsigned int master_index)
Requests an EtherCAT master for realtime operation.
Definition: module.c:614
Master state.
Definition: ecrt.h:276
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.
Slave configuration state.
Definition: ecrt.h:324
Request is being processed.
Definition: ecrt.h:537
uint64_t app_time
Application time.
Definition: ecrt.h:350
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
Definition: ecrt.h:503
unsigned int n_pdos
Number of PDOs in pdos.
Definition: ecrt.h:500
Domain state.
Definition: ecrt.h:425
uint32_t vendor_id
Slave vendor ID.
Definition: ecrt.h:516
unsigned int * bit_position
Pointer to a variable to store a bit position (0-7) within the offset.
Definition: ecrt.h:522
Port is an E-Bus.
Definition: ecrt.h:360
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:2937
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.
ec_direction_t
Direction type for PDO assignment functions.
Definition: ecrt.h:435
int ecrt_master_set_send_interval(ec_master_t *master, size_t send_interval)
Set interval between calls to ecrt_master_send().
unsigned int ecrt_version_magic(void)
Returns the version magic of the realtime interface.
Definition: module.c:648
Port is a MII.
Definition: ecrt.h:361
Vendor specific over EtherCAT handler.
Definition: voe_handler.h:49
ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe)
Execute the handler.
Definition: voe_handler.c:188
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.
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:3369
Values read by the master.
Definition: ecrt.h:438
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_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.
void ecrt_master_reset(ec_master_t *master)
Retry configuring slaves.
Definition: master.c:3612
Port is not configured.
Definition: ecrt.h:359
Port is not implemented.
Definition: ecrt.h:358
Slave information.
Definition: ecrt.h:382
void ecrt_master_sync_monitor_queue(ec_master_t *master)
Queues the DC synchrony monitoring datagram for sending.
Definition: master.c:3190
void ecrt_master_deactivate_slaves(ec_master_t *master)
Deactivates the slaves distributed clocks and sends the slaves into PREOP.
Definition: master.c:2625
void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size)
Start a VoE write operation.
Definition: voe_handler.c:178
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.
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&#39;s mapping.
Definition: slave_config.c:769
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:898
uint16_t index
PDO entry index.
Definition: ecrt.h:463
uint8_t al_state
Current state of the slave.
Definition: ecrt.h:399
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:2926
uint8_t scan_busy
true, while the master is scanning the bus
Definition: ecrt.h:349
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:831
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:3528
int ecrt_master_activate(ec_master_t *master)
Finishes the configuration phase and prepares for cyclic operation.
Definition: master.c:2550
int16_t current_on_ebus
Used current in mA.
Definition: ecrt.h:389
size_t ecrt_sdo_request_data_size(const ec_sdo_request_t *req)
Returns the current SDO data size.
Definition: sdo_request.c:210
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:806
size_t ecrt_master_send(ec_master_t *master)
Sends all datagrams in the queue.
Definition: master.c:2748
Invalid direction.
Definition: ecrt.h:436
uint8_t * data
Pointer to data memory.
Definition: reg_request.h:51
#define EC_MAX_PORTS
Maximum number of slave ports.
Definition: ecrt.h:227
Number of directions.
Definition: ecrt.h:439
uint16_t sdo_count
Number of SDOs.
Definition: ecrt.h:402
#define EC_MAX_STRING_LENGTH
Maximum string length.
Definition: ecrt.h:224
int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t subindex, const 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:3209
uint8_t * ecrt_domain_data(ec_domain_t *domain)
Returns the domain&#39;s process data.
Definition: domain.c:533
List record type for PDO entry mass-registration.
Definition: ecrt.h:513
uint16_t next_slave
Ring position of next DC slave on that port.
Definition: ecrt.h:395
No registered process data were exchanged.
Definition: ecrt.h:413
All registered process data were exchanged.
Definition: ecrt.h:416
void ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t watchdog_divider, uint16_t watchdog_intervals)
Configure a slave&#39;s watchdog times.
Definition: slave_config.c:698
void ecrt_master_deactivate(ec_master_t *master)
Deactivates the master.
Definition: master.c:2673
void ecrt_slave_config_overlapping_pdos(ec_slave_config_t *sc, uint8_t allow_overlapping_pdos)
Configure whether a slave allows overlapping PDOs.
Definition: slave_config.c:710
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:671
uint16_t alias
The slaves alias if not equal to 0.
Definition: ecrt.h:388
int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
Obtains master information.
Definition: master.c:2961
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:3452
EtherCAT slave configuration.
Definition: slave_config.h:119
uint32_t product_code
Product-Code stored on the slave.
Definition: ecrt.h:385
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:124
Request was processed successfully.
Definition: ecrt.h:538
unsigned int * offset
Pointer to a variable to store the PDO entry&#39;s (byte-)offset in the process data. ...
Definition: ecrt.h:520
ec_request_state_t
Request state.
Definition: ecrt.h:535
uint8_t * ecrt_reg_request_data(ec_reg_request_t *req)
Access to the register request&#39;s data.
Definition: reg_request.c:86
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:3101
Master information.
Definition: ecrt.h:346
void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state)
Reads the state of a domain.
Definition: domain.c:764
void ecrt_master_64bit_reference_clock_time_queue(ec_master_t *master)
Queues the 64 bit DC reference slave clock time value datagram for sending.
Definition: master.c:3157
PDO entry configuration information.
Definition: ecrt.h:462
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_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index)
Clear a sync manager&#39;s PDO assignment.
Definition: slave_config.c:751
void ecrt_domain_process(ec_domain_t *domain)
Determines the states of the domain&#39;s datagrams.
Definition: domain.c:540
uint8_t index
Sync manager index.
Definition: ecrt.h:496
void ecrt_slave_config_state(const ec_slave_config_t *sc, ec_slave_config_state_t *state)
Outputs the state of the slave configuration.
int ecrt_master_sdo_download_complete(ec_master_t *master, uint16_t slave_position, uint16_t index, const 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:3288
Values written by the master.
Definition: ecrt.h:437
Init.
Definition: ecrt.h:547
void ecrt_domain_queue(ec_domain_t *domain)
(Re-)queues all domain datagrams in the master&#39;s datagram queue.
Definition: domain.c:732
uint16_t position
Offset of the slave in the ring.
Definition: ecrt.h:383
uint32_t receive_time
Receive time on DC transmission delay measurement.
Definition: ecrt.h:393
uint32_t product_code
Slave product code.
Definition: ecrt.h:517
EtherCAT master.
Definition: master.h:189
Request processing failed.
Definition: ecrt.h:539
void ecrt_master_sync_reference_clock(ec_master_t *master)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:3124
uint8_t subindex
PDO entry subindex.
Definition: ecrt.h:464
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.
uint8_t * ecrt_voe_handler_data(ec_voe_handler_t *voe)
Access to the VoE handler&#39;s data.
Definition: voe_handler.c:146
void ecrt_sdo_request_write(ec_sdo_request_t *req)
Schedule an SDO write operation.
Definition: sdo_request.c:235
int ecrt_slave_config_emerg_overruns(ec_slave_config_t *sc)
Read the number of CoE emergency overruns.
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
EtherCAT domain.
Definition: domain.h:55
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
ec_pdo_entry_info_t * entries
Array of PDO entries to map.
Definition: ecrt.h:482
void ecrt_master_receive(ec_master_t *master)
Fetches received frames from the hardware and processes the datagrams.
Definition: master.c:2797