IgH EtherCAT Master  1.5.2
voe_handler.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * $Id$
4  *
5  * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
6  *
7  * This file is part of the IgH EtherCAT Master.
8  *
9  * The IgH EtherCAT Master is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License version 2, as
11  * published by the Free Software Foundation.
12  *
13  * The IgH EtherCAT Master is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16  * Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with the IgH EtherCAT Master; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  *
22  * ---
23  *
24  * The license mentioned above concerns the source code only. Using the
25  * EtherCAT technology and brand is only permitted in compliance with the
26  * industrial property and similar rights of Beckhoff Automation GmbH.
27  *
28  *****************************************************************************/
29 
34 /*****************************************************************************/
35 
36 #include <linux/module.h>
37 
38 #include "master.h"
39 #include "slave_config.h"
40 #include "mailbox.h"
41 #include "voe_handler.h"
42 
45 #define EC_VOE_HEADER_SIZE 6
46 
49 #define EC_VOE_RESPONSE_TIMEOUT 500
50 
51 /*****************************************************************************/
52 
55 
60 
63 
66 
67 /*****************************************************************************/
68 
74  ec_voe_handler_t *voe,
75  ec_slave_config_t *sc,
76  size_t size
77  )
78 {
79  voe->config = sc;
80  voe->vendor_id = 0x00000000;
81  voe->vendor_type = 0x0000;
82  voe->data_size = 0;
83  voe->dir = EC_DIR_INVALID;
85  voe->request_state = EC_INT_REQUEST_INIT;
86 
88  return ec_datagram_prealloc(&voe->datagram,
90 }
91 
92 /*****************************************************************************/
93 
97  ec_voe_handler_t *voe
98  )
99 {
101 }
102 
103 /*****************************************************************************/
104 
110  const ec_voe_handler_t *voe
111  )
112 {
114  return voe->datagram.mem_size -
116  else
117  return 0;
118 }
119 
120 /*****************************************************************************
121  * Application interface.
122  ****************************************************************************/
123 
124 void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id,
125  uint16_t vendor_type)
126 {
127  voe->vendor_id = vendor_id;
128  voe->vendor_type = vendor_type;
129 }
130 
131 /*****************************************************************************/
132 
134  uint32_t *vendor_id, uint16_t *vendor_type)
135 {
136  uint8_t *header = voe->datagram.data + EC_MBOX_HEADER_SIZE;
137 
138  if (vendor_id)
139  *vendor_id = EC_READ_U32(header);
140  if (vendor_type)
141  *vendor_type = EC_READ_U16(header + 4);
142 }
143 
144 /*****************************************************************************/
145 
147 {
149 }
150 
151 /*****************************************************************************/
152 
154 {
155  return voe->data_size;
156 }
157 
158 /*****************************************************************************/
159 
161 {
162  voe->dir = EC_DIR_INPUT;
164  voe->request_state = EC_INT_REQUEST_BUSY;
165 }
166 
167 /*****************************************************************************/
168 
170 {
171  voe->dir = EC_DIR_INPUT;
173  voe->request_state = EC_INT_REQUEST_BUSY;
174 }
175 
176 /*****************************************************************************/
177 
179 {
180  voe->dir = EC_DIR_OUTPUT;
181  voe->data_size = size;
183  voe->request_state = EC_INT_REQUEST_BUSY;
184 }
185 
186 /*****************************************************************************/
187 
189 {
190  if (voe->config->slave) { // FIXME locking?
191  voe->state(voe);
192  if (voe->request_state == EC_INT_REQUEST_BUSY) {
194  }
195  } else {
197  voe->request_state = EC_INT_REQUEST_FAILURE;
198  }
199 
201 }
202 
203 /******************************************************************************
204  * State functions.
205  *****************************************************************************/
206 
210 {
211  ec_slave_t *slave = voe->config->slave;
212  uint8_t *data;
213 
214  if (slave->master->debug_level) {
215  EC_SLAVE_DBG(slave, 0, "Writing %zu bytes of VoE data.\n",
216  voe->data_size);
218  }
219 
220  if (!slave->sii_image) {
221  EC_SLAVE_ERR(slave, "Slave cannot process VoE write request."
222  " SII data not available.\n");
224  voe->request_state = EC_INT_REQUEST_FAILURE;
225  return;
226  }
227 
228  if (!(slave->sii_image->sii.mailbox_protocols & EC_MBOX_VOE)) {
229  EC_SLAVE_ERR(slave, "Slave does not support VoE!\n");
231  voe->request_state = EC_INT_REQUEST_FAILURE;
232  return;
233  }
234 
235  data = ec_slave_mbox_prepare_send(slave, &voe->datagram,
236  EC_MBOX_TYPE_VOE, EC_VOE_HEADER_SIZE + voe->data_size);
237  if (IS_ERR(data)) {
239  voe->request_state = EC_INT_REQUEST_FAILURE;
240  return;
241  }
242 
243  EC_WRITE_U32(data, voe->vendor_id);
244  EC_WRITE_U16(data + 4, voe->vendor_type);
245  /* data already in datagram */
246 
247  voe->retries = EC_FSM_RETRIES;
248  voe->jiffies_start = jiffies;
250 }
251 
252 /*****************************************************************************/
253 
257 {
258  ec_datagram_t *datagram = &voe->datagram;
259  ec_slave_t *slave = voe->config->slave;
260 
261  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
262  return;
263 
264  if (datagram->state != EC_DATAGRAM_RECEIVED) {
266  voe->request_state = EC_INT_REQUEST_FAILURE;
267  EC_SLAVE_ERR(slave, "Failed to receive VoE write request datagram: ");
268  ec_datagram_print_state(datagram);
269  return;
270  }
271 
272  if (datagram->working_counter != 1) {
273  if (!datagram->working_counter) {
274  unsigned long diff_ms =
275  (jiffies - voe->jiffies_start) * 1000 / HZ;
276  if (diff_ms < EC_VOE_RESPONSE_TIMEOUT) {
277  EC_SLAVE_DBG(slave, 1, "Slave did not respond to"
278  " VoE write request. Retrying after %lu ms...\n",
279  diff_ms);
280  // no response; send request datagram again
281  return;
282  }
283  }
285  voe->request_state = EC_INT_REQUEST_FAILURE;
286  EC_SLAVE_ERR(slave, "Reception of VoE write request failed: ");
287  ec_datagram_print_wc_error(datagram);
288  return;
289  }
290 
291  EC_CONFIG_DBG(voe->config, 1, "VoE write request successful.\n");
292 
293  voe->request_state = EC_INT_REQUEST_SUCCESS;
295 }
296 
297 /*****************************************************************************/
298 
302 {
303  ec_datagram_t *datagram = &voe->datagram;
304  ec_slave_t *slave = voe->config->slave;
305 
306  EC_SLAVE_DBG(slave, 1, "Reading VoE data.\n");
307 
308  if (!slave->sii_image) {
309  EC_SLAVE_ERR(slave, "Slave not ready to process VoE request\n");
311  voe->request_state = EC_INT_REQUEST_FAILURE;
312  return;
313  }
314 
315  if (!(slave->sii_image->sii.mailbox_protocols & EC_MBOX_VOE)) {
316  EC_SLAVE_ERR(slave, "Slave does not support VoE!\n");
318  voe->request_state = EC_INT_REQUEST_FAILURE;
319  return;
320  }
321 
322  voe->jiffies_start = jiffies;
323 
324  // mailbox read check is skipped if a read request is already ongoing
325  if (ec_read_mbox_locked(slave)) {
327  // the datagram is not used and marked as invalid
328  datagram->state = EC_DATAGRAM_INVALID;
329  } else {
330  ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
331  voe->jiffies_start = jiffies;
332  voe->retries = EC_FSM_RETRIES;
334  }
335 }
336 
337 /*****************************************************************************/
338 
342 {
343  ec_datagram_t *datagram = &voe->datagram;
344  ec_slave_t *slave = voe->config->slave;
345 
346  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
347  return;
348 
349  if (datagram->state != EC_DATAGRAM_RECEIVED) {
352  voe->request_state = EC_INT_REQUEST_FAILURE;
353  EC_SLAVE_ERR(slave, "Failed to receive VoE mailbox check datagram: ");
354  ec_datagram_print_state(datagram);
355  return;
356  }
357 
358  if (datagram->working_counter != 1) {
361  voe->request_state = EC_INT_REQUEST_FAILURE;
362  EC_SLAVE_ERR(slave, "Reception of VoE mailbox check"
363  " datagram failed: ");
364  ec_datagram_print_wc_error(datagram);
365  return;
366  }
367 
368  if (!ec_slave_mbox_check(datagram)) {
369  unsigned long diff_ms = 0;
370 
371  // check that data is not already received by another read request
372  if (slave->mbox_voe_data.payload_size > 0) {
375  voe->state(voe);
376  return;
377  }
378 
379  diff_ms = (datagram->jiffies_received - voe->jiffies_start) * 1000 / HZ;
380 
381  if (diff_ms >= EC_VOE_RESPONSE_TIMEOUT) {
384  voe->request_state = EC_INT_REQUEST_FAILURE;
385  EC_SLAVE_ERR(slave, "Timeout while waiting for VoE data.\n");
386  return;
387  }
388 
389  ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
390  voe->retries = EC_FSM_RETRIES;
391  return;
392  }
393 
394  // Fetch response
395  ec_slave_mbox_prepare_fetch(slave, datagram); // can not fail.
396  voe->retries = EC_FSM_RETRIES;
398 }
399 
400 /*****************************************************************************/
401 
405 {
406  ec_datagram_t *datagram = &voe->datagram;
407  ec_slave_t *slave = voe->config->slave;
408 
409  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
410  return;
411 
412  if (datagram->state != EC_DATAGRAM_RECEIVED) {
415  voe->request_state = EC_INT_REQUEST_FAILURE;
416  EC_SLAVE_ERR(slave, "Failed to receive VoE read datagram: ");
417  ec_datagram_print_state(datagram);
418  return;
419  }
420 
421  if (datagram->working_counter != 1) {
422  // only an error if data has not already been read by another read request
423  if (slave->mbox_voe_data.payload_size == 0) {
426  voe->request_state = EC_INT_REQUEST_FAILURE;
427  EC_SLAVE_ERR(slave, "Reception of VoE read response failed: ");
428  ec_datagram_print_wc_error(datagram);
429  return;
430  }
431  }
434  voe->state(voe);
435 }
436 
437 
438 /*****************************************************************************/
439 
446 {
447  ec_datagram_t *datagram = &voe->datagram;
448  ec_slave_t *slave = voe->config->slave;
449  ec_master_t *master = voe->config->master;
450  uint8_t *data, mbox_prot;
451  size_t rec_size;
452 
453  // process the data available or initiate a new mailbox read check
454  if (slave->mbox_voe_data.payload_size > 0) {
455  slave->mbox_voe_data.payload_size = 0;
456  } else {
457  // initiate a new mailbox read check if required data is not available
458  if (ec_read_mbox_locked(slave)) {
459  // await current read request and mark the datagram as invalid
460  datagram->state = EC_DATAGRAM_INVALID;
461  } else {
462  ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
464  }
465  return;
466  }
467 
468  data = ec_slave_mbox_fetch(slave, &slave->mbox_voe_data, &mbox_prot, &rec_size);
469  if (IS_ERR(data)) {
471  voe->request_state = EC_INT_REQUEST_FAILURE;
472  return;
473  }
474 
475  if (mbox_prot != EC_MBOX_TYPE_VOE) {
477  voe->request_state = EC_INT_REQUEST_FAILURE;
478  EC_SLAVE_WARN(slave, "Received mailbox protocol 0x%02X"
479  " as response.\n", mbox_prot);
480  ec_print_data(data, rec_size);
481  return;
482  }
483 
484  if (rec_size < EC_VOE_HEADER_SIZE) {
486  voe->request_state = EC_INT_REQUEST_FAILURE;
487  EC_SLAVE_ERR(slave, "Received VoE header is"
488  " incomplete (%zu bytes)!\n", rec_size);
489  return;
490  }
491 
492  if (master->debug_level) {
493  EC_CONFIG_DBG(voe->config, 0, "VoE data:\n");
494  ec_print_data(data, rec_size);
495  }
496 
497  voe->data_size = rec_size - EC_VOE_HEADER_SIZE;
498  memcpy(voe->datagram.data + EC_MBOX_HEADER_SIZE, data, rec_size);
499  voe->request_state = EC_INT_REQUEST_SUCCESS;
500  voe->state = ec_voe_handler_state_end; // success
501 }
502 
503 /*****************************************************************************/
504 
508 {
509  ec_datagram_t *datagram = &voe->datagram;
510  ec_slave_t *slave = voe->config->slave;
511 
512  EC_SLAVE_DBG(slave, 1, "Reading VoE data.\n");
513 
514  if (!slave->sii_image) {
515  EC_SLAVE_ERR(slave, "Slave cannot process VoE read request."
516  " SII data not available.\n");
518  voe->request_state = EC_INT_REQUEST_FAILURE;
519  return;
520  }
521 
522  if (!(slave->sii_image->sii.mailbox_protocols & EC_MBOX_VOE)) {
523  EC_SLAVE_ERR(slave, "Slave does not support VoE!\n");
525  voe->request_state = EC_INT_REQUEST_FAILURE;
526  return;
527  }
528 
529  ec_slave_mbox_prepare_fetch(slave, datagram); // can not fail.
530 
531  voe->jiffies_start = jiffies;
532  voe->retries = EC_FSM_RETRIES;
534 }
535 
536 /*****************************************************************************/
537 
542 {
543  ec_datagram_t *datagram = &voe->datagram;
544  ec_slave_t *slave = voe->config->slave;
545  ec_master_t *master = voe->config->master;
546  uint8_t *data, mbox_prot;
547  size_t rec_size;
548 
549  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
550  return;
551 
552  if (datagram->state != EC_DATAGRAM_RECEIVED) {
554  voe->request_state = EC_INT_REQUEST_FAILURE;
555  EC_SLAVE_ERR(slave, "Failed to receive VoE read datagram: ");
556  ec_datagram_print_state(datagram);
557  return;
558  }
559 
560  if (datagram->working_counter == 0) {
562  voe->request_state = EC_INT_REQUEST_FAILURE;
563  EC_SLAVE_DBG(slave, 1, "Slave did not send VoE data.\n");
564  return;
565  }
566 
567  if (datagram->working_counter != 1) {
569  voe->request_state = EC_INT_REQUEST_FAILURE;
570  EC_SLAVE_WARN(slave, "Reception of VoE read response failed: ");
571  ec_datagram_print_wc_error(datagram);
572  return;
573  }
574 
575  if (slave->mbox_voe_data.payload_size > 0) {
576  slave->mbox_voe_data.payload_size = 0;
577  data = ec_slave_mbox_fetch(slave, &slave->mbox_voe_data, &mbox_prot, &rec_size);
578  } else {
580  voe->request_state = EC_INT_REQUEST_FAILURE;
581  return;
582  }
583 
584  if (mbox_prot != EC_MBOX_TYPE_VOE) {
586  voe->request_state = EC_INT_REQUEST_FAILURE;
587  EC_SLAVE_WARN(slave, "Received mailbox protocol 0x%02X"
588  " as response.\n", mbox_prot);
589  ec_print_data(data, rec_size);
590  return;
591  }
592 
593  if (rec_size < EC_VOE_HEADER_SIZE) {
595  voe->request_state = EC_INT_REQUEST_FAILURE;
596  EC_SLAVE_ERR(slave, "Received VoE header is"
597  " incomplete (%zu bytes)!\n", rec_size);
598  return;
599  }
600 
601  if (master->debug_level) {
602  EC_CONFIG_DBG(voe->config, 1, "VoE data:\n");
603  ec_print_data(data, rec_size);
604  }
605 
606  voe->data_size = rec_size - EC_VOE_HEADER_SIZE;
607  memcpy(voe->datagram.data + EC_MBOX_HEADER_SIZE, data, rec_size);
608  voe->request_state = EC_INT_REQUEST_SUCCESS;
609  voe->state = ec_voe_handler_state_end; // success
610 }
611 
612 /*****************************************************************************/
613 
617 {
618 }
619 
620 /*****************************************************************************/
621 
625 {
626 }
627 
628 /*****************************************************************************/
629 
632 EXPORT_SYMBOL(ecrt_voe_handler_send_header);
633 EXPORT_SYMBOL(ecrt_voe_handler_received_header);
634 EXPORT_SYMBOL(ecrt_voe_handler_data);
635 EXPORT_SYMBOL(ecrt_voe_handler_data_size);
636 EXPORT_SYMBOL(ecrt_voe_handler_read);
637 EXPORT_SYMBOL(ecrt_voe_handler_write);
638 EXPORT_SYMBOL(ecrt_voe_handler_execute);
639 
642 /*****************************************************************************/
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
Definition: globals.h:59
Vendor specific.
Definition: globals.h:187
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.
Definition: mailbox.c:51
void ec_voe_handler_state_read_nosync_start(ec_voe_handler_t *)
Start reading VoE data without sending a sync message before.
Definition: voe_handler.c:507
void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type)
Reads the header data of a received VoE message.
Definition: voe_handler.c:133
size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe)
Returns the current data size.
Definition: voe_handler.c:153
void ec_voe_handler_state_read_check(ec_voe_handler_t *)
Check for new data in the mailbox.
Definition: voe_handler.c:341
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
Definition: slave.h:108
ec_datagram_t datagram
State machine datagram.
Definition: voe_handler.h:52
size_t ec_voe_handler_mem_size(const ec_voe_handler_t *voe)
Get usable memory size.
Definition: voe_handler.c:109
#define EC_VOE_HEADER_SIZE
VoE header size.
Definition: voe_handler.c:45
int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram to fetch mailbox data.
Definition: mailbox.c:134
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
Definition: slave.h:91
EtherCAT datagram.
Definition: datagram.h:88
ec_master_t * master
Master owning the slave configuration.
Definition: slave_config.h:120
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.
Definition: mailbox.c:172
uint16_t working_counter
Working counter.
Definition: datagram.h:100
#define EC_VOE_RESPONSE_TIMEOUT
VoE response timeout in [ms].
Definition: voe_handler.c:49
uint16_t vendor_type
Vendor type for the header.
Definition: voe_handler.h:54
void ecrt_voe_handler_read(ec_voe_handler_t *voe)
Start a VoE read operation.
Definition: voe_handler.c:160
void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe)
Start a VoE read operation without querying the sync manager status.
Definition: voe_handler.c:169
EtherCAT master structure.
uint32_t vendor_id
Vendor ID for the header.
Definition: voe_handler.h:53
EtherCAT slave.
Definition: slave.h:214
ec_sii_image_t * sii_image
Current complete SII image.
Definition: slave.h:267
ec_datagram_state_t state
State.
Definition: datagram.h:101
void(* state)(ec_voe_handler_t *)
State function.
Definition: voe_handler.h:59
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2676
ec_internal_request_state_t request_state
Handler state.
Definition: voe_handler.h:60
uint16_t mailbox_protocols
Supported mailbox protocols.
Definition: slave.h:172
size_t data_size
Size of VoE data.
Definition: voe_handler.h:55
unsigned int debug_level
Master debug level.
Definition: master.h:310
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
Definition: slave.h:77
void ec_datagram_print_wc_error(const ec_datagram_t *datagram)
Evaluates the working counter of a single-cast datagram.
Definition: datagram.c:627
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2659
#define EC_CONFIG_DBG(sc, level, fmt, args...)
Convenience macro for printing configuration-specific debug messages to syslog.
Definition: slave_config.h:106
void ec_voe_handler_state_read_response(ec_voe_handler_t *)
Read the pending mailbox data.
Definition: voe_handler.c:404
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2570
unsigned long jiffies_start
Timestamp for timeout calculation.
Definition: voe_handler.h:62
Vendor specific over EtherCAT handler.
Definition: voe_handler.h:49
ec_master_t * master
Master owning the slave.
Definition: slave.h:216
ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe)
Execute the handler.
Definition: voe_handler.c:188
int ec_read_mbox_locked(ec_slave_t *slave)
Return the current mailbox lock status and lock it if not locked.
Definition: slave.c:229
void ec_master_queue_datagram(ec_master_t *master, ec_datagram_t *datagram)
Places a datagram in the datagram queue.
Definition: master.c:1105
Values read by the master.
Definition: ecrt.h:439
int ec_voe_handler_init(ec_voe_handler_t *voe, ec_slave_config_t *sc, size_t size)
VoE handler constructor.
Definition: voe_handler.c:73
ec_slave_t * slave
Slave pointer.
Definition: slave_config.h:135
void ec_voe_handler_state_write_start(ec_voe_handler_t *)
Start writing VoE data.
Definition: voe_handler.c:209
#define EC_MBOX_HEADER_SIZE
Mailbox header size.
Definition: globals.h:100
void ec_voe_handler_state_write_response(ec_voe_handler_t *)
Wait for the mailbox response.
Definition: voe_handler.c:256
void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size)
Start a VoE write operation.
Definition: voe_handler.c:178
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
Definition: module.c:355
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
Definition: slave.c:216
int ec_datagram_prealloc(ec_datagram_t *datagram, size_t size)
Allocates internal payload memory.
Definition: datagram.c:151
void ec_voe_handler_state_read_start(ec_voe_handler_t *)
Start reading VoE data.
Definition: voe_handler.c:301
unsigned int retries
retries upon datagram timeout
Definition: voe_handler.h:61
int ec_slave_mbox_prepare_check(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram for checking the mailbox state.
Definition: mailbox.c:103
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2554
ec_direction_t dir
Direction.
Definition: voe_handler.h:56
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
Definition: datagram.c:587
Mailbox functionality.
Invalid direction.
Definition: ecrt.h:437
Vendor specific over EtherCAT protocol handler.
void ec_datagram_init(ec_datagram_t *datagram)
Constructor.
Definition: datagram.c:88
Timed out (dequeued).
Definition: datagram.h:79
ec_mbox_data_t mbox_voe_data
Received mailbox data for VoE.
Definition: slave.h:294
void ec_voe_handler_state_read_nosync_response(ec_voe_handler_t *)
Read the pending mailbox data without sending a sync message before.
Definition: voe_handler.c:541
uint8_t * data
Datagram payload.
Definition: datagram.h:95
void ec_voe_handler_state_error(ec_voe_handler_t *)
Failure termination state function.
Definition: voe_handler.c:624
EtherCAT slave configuration.
Definition: slave_config.h:118
void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type)
Sets the VoE header for future send operations.
Definition: voe_handler.c:124
EtherCAT slave configuration structure.
ec_sii_t sii
Extracted SII data.
Definition: slave.h:207
size_t mem_size
Datagram data memory size.
Definition: datagram.h:97
ec_request_state_t
Request state.
Definition: ecrt.h:537
ec_slave_config_t * config
Parent slave configuration.
Definition: voe_handler.h:51
Unused and should not be queued (dequeued).
Definition: datagram.h:81
Values written by the master.
Definition: ecrt.h:438
Received (dequeued).
Definition: datagram.h:78
void ec_voe_handler_state_read_response_data(ec_voe_handler_t *)
VoE state: READ RESPONSE DATA.
Definition: voe_handler.c:445
const ec_request_state_t ec_request_state_translation_table[]
Global request state type translation table.
Definition: module.c:665
EtherCAT master.
Definition: master.h:202
uint8_t * ecrt_voe_handler_data(ec_voe_handler_t *voe)
Access to the VoE handler&#39;s data.
Definition: voe_handler.c:146
unsigned long jiffies_received
Jiffies, when the datagram was received.
Definition: datagram.h:110
size_t payload_size
Size of the mailbox response payload data.
Definition: datagram.h:125
int ec_slave_mbox_check(const ec_datagram_t *datagram)
Processes a mailbox state checking datagram.
Definition: mailbox.c:122
void ec_voe_handler_clear(ec_voe_handler_t *voe)
VoE handler destructor.
Definition: voe_handler.c:96
void ec_datagram_clear(ec_datagram_t *datagram)
Destructor.
Definition: datagram.c:119
void ec_voe_handler_state_end(ec_voe_handler_t *)
Successful termination state function.
Definition: voe_handler.c:616