80 INIT_LIST_HEAD(&fsm->
list);
190 fsm->
state(fsm, datagram);
202 return datagram_used;
236 EC_SLAVE_DBG(slave, 1,
"Scanning slave %u on %s link.\n",
266 if ((eoe->
slave == NULL) &&
307 if (!(eoe = kmalloc(
sizeof(
ec_eoe_t), GFP_KERNEL))) {
308 EC_SLAVE_ERR(slave,
"Failed to allocate EoE handler memory!\n");
345 fsm->
state(fsm, datagram);
358 EC_SLAVE_DBG(slave, 1,
"Changing state from %s to %s%s.\n",
359 old_state, new_state,
381 fsm->
state(fsm, datagram);
404 EC_SLAVE_ERR(slave,
"Failed to acknowledge state change.\n");
460 list_del_init(&request->
list);
463 EC_SLAVE_ERR(slave,
"Slave not ready to process dictionary request\n");
464 request->
state = EC_INT_REQUEST_FAILURE;
475 " slave does not support SDO Info.\n");
476 request->
state = EC_INT_REQUEST_SUCCESS;
486 " dictionary already uploaded.\n");
487 request->
state = EC_INT_REQUEST_SUCCESS;
496 " slave has error flag set.\n");
497 request->
state = EC_INT_REQUEST_FAILURE;
505 " slave is in INIT.\n");
506 request->
state = EC_INT_REQUEST_FAILURE;
513 request->
state = EC_INT_REQUEST_BUSY;
516 EC_SLAVE_DBG(slave, 1,
"Processing dictionary request...\n");
571 EC_SLAVE_ERR(slave,
"Failed to process dictionary request.\n");
572 #if !EC_SKIP_SDO_DICT 578 request->
state = EC_INT_REQUEST_FAILURE;
586 unsigned int sdo_count, entry_count;
588 EC_SLAVE_DBG(slave, 1,
"Fetched %u SDOs and %u entries.\n",
589 sdo_count, entry_count);
598 request->
state = EC_INT_REQUEST_SUCCESS;
623 if (request->
state == EC_INT_REQUEST_QUEUED) {
625 request->
state = EC_INT_REQUEST_FAILURE;
626 EC_SLAVE_DBG(slave, 1,
"Internal SDO request timed out.\n");
632 " slave has error flag set.\n");
633 request->
state = EC_INT_REQUEST_FAILURE;
638 EC_SLAVE_WARN(slave,
"Aborting SDO request, slave is in INIT.\n");
639 request->
state = EC_INT_REQUEST_FAILURE;
643 request->
state = EC_INT_REQUEST_BUSY;
644 EC_SLAVE_DBG(slave, 1,
"Processing internal SDO request...\n");
784 list_del_init(&request->
list);
788 " slave has error flag set.\n");
789 request->
state = EC_INT_REQUEST_FAILURE;
796 EC_SLAVE_WARN(slave,
"Aborting SDO request, slave is in INIT.\n");
797 request->
state = EC_INT_REQUEST_FAILURE;
804 request->
state = EC_INT_REQUEST_BUSY;
833 EC_SLAVE_ERR(slave,
"Failed to process SDO request.\n");
834 request->
state = EC_INT_REQUEST_FAILURE;
844 request->
state = EC_INT_REQUEST_SUCCESS;
861 static const char *direction_names[] = {
876 if (reg->
state == EC_INT_REQUEST_QUEUED) {
896 " slave has error flag set.\n");
905 EC_SLAVE_DBG(slave, 1,
"Processing register request %s 0x%04X-0x%04X...\n",
931 EC_SLAVE_WARN(slave,
"Aborting register request, unknown direction.\n");
964 " request datagram: ");
966 reg->
state = EC_INT_REQUEST_FAILURE;
978 reg->
state = EC_INT_REQUEST_SUCCESS;
979 EC_SLAVE_DBG(slave, 1,
"Register request successful.\n");
981 reg->
state = EC_INT_REQUEST_FAILURE;
984 " (working counter is %u).\n",
1010 if (request->
state == EC_INT_REQUEST_QUEUED) {
1030 " slave has error flag set.\n");
1065 EC_SLAVE_ERR(slave,
"Failed to handle FoE request.\n");
1066 request->
state = EC_INT_REQUEST_FAILURE;
1074 EC_SLAVE_DBG(slave, 1,
"Successfully transferred %zu bytes of FoE" 1077 request->
state = EC_INT_REQUEST_SUCCESS;
1103 list_del_init(&req->
list);
1107 " slave has error flag set.\n");
1108 req->
state = EC_INT_REQUEST_FAILURE;
1115 EC_SLAVE_WARN(slave,
"Aborting SoE request, slave is in INIT.\n");
1116 req->
state = EC_INT_REQUEST_FAILURE;
1123 req->
state = EC_INT_REQUEST_BUSY;
1155 list_del_init(&req->
list);
1159 " slave has error flag set.\n");
1160 req->
state = EC_INT_REQUEST_FAILURE;
1168 " slave is in INIT.\n");
1169 req->
state = EC_INT_REQUEST_FAILURE;
1176 req->
state = EC_INT_REQUEST_BUSY;
1179 EC_SLAVE_DBG(slave, 1,
"Processing MBox Gateway request...\n");
1205 EC_SLAVE_ERR(slave,
"Failed to process MBox Gateway request.\n");
1206 request->
state = EC_INT_REQUEST_FAILURE;
1213 EC_SLAVE_DBG(slave, 1,
"Finished MBox Gateway request.\n");
1216 request->
state = EC_INT_REQUEST_SUCCESS;
1239 EC_SLAVE_ERR(slave,
"Failed to process SoE request.\n");
1240 request->
state = EC_INT_REQUEST_FAILURE;
1250 request->
state = EC_INT_REQUEST_SUCCESS;
1276 list_del_init(&request->
list);
1280 " slave has error flag set.\n");
1281 request->
state = EC_INT_REQUEST_FAILURE;
1288 EC_SLAVE_WARN(slave,
"Aborting EoE request, slave is in INIT.\n");
1289 request->
state = EC_INT_REQUEST_FAILURE;
1296 request->
state = EC_INT_REQUEST_BUSY;
1325 req->
state = EC_INT_REQUEST_SUCCESS;
1329 req->
state = EC_INT_REQUEST_FAILURE;
1330 EC_SLAVE_ERR(slave,
"Failed to process EoE request.\n");
ec_fsm_change_t fsm_change
State change state machine.
struct list_head mbg_requests
EoE set IP parameter requests.
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.
uint16_t ring_position
Ring position.
void ec_fsm_slave_config_start(ec_fsm_slave_config_t *fsm)
Start slave configuration state machine.
ec_internal_request_state_t state
Request state.
void ec_fsm_slave_clear(ec_fsm_slave_t *fsm)
Destructor.
#define EC_DATAGRAM_NAME_SIZE
Size of the datagram description string.
int ec_fsm_foe_success(const ec_fsm_foe_t *fsm)
Returns, if the state machine terminated with success.
void ec_fsm_slave_state_foe_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: FOE REQUEST.
char * ec_eoe_name(const ec_eoe_t *eoe)
Returns the eoe device name.
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.
void ec_fsm_slave_state_eoe_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: EOE_REQUEST.
EtherCAT Mailbox Gateway request.
struct list_head list
List item.
bool eoe_autocreate
Auto-create EOE interfaces.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
ec_slave_t * slave
pointer to the corresponding slave
OP (mailbox communication and input/output update)
ec_reg_request_t * reg_request
Register request to process.
struct list_head foe_requests
List of FoE requests.
size_t ec_state_string(uint8_t, char *, uint8_t)
Prints slave states in clear text.
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.
int ec_fsm_slave_action_process_mbg(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending MBox Gateway requests and process one.
struct list_head eoe_handlers
Ethernet over EtherCAT handlers.
void ec_fsm_change_init(ec_fsm_change_t *fsm)
Constructor.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
int ec_fsm_slave_action_process_dict(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending SDO dictionary reads.
ec_sii_coe_details_t coe_details
CoE detail flags.
void ec_fsm_slave_config_quick_start(ec_fsm_slave_config_t *fsm)
Start slave configuration state machine for "quick" SAFEOP->OP.
void ec_fsm_slave_state_soe_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: SOE_REQUEST.
ec_internal_request_state_t state
Request state.
static int ec_slave_reconnect_to_eoe_handler(ec_slave_t *slave)
try to reconnect to an existing EoE handler.
size_t data_size
Size of FoE data.
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.
int ec_sdo_request_timed_out(const ec_sdo_request_t *req)
Checks, if the timeout was exceeded.
int ec_fsm_slave_action_process_foe(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending FoE requests and process one.
void ec_fsm_foe_transfer(ec_fsm_foe_t *fsm, ec_slave_t *slave, ec_foe_request_t *request)
Prepares an FoE transfer.
int ec_fsm_slave_scan_exec(ec_fsm_slave_scan_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
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_slave_state_scan(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: SCAN.
ec_dict_request_t int_dict_request
Internal dictionary request.
wait_queue_head_t request_queue
Wait queue for external requests from user space.
ec_sdo_request_t * sdo_request
SDO request to process.
int ec_fsm_slave_action_process_reg(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending register requests and process one.
uint16_t station_address
Configured station address.
const char * ec_device_names[2]
Device names.
int ec_fsm_slave_action_process_soe(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending SoE requests and process one.
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.
int ec_fsm_slave_action_process_config_sdo(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending internal SDO requests and process one.
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_slave_state_sdo_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: SDO_REQUEST.
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.
ec_eoe_request_t * eoe_request
EoE request to process.
ec_slave_t * slave
slave the FSM runs on
void ec_fsm_mbg_transfer(ec_fsm_mbg_t *fsm, ec_slave_t *slave, ec_mbg_request_t *request)
Starts to transfer a mailbox gateway request to/from a slave.
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_foe_init(ec_fsm_foe_t *fsm)
Constructor.
ec_sii_image_t * sii_image
Current complete SII image.
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.
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_config(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: CONFIG.
unsigned int debug_level
Master debug level.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
struct list_head list
List item.
void ec_fsm_slave_state_reg_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: Register request.
void ec_fsm_slave_set_ready(ec_fsm_slave_t *fsm)
Sets the current state of the state machine to READY.
ec_fsm_slave_config_t fsm_slave_config
slave config state machine.
void ec_fsm_mbg_clear(ec_fsm_mbg_t *fsm)
Destructor.
ec_soe_request_t * soe_request
SoE request to process.
void ec_fsm_pdo_init(ec_fsm_pdo_t *fsm, ec_fsm_coe_t *fsm_coe)
Constructor.
int ec_fsm_mbg_success(const ec_fsm_mbg_t *fsm)
Returns, if the state machine terminated with success.
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.
void ec_fsm_change_clear(ec_fsm_change_t *fsm)
Destructor.
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.
Values read and written by the master.
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.
struct list_head list
List item.
void ec_fsm_coe_dictionary(ec_fsm_coe_t *fsm, ec_slave_t *slave)
Starts reading a slaves' SDO dictionary.
void ec_fsm_slave_state_dict_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: DICT_REQUEST.
Values read by the master.
CANopen dictionary request.
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
void ec_fsm_mbg_init(ec_fsm_mbg_t *fsm)
Constructor.
void ec_fsm_slave_state_ready(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: READY.
void ec_fsm_slave_state_acknowledge(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: ACKNOWLEDGE.
#define EC_SLAVE_INFO(slave, fmt, args...)
Convenience macro for printing slave-specific information to syslog.
struct list_head list
list item
struct list_head list
List item.
void ec_fsm_coe_init(ec_fsm_coe_t *fsm)
Constructor.
Ethernet-over-EtherCAT set IP parameter request.
ec_fsm_mbg_t fsm_mbg
MBox Gateway state machine.
void ec_fsm_eoe_clear(ec_fsm_eoe_t *fsm)
Destructor.
int ec_fsm_mbg_exec(ec_fsm_mbg_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
uint8_t valid_mbox_data
Received mailbox data is valid.
INIT state (no mailbox communication, no IO)
int ec_datagram_fprw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRW datagram.
uint16_t effective_alias
Effective alias address.
ec_internal_request_state_t state
Request state.
struct list_head foe_requests
FoE requests.
void ec_eoe_link_slave(ec_eoe_t *eoe, ec_slave_t *slave)
EoE link slave.
int ec_fsm_slave_action_process_sdo(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending SDO requests and process one.
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.
int ec_eoe_auto_init(ec_eoe_t *eoe, ec_slave_t *slave)
EoE auto constructor for slave.
void ec_fsm_slave_scan_start(ec_fsm_slave_scan_t *fsm)
Start slave scan state machine.
struct list_head list
Used for execution list.
uint8_t * data
Pointer to data memory.
ec_fsm_slave_scan_t fsm_slave_scan
slave scan state machine
#define EC_STATE_STRING_SIZE
Minimum size of a buffer used with ec_state_string().
ec_fsm_pdo_t fsm_pdo
PDO configuration state machine.
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.
ec_mbg_request_t * mbg_request
MBox Gateway request to process.
EtherCAT slave request state machine.
int ec_fsm_slave_config_exec(ec_fsm_slave_config_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
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.
int ec_fsm_change_exec(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
wait_queue_head_t config_queue
Queue for processes that wait for slave configuration.
void ec_fsm_slave_config_clear(ec_fsm_slave_config_t *fsm)
Destructor.
ec_fsm_foe_t fsm_foe
FoE state machine.
void ec_fsm_soe_init(ec_fsm_soe_t *fsm)
Constructor.
void ec_fsm_slave_config_init(ec_fsm_slave_config_t *fsm, ec_slave_t *slave, 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.
void ec_fsm_soe_clear(ec_fsm_soe_t *fsm)
Destructor.
uint8_t * data
Datagram payload.
void ec_dict_request_init(ec_dict_request_t *req)
Dictionary request constructor.
struct list_head dict_requests
Dictionary read requests.
ec_fsm_coe_t fsm_coe
CoE state machine.
int ec_fsm_slave_config_success(const ec_fsm_slave_config_t *fsm)
int ec_fsm_slave_set_unready(ec_fsm_slave_t *fsm)
Sets the current state of the state machine to IDLE.
void ec_fsm_slave_scan_clear(ec_fsm_slave_scan_t *fsm)
Destructor.
EtherCAT slave configuration structure.
ec_sii_t sii
Extracted SII data.
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_config(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending configuration.
Values written by the master.
Ethernet over EtherCAT (EoE) handler.
int ec_fsm_slave_action_scan(ec_fsm_slave_t *, ec_datagram_t *)
Check for pending scan.
uint8_t scan_required
Scan required.
unsigned int error_flag
Stop processing after an error.
void ec_fsm_slave_state_idle(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: IDLE.
void ec_fsm_slave_scan_init(ec_fsm_slave_scan_t *fsm, ec_slave_t *slave, ec_fsm_slave_config_t *fsm_slave_config, ec_fsm_pdo_t *fsm_pdo)
Constructor.
struct list_head list
List item.
ec_slave_state_t requested_state
Requested application state.
struct list_head eoe_requests
EoE set IP parameter requests.
void ec_fsm_slave_state_mbg_request(ec_fsm_slave_t *, ec_datagram_t *)
Slave state: MBG_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.
uint16_t last_al_error
Last AL state error code.
void(* state)(ec_fsm_slave_t *, ec_datagram_t *)
State function.
unsigned int config_busy
State of slave configuration.
struct list_head list
List item.
unsigned int force_config
Force (re-)configuration.
ec_internal_request_state_t state
FoE request state.
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.
Sercos-over-EtherCAT request.
ec_internal_request_state_t state
SDO request state.