47 #define EC_FSM_FOE_TIMEOUT_JIFFIES (3 * HZ) 51 #define EC_FOE_HEADER_SIZE 6 135 fsm->
state(fsm, datagram);
218 size_t remaining_size, current_size;
225 if (remaining_size < current_size) {
226 current_size = remaining_size;
231 datagram, EC_MBOX_TYPE_FOE, current_size + EC_FOE_HEADER_SIZE);
243 memcpy(data + EC_FOE_HEADER_SIZE,
306 EC_SLAVE_ERR(slave,
"Slave cannot process FoE write request." 307 " SII data not available.\n");
343 EC_SLAVE_ERR(slave,
"Failed to receive FoE mailbox check datagram: ");
351 EC_SLAVE_ERR(slave,
"Reception of FoE mailbox check datagram" 364 fsm->
state(fsm, datagram);
372 EC_SLAVE_ERR(slave,
"Timeout while waiting for ack response.\n");
406 EC_SLAVE_ERR(slave,
"Failed to receive FoE ack response datagram: ");
416 EC_SLAVE_ERR(slave,
"Reception of FoE ack response failed: ");
423 fsm->
state(fsm, datagram);
436 uint8_t *data, mbox_prot;
461 if (mbox_prot != EC_MBOX_TYPE_FOE) {
463 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
486 EC_SLAVE_ERR(slave,
"Received FoE Error Request (code 0x%08x).\n",
488 if (rec_size > 6 && data[6]) {
490 strncpy(text, data + 6, min(rec_size - 6,
sizeof(text)));
491 text[
sizeof(text)-1] = 0;
585 EC_SLAVE_ERR(slave,
"Failed to receive FoE ack response datagram: ");
592 EC_SLAVE_ERR(slave,
"Reception of FoE data send failed: ");
747 EC_SLAVE_ERR(slave,
"Slave cannot process FoE read request." 748 " SII data not available.\n");
802 fsm->
state(fsm, datagram);
810 EC_SLAVE_ERR(slave,
"Timeout while waiting for ack response.\n");
844 EC_SLAVE_ERR(slave,
"Failed to receive FoE DATA READ datagram: ");
854 EC_SLAVE_ERR(slave,
"Reception of FoE DATA READ failed: ");
861 fsm->
state(fsm, datagram);
875 uint8_t *data, opCode, packet_no, mbox_prot;
898 if (mbox_prot != EC_MBOX_TYPE_FOE) {
899 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
926 EC_SLAVE_ERR(slave,
"Received FoE Error Request (code 0x%08x).\n",
928 if (rec_size > 6 && data[6]) {
930 strncpy(text, data + 6, min(rec_size - 6,
sizeof(text)));
931 text[
sizeof(text)-1] = 0;
939 EC_SLAVE_ERR(slave,
"Received OPCODE %x, expected %x.\n",
948 EC_SLAVE_ERR(slave,
"Received packet number %u, expected %u.\n",
986 EC_SLAVE_ERR(slave,
"Data do not fit in receive buffer!\n");
987 printk(
" rx_buffer_size = %d\n", fsm->
buffer_size);
989 printk(
" rec_size = %zd\n", rec_size);
991 printk(
" rx_last_packet = %d\n", fsm->
last_packet);
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
ec_slave_t * slave
Slave the FSM runs on.
void ec_fsm_foe_read_start(ec_fsm_foe_t *, ec_datagram_t *)
Starting state for read operations.
uint8_t * ec_slave_mbox_prepare_send(const ec_slave_t *slave, ec_datagram_t *datagram, uint8_t type, size_t size)
Prepares a mailbox-send datagram.
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
int ec_fsm_foe_success(const ec_fsm_foe_t *fsm)
Returns, if the state machine terminated with success.
uint16_t configured_tx_mailbox_size
Configured send mailbox size.
uint32_t buffer_offset
Offset of data to transmit/receive next.
void ec_fsm_foe_error(ec_fsm_foe_t *, ec_datagram_t *)
State: ERROR.
void ec_fsm_foe_clear(ec_fsm_foe_t *fsm)
Destructor.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
unsigned long jiffies_start
FoE timestamp.
Error acknowledging received data.
ec_mbox_data_t mbox_foe_data
Received mailbox data for FoE.
int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram to fetch mailbox data.
uint32_t packet_no
FoE packet number.
void ec_fsm_foe_state_rrq_sent(ec_fsm_foe_t *, ec_datagram_t *)
State: RRQ SENT.
size_t data_size
Size of FoE data.
#define EC_FOE_HEADER_SIZE
Size of the FoE header.
uint8_t * ec_slave_mbox_fetch(const ec_slave_t *slave, ec_mbox_data_t *response_data, uint8_t *type, size_t *size)
Processes received mailbox data.
uint16_t working_counter
Working counter.
void ec_fsm_foe_transfer(ec_fsm_foe_t *fsm, ec_slave_t *slave, ec_foe_request_t *request)
Prepares an FoE transfer.
void ec_foe_set_tx_error(ec_fsm_foe_t *, uint32_t)
Set an error code and go to the send error state.
void ec_fsm_foe_end(ec_fsm_foe_t *, ec_datagram_t *)
State: END.
int ec_foe_prepare_wrq_send(ec_fsm_foe_t *, ec_datagram_t *)
Prepare a write request (WRQ) with filename.
Global definitions and macros.
EtherCAT master structure.
void ec_fsm_foe_state_data_read_data(ec_fsm_foe_t *, ec_datagram_t *)
Process a read data operation.
uint8_t file_name[255]
FoE filename.
uint32_t buffer_size
Size of transmit/receive buffer.
void ec_fsm_foe_state_ack_read_data(ec_fsm_foe_t *, ec_datagram_t *)
Process a read operation.
void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *, ec_datagram_t *)
State: WRQ SENT.
void ec_fsm_foe_init(ec_fsm_foe_t *fsm)
Constructor.
ec_sii_image_t * sii_image
Current complete SII image.
ec_datagram_state_t state
State.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
uint8_t * buffer
Pointer to FoE data.
uint16_t mailbox_protocols
Supported mailbox protocols.
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.
void ec_foe_set_rx_error(ec_fsm_foe_t *, uint32_t)
Set an error code and go to the receive error state.
void ec_fsm_foe_write_start(ec_fsm_foe_t *, ec_datagram_t *)
Initializes the FoE write state machine.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
ec_master_t * master
Master owning the slave.
uint32_t error_code
Error code from an FoE Error Request.
void ec_fsm_foe_state_sent_ack(ec_fsm_foe_t *, ec_datagram_t *)
Sent an acknowledge.
int ec_read_mbox_locked(ec_slave_t *slave)
Return the current mailbox lock status and lock it if not locked.
ec_foe_error_t result
FoE request abort code.
int ec_foe_prepare_data_send(ec_fsm_foe_t *, ec_datagram_t *)
Sends a file or the next fragment.
#define EC_MBOX_HEADER_SIZE
Mailbox header size.
void ec_fsm_foe_state_data_read(ec_fsm_foe_t *, ec_datagram_t *)
Start reading data.
ec_direction_t dir
Direction.
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
unsigned int retries
Retries upon datagram timeout.
int ec_slave_mbox_prepare_check(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram for checking the mailbox state.
size_t buffer_size
Size of FoE data memory.
ec_datagram_t * datagram
Datagram used in previous step.
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.
Error fetching data from mailbox.
int ec_foe_prepare_rrq_send(ec_fsm_foe_t *, ec_datagram_t *)
Prepare a read request (RRQ) with filename.
ec_foe_request_t * request
FoE request.
void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *, ec_datagram_t *)
Acknowledge a read operation.
uint16_t configured_rx_mailbox_size
Configured receive mailbox size.
void(* state)(ec_fsm_foe_t *, ec_datagram_t *)
FoE state function.
size_t progress
Current position of a BUSY request.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
#define EC_FSM_FOE_TIMEOUT_JIFFIES
Maximum time in jiffies to wait for responses when reading out the dictionary.
ec_sii_t sii
Extracted SII data.
void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *, ec_datagram_t *)
State: WRQ SENT.
Unused and should not be queued (dequeued).
uint32_t last_packet
Current packet is last one to send/receive.
Values written by the master.
File-Access over EtherCAT.
int ec_foe_prepare_send_ack(ec_fsm_foe_t *, ec_datagram_t *)
Prepare to send an acknowledge.
void ec_fsm_foe_state_data_check(ec_fsm_foe_t *, ec_datagram_t *)
Check for data.
uint32_t current_size
Size of current packet to send.
EtherCAT FoE state machines.
unsigned long jiffies_received
Jiffies, when the datagram was received.
size_t payload_size
Size of the mailbox response payload data.
int ec_slave_mbox_check(const ec_datagram_t *datagram)
Processes a mailbox state checking datagram.
uint32_t password
FoE password.
Finite state machines for the CANopen-over-EtherCAT protocol.
void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *, ec_datagram_t *)
Check for acknowledge.