39#include <linux/module.h>
40#include <linux/slab.h>
93 INIT_LIST_HEAD(&sc->
flags);
122 list_for_each_entry_safe(req, next_req, &sc->
sdo_configs, list) {
123 list_del(&req->
list);
129 list_for_each_entry_safe(req, next_req, &sc->
sdo_requests, list) {
130 list_del(&req->
list);
136 list_for_each_entry_safe(reg, next_reg, &sc->
reg_requests, list) {
137 list_del(®->
list);
143 list_for_each_entry_safe(voe, next_voe, &sc->
voe_handlers, list) {
144 list_del(&voe->
list);
150 list_for_each_entry_safe(soe, next_soe, &sc->
soe_configs, list) {
151 list_del(&soe->
list);
157 list_for_each_entry_safe(flag, next_flag, &sc->
flags, list) {
158 list_del(&flag->
list);
229 EC_CONFIG_DBG(sc, 1,
"Failed to find slave for configuration.\n");
234 EC_CONFIG_DBG(sc, 1,
"Failed to attach configuration. Slave %u"
240#ifdef EC_IDENT_WILDCARDS
245 EC_CONFIG_DBG(sc, 1,
"Slave %u has no matching vendor ID (0x%08X)"
246 " for configuration (0x%08X).\n",
252#ifdef EC_IDENT_WILDCARDS
257 EC_CONFIG_DBG(sc, 1,
"Slave %u has no matching product code (0x%08X)"
258 " for configuration (0x%08X).\n",
316 "SM%u has an invalid direction field!\n", sync_index);
338 EC_CONFIG_DBG(sc, 1,
"Loading default mapping for PDO 0x%04X.\n",
345 list_for_each_entry(default_pdo, &sync->
pdos.
list, list) {
349 if (default_pdo->
name) {
363 list_for_each_entry(entry, &pdo->
entries, list) {
387 unsigned int count = 0;
431 unsigned int count = 0;
475 unsigned int count = 0;
477 list_for_each_entry(flag, &sc->
flags, list) {
499 list_for_each_entry(flag, &sc->
flags, list) {
587 list_for_each_entry(flag, &sc->
flags, list) {
588 if (!strcmp(flag->
key, key)) {
606 EC_CONFIG_DBG(sc, 1,
"ecrt_slave_config_sync_manager(sc = 0x%p,"
607 " sync_index = %u, dir = %i, watchdog_mode = %i)\n",
608 sc, sync_index, dir, watchdog_mode);
611 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
616 EC_CONFIG_ERR(sc,
"Invalid direction %u!\n", (
unsigned int) dir);
621 sync_config->
dir = dir;
629 uint16_t divider, uint16_t intervals)
631 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, divider = %u, intervals = %u)\n",
632 __func__, sc, divider, intervals);
641 uint8_t sync_index, uint16_t pdo_index)
646 "pdo_index = 0x%04X)\n", __func__, sc, sync_index, pdo_index);
649 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
674 __func__, sc, sync_index);
677 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
689 uint16_t pdo_index, uint16_t entry_index, uint8_t entry_subindex,
690 uint8_t entry_bit_length)
698 "pdo_index = 0x%04X, entry_index = 0x%04X, "
699 "entry_subindex = 0x%02X, entry_bit_length = %u)\n",
700 __func__, sc, pdo_index, entry_index, entry_subindex,
714 retval = PTR_ERR(entry);
716 EC_CONFIG_ERR(sc,
"PDO 0x%04X is not assigned.\n", pdo_index);
732 __func__, sc, pdo_index);
754 unsigned int i, j, k;
759 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, n_syncs = %u, syncs = 0x%p)\n",
760 __func__, sc, n_syncs, syncs);
765 for (i = 0; i < n_syncs; i++) {
766 sync_info = &syncs[i];
786 for (j = 0; j < sync_info->
n_pdos; j++) {
787 pdo_info = &sync_info->
pdos[j];
797 for (k = 0; k < pdo_info->
n_entries; k++) {
798 entry_info = &pdo_info->
entries[k];
822 unsigned int *bit_position
827 unsigned int bit_offset, bit_pos;
833 "subindex = 0x%02X, domain = 0x%p, bit_position = 0x%p)\n",
834 __func__, sc, index, subindex, domain, bit_position);
840 list_for_each_entry(pdo, &sync_config->
pdos.
list, list) {
841 list_for_each_entry(entry, &pdo->
entries, list) {
845 bit_pos = bit_offset % 8;
847 *bit_position = bit_pos;
848 }
else if (bit_pos) {
850 " not byte-align.\n", index, subindex);
855 sc, domain, sync_index, sync_config->
dir);
859 return sync_offset + bit_offset / 8;
875 unsigned int pdo_pos,
876 unsigned int entry_pos,
878 unsigned int *bit_position
882 unsigned int bit_offset, pp, ep;
886 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, sync_index = %u, pdo_pos = %u,"
887 " entry_pos = %u, domain = 0x%p, bit_position = 0x%p)\n",
888 __func__, sc, sync_index, pdo_pos, entry_pos,
889 domain, bit_position);
892 EC_CONFIG_ERR(sc,
"Invalid syncmanager position %u.\n", sync_index);
900 list_for_each_entry(pdo, &sync_config->
pdos.
list, list) {
902 list_for_each_entry(entry, &pdo->
entries, list) {
903 if (pp != pdo_pos || ep != entry_pos) {
906 unsigned int bit_pos = bit_offset % 8;
910 *bit_position = bit_pos;
911 }
else if (bit_pos) {
913 " not byte-align.\n",
919 sc, domain, sync_index, sync_config->
dir);
923 return sync_offset + bit_offset / 8;
930 EC_CONFIG_ERR(sc,
"PDO entry specification %u/%u/%u out of range.\n",
931 sync_index, pdo_pos, entry_pos);
938 uint32_t sync0_cycle_time, int32_t sync0_shift_time,
939 uint32_t sync1_cycle_time, int32_t sync1_shift_time)
941 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, assign_activate = 0x%04X,"
942 " sync0_cycle = %u, sync0_shift = %i,"
943 " sync1_cycle = %u, sync1_shift = %i\n",
944 __func__, sc, assign_activate, sync0_cycle_time, sync0_shift_time,
945 sync1_cycle_time, sync1_shift_time);
957 uint8_t subindex,
const uint8_t *data,
size_t size)
964 "subindex = 0x%02X, data = 0x%p, size = %zu)\n",
965 __func__, sc, index, subindex, data, size);
974 " SDO configuration!\n");
997 uint8_t subindex, uint8_t value)
1002 "subindex = 0x%02X, value = %u)\n",
1003 __func__, sc, index, subindex, (
unsigned int) value);
1012 uint8_t subindex, uint16_t value)
1017 "subindex = 0x%02X, value = %u)\n",
1018 __func__, sc, index, subindex, value);
1027 uint8_t subindex, uint32_t value)
1032 "subindex = 0x%02X, value = %u)\n",
1033 __func__, sc, index, subindex, value);
1042 const uint8_t *data,
size_t size)
1049 "data = 0x%p, size = %zu)\n", __func__, sc, index, data, size);
1058 " SDO configuration!\n");
1119 "index = 0x%04X, subindex = 0x%02X, size = %zu)\n",
1120 __func__, sc, index, subindex, size);
1124 EC_CONFIG_ERR(sc,
"Failed to allocate SDO request memory!\n");
1125 return ERR_PTR(-ENOMEM);
1135 return ERR_PTR(ret);
1139 memset(req->
data, 0x00, size);
1156 return IS_ERR(s) ? NULL : s;
1171 __func__, sc, size);
1175 EC_CONFIG_ERR(sc,
"Failed to allocate register request memory!\n");
1176 return ERR_PTR(-ENOMEM);
1182 return ERR_PTR(ret);
1199 return IS_ERR(reg) ? NULL : reg;
1213 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, size = %zu)\n", __func__, sc, size);
1217 EC_CONFIG_ERR(sc,
"Failed to allocate VoE request memory!\n");
1218 return ERR_PTR(-ENOMEM);
1224 return ERR_PTR(ret);
1241 return IS_ERR(voe) ? NULL : voe;
1271 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, drive_no = %u, idn = 0x%04X, "
1272 "state = %u, data = 0x%p, size = %zu)\n",
1273 __func__, sc, drive_no, idn, state, data, size);
1277 (
unsigned int) drive_no);
1283 " must be PREOP or SAFEOP!\n");
1294 " IDN configuration!\n");
1323 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, key = %s, value = %i)\n",
1324 __func__, sc, key, value);
1329 flag->
value = value;
void ec_coe_emerg_ring_init(ec_coe_emerg_ring_t *ring, ec_slave_config_t *sc)
Emergency ring buffer constructor.
int ec_coe_emerg_ring_overruns(ec_coe_emerg_ring_t *ring)
Read the number of overruns.
int ec_coe_emerg_ring_pop(ec_coe_emerg_ring_t *ring, u8 *msg)
Remove an emergency message from the ring.
int ec_coe_emerg_ring_clear_ring(ec_coe_emerg_ring_t *ring)
Clear the ring.
int ec_coe_emerg_ring_size(ec_coe_emerg_ring_t *ring, size_t size)
Set the ring size.
void ec_coe_emerg_ring_clear(ec_coe_emerg_ring_t *ring)
Emergency ring buffer destructor.
int ec_flag_init(ec_flag_t *flag, const char *key, int32_t value)
SDO request constructor.
void ec_flag_clear(ec_flag_t *flag)
SDO request destructor.
EtherCAT Slave Configuration Feature Flag.
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.
Global definitions and macros.
@ EC_SLAVE_STATE_OP
OP (mailbox communication and input/output update)
@ EC_SLAVE_STATE_UNKNOWN
unknown state
#define EC_MAX_FMMUS
Maximum number of FMMUs per slave.
@ EC_MBOX_COE
CANopen over EtherCAT.
@ EC_MBOX_SOE
Servo-Profile over EtherCAT.
void 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.
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.
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.
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.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
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.
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_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_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.
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.
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.
void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, uint16_t pdo_index)
Clear the mapping of a given PDO.
int ecrt_slave_config_flag(ec_slave_config_t *sc, const char *key, int32_t value)
Adds a feature flag to a slave configuration.
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.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
ec_watchdog_mode_t
Watchdog mode for sync manager configuration.
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_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.
#define EC_END
End of list marker.
#define EC_MAX_SYNC_MANAGERS
Maximum number of sync managers per slave.
void ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals)
Configure a slave's watchdog times.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
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.
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_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex)
Set the SDO index and subindex.
int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements)
Set the size of the CoE emergency ring buffer.
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.
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.
void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index)
Clear a sync manager's PDO assignment.
@ EC_AL_STATE_PREOP
Pre-operational.
@ EC_AL_STATE_SAFEOP
Safe-operational.
@ EC_DIR_INVALID
Invalid direction.
@ EC_DIR_INPUT
Values read by the master.
@ EC_DIR_OUTPUT
Values written by the master.
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.
EtherCAT master structure.
int ec_pdo_copy_entries(ec_pdo_t *pdo, const ec_pdo_t *other)
Copy PDO entries from another PDO.
void ec_pdo_clear_entries(ec_pdo_t *pdo)
Clear PDO entry list.
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.
int ec_pdo_set_name(ec_pdo_t *pdo, const char *name)
Set PDO name.
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_t * ec_pdo_list_find_pdo(const ec_pdo_list_t *pl, uint16_t index)
Finds a PDO with the given index.
int ec_pdo_list_copy(ec_pdo_list_t *pl, const ec_pdo_list_t *other)
Makes a deep copy of another PDO list.
void ec_pdo_list_clear_pdos(ec_pdo_list_t *pl)
Clears the list of mapped PDOs.
void ec_reg_request_clear(ec_reg_request_t *reg)
Register request destructor.
int ec_reg_request_init(ec_reg_request_t *reg, size_t size)
Register request constructor.
void ec_sdo_request_init(ec_sdo_request_t *req)
SDO request constructor.
int ec_sdo_request_alloc(ec_sdo_request_t *req, size_t size)
Pre-allocates the data memory.
void ec_sdo_request_clear(ec_sdo_request_t *req)
SDO request destructor.
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.
ec_sync_t * ec_slave_get_sync(ec_slave_t *slave, uint8_t sync_index)
Get the sync manager given an index.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
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.
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.
void ec_slave_config_load_default_sync_config(ec_slave_config_t *sc)
Loads the default PDO assignment from the slave object.
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.
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 ec_slave_config_prepare_fmmu(ec_slave_config_t *sc, ec_domain_t *domain, uint8_t sync_index, ec_direction_t dir)
Prepares an FMMU configuration.
void ec_slave_config_clear(ec_slave_config_t *sc)
Slave configuration destructor.
unsigned int ec_slave_config_idn_count(const ec_slave_config_t *sc)
Get the number of IDN configurations.
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.
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.
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.
ec_sdo_request_t * ec_slave_config_find_sdo_request(ec_slave_config_t *sc, unsigned int pos)
Finds a CoE handler via its position in the list.
void ec_slave_config_load_default_mapping(const ec_slave_config_t *sc, ec_pdo_t *pdo)
Loads the default mapping for a PDO from the slave object.
int ec_slave_config_attach(ec_slave_config_t *sc)
Attaches the configuration to the addressed slave object.
unsigned int ec_slave_config_sdo_count(const ec_slave_config_t *sc)
Get the number of SDO configurations.
ec_flag_t * ec_slave_config_find_flag(ec_slave_config_t *sc, const char *key)
Finds a flag.
unsigned int ec_slave_config_flag_count(const ec_slave_config_t *sc)
Get the number of feature flags.
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.
void ec_slave_config_detach(ec_slave_config_t *sc)
Detaches the configuration from a slave object.
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.
EtherCAT slave configuration structure.
#define EC_CONFIG_ERR(sc, fmt, args...)
Convenience macro for printing configuration-specific errors to syslog.
#define EC_CONFIG_WARN(sc, fmt, args...)
Convenience macro for printing configuration-specific warnings to syslog.
#define EC_CONFIG_DBG(sc, level, fmt, args...)
Convenience macro for printing configuration-specific debug messages to syslog.
void ec_soe_request_set_idn(ec_soe_request_t *req, uint16_t idn)
Set IDN.
void ec_soe_request_set_drive_no(ec_soe_request_t *req, uint8_t drive_no)
Set drive number.
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.
void ec_soe_request_init(ec_soe_request_t *req)
SoE request constructor.
void ec_soe_request_clear(ec_soe_request_t *req)
SoE request destructor.
Slave configutation feature flag.
char * key
Flag key (null-terminated ASCII string.
struct list_head list
List item.
int32_t value
Flag value (meaning depends on key).
uint32_t logical_start_address
Logical start address.
const ec_domain_t * domain
Domain.
uint8_t sync_index
Index of sync manager to use.
ec_reg_request_t * reg_request
Register request to process.
struct semaphore master_sem
Master semaphore.
unsigned int debug_level
Master debug level.
PDO entry configuration information.
uint8_t subindex
PDO entry subindex.
uint8_t bit_length
Size of the PDO entry in bit.
uint16_t index
PDO entry index.
uint8_t bit_length
entry length in bit
uint8_t subindex
PDO entry subindex.
uint16_t index
PDO entry index.
PDO configuration information.
ec_pdo_entry_info_t * entries
Array of PDO entries to map.
unsigned int n_entries
Number of PDO entries in entries to map.
struct list_head list
List of PDOs.
struct list_head entries
List of PDO entries.
int8_t sync_index
Assigned sync manager.
struct list_head list
List item.
struct list_head list
List item.
uint8_t complete_access
SDO shall be transferred completely.
size_t data_size
Size of SDO data.
uint8_t * data
Pointer to SDO data.
ec_sync_t * syncs
SYNC MANAGER categories.
uint32_t product_code
Vendor-specific product code.
uint16_t mailbox_protocols
Supported mailbox protocols.
uint32_t vendor_id
Vendor ID.
unsigned int sync_count
Number of sync managers.
Slave configuration state.
unsigned int online
The slave is online.
unsigned int operational
The slave was brought into OP state using the specified configuration.
unsigned int al_state
The application-layer state of the slave.
EtherCAT slave configuration.
uint32_t product_code
Slave product code.
ec_sync_config_t sync_configs[EC_MAX_SYNC_MANAGERS]
Sync manager configurations.
struct list_head flags
List of feature flags.
struct list_head reg_requests
List of register requests.
uint16_t dc_assign_activate
Vendor-specific AssignActivate word.
struct list_head sdo_requests
List of SDO requests.
uint16_t watchdog_intervals
Process data watchdog intervals (see spec.
uint16_t alias
Slave alias.
ec_fmmu_config_t fmmu_configs[EC_MAX_FMMUS]
FMMU configurations.
ec_coe_emerg_ring_t emerg_ring
CoE emergency ring buffer.
ec_sync_signal_t dc_sync[EC_SYNC_SIGNAL_COUNT]
DC sync signals.
struct list_head soe_configs
List of SoE configurations.
struct list_head sdo_configs
List of SDO configurations.
uint16_t watchdog_divider
Watchdog divider as a number of 40ns intervals (see spec.
uint8_t used_fmmus
Number of FMMUs used.
ec_master_t * master
Master owning the slave configuration.
ec_slave_t * slave
Slave pointer.
uint32_t vendor_id
Slave vendor ID.
uint16_t position
Index after alias.
struct list_head voe_handlers
List of VoE handlers.
ec_sii_t sii
Extracted SII data.
unsigned int force_config
Force (re-)configuration.
uint16_t ring_position
Ring position.
ec_slave_config_t * config
Current configuration.
ec_slave_state_t current_state
Current application state.
ec_fsm_slave_t fsm
Slave state machine.
Sercos-over-EtherCAT request.
struct list_head list
List item.
ec_al_state_t al_state
AL state (only valid for IDN config).
Sync manager configuration.
ec_direction_t dir
Sync manager direction.
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
ec_pdo_list_t pdos
Current PDO assignment.
Sync manager configuration information.
ec_pdo_info_t * pdos
Array with PDOs to assign.
unsigned int n_pdos
Number of PDOs in pdos.
ec_direction_t dir
Sync manager direction.
uint8_t index
Sync manager index.
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
uint32_t cycle_time
Cycle time [ns].
int32_t shift_time
Shift time [ns].
ec_pdo_list_t pdos
Current PDO assignment.
Vendor specific over EtherCAT handler.
struct list_head list
List item.
ec_direction_t ec_sync_default_direction(const ec_sync_t *sync)
Determines the default direction from the control register.
void ec_sync_config_clear(ec_sync_config_t *sync_config)
Destructor.
void ec_sync_config_init(ec_sync_config_t *sync_config)
Constructor.
void ec_voe_handler_clear(ec_voe_handler_t *voe)
VoE handler destructor.
int ec_voe_handler_init(ec_voe_handler_t *voe, ec_slave_config_t *sc, size_t size)
VoE handler constructor.
Vendor specific over EtherCAT protocol handler.