51 #define EC_SYSTEM_TIME_TOLERANCE_NS 1000 58 #ifdef EC_LOOP_CONTROL 65 #ifdef EC_LOOP_CONTROL 222 list_del_init(&request->
list);
223 request->
state = EC_INT_REQUEST_BUSY;
226 EC_MASTER_ERR(master,
"Emergency request data too large!\n");
227 request->
state = EC_INT_REQUEST_FAILURE;
235 " write requests!\n");
236 request->
state = EC_INT_REQUEST_FAILURE;
242 EC_MASTER_DBG(master, 1,
"Writing emergency register request...\n");
247 request->
state = EC_INT_REQUEST_SUCCESS;
273 unsigned int i, size;
295 "link down on %s device. Clearing slave list.\n",
341 unsigned int count = 0, next_dev_slave, ring_position;
375 " of slave memory!\n", size);
386 for (i = 0; i < count; i++, ring_position++) {
387 slave = master->
slaves + i;
388 while (i >= next_dev_slave) {
468 list_del_init(&request->
list);
469 request->
state = EC_INT_REQUEST_BUSY;
476 assign_to_pdi = flag->
value;
483 "Assigning SII back to EtherCAT.\n");
521 for (slave = master->
slaves;
530 EC_SLAVE_DBG(slave, 2,
"Busy - processing external request!\n");
535 if (req->
state == EC_INT_REQUEST_QUEUED) {
538 req->
state = EC_INT_REQUEST_FAILURE;
545 req->
state = EC_INT_REQUEST_FAILURE;
549 req->
state = EC_INT_REQUEST_BUSY;
551 " SDO request...\n");
584 for (slave = master->
slaves;
587 #ifndef EC_SKIP_SDO_DICT 603 #ifndef EC_SKIP_SDO_DICT 661 #ifdef EC_LOOP_CONTROL 665 void ec_fsm_master_action_read_dl_status(
673 fsm->
state = ec_fsm_master_state_read_dl_status;
680 void ec_fsm_master_action_open_port(
690 fsm->
state = ec_fsm_master_state_open_port;
699 void ec_fsm_master_state_read_dl_status(
712 EC_SLAVE_ERR(slave,
"Failed to receive AL state datagram: ");
731 switch (port->state) {
732 case EC_SLAVE_PORT_DOWN:
735 port->link_detection_jiffies = jiffies;
736 port->state = EC_SLAVE_PORT_WAIT;
740 port->state = EC_SLAVE_PORT_UP;
743 case EC_SLAVE_PORT_WAIT:
745 if (jiffies - port->link_detection_jiffies >
746 HZ * EC_PORT_WAIT_MS / 1000) {
747 port->state = EC_SLAVE_PORT_UP;
748 ec_fsm_master_action_open_port(fsm);
753 port->state = EC_SLAVE_PORT_DOWN;
758 port->state = EC_SLAVE_PORT_DOWN;
774 void ec_fsm_master_state_open_port(
786 EC_SLAVE_ERR(slave,
"Failed to receive port open datagram: ");
794 EC_SLAVE_ERR(slave,
"Did not respond to port open command!\n");
823 " (aborting state check).\n");
844 EC_SLAVE_DBG(slave, 1,
"Changing state from %s to %s%s.\n",
845 old_state, new_state,
857 #ifdef EC_LOOP_CONTROL 859 ec_fsm_master_action_read_dl_status(fsm);
884 EC_SLAVE_ERR(slave,
"Failed to receive AL state datagram: ");
894 EC_SLAVE_DBG(slave, 1,
"Slave did not respond to state query.\n");
919 #ifdef EC_LOOP_CONTROL 921 ec_fsm_master_action_read_dl_status(fsm);
944 EC_SLAVE_ERR(slave,
"Failed to acknowledge state change.\n");
975 " to measure transmission delays on %s link.\n",
987 #ifdef EC_LOOP_CONTROL 991 void ec_fsm_master_enter_loop_control(
996 " loop control registers on %s link.\n",
1003 fsm->
state = ec_fsm_master_state_loop_control;
1010 void ec_fsm_master_state_loop_control(
1023 " datagram on %s link: ",
1050 " clearing datagram on %s link: ",
1060 EC_MASTER_WARN(master,
"Failed to clear station addresses on %s link:" 1061 " Cleared %u of %u",
1066 #ifdef EC_LOOP_CONTROL 1067 ec_fsm_master_enter_loop_control(fsm);
1089 EC_MASTER_ERR(master,
"Failed to receive delay measuring datagram" 1098 EC_MASTER_DBG(master, 1,
"%u slaves responded to delay measuring" 1150 if (!(eoe = kmalloc(
sizeof(
ec_eoe_t), GFP_KERNEL))) {
1151 EC_SLAVE_ERR(slave,
"Failed to allocate EoE handler memory!\n");
1231 #ifdef EC_LOOP_CONTROL 1233 ec_fsm_master_action_read_dl_status(fsm);
1276 EC_MASTER_DBG(master, 1,
"No app_time received up to now.\n");
1298 u32 system_time32, old_offset32, new_offset;
1301 system_time32 = (u32) system_time;
1302 old_offset32 = (u32) old_offset;
1304 time_diff = (u32) app_time_sent - system_time32;
1306 EC_SLAVE_DBG(slave, 1,
"DC 32 bit system time offset calculation:" 1307 " system_time=%u, app_time=%llu, diff=%i\n",
1308 system_time32, app_time_sent, time_diff);
1311 new_offset = time_diff + old_offset32;
1312 EC_SLAVE_DBG(slave, 1,
"Setting time offset to %u (was %u)\n",
1313 new_offset, old_offset32);
1314 return (u64) new_offset;
1338 time_diff = app_time_sent - system_time;
1340 EC_SLAVE_DBG(slave, 1,
"DC 64 bit system time offset calculation:" 1341 " system_time=%llu, app_time=%llu, diff=%lli\n",
1342 system_time, app_time_sent, time_diff);
1345 new_offset = time_diff + old_offset;
1346 EC_SLAVE_DBG(slave, 1,
"Setting time offset to %llu (was %llu)\n",
1347 new_offset, old_offset);
1349 new_offset = old_offset;
1367 u64 system_time, old_offset, new_offset;
1374 EC_SLAVE_ERR(slave,
"Failed to receive DC times datagram: ");
1391 " abort DC time offset calculation.\n");
1410 if (new_offset != old_offset
1416 EC_SLAVE_DBG(slave, 1,
"Slave is running; ignoring DC offset change.\n");
1417 new_offset = old_offset;
1452 "Failed to receive DC system time offset datagram: ");
1460 EC_SLAVE_ERR(slave,
"Failed to set DC system time offset: ");
1469 EC_SLAVE_DBG(slave, 1,
"Slave is running; not resetting DC filter.\n");
1497 "Failed to receive DC reset filter datagram: ");
1532 EC_SLAVE_ERR(slave,
"Failed to receive SII assignment datagram: ");
1538 EC_SLAVE_ERR(slave,
"Failed to assign SII back to EtherCAT: ");
1545 EC_SLAVE_DBG(slave, 1,
"Writing SII data (after assignment)...\n");
1569 request->
state = EC_INT_REQUEST_FAILURE;
1586 EC_SLAVE_DBG(slave, 1,
"Finished writing %zu words of SII data.\n",
1597 request->
state = EC_INT_REQUEST_SUCCESS;
1630 unsigned int sdo_count, entry_count;
1632 EC_SLAVE_DBG(slave, 1,
"Fetched %u SDOs and %u entries.\n",
1633 sdo_count, entry_count);
1667 "Failed to process internal SDO request.\n");
1668 request->
state = EC_INT_REQUEST_FAILURE;
1675 request->
state = EC_INT_REQUEST_SUCCESS;
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
uint16_t ring_position
Ring position for emergency requests.
ec_internal_request_state_t state
Request state.
uint16_t offset
SII word offset.
uint16_t ring_position
Ring position.
ec_datagram_t * datagram
datagram used in the state machine
ec_sii_write_request_t * sii_request
SII write request.
ec_sii_t sii
Extracted SII data.
void ec_fsm_slave_config_start(ec_fsm_slave_config_t *fsm, ec_slave_t *slave)
Start slave configuration state machine.
ec_fsm_soe_t fsm_soe
SoE state machine.
void ec_master_calc_dc(ec_master_t *master)
Distributed-clocks calculations.
size_t transfer_size
Size of the data to transfer.
void ec_fsm_master_state_broadcast(ec_fsm_master_t *)
Master state: BROADCAST.
void ec_slave_attach_pdo_names(ec_slave_t *slave)
Attach PDO names.
struct list_head sii_requests
SII write requests.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
ec_fsm_pdo_t fsm_pdo
PDO configuration state machine.
void ec_fsm_master_state_configure_slave(ec_fsm_master_t *)
Master state: CONFIGURE SLAVE.
void ec_fsm_master_state_scan_slave(ec_fsm_master_t *)
Master state: SCAN SLAVE.
void ec_fsm_master_state_read_al_status(ec_fsm_master_t *)
Master state: READ AL STATUS.
Finite state machine of an EtherCAT master.
uint64_t app_time_sent
App time, when the datagram was sent.
ec_internal_request_state_t state
State of the request.
unsigned int slaves_responding[EC_MAX_NUM_DEVICES]
Number of responding slaves for every device.
void ec_fsm_slave_scan_init(ec_fsm_slave_scan_t *fsm, ec_datagram_t *datagram, ec_fsm_slave_config_t *fsm_slave_config, ec_fsm_pdo_t *fsm_pdo)
Constructor.
size_t ec_state_string(uint8_t, char *, uint8_t)
Prints slave states in clear text.
ec_slave_port_t ports[EC_MAX_PORTS]
Ports.
void ec_fsm_master_reset(ec_fsm_master_t *fsm)
Reset state machine.
struct ec_slave ec_slave_t
void ec_master_request_op(ec_master_t *master)
Request OP state for configured slaves.
int ec_fsm_slave_is_ready(const ec_fsm_slave_t *fsm)
Returns, if the FSM is currently not busy and ready to execute.
ec_slave_state_t current_state
Current application state.
#define ec_master_num_devices(MASTER)
Number of Ethernet devices.
size_t nwords
Number of words.
void(* state)(ec_fsm_master_t *)
master state function
ec_internal_request_state_t state
SDO request state.
uint16_t address
Register address.
struct list_head eoe_handlers
Ethernet over EtherCAT handlers.
ec_slave_port_link_t link
Port link status.
u64 ec_fsm_master_dc_offset32(ec_fsm_master_t *fsm, u64 system_time, u64 old_offset, u64 app_time_sent)
Configure 32 bit time offset.
unsigned int allow_scan
True, if slave scanning is allowed.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
void ec_fsm_master_restart(ec_fsm_master_t *fsm)
Restarts the master state machine.
unsigned int rescan_required
A bus rescan is required.
ec_sii_coe_details_t coe_details
CoE detail flags.
void ec_fsm_sii_write(ec_fsm_sii_t *fsm, ec_slave_t *slave, uint16_t word_offset, const uint16_t *value, ec_fsm_sii_addressing_t mode)
Initializes the SII write state machine.
void ec_master_expire_slave_config_requests(ec_master_t *master)
Abort active requests for slave configs without attached slaves.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
u64 ec_fsm_master_dc_offset64(ec_fsm_master_t *fsm, u64 system_time, u64 old_offset, u64 app_time_sent)
Configure 64 bit time offset.
u64 dc_ref_time
Common reference timestamp for DC start times.
ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]
AL states of responding slaves for every device.
struct list_head emerg_reg_requests
Emergency register access requests.
#define EC_SYSTEM_TIME_TOLERANCE_NS
Time difference [ns] to tolerate without setting a new system time offset.
ec_fsm_slave_t fsm
Slave state machine.
uint16_t working_counter
Working counter.
int ec_sdo_request_timed_out(const ec_sdo_request_t *req)
Checks, if the timeout was exceeded.
void ec_fsm_master_action_idle(ec_fsm_master_t *fsm)
Master action: IDLE.
int ec_eoe_init(ec_eoe_t *eoe, ec_slave_t *slave)
EoE constructor.
Acknowledge/Error bit (no actual state)
int ec_fsm_coe_success(const ec_fsm_coe_t *fsm)
Returns, if the state machine terminated with success.
void ec_fsm_master_state_sdo_dictionary(ec_fsm_master_t *)
Master state: SDO DICTIONARY.
uint8_t link_state
device link state
void ec_fsm_master_state_dc_read_offset(ec_fsm_master_t *)
Master state: DC READ OFFSET.
Sent (still in the queue).
void ec_slave_set_dl_status(ec_slave_t *slave, uint16_t new_state)
Sets the data-link state of a slave.
wait_queue_head_t request_queue
Wait queue for external requests from user space.
void ec_fsm_sii_init(ec_fsm_sii_t *fsm, ec_datagram_t *datagram)
Constructor.
EtherCAT master state machine.
uint16_t station_address
Configured station address.
const char * ec_device_names[2]
Device names.
struct list_head list
List head.
void ec_fsm_master_action_next_slave_state(ec_fsm_master_t *fsm)
Master action: Get state of next slave.
#define EC_WAIT_SDO_DICT
Seconds to wait before fetching SDO dictionary after slave entered PREOP state.
void ec_fsm_slave_config_init(ec_fsm_slave_config_t *fsm, ec_datagram_t *datagram, ec_fsm_change_t *fsm_change, ec_fsm_coe_t *fsm_coe, ec_fsm_soe_t *fsm_soe, ec_fsm_pdo_t *fsm_pdo)
Constructor.
int ec_fsm_slave_scan_exec(ec_fsm_slave_scan_t *fsm)
Executes the current state of the state machine.
Global definitions and macros.
void ec_fsm_pdo_clear(ec_fsm_pdo_t *fsm)
Destructor.
EtherCAT master structure.
SAFEOP (mailbox communication and input update)
ec_lock_t config_sem
Semaphore protecting the config_busy variable and the allow_config flag.
void ec_fsm_master_init(ec_fsm_master_t *fsm, ec_master_t *master, ec_datagram_t *datagram)
Constructor.
#define EC_MASTER_DBG(master, level, fmt, args...)
Convenience macro for printing master-specific debug messages to syslog.
void ec_fsm_master_state_sdo_request(ec_fsm_master_t *)
Master state: SDO REQUEST.
int ec_fsm_master_action_process_sii(ec_fsm_master_t *fsm)
Check for pending SII write requests and process one.
ec_slave_t * fsm_slave
Slave that is queried next for FSM exec.
ec_slave_t * slave
EtherCAT slave.
void ec_slave_sdo_dict_info(const ec_slave_t *slave, unsigned int *sdo_count, unsigned int *entry_count)
Counts the total number of SDOs and entries in the dictionary.
uint8_t loop_closed
Loop closed.
int ec_fsm_master_action_process_sdo(ec_fsm_master_t *fsm)
Check for pending SDO requests and process one.
void ec_master_attach_slave_configs(ec_master_t *master)
Attaches the slave configurations to the slaves.
int ec_datagram_apwr(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APWR datagram.
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
u8 dc_offset_valid
DC slaves have valid system time offsets.
Ethernet over EtherCAT (EoE)
ec_datagram_state_t state
State.
void ec_fsm_master_enter_write_system_times(ec_fsm_master_t *)
Start writing DC system times.
ec_slave_config_t * config
Current configuration.
ec_master_phase_t phase
Master phase.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
ec_fsm_sii_t fsm_sii
SII state machine.
ec_slave_t * slaves
Array of slaves on the bus.
uint8_t enable_sdo_info
SDO information service available.
Use configured addresses.
Slave configutation feature flag.
ec_fsm_slave_scan_t fsm_slave_scan
slave state machine
uint8_t sdo_dictionary_fetched
Dictionary has been fetched.
struct list_head sdo_requests
List of SDO requests.
void ec_fsm_master_action_configure(ec_fsm_master_t *fsm)
Master action: Configure.
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_sdo_request_t * sdo_request
SDO request to process.
unsigned int debug_level
Master debug level.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
void ec_datagram_print_wc_error(const ec_datagram_t *datagram)
Evaluates the working counter of a single-cast datagram.
ec_slave_dc_range_t base_dc_range
DC range.
void ec_fsm_slave_set_ready(ec_fsm_slave_t *fsm)
Sets the current state of the state machine to READY.
int ec_fsm_change_exec(ec_fsm_change_t *fsm)
Executes the current state of the state machine.
uint32_t transmission_delay
DC system time transmission delay (offset from reference clock).
unsigned int slave_count
Number of slaves on the bus.
unsigned int scan_busy
Current scan state.
ec_device_index_t
Master devices.
void ec_fsm_pdo_init(ec_fsm_pdo_t *fsm, ec_fsm_coe_t *fsm_coe)
Constructor.
void ec_fsm_coe_clear(ec_fsm_coe_t *fsm)
Destructor.
uint16_t alias
Configured station alias.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
unsigned long scan_jiffies
beginning of slave scanning
#define EC_ABS(X)
Absolute value.
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
void ec_fsm_master_enter_clear_addresses(ec_fsm_master_t *)
Start clearing slave addresses.
#define EC_MASTER_WARN(master, fmt, args...)
Convenience macro for printing master-specific warnings to syslog.
unsigned int active
Master has been activated.
void ec_fsm_master_state_assign_sii(ec_fsm_master_t *)
Master state: ASSIGN SII.
void ec_fsm_change_clear(ec_fsm_change_t *fsm)
Destructor.
int ec_datagram_brd(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRD datagram.
void ec_fsm_master_state_dc_measure_delays(ec_fsm_master_t *)
Master state: DC MEASURE DELAYS.
int ec_datagram_fpwr(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPWR datagram.
uint8_t has_dc_system_time
The slave supports the DC system time register.
void ec_fsm_master_state_dc_write_offset(ec_fsm_master_t *)
Master state: DC WRITE OFFSET.
wait_queue_head_t scan_queue
Queue for processes that wait for slave scanning.
#define EC_MASTER_ERR(master, fmt, args...)
Convenience macro for printing master-specific errors to syslog.
int ec_datagram_fprd(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRD datagram.
void ec_fsm_coe_dictionary(ec_fsm_coe_t *fsm, ec_slave_t *slave)
Starts reading a slaves' SDO dictionary.
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
int ec_fsm_master_idle(const ec_fsm_master_t *fsm)
void ec_master_clear_slaves(ec_master_t *master)
Clear all slaves.
#define EC_SLAVE_INFO(slave, fmt, args...)
Convenience macro for printing slave-specific information to syslog.
void ec_fsm_change_init(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
Constructor.
struct list_head list
list item
void ec_fsm_coe_init(ec_fsm_coe_t *fsm)
Constructor.
uint8_t valid_mbox_data
Received mailbox data is valid.
void ec_fsm_sii_clear(ec_fsm_sii_t *fsm)
Destructor.
INIT state (no mailbox communication, no IO)
int idle
state machine is in idle phase
void ec_fsm_master_state_dc_reset_filter(ec_fsm_master_t *)
Master state: DC RESET FILTER.
uint16_t effective_alias
Effective alias address.
void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *)
Master state: CLEAR ADDRESSES.
void ec_master_clear_eoe_handlers(ec_master_t *master)
Clear and free all EoE handlers.
ec_fsm_slave_config_t fsm_slave_config
slave state machine
int ec_fsm_sii_exec(ec_fsm_sii_t *fsm)
Executes the SII state machine.
int ec_fsm_sii_success(ec_fsm_sii_t *fsm)
Returns, if the master startup state machine terminated with success.
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
void ec_master_eoe_start(ec_master_t *master)
Starts Ethernet over EtherCAT processing on demand.
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
void ec_fsm_master_state_acknowledge(ec_fsm_master_t *)
Master state: ACKNOWLEDGE.
ec_master_t * master
master the FSM runs on
uint8_t * data
Pointer to data memory.
#define EC_STATE_STRING_SIZE
Minimum size of a buffer used with ec_state_string().
#define EC_WRITE_U64(DATA, VAL)
Write a 64-bit unsigned value to EtherCAT data.
#define EC_MAX_PORTS
Maximum number of slave ports.
int ec_fsm_slave_config_exec(ec_fsm_slave_config_t *fsm)
Executes the current state of the state machine.
int ec_fsm_coe_exec(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
void ec_slave_init(ec_slave_t *slave, ec_master_t *master, ec_device_index_t dev_idx, uint16_t ring_position, uint16_t station_address)
Slave constructor.
ec_direction_t dir
Direction.
void ec_fsm_change_ack(ec_fsm_change_t *fsm, ec_slave_t *slave)
Starts the change state machine to only acknowlegde a slave's state.
wait_queue_head_t config_queue
Queue for processes that wait for slave configuration.
int32_t value
Flag value (meaning depends on key).
unsigned int retries
retries on datagram timeout.
void ec_fsm_slave_config_clear(ec_fsm_slave_config_t *fsm)
Destructor.
unsigned long jiffies_preop
Time, the slave went to PREOP.
void ec_fsm_soe_init(ec_fsm_soe_t *fsm)
Constructor.
uint8_t base_dc_supported
Distributed clocks are supported.
void ec_fsm_soe_clear(ec_fsm_soe_t *fsm)
Destructor.
void ec_fsm_slave_scan_start(ec_fsm_slave_scan_t *fsm, ec_slave_t *slave)
Start slave scan state machine.
uint8_t * data
Datagram payload.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
EtherCAT slave configuration.
int ec_fsm_master_exec(ec_fsm_master_t *fsm)
Executes the current state of the state machine.
int ec_fsm_slave_config_success(const ec_fsm_slave_config_t *fsm)
void ec_fsm_slave_scan_clear(ec_fsm_slave_scan_t *fsm)
Destructor.
EtherCAT slave configuration structure.
size_t mem_size
Datagram data memory size.
void ec_fsm_master_enter_dc_measure_delays(ec_fsm_master_t *fsm)
Start measuring DC delays.
ec_device_index_t device_index
Index of device the slave responds on.
void ec_fsm_coe_transfer(ec_fsm_coe_t *fsm, ec_slave_t *slave, ec_sdo_request_t *request)
Starts to transfer an SDO to/from a slave.
ec_slave_t * slave
current slave
Values written by the master.
void ec_fsm_master_state_start(ec_fsm_master_t *)
Master state: START.
ec_fsm_change_t fsm_change
State change state machine.
Ethernet over EtherCAT (EoE) handler.
void ec_fsm_master_state_write_sii(ec_fsm_master_t *)
Master state: WRITE SII.
off_t sii_index
index to SII write request data
#define EC_MASTER_INFO(master, fmt, args...)
Convenience macro for printing master-specific information to syslog.
unsigned int error_flag
Stop processing after an error.
unsigned int config_changed
The configuration changed.
struct list_head list
List item.
ec_slave_state_t requested_state
Requested application state.
ec_device_index_t dev_idx
Current device index (for scanning etc.).
#define EC_READ_U64(DATA)
Read a 64-bit unsigned value from EtherCAT data.
uint8_t link_up
Link detected.
ec_device_t devices[EC_MAX_NUM_DEVICES]
EtherCAT devices.
ec_lock_t scan_sem
Semaphore protecting the scan_busy variable and the allow_scan flag.
unsigned int config_busy
State of slave configuration.
const uint16_t * words
Pointer to the data words.
void ec_fsm_master_clear(ec_fsm_master_t *fsm)
Destructor.
EtherCAT FoE state machines.
void ec_slave_set_al_status(ec_slave_t *slave, ec_slave_state_t new_state)
Sets the application state of a slave.
void ec_master_eoe_stop(ec_master_t *master)
Stops the Ethernet over EtherCAT processing.
uint8_t link_state[EC_MAX_NUM_DEVICES]
Last link state for every device.
ec_fsm_coe_t fsm_coe
CoE state machine.
unsigned int force_config
Force (re-)configuration.
int ec_fsm_change_success(ec_fsm_change_t *fsm)
Returns, if the state machine terminated with success.
unsigned int has_general
General category present.
int ec_datagram_bwr(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BWR datagram.