43#include <linux/module.h>
44#include <linux/slab.h>
59 struct list_head list;
62 unsigned int timeout_ms;
110 INIT_LIST_HEAD(&sc->
flags);
145 list_for_each_entry_safe(req, next_req, &sc->
sdo_configs, list) {
146 list_del(&req->
list);
152 list_for_each_entry_safe(req, next_req, &sc->
sdo_requests, list) {
153 list_del(&req->
list);
159 list_for_each_entry_safe(soe, next_soe, &sc->
soe_requests, list) {
160 list_del(&soe->
list);
166 list_for_each_entry_safe(reg, next_reg, &sc->
reg_requests, list) {
167 list_del(®->
list);
173 list_for_each_entry_safe(voe, next_voe, &sc->
voe_handlers, list) {
174 list_del(&voe->
list);
180 list_for_each_entry_safe(soe, next_soe, &sc->
soe_configs, list) {
181 list_del(&soe->
list);
187 list_for_each_entry_safe(flag, next_flag, &sc->
flags, list) {
188 list_del(&flag->
list);
194 list_for_each_entry_safe(timeout, next_timeout, &sc->
al_timeouts, list) {
195 list_del(&timeout->list);
265 EC_CONFIG_DBG(sc, 1,
"Failed to find slave for configuration.\n");
270 EC_CONFIG_DBG(sc, 1,
"Failed to attach configuration. Slave %u"
276#ifdef EC_IDENT_WILDCARDS
281 EC_CONFIG_DBG(sc, 1,
"Slave %u has no matching vendor ID (0x%08X)"
282 " for configuration (0x%08X).\n",
288#ifdef EC_IDENT_WILDCARDS
293 EC_CONFIG_DBG(sc, 1,
"Slave %u has no matching product code (0x%08X)"
294 " for configuration (0x%08X).\n",
352 "SM%u has an invalid direction field!\n", sync_index);
374 EC_CONFIG_DBG(sc, 1,
"Loading default mapping for PDO 0x%04X.\n",
381 list_for_each_entry(default_pdo, &sync->
pdos.
list, list) {
385 if (default_pdo->
name) {
399 list_for_each_entry(entry, &pdo->
entries, list) {
423 unsigned int count = 0;
467 unsigned int count = 0;
511 unsigned int count = 0;
513 list_for_each_entry(flag, &sc->
flags, list) {
535 list_for_each_entry(flag, &sc->
flags, list) {
645 list_for_each_entry(flag, &sc->
flags, list) {
646 if (!strcmp(flag->
key, key)) {
666 list_for_each_entry(timeout, &sc->
al_timeouts, list) {
667 if (timeout->from == from && timeout->to == to) {
668 return timeout->timeout_ms;
684 EC_CONFIG_DBG(sc, 1,
"ecrt_slave_config_sync_manager(sc = 0x%p,"
685 " sync_index = %u, dir = %i, watchdog_mode = %i)\n",
686 sc, sync_index, dir, watchdog_mode);
689 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
694 EC_CONFIG_ERR(sc,
"Invalid direction %u!\n", (
unsigned int) dir);
699 sync_config->
dir = dir;
707 uint16_t divider, uint16_t intervals)
709 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, divider = %u, intervals = %u)\n",
710 __func__, sc, divider, intervals);
720 uint8_t sync_index, uint16_t pdo_index)
725 "pdo_index = 0x%04X)\n", __func__, sc, sync_index, pdo_index);
728 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
753 __func__, sc, sync_index);
756 EC_CONFIG_ERR(sc,
"Invalid sync manager index %u!\n", sync_index);
769 uint16_t pdo_index, uint16_t entry_index, uint8_t entry_subindex,
770 uint8_t entry_bit_length)
778 "pdo_index = 0x%04X, entry_index = 0x%04X, "
779 "entry_subindex = 0x%02X, entry_bit_length = %u)\n",
780 __func__, sc, pdo_index, entry_index, entry_subindex,
794 retval = PTR_ERR(entry);
796 EC_CONFIG_ERR(sc,
"PDO 0x%04X is not assigned.\n", pdo_index);
812 __func__, sc, pdo_index);
835 unsigned int i, j, k;
840 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, n_syncs = %u, syncs = 0x%p)\n",
841 __func__, sc, n_syncs, syncs);
846 for (i = 0; i < n_syncs; i++) {
847 sync_info = &syncs[i];
867 for (j = 0; j < sync_info->
n_pdos; j++) {
868 pdo_info = &sync_info->
pdos[j];
878 for (k = 0; k < pdo_info->
n_entries; k++) {
879 entry_info = &pdo_info->
entries[k];
903 unsigned int *bit_position
908 unsigned int bit_offset, bit_pos;
914 "subindex = 0x%02X, domain = 0x%p, bit_position = 0x%p)\n",
915 __func__, sc, index, subindex, domain, bit_position);
921 list_for_each_entry(pdo, &sync_config->
pdos.
list, list) {
922 list_for_each_entry(entry, &pdo->
entries, list) {
926 bit_pos = bit_offset % 8;
928 *bit_position = bit_pos;
929 }
else if (bit_pos) {
931 " not byte-align.\n", index, subindex);
936 sc, domain, sync_index, sync_config->
dir);
940 return sync_offset + bit_offset / 8;
956 unsigned int pdo_pos,
957 unsigned int entry_pos,
959 unsigned int *bit_position
963 unsigned int bit_offset, pp, ep;
967 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, sync_index = %u, pdo_pos = %u,"
968 " entry_pos = %u, domain = 0x%p, bit_position = 0x%p)\n",
969 __func__, sc, sync_index, pdo_pos, entry_pos,
970 domain, bit_position);
973 EC_CONFIG_ERR(sc,
"Invalid syncmanager position %u.\n", sync_index);
981 list_for_each_entry(pdo, &sync_config->
pdos.
list, list) {
983 list_for_each_entry(entry, &pdo->
entries, list) {
984 if (pp != pdo_pos || ep != entry_pos) {
987 unsigned int bit_pos = bit_offset % 8;
991 *bit_position = bit_pos;
992 }
else if (bit_pos) {
994 " not byte-align.\n",
1000 sc, domain, sync_index, sync_config->
dir);
1001 if (sync_offset < 0)
1004 return sync_offset + bit_offset / 8;
1011 EC_CONFIG_ERR(sc,
"PDO entry specification %u/%u/%u out of range.\n",
1012 sync_index, pdo_pos, entry_pos);
1019 uint32_t sync0_cycle_time, int32_t sync0_shift_time,
1020 uint32_t sync1_cycle_time, int32_t sync1_shift_time)
1022 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, assign_activate = 0x%04X,"
1023 " sync0_cycle = %u, sync0_shift = %i,"
1024 " sync1_cycle = %u, sync1_shift = %i\n",
1025 __func__, sc, assign_activate, sync0_cycle_time, sync0_shift_time,
1026 sync1_cycle_time, sync1_shift_time);
1039 uint8_t subindex,
const uint8_t *data,
size_t size)
1046 "subindex = 0x%02X, data = 0x%p, size = %zu)\n",
1047 __func__, sc, index, subindex, data, size);
1056 " SDO configuration!\n");
1079 uint8_t subindex, uint8_t value)
1084 "subindex = 0x%02X, value = %u)\n",
1085 __func__, sc, index, subindex, (
unsigned int) value);
1094 uint8_t subindex, uint16_t value)
1099 "subindex = 0x%02X, value = %u)\n",
1100 __func__, sc, index, subindex, value);
1109 uint8_t subindex, uint32_t value)
1114 "subindex = 0x%02X, value = %u)\n",
1115 __func__, sc, index, subindex, value);
1124 const uint8_t *data,
size_t size)
1131 "data = 0x%p, size = %zu)\n", __func__, sc, index, data, size);
1140 " SDO configuration!\n");
1201 "index = 0x%04X, subindex = 0x%02X, size = %zu)\n",
1202 __func__, sc, index, subindex, size);
1206 EC_CONFIG_ERR(sc,
"Failed to allocate SDO request memory!\n");
1207 return ERR_PTR(-ENOMEM);
1217 return ERR_PTR(ret);
1221 memset(req->
data, 0x00, size);
1238 return IS_ERR(s) ? NULL : s;
1253 "drive_no = 0x%02X, idn = 0x%04X, size = %zu)\n",
1254 __func__, sc, drive_no, idn, size);
1258 EC_CONFIG_ERR(sc,
"Failed to allocate IDN request memory!\n");
1259 return ERR_PTR(-ENOMEM);
1269 return ERR_PTR(ret);
1273 memset(req->
data, 0x00, size);
1289 drive_no, idn, size);
1290 return IS_ERR(req) ? NULL : req;
1305 __func__, sc, size);
1309 EC_CONFIG_ERR(sc,
"Failed to allocate register request memory!\n");
1310 return ERR_PTR(-ENOMEM);
1316 return ERR_PTR(ret);
1333 return IS_ERR(reg) ? NULL : reg;
1347 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, size = %zu)\n", __func__, sc, size);
1351 EC_CONFIG_ERR(sc,
"Failed to allocate VoE request memory!\n");
1352 return ERR_PTR(-ENOMEM);
1358 return ERR_PTR(ret);
1375 return IS_ERR(voe) ? NULL : voe;
1385 state->
online = slave ? 1 : 0;
1407 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, drive_no = %u, idn = 0x%04X, "
1408 "state = %u, data = 0x%p, size = %zu)\n",
1409 __func__, sc, drive_no, idn, state, data, size);
1413 (
unsigned int) drive_no);
1419 " must be PREOP or SAFEOP!\n");
1430 " IDN configuration!\n");
1459 EC_CONFIG_DBG(sc, 1,
"%s(sc = 0x%p, key = %s, value = %i)\n",
1460 __func__, sc, key, value);
1465 flag->
value = value;
1493 const unsigned char *mac_address)
1503 struct in_addr ip_address)
1513 struct in_addr subnet_mask)
1523 struct in_addr gateway_address)
1533 struct in_addr dns_address)
1575 list_for_each_entry(timeout, &sc->
al_timeouts, list) {
1576 if (timeout->from == from_state && timeout->to == to_state) {
1577 if (timeout_ms == 0) {
1579 list_del(&timeout->list);
1583 timeout->timeout_ms = timeout_ms;
1588 if (timeout_ms == 0) {
1596 " AL timeout configuration!\n");
1600 timeout->from = from_state;
1601 timeout->to = to_state;
1602 timeout->timeout_ms = timeout_ms;
int ec_coe_emerg_ring_overruns(const ec_coe_emerg_ring_t *ring)
Read the number of overruns.
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_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.
void ec_eoe_request_init(ec_eoe_request_t *req)
EoE request constructor.
EtherCAT EoE request structure.
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_t
State of an EtherCAT slave.
@ EC_SLAVE_STATE_OP
OP (mailbox communication and input/output update)
@ EC_SLAVE_STATE_UNKNOWN
unknown state
@ EC_MBOX_COE
CANopen over EtherCAT.
@ EC_MBOX_SOE
Servo-Profile over EtherCAT.
#define EC_MAX_FMMUS
Maximum number of FMMUs per slave.
struct ec_slave ec_slave_t
#define EC_MAX_HOSTNAME_SIZE
Maximum hostname size.
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.
struct ec_soe_request ec_soe_request_t
int ecrt_slave_config_emerg_clear(ec_slave_config_t *sc)
Clears CoE emergency ring buffer and the overrun counter.
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.
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.
ec_al_state_t
Application-layer state.
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_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_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals)
Configure a slave's watchdog times.
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_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_eoe_subnet_mask(ec_slave_config_t *sc, struct in_addr subnet_mask)
Sets the subnet mask for Ethernet-over-EtherCAT (EoE) operation.
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.
int ecrt_slave_config_emerg_overruns(const ec_slave_config_t *sc)
Read the number of CoE emergency overruns.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
struct ec_voe_handler ec_voe_handler_t
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_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_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index)
Clear a sync manager's PDO assignment.
struct ec_sdo_request ec_sdo_request_t
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.
int ecrt_slave_config_flag(ec_slave_config_t *sc, const char *key, int32_t value)
Adds a feature flag to a slave configuration.
struct ec_master ec_master_t
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.
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_direction_t
Direction type for PDO assignment functions.
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.
struct ec_domain ec_domain_t
struct ec_slave_config ec_slave_config_t
struct ec_reg_request ec_reg_request_t
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.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
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_complete_sdo(ec_slave_config_t *sc, uint16_t index, const uint8_t *data, size_t size)
Add configuration data for a complete SDO.
ec_watchdog_mode_t
Watchdog mode for sync manager configuration.
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.
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_eoe_hostname(ec_slave_config_t *sc, const char *name)
Sets the host name for Ethernet-over-EtherCAT (EoE) operation.
#define EC_END
End of list marker.
int 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_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_MAX_SYNC_MANAGERS
Maximum number of sync managers per slave.
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_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_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
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.
int 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_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.
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.
int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements)
Set the size of the CoE emergency ring buffer.
@ EC_AL_STATE_OP
Operational.
@ 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.
EtherCAT master character device IOCTL commands.
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.
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.
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 *, ec_domain_t *, uint8_t, ec_direction_t)
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_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.
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.
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.
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.
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.
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.
int ec_soe_request_alloc(ec_soe_request_t *req, size_t size)
Pre-allocates the data memory.
void ec_soe_request_clear(ec_soe_request_t *req)
SoE request destructor.
EtherCAT application-layer transition timeout.
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.
unsigned int n_entries
Number of PDO entries in entries to map.
ec_pdo_entry_info_t const * entries
Array of PDO 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.
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_requests
List of SoE requests.
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.
struct list_head al_timeouts
List of specific AL state timeouts.
uint32_t vendor_id
Slave vendor ID.
uint16_t position
Index after alias.
ec_eoe_request_t eoe_ip_param_request
EoE IP parameters.
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.
ec_al_state_t al_state
AL state (only valid for IDN config).
size_t data_size
Size of SDO data.
uint8_t * data
Pointer to SDO data.
struct list_head list
List item.
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.
unsigned int n_pdos
Number of PDOs in pdos.
ec_direction_t dir
Sync manager direction.
uint8_t index
Sync manager index.
ec_pdo_info_t const * pdos
Array with PDOs to assign.
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.
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.