72 INIT_LIST_HEAD(&fsm->
list);
152 fsm->
state(fsm, datagram);
163 return datagram_used;
221 if (req->
state == EC_INT_REQUEST_QUEUED || req->
state == EC_INT_REQUEST_BUSY) {
281 list_del_init(&request->
list);
285 " slave has error flag set.\n");
286 request->
state = EC_INT_REQUEST_FAILURE;
293 EC_SLAVE_WARN(slave,
"Aborting SDO request, slave is in INIT.\n");
294 request->
state = EC_INT_REQUEST_FAILURE;
301 request->
state = EC_INT_REQUEST_BUSY;
330 EC_SLAVE_ERR(slave,
"Failed to process SDO request.\n");
331 request->
state = EC_INT_REQUEST_FAILURE;
341 request->
state = EC_INT_REQUEST_SUCCESS;
366 if (reg->
state == EC_INT_REQUEST_QUEUED) {
386 " slave has error flag set.\n");
395 EC_SLAVE_DBG(slave, 1,
"Processing register request...\n");
436 " request datagram: ");
438 reg->
state = EC_INT_REQUEST_FAILURE;
450 reg->
state = EC_INT_REQUEST_SUCCESS;
451 EC_SLAVE_DBG(slave, 1,
"Register request successful.\n");
453 reg->
state = EC_INT_REQUEST_FAILURE;
456 " (working counter is %u).\n",
485 list_del_init(&request->
list);
489 " slave has error flag set.\n");
490 request->
state = EC_INT_REQUEST_FAILURE;
496 request->
state = EC_INT_REQUEST_BUSY;
525 request->
state = EC_INT_REQUEST_FAILURE;
533 EC_SLAVE_DBG(slave, 1,
"Successfully transferred %zu bytes of FoE" 536 request->
state = EC_INT_REQUEST_SUCCESS;
562 list_del_init(&req->
list);
566 " slave has error flag set.\n");
567 req->
state = EC_INT_REQUEST_FAILURE;
574 EC_SLAVE_WARN(slave,
"Aborting SoE request, slave is in INIT.\n");
575 req->
state = EC_INT_REQUEST_FAILURE;
582 req->
state = EC_INT_REQUEST_BUSY;
611 EC_SLAVE_ERR(slave,
"Failed to process SoE request.\n");
612 request->
state = EC_INT_REQUEST_FAILURE;
622 request->
state = EC_INT_REQUEST_SUCCESS;
648 list_del_init(&request->
list);
655 " slave does not support SDO Info.\n");
656 request->
state = EC_INT_REQUEST_SUCCESS;
666 " dictionary already uploaded.\n");
667 request->
state = EC_INT_REQUEST_SUCCESS;
676 " slave has error flag set.\n");
677 request->
state = EC_INT_REQUEST_FAILURE;
684 EC_SLAVE_WARN(slave,
"Aborting dictioanry request, slave is in INIT.\n");
685 request->
state = EC_INT_REQUEST_FAILURE;
692 request->
state = EC_INT_REQUEST_BUSY;
695 EC_SLAVE_DBG(slave, 1,
"Processing dictionary request...\n");
721 EC_SLAVE_ERR(slave,
"Failed to process dictionary request.\n");
722 request->
state = EC_INT_REQUEST_FAILURE;
729 EC_SLAVE_DBG(slave, 1,
"Finished dictionary request.\n");
737 request->
state = EC_INT_REQUEST_SUCCESS;
763 list_del_init(&request->
list);
767 " slave has error flag set.\n");
768 request->
state = EC_INT_REQUEST_FAILURE;
775 EC_SLAVE_WARN(slave,
"Aborting EoE request, slave is in INIT.\n");
776 request->
state = EC_INT_REQUEST_FAILURE;
783 request->
state = EC_INT_REQUEST_BUSY;
812 req->
state = EC_INT_REQUEST_SUCCESS;
816 req->
state = EC_INT_REQUEST_FAILURE;
817 EC_SLAVE_ERR(slave,
"Failed to process EoE request.\n");
int ec_fsm_eoe_exec(ec_fsm_eoe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
ec_internal_request_state_t state
Request state.
void ec_fsm_slave_clear(ec_fsm_slave_t *fsm)
Destructor.
ec_sii_t sii
Extracted SII data.
int ec_fsm_foe_success(const ec_fsm_foe_t *fsm)
Returns, if the state machine terminated with success.
size_t transfer_size
Size of the data to transfer.
ec_dict_request_t * dict_request
Dictionary request to process.
void ec_slave_attach_pdo_names(ec_slave_t *slave)
Attach PDO names.
ec_foe_request_t * foe_request
FoE request to process.
void ec_fsm_foe_clear(ec_fsm_foe_t *fsm)
Destructor.
struct list_head list
List item.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
ec_reg_request_t * reg_request
Register request to process.
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.
ec_internal_request_state_t state
SDO request state.
uint16_t address
Register address.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
ec_sii_coe_details_t coe_details
CoE detail flags.
ec_internal_request_state_t state
Request state.
ec_fsm_soe_t fsm_soe
SoE state machine.
Finite state machine of an EtherCAT slave.
ec_datagram_t * datagram
Previous state datagram.
struct list_head reg_requests
Register access requests.
uint16_t working_counter
Working counter.
void ec_fsm_eoe_init(ec_fsm_eoe_t *fsm)
Constructor.
void ec_fsm_foe_transfer(ec_fsm_foe_t *fsm, ec_slave_t *slave, ec_foe_request_t *request)
Prepares an FoE transfer.
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.
int ec_fsm_slave_action_process_foe(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending FoE requests and process one.
wait_queue_head_t request_queue
Wait queue for external requests from user space.
ec_sdo_request_t * sdo_request
SDO request to process.
uint16_t station_address
Configured station address.
void ec_fsm_eoe_set_ip_param(ec_fsm_eoe_t *fsm, ec_slave_t *slave, ec_eoe_request_t *request)
Starts to set the EoE IP partameters of a slave.
Global definitions and macros.
EtherCAT master structure.
ec_eoe_request_t * eoe_request
EoE request to process.
ec_slave_t * slave
slave the FSM runs on
struct list_head sdo_requests
SDO access requests.
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
void ec_fsm_slave_state_soe_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: SOE_REQUEST.
void ec_fsm_foe_init(ec_fsm_foe_t *fsm)
Constructor.
void ec_fsm_soe_transfer(ec_fsm_soe_t *fsm, ec_slave_t *slave, ec_soe_request_t *request)
Starts to transfer an IDN to/from a slave.
int ec_fsm_soe_success(const ec_fsm_soe_t *fsm)
Returns, if the state machine terminated with success.
struct list_head soe_requests
SoE requests.
ec_datagram_state_t state
State.
ec_slave_config_t * config
Current configuration.
struct list_head reg_requests
List of register requests.
int ec_fsm_slave_action_process_reg(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending register requests and process one.
uint8_t enable_sdo_info
SDO information service available.
uint8_t sdo_dictionary_fetched
Dictionary has been fetched.
struct list_head sdo_requests
List of SDO requests.
uint16_t mailbox_protocols
Supported mailbox protocols.
void ec_fsm_slave_state_eoe_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: EOE_REQUEST.
void ec_fsm_slave_state_ready(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: READY.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
void ec_fsm_slave_set_ready(ec_fsm_slave_t *fsm)
Sets the current state of the state machine to READY.
ec_soe_request_t * soe_request
SoE request to process.
void ec_fsm_coe_clear(ec_fsm_coe_t *fsm)
Destructor.
ec_fsm_eoe_t fsm_eoe
EoE state machine.
int ec_fsm_eoe_success(const ec_fsm_eoe_t *fsm)
Returns, if the state machine terminated with success.
int ec_fsm_slave_exec(ec_fsm_slave_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
ec_master_t * master
Master owning the slave.
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.
void ec_fsm_slave_state_sdo_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: SDO_REQUEST.
void ec_fsm_slave_state_foe_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: FOE REQUEST.
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.
Values read by the master.
int ec_fsm_slave_action_process_dict(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending dictionary requests and process one.
CANopen dictionary request.
int ec_fsm_slave_action_process_eoe(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending EoE IP parameter requests and process one.
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
size_t data_size
Size of FoE data.
#define EC_SLAVE_INFO(slave, fmt, args...)
Convenience macro for printing slave-specific information to syslog.
struct list_head list
List item.
void ec_fsm_coe_init(ec_fsm_coe_t *fsm)
Constructor.
Ethernet-over-EtherCAT set IP parameter request.
void ec_fsm_eoe_clear(ec_fsm_eoe_t *fsm)
Destructor.
INIT state (no mailbox communication, no IO)
uint8_t subindex
SDO subindex.
ec_internal_request_state_t state
Request state.
struct list_head foe_requests
FoE requests.
int ec_fsm_foe_exec(ec_fsm_foe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
struct list_head list
Used for execution list.
uint8_t * data
Pointer to data memory.
struct list_head list
List item.
void ec_fsm_slave_init(ec_fsm_slave_t *fsm, ec_slave_t *slave)
Constructor.
int ec_fsm_coe_exec(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
EtherCAT slave request state machine.
ec_direction_t dir
Direction.
void ec_fsm_slave_state_idle(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: IDLE.
ec_fsm_foe_t fsm_foe
FoE state machine.
void ec_fsm_soe_init(ec_fsm_soe_t *fsm)
Constructor.
void ec_fsm_soe_clear(ec_fsm_soe_t *fsm)
Destructor.
uint8_t * data
Datagram payload.
struct list_head dict_requests
Dictionary read requests.
ec_fsm_coe_t fsm_coe
CoE state machine.
EtherCAT slave configuration structure.
ec_internal_request_state_t state
FoE request state.
ec_device_index_t device_index
Index of device the slave responds on.
int ec_fsm_soe_exec(ec_fsm_soe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
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.
int ec_fsm_slave_action_process_soe(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending SoE requests and process one.
struct list_head list
List item.
struct list_head eoe_requests
EoE set IP parameter requests.
void(* state)(ec_fsm_slave_t *, ec_datagram_t *)
State function.
struct list_head list
List item.
void ec_fsm_slave_state_reg_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: Register request.
int ec_fsm_slave_action_process_sdo(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending SDO requests and process one.
struct list_head list
List item.
unsigned int has_general
General category present.
Sercos-over-EtherCAT request.
ec_internal_request_state_t state
SDO request state.
void ec_fsm_slave_state_dict_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: DICT_REQUEST.