IgH EtherCAT Master  1.6.0-rc1
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.mailbox_protocols & EC_MBOX_VOE)) {
221  EC_SLAVE_ERR(slave, "Slave does not support VoE!\n");
223  voe->request_state = EC_INT_REQUEST_FAILURE;
224  return;
225  }
226 
227  data = ec_slave_mbox_prepare_send(slave, &voe->datagram,
228  EC_MBOX_TYPE_VOE, EC_VOE_HEADER_SIZE + voe->data_size);
229  if (IS_ERR(data)) {
231  voe->request_state = EC_INT_REQUEST_FAILURE;
232  return;
233  }
234 
235  EC_WRITE_U32(data, voe->vendor_id);
236  EC_WRITE_U16(data + 4, voe->vendor_type);
237  /* data already in datagram */
238 
239  voe->retries = EC_FSM_RETRIES;
240  voe->jiffies_start = jiffies;
242 }
243 
244 /*****************************************************************************/
245 
249 {
250  ec_datagram_t *datagram = &voe->datagram;
251  ec_slave_t *slave = voe->config->slave;
252 
253  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
254  return;
255 
256  if (datagram->state != EC_DATAGRAM_RECEIVED) {
258  voe->request_state = EC_INT_REQUEST_FAILURE;
259  EC_SLAVE_ERR(slave, "Failed to receive VoE write request datagram: ");
260  ec_datagram_print_state(datagram);
261  return;
262  }
263 
264  if (datagram->working_counter != 1) {
265  if (!datagram->working_counter) {
266  unsigned long diff_ms =
267  (jiffies - voe->jiffies_start) * 1000 / HZ;
268  if (diff_ms < EC_VOE_RESPONSE_TIMEOUT) {
269  EC_SLAVE_DBG(slave, 1, "Slave did not respond to"
270  " VoE write request. Retrying after %lu ms...\n",
271  diff_ms);
272  // no response; send request datagram again
273  return;
274  }
275  }
277  voe->request_state = EC_INT_REQUEST_FAILURE;
278  EC_SLAVE_ERR(slave, "Reception of VoE write request failed: ");
279  ec_datagram_print_wc_error(datagram);
280  return;
281  }
282 
283  EC_CONFIG_DBG(voe->config, 1, "VoE write request successful.\n");
284 
285  voe->request_state = EC_INT_REQUEST_SUCCESS;
287 }
288 
289 /*****************************************************************************/
290 
294 {
295  ec_datagram_t *datagram = &voe->datagram;
296  ec_slave_t *slave = voe->config->slave;
297 
298  EC_SLAVE_DBG(slave, 1, "Reading VoE data.\n");
299 
300  if (!(slave->sii.mailbox_protocols & EC_MBOX_VOE)) {
301  EC_SLAVE_ERR(slave, "Slave does not support VoE!\n");
303  voe->request_state = EC_INT_REQUEST_FAILURE;
304  return;
305  }
306 
307  voe->jiffies_start = jiffies;
308 
309  // mailbox read check is skipped if a read request is already ongoing
310  if (ec_read_mbox_locked(slave)) {
312  // the datagram is not used and marked as invalid
313  datagram->state = EC_DATAGRAM_INVALID;
314  } else {
315  ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
316  voe->jiffies_start = jiffies;
317  voe->retries = EC_FSM_RETRIES;
319  }
320 }
321 
322 /*****************************************************************************/
323 
327 {
328  ec_datagram_t *datagram = &voe->datagram;
329  ec_slave_t *slave = voe->config->slave;
330 
331  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
332  return;
333 
334  if (datagram->state != EC_DATAGRAM_RECEIVED) {
337  voe->request_state = EC_INT_REQUEST_FAILURE;
338  EC_SLAVE_ERR(slave, "Failed to receive VoE mailbox check datagram: ");
339  ec_datagram_print_state(datagram);
340  return;
341  }
342 
343  if (datagram->working_counter != 1) {
346  voe->request_state = EC_INT_REQUEST_FAILURE;
347  EC_SLAVE_ERR(slave, "Reception of VoE mailbox check"
348  " datagram failed: ");
349  ec_datagram_print_wc_error(datagram);
350  return;
351  }
352 
353  if (!ec_slave_mbox_check(datagram)) {
354  unsigned long diff_ms = 0;
355 
356  // check that data is not already received by another read request
357  if (slave->mbox_voe_data.payload_size > 0) {
360  voe->state(voe);
361  return;
362  }
363 
364  diff_ms = (datagram->jiffies_received - voe->jiffies_start) * 1000 / HZ;
365 
366  if (diff_ms >= EC_VOE_RESPONSE_TIMEOUT) {
369  voe->request_state = EC_INT_REQUEST_FAILURE;
370  EC_SLAVE_ERR(slave, "Timeout while waiting for VoE data.\n");
371  return;
372  }
373 
374  ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
375  voe->retries = EC_FSM_RETRIES;
376  return;
377  }
378 
379  // Fetch response
380  ec_slave_mbox_prepare_fetch(slave, datagram); // can not fail.
381  voe->retries = EC_FSM_RETRIES;
383 }
384 
385 /*****************************************************************************/
386 
390 {
391  ec_datagram_t *datagram = &voe->datagram;
392  ec_slave_t *slave = voe->config->slave;
393 
394  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
395  return;
396 
397  if (datagram->state != EC_DATAGRAM_RECEIVED) {
400  voe->request_state = EC_INT_REQUEST_FAILURE;
401  EC_SLAVE_ERR(slave, "Failed to receive VoE read datagram: ");
402  ec_datagram_print_state(datagram);
403  return;
404  }
405 
406  if (datagram->working_counter != 1) {
407  // only an error if data has not already been read by another read request
408  if (slave->mbox_voe_data.payload_size == 0) {
411  voe->request_state = EC_INT_REQUEST_FAILURE;
412  EC_SLAVE_ERR(slave, "Reception of VoE read response failed: ");
413  ec_datagram_print_wc_error(datagram);
414  return;
415  }
416  }
419  voe->state(voe);
420 }
421 
422 
423 /*****************************************************************************/
424 
431 {
432  ec_datagram_t *datagram = &voe->datagram;
433  ec_slave_t *slave = voe->config->slave;
434  ec_master_t *master = voe->config->master;
435  uint8_t *data, mbox_prot;
436  size_t rec_size;
437 
438  // process the data available or initiate a new mailbox read check
439  if (slave->mbox_voe_data.payload_size > 0) {
440  slave->mbox_voe_data.payload_size = 0;
441  } else {
442  // initiate a new mailbox read check if required data is not available
443  if (ec_read_mbox_locked(slave)) {
444  // await current read request and mark the datagram as invalid
445  datagram->state = EC_DATAGRAM_INVALID;
446  } else {
447  ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
449  }
450  return;
451  }
452 
453  data = ec_slave_mbox_fetch(slave, &slave->mbox_voe_data, &mbox_prot, &rec_size);
454  if (IS_ERR(data)) {
456  voe->request_state = EC_INT_REQUEST_FAILURE;
457  return;
458  }
459 
460  if (mbox_prot != EC_MBOX_TYPE_VOE) {
462  voe->request_state = EC_INT_REQUEST_FAILURE;
463  EC_SLAVE_WARN(slave, "Received mailbox protocol 0x%02X"
464  " as response.\n", mbox_prot);
465  ec_print_data(data, rec_size);
466  return;
467  }
468 
469  if (rec_size < EC_VOE_HEADER_SIZE) {
471  voe->request_state = EC_INT_REQUEST_FAILURE;
472  EC_SLAVE_ERR(slave, "Received VoE header is"
473  " incomplete (%zu bytes)!\n", rec_size);
474  return;
475  }
476 
477  if (master->debug_level) {
478  EC_CONFIG_DBG(voe->config, 0, "VoE data:\n");
479  ec_print_data(data, rec_size);
480  }
481 
482  voe->data_size = rec_size - EC_VOE_HEADER_SIZE;
483  memcpy(voe->datagram.data + EC_MBOX_HEADER_SIZE, data, rec_size);
484  voe->request_state = EC_INT_REQUEST_SUCCESS;
485  voe->state = ec_voe_handler_state_end; // success
486 }
487 
488 /*****************************************************************************/
489 
493 {
494  ec_datagram_t *datagram = &voe->datagram;
495  ec_slave_t *slave = voe->config->slave;
496 
497  EC_SLAVE_DBG(slave, 1, "Reading VoE data.\n");
498 
499  if (!(slave->sii.mailbox_protocols & EC_MBOX_VOE)) {
500  EC_SLAVE_ERR(slave, "Slave does not support VoE!\n");
502  voe->request_state = EC_INT_REQUEST_FAILURE;
503  return;
504  }
505 
506  ec_slave_mbox_prepare_fetch(slave, datagram); // can not fail.
507 
508  voe->jiffies_start = jiffies;
509  voe->retries = EC_FSM_RETRIES;
511 }
512 
513 /*****************************************************************************/
514 
519 {
520  ec_datagram_t *datagram = &voe->datagram;
521  ec_slave_t *slave = voe->config->slave;
522  ec_master_t *master = voe->config->master;
523  uint8_t *data, mbox_prot;
524  size_t rec_size;
525 
526  if (datagram->state == EC_DATAGRAM_TIMED_OUT && voe->retries--)
527  return;
528 
529  if (datagram->state != EC_DATAGRAM_RECEIVED) {
531  voe->request_state = EC_INT_REQUEST_FAILURE;
532  EC_SLAVE_ERR(slave, "Failed to receive VoE read datagram: ");
533  ec_datagram_print_state(datagram);
534  return;
535  }
536 
537  if (datagram->working_counter == 0) {
539  voe->request_state = EC_INT_REQUEST_FAILURE;
540  EC_SLAVE_DBG(slave, 1, "Slave did not send VoE data.\n");
541  return;
542  }
543 
544  if (datagram->working_counter != 1) {
546  voe->request_state = EC_INT_REQUEST_FAILURE;
547  EC_SLAVE_WARN(slave, "Reception of VoE read response failed: ");
548  ec_datagram_print_wc_error(datagram);
549  return;
550  }
551 
552  if (slave->mbox_voe_data.payload_size > 0) {
553  slave->mbox_voe_data.payload_size = 0;
554  data = ec_slave_mbox_fetch(slave, &slave->mbox_voe_data, &mbox_prot, &rec_size);
555  } else {
557  voe->request_state = EC_INT_REQUEST_FAILURE;
558  return;
559  }
560 
561  if (mbox_prot != EC_MBOX_TYPE_VOE) {
563  voe->request_state = EC_INT_REQUEST_FAILURE;
564  EC_SLAVE_WARN(slave, "Received mailbox protocol 0x%02X"
565  " as response.\n", mbox_prot);
566  ec_print_data(data, rec_size);
567  return;
568  }
569 
570  if (rec_size < EC_VOE_HEADER_SIZE) {
572  voe->request_state = EC_INT_REQUEST_FAILURE;
573  EC_SLAVE_ERR(slave, "Received VoE header is"
574  " incomplete (%zu bytes)!\n", rec_size);
575  return;
576  }
577 
578  if (master->debug_level) {
579  EC_CONFIG_DBG(voe->config, 1, "VoE data:\n");
580  ec_print_data(data, rec_size);
581  }
582 
583  voe->data_size = rec_size - EC_VOE_HEADER_SIZE;
584  memcpy(voe->datagram.data + EC_MBOX_HEADER_SIZE, data, rec_size);
585  voe->request_state = EC_INT_REQUEST_SUCCESS;
586  voe->state = ec_voe_handler_state_end; // success
587 }
588 
589 /*****************************************************************************/
590 
594 {
595 }
596 
597 /*****************************************************************************/
598 
602 {
603 }
604 
605 /*****************************************************************************/
606 
609 EXPORT_SYMBOL(ecrt_voe_handler_send_header);
610 EXPORT_SYMBOL(ecrt_voe_handler_received_header);
611 EXPORT_SYMBOL(ecrt_voe_handler_data);
612 EXPORT_SYMBOL(ecrt_voe_handler_data_size);
613 EXPORT_SYMBOL(ecrt_voe_handler_read);
614 EXPORT_SYMBOL(ecrt_voe_handler_write);
615 EXPORT_SYMBOL(ecrt_voe_handler_execute);
616 
619 /*****************************************************************************/
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
Definition: globals.h:47
Vendor specific.
Definition: globals.h:155
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:492
ec_sii_t sii
Extracted SII data.
Definition: slave.h:246
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:326
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
Definition: slave.h:107
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:128
#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:121
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:166
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:199
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:2372
ec_internal_request_state_t request_state
Handler state.
Definition: voe_handler.h:60
uint16_t mailbox_protocols
Supported mailbox protocols.
Definition: slave.h:170
size_t data_size
Size of VoE data.
Definition: voe_handler.h:55
unsigned int debug_level
Master debug level.
Definition: master.h:285
#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:606
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2355
#define EC_CONFIG_DBG(sc, level, fmt, args...)
Convenience macro for printing configuration-specific debug messages to syslog.
Definition: slave_config.h:107
void ec_voe_handler_state_read_response(ec_voe_handler_t *)
Read the pending mailbox data.
Definition: voe_handler.c:389
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2266
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:201
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:203
void ec_master_queue_datagram(ec_master_t *master, ec_datagram_t *datagram)
Places a datagram in the datagram queue.
Definition: master.c:947
Values read by the master.
Definition: ecrt.h:438
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:136
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:89
void ec_voe_handler_state_write_response(ec_voe_handler_t *)
Wait for the mailbox response.
Definition: voe_handler.c:248
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:345
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
Definition: slave.c:190
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:293
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:97
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2250
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:566
Mailbox functionality.
Invalid direction.
Definition: ecrt.h:436
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:271
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:518
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:601
EtherCAT slave configuration.
Definition: slave_config.h:119
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.
size_t mem_size
Datagram data memory size.
Definition: datagram.h:97
ec_request_state_t
Request state.
Definition: ecrt.h:535
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:437
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:430
const ec_request_state_t ec_request_state_translation_table[]
Global request state type translation table.
Definition: module.c:659
EtherCAT master.
Definition: master.h:189
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:116
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:593