43 #include <linux/module.h> 44 #include <linux/slab.h> 59 struct list_head list;
62 unsigned int timeout_ms;
113 INIT_LIST_HEAD(&sc->
flags);
148 list_for_each_entry_safe(req, next_req, &sc->
sdo_configs, list) {
149 list_del(&req->
list);
155 list_for_each_entry_safe(req, next_req, &sc->
sdo_requests, list) {
156 list_del(&req->
list);
162 list_for_each_entry_safe(soe, next_soe, &sc->
soe_requests, list) {
163 list_del(&soe->
list);
169 list_for_each_entry_safe(reg, next_reg, &sc->
reg_requests, list) {
170 list_del(®->
list);
176 list_for_each_entry_safe(voe, next_voe, &sc->
voe_handlers, list) {
177 list_del(&voe->
list);
183 list_for_each_entry_safe(soe, next_soe, &sc->
soe_configs, list) {
184 list_del(&soe->
list);
190 list_for_each_entry_safe(flag, next_flag, &sc->
flags, list) {
191 list_del(&flag->
list);
197 list_for_each_entry_safe(timeout, next_timeout, &sc->
al_timeouts, list) {
198 list_del(&timeout->list);
268 EC_CONFIG_DBG(sc, 1,
"Failed to find slave for configuration.\n");
273 EC_CONFIG_DBG(sc, 1,
"Failed to attach configuration. Slave %u" 279 #ifdef EC_IDENT_WILDCARDS
284 EC_CONFIG_DBG(sc, 1,
"Slave %u has no matching vendor ID (0x%08X)" 285 " for configuration (0x%08X).\n",
291 #ifdef EC_IDENT_WILDCARDS
296 EC_CONFIG_DBG(sc, 1,
"Slave %u has no matching product code (0x%08X)" 297 " for configuration (0x%08X).\n",
355 "SM%u has an invalid direction field!\n", sync_index);
377 EC_CONFIG_DBG(sc, 1,
"Loading default mapping for PDO 0x%04X.\n",
384 list_for_each_entry(default_pdo, &sync->
pdos.
list, list) {
388 if (default_pdo->
name) {
402 list_for_each_entry(entry, &pdo->
entries, list) {
426 unsigned int count = 0;
470 unsigned int count = 0;
514 unsigned int count = 0;
516 list_for_each_entry(flag, &sc->
flags, list) {
538 list_for_each_entry(flag, &sc->
flags, list) {
648 list_for_each_entry(flag, &sc->
flags, list) {
649 if (!strcmp(flag->
key, key)) {
669 list_for_each_entry(timeout, &sc->
al_timeouts, list) {
670 if (timeout->from == from && timeout->to == to) {
671 return timeout->timeout_ms;
687 EC_CONFIG_DBG(sc, 1,
"ecrt_slave_config_sync_manager(sc = 0x%p," 688 " sync_index = %u, dir = %i, watchdog_mode = %i)\n",
689 sc, sync_index, dir, watchdog_mode);
692 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
697 EC_CONFIG_ERR(sc,
"Invalid direction %u!\n", (
unsigned int) dir);
702 sync_config->
dir = dir;
710 uint16_t divider, uint16_t intervals)
712 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, divider = %u, intervals = %u)\n",
713 __func__, sc, divider, intervals);
726 " config_mode = %u)\n", __func__, sc, assign_mode, config_mode);
729 EC_CONFIG_ERR(sc,
"Invalid PDO assignment mode %u!\n", assign_mode);
747 uint8_t sync_index, uint16_t pdo_index)
752 "pdo_index = 0x%04X)\n", __func__, sc, sync_index, pdo_index);
755 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
780 __func__, sc, sync_index);
783 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
796 uint16_t pdo_index, uint16_t entry_index, uint8_t entry_subindex,
797 uint8_t entry_bit_length)
805 "pdo_index = 0x%04X, entry_index = 0x%04X, " 806 "entry_subindex = 0x%02X, entry_bit_length = %u)\n",
807 __func__, sc, pdo_index, entry_index, entry_subindex,
821 retval = PTR_ERR(entry);
823 EC_CONFIG_ERR(sc,
"PDO 0x%04X is not assigned.\n", pdo_index);
839 __func__, sc, pdo_index);
862 unsigned int i, j, k;
867 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, n_syncs = %u, syncs = 0x%p)\n",
868 __func__, sc, n_syncs, syncs);
873 for (i = 0; i < n_syncs; i++) {
874 sync_info = &syncs[i];
893 for (j = 0; j < sync_info->
n_pdos; j++) {
894 pdo_info = &sync_info->
pdos[j];
904 for (k = 0; k < pdo_info->
n_entries; k++) {
905 entry_info = &pdo_info->
entries[k];
929 unsigned int *bit_position
934 unsigned int bit_offset, bit_pos;
940 "subindex = 0x%02X, domain = 0x%p, bit_position = 0x%p)\n",
941 __func__, sc, index, subindex, domain, bit_position);
947 list_for_each_entry(pdo, &sync_config->
pdos.
list, list) {
948 list_for_each_entry(entry, &pdo->
entries, list) {
952 bit_pos = bit_offset % 8;
954 *bit_position = bit_pos;
955 }
else if (bit_pos) {
957 " not byte-align.\n", index, subindex);
962 sc, domain, sync_index, sync_config->
dir);
966 return sync_offset + bit_offset / 8;
982 unsigned int pdo_pos,
983 unsigned int entry_pos,
985 unsigned int *bit_position
989 unsigned int bit_offset, pp, ep;
993 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, sync_index = %u, pdo_pos = %u," 994 " entry_pos = %u, domain = 0x%p, bit_position = 0x%p)\n",
995 __func__, sc, sync_index, pdo_pos, entry_pos,
996 domain, bit_position);
999 EC_CONFIG_ERR(sc,
"Invalid syncmanager position %u.\n", sync_index);
1007 list_for_each_entry(pdo, &sync_config->
pdos.
list, list) {
1009 list_for_each_entry(entry, &pdo->
entries, list) {
1010 if (pp != pdo_pos || ep != entry_pos) {
1013 unsigned int bit_pos = bit_offset % 8;
1017 *bit_position = bit_pos;
1018 }
else if (bit_pos) {
1020 " not byte-align.\n",
1026 sc, domain, sync_index, sync_config->
dir);
1027 if (sync_offset < 0)
1030 return sync_offset + bit_offset / 8;
1037 EC_CONFIG_ERR(sc,
"PDO entry specification %u/%u/%u out of range.\n",
1038 sync_index, pdo_pos, entry_pos);
1045 uint32_t sync0_cycle_time, int32_t sync0_shift_time,
1046 uint32_t sync1_cycle_time, int32_t sync1_shift_time)
1048 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, assign_activate = 0x%04X," 1049 " sync0_cycle = %u, sync0_shift = %i," 1050 " sync1_cycle = %u, sync1_shift = %i\n",
1051 __func__, sc, assign_activate, sync0_cycle_time, sync0_shift_time,
1052 sync1_cycle_time, sync1_shift_time);
1065 uint8_t subindex,
const uint8_t *data,
size_t size)
1072 "subindex = 0x%02X, data = 0x%p, size = %zu)\n",
1073 __func__, sc, index, subindex, data, size);
1082 " SDO configuration!\n");
1105 uint8_t subindex, uint8_t value)
1110 "subindex = 0x%02X, value = %u)\n",
1111 __func__, sc, index, subindex, (
unsigned int) value);
1120 uint8_t subindex, uint16_t value)
1125 "subindex = 0x%02X, value = %u)\n",
1126 __func__, sc, index, subindex, value);
1135 uint8_t subindex, uint32_t value)
1140 "subindex = 0x%02X, value = %u)\n",
1141 __func__, sc, index, subindex, value);
1150 const uint8_t *data,
size_t size)
1157 "data = 0x%p, size = %zu)\n", __func__, sc, index, data, size);
1166 " SDO configuration!\n");
1227 "index = 0x%04X, subindex = 0x%02X, size = %zu)\n",
1228 __func__, sc, index, subindex, size);
1232 EC_CONFIG_ERR(sc,
"Failed to allocate SDO request memory!\n");
1233 return ERR_PTR(-ENOMEM);
1243 return ERR_PTR(ret);
1247 memset(req->
data, 0x00, size);
1264 return IS_ERR(s) ? NULL : s;
1279 "drive_no = 0x%02X, idn = 0x%04X, size = %zu)\n",
1280 __func__, sc, drive_no, idn, size);
1284 EC_CONFIG_ERR(sc,
"Failed to allocate IDN request memory!\n");
1285 return ERR_PTR(-ENOMEM);
1295 return ERR_PTR(ret);
1299 memset(req->
data, 0x00, size);
1315 drive_no, idn, size);
1316 return IS_ERR(req) ? NULL : req;
1331 __func__, sc, size);
1335 EC_CONFIG_ERR(sc,
"Failed to allocate register request memory!\n");
1336 return ERR_PTR(-ENOMEM);
1342 return ERR_PTR(ret);
1359 return IS_ERR(reg) ? NULL : reg;
1373 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, size = %zu)\n", __func__, sc, size);
1377 EC_CONFIG_ERR(sc,
"Failed to allocate VoE request memory!\n");
1378 return ERR_PTR(-ENOMEM);
1384 return ERR_PTR(ret);
1401 return IS_ERR(voe) ? NULL : voe;
1411 state->
online = slave ? 1 : 0;
1433 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, drive_no = %u, idn = 0x%04X, " 1434 "state = %u, data = 0x%p, size = %zu)\n",
1435 __func__, sc, drive_no, idn, state, data, size);
1439 (
unsigned int) drive_no);
1445 " must be PREOP or SAFEOP!\n");
1456 " IDN configuration!\n");
1485 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, key = %s, value = %i)\n",
1486 __func__, sc, key, value);
1491 flag->
value = value;
1519 const unsigned char *mac_address)
1529 struct in_addr ip_address)
1539 struct in_addr subnet_mask)
1549 struct in_addr gateway_address)
1559 struct in_addr dns_address)
1601 list_for_each_entry(timeout, &sc->
al_timeouts, list) {
1602 if (timeout->from == from_state && timeout->to == to_state) {
1603 if (timeout_ms == 0) {
1605 list_del(&timeout->list);
1609 timeout->timeout_ms = timeout_ms;
1614 if (timeout_ms == 0) {
1622 " AL timeout configuration!\n");
1626 timeout->from = from_state;
1627 timeout->to = to_state;
1628 timeout->timeout_ms = timeout_ms;
unsigned int ec_slave_config_flag_count(const ec_slave_config_t *sc)
Get the number of feature flags.
uint16_t ring_position
Ring position.
struct list_head sdo_configs
List of SDO configurations.
void ec_soe_request_set_idn(ec_soe_request_t *req, uint16_t idn)
Set IDN.
ec_sii_t sii
Extracted SII data.
ec_reg_request_t * ec_slave_config_find_reg_request(ec_slave_config_t *sc, unsigned int pos)
Finds a register handler via its position in the list.
void ec_slave_config_init(ec_slave_config_t *sc, ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code)
Slave configuration constructor.
int ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index)
Clear a sync manager's PDO assignment.
unsigned int n_entries
Number of PDO entries in entries to map.
uint8_t bit_length
Size of the PDO entry in bit.
EtherCAT application-layer transition timeout.
ec_direction_t dir
Sync manager direction.
ec_pdo_mode_t
PDO handling mode.
ec_watchdog_mode_t
Watchdog mode for sync manager configuration.
const ec_soe_request_t * ec_slave_config_get_idn_by_pos_const(const ec_slave_config_t *sc, unsigned int pos)
Finds an IDN configuration via its position in the list.
ec_sdo_request_t * ecrt_slave_config_create_sdo_request_err(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, size_t size)
Same as ecrt_slave_config_create_sdo_request(), but with ERR_PTR() return value.
ec_pdo_info_t const * pdos
Array with PDOs to assign.
int ecrt_slave_config_sdo32(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, uint32_t value)
Add a configuration value for a 32-bit SDO.
ec_al_state_t
Application-layer state.
unsigned int ec_slave_config_al_timeout(const ec_slave_config_t *sc, ec_slave_state_t from, ec_slave_state_t to)
Return an AL state timeout.
int32_t shift_time
Shift time [ns].
OP (mailbox communication and input/output update)
ec_reg_request_t * reg_request
Register request to process.
const ec_flag_t * ec_slave_config_get_flag_by_pos_const(const ec_slave_config_t *sc, unsigned int pos)
Finds a flag via its position in the list.
ec_soe_request_t * ec_slave_config_find_soe_request(ec_slave_config_t *sc, unsigned int pos)
Finds a SoE request via its position in the list.
int ec_pdo_list_copy(ec_pdo_list_t *pl, const ec_pdo_list_t *other)
Makes a deep copy of another PDO list.
int ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals)
Configure a slave's watchdog times.
ec_slave_state_t current_state
Current application state.
int ecrt_slave_config_reg_pdo_entry(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, ec_domain_t *domain, unsigned int *bit_position)
Registers a PDO entry for process data exchange in a domain.
uint8_t used_fmmus
Number of FMMUs used.
uint32_t product_code
Slave product code.
Servo-Profile over EtherCAT.
uint16_t position
Index after alias.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
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.
void ec_sync_config_clear(ec_sync_config_t *sync_config)
Destructor.
const ec_sdo_request_t * ec_slave_config_get_sdo_by_pos_const(const ec_slave_config_t *sc, unsigned int pos)
Finds an SDO configuration via its position in the list.
void ec_fmmu_config_init(ec_fmmu_config_t *fmmu, ec_slave_config_t *sc, ec_domain_t *domain, uint8_t sync_index, ec_direction_t dir)
FMMU configuration constructor.
struct list_head list
List of PDOs.
int ecrt_slave_config_sync_manager(ec_slave_config_t *sc, uint8_t sync_index, ec_direction_t dir, ec_watchdog_mode_t watchdog_mode)
Configure a sync manager.
ec_master_t * master
Master owning the slave configuration.
int ec_reg_request_init(ec_reg_request_t *reg, size_t size)
Register request constructor.
int ec_pdo_set_name(ec_pdo_t *pdo, const char *name)
Set PDO name.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
struct list_head list
List item.
uint16_t alias
Slave alias.
void ec_pdo_list_clear_pdos(ec_pdo_list_t *pl)
Clears the list of mapped PDOs.
ec_eoe_request_t eoe_ip_param_request
EoE IP parameters.
void ec_pdo_clear_entries(ec_pdo_t *pdo)
Clear PDO entry list.
int ecrt_slave_config_emerg_overruns(const ec_slave_config_t *sc)
Read the number of CoE emergency overruns.
uint32_t cycle_time
Cycle time [ns].
ec_fsm_slave_t fsm
Slave state machine.
int ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, uint16_t idn)
Set the request's drive and Sercos ID numbers.
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.
PDO configuration information.
#define EC_CONFIG_ERR(sc, fmt, args...)
Convenience macro for printing configuration-specific errors to syslog.
int ecrt_slave_config_state_timeout(ec_slave_config_t *sc, ec_al_state_t from, ec_al_state_t to, unsigned int timeout_ms)
Sets the application-layer state transition timeout in ms.
uint8_t * data
Pointer to SDO data.
ec_slave_t * ec_master_find_slave(ec_master_t *master, uint16_t alias, uint16_t position)
Finds a slave in the bus, given the alias and position.
Sync manager configuration information.
int ecrt_slave_config_eoe_dns_address(ec_slave_config_t *sc, struct in_addr dns_address)
Sets the IPv4 address of the DNS server for Ethernet-over-EtherCAT (EoE) operation.
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.
struct list_head list
List item.
#define EC_MAX_HOSTNAME_SIZE
Maximum hostname size.
size_t data_size
Size of SDO data.
void ec_eoe_request_init(ec_eoe_request_t *req)
EoE request constructor.
ec_pdo_mode_t pdo_config_mode
Whether/how to read resp.
int ecrt_slave_config_sdo8(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, uint8_t value)
Add a configuration value for an 8-bit SDO.
int 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 ec_sync_default_direction(const ec_sync_t *sync)
Determines the default direction from the control register.
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. ...
unsigned int sync_count
Number of sync managers.
char * key
Flag key (null-terminated ASCII string.
#define EC_MAX_FMMUS
Maximum number of FMMUs per slave.
Global definitions and macros.
ec_al_state_t al_state
AL state (only valid for IDN config).
void ec_coe_emerg_ring_init(ec_coe_emerg_ring_t *ring, ec_slave_config_t *sc)
Emergency ring buffer constructor.
void ec_flag_clear(ec_flag_t *flag)
SDO request destructor.
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.
ec_pdo_entry_t * ec_pdo_add_entry(ec_pdo_t *pdo, uint16_t index, uint8_t subindex, uint8_t bit_length)
Add a new PDO entry to the configuration.
EtherCAT master structure.
ec_fmmu_config_t fmmu_configs[EC_MAX_FMMUS]
FMMU configurations.
ec_sync_signal_t dc_sync[EC_SYNC_SIGNAL_COUNT]
DC sync signals.
struct list_head al_timeouts
List of specific AL state timeouts.
int8_t sync_index
Assigned sync manager.
int ec_soe_request_copy_data(ec_soe_request_t *req, const uint8_t *source, size_t size)
Copies SoE data from an external source.
int ec_slave_config_prepare_fmmu(ec_slave_config_t *, ec_domain_t *, uint8_t, ec_direction_t)
Prepares an FMMU configuration.
int ecrt_slave_config_emerg_clear(ec_slave_config_t *sc)
Clears CoE emergency ring buffer and the overrun counter.
uint16_t index
PDO entry index.
struct list_head flags
List of feature flags.
struct semaphore master_sem
Master semaphore.
uint32_t logical_start_address
Logical start address.
void ec_slave_config_load_default_mapping(const ec_slave_config_t *, ec_pdo_t *)
Loads the default mapping for a PDO from the slave object.
void ec_sdo_request_clear(ec_sdo_request_t *req)
SDO request destructor.
Read the current state via CoE while scanning the slave, and write it back only if it differs from th...
ec_voe_handler_t * ecrt_slave_config_create_voe_handler_err(ec_slave_config_t *sc, size_t size)
Same as ecrt_slave_config_create_voe_handler(), but with ERR_PTR() return value.
int ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex)
Set the SDO index and subindex.
const ec_domain_t * domain
Domain.
int ec_sdo_request_copy_data(ec_sdo_request_t *req, const uint8_t *source, size_t size)
Copies SDO data from an external source.
Slave configuration state.
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
ec_sync_config_t sync_configs[EC_MAX_SYNC_MANAGERS]
Sync manager configurations.
ec_pdo_mode_t pdo_assign_mode
Whether/how to read resp.
unsigned int n_pdos
Number of PDOs in pdos.
ec_slave_config_t * config
Current configuration.
struct list_head reg_requests
List of register requests.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
unsigned int al_state
The application-layer state of the slave.
uint8_t sync_index
Index of sync manager to use.
Slave configutation feature flag.
void ec_soe_request_set_drive_no(ec_soe_request_t *req, uint8_t drive_no)
Set drive number.
struct list_head sdo_requests
List of SDO requests.
uint16_t mailbox_protocols
Supported mailbox protocols.
ec_flag_t * ec_slave_config_find_flag(ec_slave_config_t *sc, const char *key)
Finds a flag.
ec_reg_request_t * ecrt_slave_config_create_reg_request_err(ec_slave_config_t *sc, size_t size)
Same as ecrt_slave_config_create_reg_request(), but with ERR_PTR() return value.
unsigned int debug_level
Master debug level.
uint8_t bit_length
entry length in bit
struct list_head list
List item.
unsigned int operational
The slave was brought into OP state using the specified configuration.
int ec_coe_emerg_ring_clear_ring(ec_coe_emerg_ring_t *ring)
Clear the ring.
void ec_soe_request_clear(ec_soe_request_t *req)
SoE request destructor.
EtherCAT Slave Configuration Feature Flag.
ec_pdo_list_t pdos
Current PDO assignment.
struct list_head voe_handlers
List of VoE handlers.
uint16_t dc_assign_activate
Vendor-specific AssignActivate word.
#define EC_CONFIG_WARN(sc, fmt, args...)
Convenience macro for printing configuration-specific warnings to syslog.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
#define EC_CONFIG_DBG(sc, level, fmt, args...)
Convenience macro for printing configuration-specific debug messages to syslog.
ec_direction_t
Direction type for PDO assignment functions.
EtherCAT EoE request structure.
struct list_head entries
List of PDO entries.
uint16_t watchdog_intervals
Process data watchdog intervals (see spec.
int ecrt_slave_config_flag(ec_slave_config_t *sc, const char *key, int32_t value)
Adds a feature flag to a slave configuration.
Vendor specific over EtherCAT handler.
struct list_head soe_requests
List of SoE requests.
unsigned int ec_slave_config_sdo_count(const ec_slave_config_t *sc)
Get the number of SDO configurations.
ec_pdo_t * ec_pdo_list_add_pdo(ec_pdo_list_t *pl, uint16_t index)
Add a new PDO to the list.
ec_pdo_entry_info_t const * entries
Array of PDO entries to map.
int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc, uint8_t sync_index, uint16_t pdo_index)
Add a PDO to a sync manager's PDO assignment.
ec_slave_state_t
State of an EtherCAT slave.
int ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle_time, int32_t sync0_shift_time, uint32_t sync1_cycle_time, int32_t sync1_shift_time)
Configure distributed clocks.
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_eoe_ip_address(ec_slave_config_t *sc, struct in_addr ip_address)
Sets the IP address for Ethernet-over-EtherCAT (EoE) operation.
uint8_t subindex
PDO entry subindex.
Values read by the master.
int ec_slave_config_attach(ec_slave_config_t *sc)
Attaches the configuration to the addressed slave object.
ec_direction_t dir
Sync manager direction.
int ec_voe_handler_init(ec_voe_handler_t *voe, ec_slave_config_t *sc, size_t size)
VoE handler constructor.
ec_slave_t * slave
Slave pointer.
unsigned int online
The slave is online.
uint16_t watchdog_divider
Watchdog divider as a number of 40ns intervals (see spec.
ec_sdo_request_t * ec_slave_config_find_sdo_request(ec_slave_config_t *sc, unsigned int pos)
Finds a CoE SDO request via its position in the list.
int ec_soe_request_alloc(ec_soe_request_t *req, size_t size)
Pre-allocates the data memory.
struct list_head soe_configs
List of SoE configurations.
int ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, uint16_t pdo_index)
Clear the mapping of a given PDO.
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
int ec_pdo_copy_entries(ec_pdo_t *pdo, const ec_pdo_t *other)
Copy PDO entries from another PDO.
unsigned int ec_slave_config_idn_count(const ec_slave_config_t *sc)
Get the number of IDN configurations.
uint16_t index
PDO entry index.
size_t data_size
Size of SDO data.
ec_soe_request_t * ecrt_slave_config_create_soe_request_err(ec_slave_config_t *sc, uint8_t drive_no, uint16_t idn, size_t size)
Same as ecrt_slave_config_create_soe_request(), but with ERR_PTR() return value.
#define EC_END
End of list marker.
ec_coe_emerg_ring_t emerg_ring
CoE emergency ring buffer.
int ecrt_slave_config_eoe_default_gateway(ec_slave_config_t *sc, struct in_addr gateway_address)
Sets the gateway address for Ethernet-over-EtherCAT (EoE) operation.
Vendor specific over EtherCAT protocol handler.
void ec_sdo_request_init(ec_sdo_request_t *req)
SDO request constructor.
#define EC_PDO_MODE_DEFAULT
Default PDO handling mode: read via CoE while scanning, and unconditionally (re-)write via CoE every ...
Sync manager configuration.
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.
ec_soe_request_t * ecrt_slave_config_create_soe_request(ec_slave_config_t *sc, uint8_t drive_no, uint16_t idn, size_t size)
Create an SoE request to exchange SoE IDNs 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.
struct list_head list
List item.
void ec_coe_emerg_ring_clear(ec_coe_emerg_ring_t *ring)
Emergency ring buffer destructor.
int ec_coe_emerg_ring_overruns(const ec_coe_emerg_ring_t *ring)
Read the number of overruns.
uint32_t vendor_id
Slave vendor ID.
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.
int ecrt_slave_config_eoe_hostname(ec_slave_config_t *sc, const char *name)
Sets the host name for Ethernet-over-EtherCAT (EoE) operation.
int ecrt_slave_config_pdo_mode(ec_slave_config_t *sc, ec_pdo_mode_t assign_mode, ec_pdo_mode_t config_mode)
Selects how a slave's PDO assignment and PDO configuration are read from resp.
ec_pdo_list_t pdos
Current PDO assignment.
int32_t value
Flag value (meaning depends on key).
void ec_sync_config_init(ec_sync_config_t *sync_config)
Constructor.
void ec_reg_request_clear(ec_reg_request_t *reg)
Register request destructor.
EtherCAT slave configuration.
void ec_soe_request_init(ec_soe_request_t *req)
SoE request constructor.
EtherCAT master character device IOCTL commands.
EtherCAT slave configuration structure.
void ec_slave_config_detach(ec_slave_config_t *sc)
Detaches the configuration from a slave object.
PDO entry configuration information.
int ec_sdo_request_alloc(ec_sdo_request_t *req, size_t size)
Pre-allocates the data memory.
uint32_t product_code
Vendor-specific product code.
uint8_t index
Sync manager index.
void ec_slave_config_clear(ec_slave_config_t *sc)
Slave configuration destructor.
Values written by the master.
int ecrt_slave_config_eoe_mac_address(ec_slave_config_t *sc, const unsigned char *mac_address)
Sets the link/MAC address for Ethernet-over-EtherCAT (EoE) operation.
int ecrt_slave_config_sdo16(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, uint16_t value)
Add a configuration value for a 16-bit SDO.
int ecrt_slave_config_eoe_subnet_mask(ec_slave_config_t *sc, struct in_addr subnet_mask)
Sets the subnet mask for Ethernet-over-EtherCAT (EoE) operation.
ec_pdo_t * ec_pdo_list_find_pdo(const ec_pdo_list_t *pl, uint16_t index)
Finds a PDO with the given index.
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.
int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements)
Set the size of the CoE emergency ring buffer.
ec_sync_t * syncs
SYNC MANAGER categories.
struct list_head list
List item.
uint8_t subindex
PDO entry subindex.
#define EC_MAX_SYNC_MANAGERS
Maximum number of sync managers per slave.
void ec_slave_config_load_default_sync_config(ec_slave_config_t *sc)
Loads the default PDO assignment from the slave object.
int ec_coe_emerg_ring_size(ec_coe_emerg_ring_t *ring, size_t size)
Set the ring size.
Sercos-over-EtherCAT request.
uint8_t * data
Pointer to SDO data.
uint32_t vendor_id
Vendor ID.
uint8_t complete_access
SDO shall be transferred completely.
int ec_coe_emerg_ring_pop(ec_coe_emerg_ring_t *ring, u8 *msg)
Remove an emergency message from the ring.
unsigned int force_config
Force (re-)configuration.
ec_voe_handler_t * ec_slave_config_find_voe_handler(ec_slave_config_t *sc, unsigned int pos)
Finds a VoE handler via its position in the list.
void ec_voe_handler_clear(ec_voe_handler_t *voe)
VoE handler destructor.
ec_sync_t * ec_slave_get_sync(ec_slave_t *slave, uint8_t sync_index)
Get the sync manager given an index.
int ec_flag_init(ec_flag_t *flag, const char *key, int32_t value)
SDO request constructor.