IgH EtherCAT Master  1.6.0-rc1
datagram.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 
35 /*****************************************************************************/
36 
37 #include <linux/slab.h>
38 
39 #include "datagram.h"
40 #include "master.h"
41 
42 /*****************************************************************************/
43 
46 #define EC_FUNC_HEADER \
47  ret = ec_datagram_prealloc(datagram, data_size); \
48  if (unlikely(ret)) \
49  return ret; \
50  datagram->index = 0; \
51  datagram->working_counter = 0; \
52  datagram->state = EC_DATAGRAM_INIT;
53 
54 #define EC_FUNC_FOOTER \
55  datagram->data_size = data_size; \
56  return 0;
57 
60 /*****************************************************************************/
61 
66 static const char *type_strings[] = {
67  "?",
68  "APRD",
69  "APWR",
70  "APRW",
71  "FPRD",
72  "FPWR",
73  "FPRW",
74  "BRD",
75  "BWR",
76  "BRW",
77  "LRD",
78  "LWR",
79  "LRW",
80  "ARMW",
81  "FRMW"
82 };
83 
84 /*****************************************************************************/
85 
89 {
90  INIT_LIST_HEAD(&datagram->queue); // mark as unqueued
91  datagram->device_index = EC_DEVICE_MAIN;
92  datagram->type = EC_DATAGRAM_NONE;
93  memset(datagram->address, 0x00, EC_ADDR_LEN);
94  datagram->data = NULL;
95  datagram->data_origin = EC_ORIG_INTERNAL;
96  datagram->mem_size = 0;
97  datagram->data_size = 0;
98  datagram->index = 0x00;
99  datagram->working_counter = 0x0000;
100  datagram->state = EC_DATAGRAM_INIT;
101 #ifdef EC_HAVE_CYCLES
102  datagram->cycles_sent = 0;
103 #endif
104  datagram->jiffies_sent = 0;
105  datagram->app_time_sent = 0;
106 #ifdef EC_HAVE_CYCLES
107  datagram->cycles_received = 0;
108 #endif
109  datagram->jiffies_received = 0;
110  datagram->skip_count = 0;
111  datagram->stats_output_jiffies = 0;
112  memset(datagram->name, 0x00, EC_DATAGRAM_NAME_SIZE);
113 }
114 
115 /*****************************************************************************/
116 
120 {
121  ec_datagram_unqueue(datagram);
122 
123  if (datagram->data_origin == EC_ORIG_INTERNAL && datagram->data) {
124  kfree(datagram->data);
125  datagram->data = NULL;
126  }
127 }
128 
129 /*****************************************************************************/
130 
134 {
135  if (!list_empty(&datagram->queue)) {
136  list_del_init(&datagram->queue);
137  }
138 }
139 
140 /*****************************************************************************/
141 
152  ec_datagram_t *datagram,
153  size_t size
154  )
155 {
156  if (datagram->data_origin == EC_ORIG_EXTERNAL
157  || size <= datagram->mem_size)
158  return 0;
159 
160  if (datagram->data) {
161  kfree(datagram->data);
162  datagram->data = NULL;
163  datagram->mem_size = 0;
164  }
165 
166  if (!(datagram->data = kmalloc(size, GFP_KERNEL))) {
167  EC_ERR("Failed to allocate %zu bytes of datagram memory!\n", size);
168  return -ENOMEM;
169  }
170 
171  datagram->mem_size = size;
172  return 0;
173 }
174 
175 /*****************************************************************************/
176 
180 {
181  memset(datagram->data, 0x00, datagram->data_size);
182 }
183 
184 /*****************************************************************************/
185 
191  ec_datagram_t *datagram,
192  uint16_t ring_position,
193  uint16_t mem_address,
194  size_t data_size
195  )
196 {
197  int ret;
198  EC_FUNC_HEADER;
199  datagram->type = EC_DATAGRAM_APRD;
200  EC_WRITE_S16(datagram->address, (int16_t) ring_position * (-1));
201  EC_WRITE_U16(datagram->address + 2, mem_address);
202  EC_FUNC_FOOTER;
203 }
204 
205 /*****************************************************************************/
206 
212  ec_datagram_t *datagram,
213  uint16_t ring_position,
214  uint16_t mem_address,
215  size_t data_size
216  )
217 {
218  int ret;
219  EC_FUNC_HEADER;
220  datagram->type = EC_DATAGRAM_APWR;
221  EC_WRITE_S16(datagram->address, (int16_t) ring_position * (-1));
222  EC_WRITE_U16(datagram->address + 2, mem_address);
223  EC_FUNC_FOOTER;
224 }
225 
226 /*****************************************************************************/
227 
233  ec_datagram_t *datagram,
234  uint16_t ring_position,
235  uint16_t mem_address,
236  size_t data_size
237  )
238 {
239  int ret;
240  EC_FUNC_HEADER;
241  datagram->type = EC_DATAGRAM_APRW;
242  EC_WRITE_S16(datagram->address, (int16_t) ring_position * (-1));
243  EC_WRITE_U16(datagram->address + 2, mem_address);
244  EC_FUNC_FOOTER;
245 }
246 
247 /*****************************************************************************/
248 
254  ec_datagram_t *datagram,
255  uint16_t ring_position,
256  uint16_t mem_address,
257  size_t data_size
258  )
259 {
260  int ret;
261  EC_FUNC_HEADER;
262  datagram->type = EC_DATAGRAM_ARMW;
263  EC_WRITE_S16(datagram->address, (int16_t) ring_position * (-1));
264  EC_WRITE_U16(datagram->address + 2, mem_address);
265  EC_FUNC_FOOTER;
266 }
267 
268 /*****************************************************************************/
269 
275  ec_datagram_t *datagram,
276  uint16_t configured_address,
277  uint16_t mem_address,
278  size_t data_size
279  )
280 {
281  int ret;
282 
283  if (unlikely(configured_address == 0x0000))
284  EC_WARN("Using configured station address 0x0000!\n");
285 
286  EC_FUNC_HEADER;
287  datagram->type = EC_DATAGRAM_FPRD;
288  EC_WRITE_U16(datagram->address, configured_address);
289  EC_WRITE_U16(datagram->address + 2, mem_address);
290  EC_FUNC_FOOTER;
291 }
292 
293 /*****************************************************************************/
294 
300  ec_datagram_t *datagram,
301  uint16_t configured_address,
302  uint16_t mem_address,
303  size_t data_size
304  )
305 {
306  int ret;
307 
308  if (unlikely(configured_address == 0x0000))
309  EC_WARN("Using configured station address 0x0000!\n");
310 
311  EC_FUNC_HEADER;
312  datagram->type = EC_DATAGRAM_FPWR;
313  EC_WRITE_U16(datagram->address, configured_address);
314  EC_WRITE_U16(datagram->address + 2, mem_address);
315  EC_FUNC_FOOTER;
316 }
317 
318 /*****************************************************************************/
319 
325  ec_datagram_t *datagram,
326  uint16_t configured_address,
327  uint16_t mem_address,
328  size_t data_size
329  )
330 {
331  int ret;
332 
333  if (unlikely(configured_address == 0x0000))
334  EC_WARN("Using configured station address 0x0000!\n");
335 
336  EC_FUNC_HEADER;
337  datagram->type = EC_DATAGRAM_FPRW;
338  EC_WRITE_U16(datagram->address, configured_address);
339  EC_WRITE_U16(datagram->address + 2, mem_address);
340  EC_FUNC_FOOTER;
341 }
342 
343 /*****************************************************************************/
344 
350  ec_datagram_t *datagram,
351  uint16_t configured_address,
352  uint16_t mem_address,
353  size_t data_size
354  )
355 {
356  int ret;
357 
358  if (unlikely(configured_address == 0x0000))
359  EC_WARN("Using configured station address 0x0000!\n");
360 
361  EC_FUNC_HEADER;
362  datagram->type = EC_DATAGRAM_FRMW;
363  EC_WRITE_U16(datagram->address, configured_address);
364  EC_WRITE_U16(datagram->address + 2, mem_address);
365  EC_FUNC_FOOTER;
366 }
367 
368 /*****************************************************************************/
369 
375  ec_datagram_t *datagram,
376  uint16_t mem_address,
377  size_t data_size
378  )
379 {
380  int ret;
381  EC_FUNC_HEADER;
382  datagram->type = EC_DATAGRAM_BRD;
383  EC_WRITE_U16(datagram->address, 0x0000);
384  EC_WRITE_U16(datagram->address + 2, mem_address);
385  EC_FUNC_FOOTER;
386 }
387 
388 /*****************************************************************************/
389 
395  ec_datagram_t *datagram,
396  uint16_t mem_address,
397  size_t data_size
398  )
399 {
400  int ret;
401  EC_FUNC_HEADER;
402  datagram->type = EC_DATAGRAM_BWR;
403  EC_WRITE_U16(datagram->address, 0x0000);
404  EC_WRITE_U16(datagram->address + 2, mem_address);
405  EC_FUNC_FOOTER;
406 }
407 
408 /*****************************************************************************/
409 
415  ec_datagram_t *datagram,
416  uint16_t mem_address,
417  size_t data_size
418  )
419 {
420  int ret;
421  EC_FUNC_HEADER;
422  datagram->type = EC_DATAGRAM_BRW;
423  EC_WRITE_U16(datagram->address, 0x0000);
424  EC_WRITE_U16(datagram->address + 2, mem_address);
425  EC_FUNC_FOOTER;
426 }
427 
428 /*****************************************************************************/
429 
435  ec_datagram_t *datagram,
436  uint32_t offset,
437  size_t data_size
438  )
439 {
440  int ret;
441  EC_FUNC_HEADER;
442  datagram->type = EC_DATAGRAM_LRD;
443  EC_WRITE_U32(datagram->address, offset);
444  EC_FUNC_FOOTER;
445 }
446 
447 /*****************************************************************************/
448 
454  ec_datagram_t *datagram,
455  uint32_t offset,
456  size_t data_size
457  )
458 {
459  int ret;
460  EC_FUNC_HEADER;
461  datagram->type = EC_DATAGRAM_LWR;
462  EC_WRITE_U32(datagram->address, offset);
463  EC_FUNC_FOOTER;
464 }
465 
466 /*****************************************************************************/
467 
473  ec_datagram_t *datagram,
474  uint32_t offset,
475  size_t data_size
476  )
477 {
478  int ret;
479  EC_FUNC_HEADER;
480  datagram->type = EC_DATAGRAM_LRW;
481  EC_WRITE_U32(datagram->address, offset);
482  EC_FUNC_FOOTER;
483 }
484 
485 /*****************************************************************************/
486 
495  ec_datagram_t *datagram,
496  uint32_t offset,
497  size_t data_size,
498  uint8_t *external_memory
499  )
500 {
501  int ret;
502  datagram->data = external_memory;
503  datagram->data_origin = EC_ORIG_EXTERNAL;
504  EC_FUNC_HEADER;
505  datagram->type = EC_DATAGRAM_LRD;
506  EC_WRITE_U32(datagram->address, offset);
507  EC_FUNC_FOOTER;
508 }
509 
510 /*****************************************************************************/
511 
520  ec_datagram_t *datagram,
521  uint32_t offset,
522  size_t data_size,
523  uint8_t *external_memory
524  )
525 {
526  int ret;
527  datagram->data = external_memory;
528  datagram->data_origin = EC_ORIG_EXTERNAL;
529  EC_FUNC_HEADER;
530  datagram->type = EC_DATAGRAM_LWR;
531  EC_WRITE_U32(datagram->address, offset);
532  EC_FUNC_FOOTER;
533 }
534 
535 /*****************************************************************************/
536 
545  ec_datagram_t *datagram,
546  uint32_t offset,
547  size_t data_size,
548  uint8_t *external_memory
549  )
550 {
551  int ret;
552  datagram->data = external_memory;
553  datagram->data_origin = EC_ORIG_EXTERNAL;
554  EC_FUNC_HEADER;
555  datagram->type = EC_DATAGRAM_LRW;
556  EC_WRITE_U32(datagram->address, offset);
557  EC_FUNC_FOOTER;
558 }
559 
560 /*****************************************************************************/
561 
567  const ec_datagram_t *datagram
568  )
569 {
570  printk(KERN_CONT "Datagram ");
571  switch (datagram->state) {
572  case EC_DATAGRAM_INIT:
573  printk(KERN_CONT "initialized");
574  break;
575  case EC_DATAGRAM_QUEUED:
576  printk(KERN_CONT "queued");
577  break;
578  case EC_DATAGRAM_SENT:
579  printk(KERN_CONT "sent");
580  break;
582  printk(KERN_CONT "received");
583  break;
585  printk(KERN_CONT "timed out");
586  break;
587  case EC_DATAGRAM_ERROR:
588  printk(KERN_CONT "error");
589  break;
590  case EC_DATAGRAM_INVALID:
591  printk(KERN_CONT "invalid");
592  break;
593  default:
594  printk(KERN_CONT "???");
595  }
596 
597  printk(KERN_CONT ".\n");
598 }
599 
600 /*****************************************************************************/
601 
607  const ec_datagram_t *datagram
608  )
609 {
610  if (datagram->working_counter == 0) {
611  printk(KERN_CONT "No response.");
612  }
613  else if (datagram->working_counter > 1) {
614  printk(KERN_CONT "%u slaves responded!", datagram->working_counter);
615  }
616  else {
617  printk(KERN_CONT "Success.");
618  }
619  printk(KERN_CONT "\n");
620 }
621 
622 /*****************************************************************************/
623 
627  ec_datagram_t *datagram
628  )
629 {
630  if (jiffies - datagram->stats_output_jiffies > HZ) {
631  datagram->stats_output_jiffies = jiffies;
632 
633  if (unlikely(datagram->skip_count)) {
634  EC_WARN("Datagram %p (%s) was SKIPPED %u time%s.\n",
635  datagram, datagram->name,
636  datagram->skip_count,
637  datagram->skip_count == 1 ? "" : "s");
638  datagram->skip_count = 0;
639  }
640  }
641 }
642 
643 /*****************************************************************************/
644 
650  const ec_datagram_t *datagram
651  )
652 {
653  return type_strings[datagram->type];
654 }
655 
656 /*****************************************************************************/
657 
662  ec_mbox_data_t *mbox_data
663  )
664 {
665  mbox_data->data = NULL;
666  mbox_data->data_size = 0;
667  mbox_data->payload_size = 0;
668 }
669 
670 
671 /*****************************************************************************/
672 
677  ec_mbox_data_t *mbox_data
678  )
679 {
680  if (mbox_data->data) {
681  kfree(mbox_data->data);
682  mbox_data->data = NULL;
683  mbox_data->data_size = 0;
684  }
685 }
686 
687 
688 /*****************************************************************************/
689 
695  ec_mbox_data_t *mbox_data,
696  size_t size
697  )
698 {
699  if (mbox_data->data) {
700  kfree(mbox_data->data);
701  mbox_data->data = NULL;
702  mbox_data->data_size = 0;
703  }
704 
705  if (!(mbox_data->data = kmalloc(size, GFP_KERNEL))) {
706  EC_ERR("Failed to allocate %zu bytes of mailbox data memory!\n", size);
707  return -ENOMEM;
708  }
709  mbox_data->data_size = size;
710  return 0;
711 }
712 
713 
714 /*****************************************************************************/
715 
721  ec_slave_t *slave,
722  uint16_t protocols,
723  size_t size
724  )
725 {
726  if ((size > 0) && (size <= EC_MAX_DATA_SIZE)) {
727 #ifdef EC_EOE
728  if (protocols & EC_MBOX_EOE) {
731  } else {
734  }
735 #endif
736  if (protocols & EC_MBOX_COE) {
737  ec_mbox_data_prealloc(&slave->mbox_coe_data, size);
738  } else {
740  }
741  if (protocols & EC_MBOX_FOE) {
742  ec_mbox_data_prealloc(&slave->mbox_foe_data, size);
743  } else {
745  }
746  if (protocols & EC_MBOX_SOE) {
747  ec_mbox_data_prealloc(&slave->mbox_soe_data, size);
748  } else {
750  }
751  if (protocols & EC_MBOX_VOE) {
752  ec_mbox_data_prealloc(&slave->mbox_voe_data, size);
753  } else {
755  }
756  }
757 }
758 
759 /*****************************************************************************/
uint8_t * data
Mailbox response data.
Definition: datagram.h:123
ec_mbox_data_t mbox_eoe_frag_data
Received mailbox data for EoE, type frame fragment.
Definition: slave.h:265
Vendor specific.
Definition: globals.h:155
#define EC_WARN(fmt, args...)
Convenience macro for printing EtherCAT-specific warnings to syslog.
Definition: globals.h:240
void ec_mbox_prot_data_prealloc(ec_slave_t *slave, uint16_t protocols, size_t size)
Allocates internal memory for mailbox response data for all slave supported mailbox protocols ...
Definition: datagram.c:720
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
Definition: datagram.h:105
Auto Increment Physical Read Multiple Write.
Definition: datagram.h:64
#define EC_ADDR_LEN
Size of the EtherCAT address field.
Definition: globals.h:76
static const char * type_strings[]
Array of datagram type strings used in ec_datagram_type_string().
Definition: datagram.c:66
#define EC_DATAGRAM_NAME_SIZE
Size of the datagram description string.
Definition: globals.h:110
Auto Increment Physical ReadWrite.
Definition: datagram.h:54
size_t data_size
Size of the data in data.
Definition: datagram.h:98
void ec_mbox_data_init(ec_mbox_data_t *mbox_data)
Initialize mailbox response data.
Definition: datagram.c:661
Servo-Profile over EtherCAT.
Definition: globals.h:154
ec_mbox_data_t mbox_eoe_init_data
Received mailbox data for EoE, type eoe init reponse.
Definition: slave.h:266
Broadcast ReadWrite.
Definition: datagram.h:60
uint64_t app_time_sent
App time, when the datagram was sent.
Definition: datagram.h:106
unsigned long stats_output_jiffies
Last statistics output.
Definition: datagram.h:113
ec_mbox_data_t mbox_foe_data
Received mailbox data for FoE.
Definition: slave.h:269
ec_origin_t data_origin
Origin of the data memory.
Definition: datagram.h:96
int ec_datagram_lwr_ext(ec_datagram_t *datagram, uint32_t offset, size_t data_size, uint8_t *external_memory)
Initializes an EtherCAT LWR datagram with external memory.
Definition: datagram.c:519
EtherCAT mailbox response data.
Definition: datagram.h:122
EtherCAT datagram.
Definition: datagram.h:88
Logical Read.
Definition: datagram.h:61
char name[EC_DATAGRAM_NAME_SIZE]
Description of the datagram.
Definition: datagram.h:114
uint16_t working_counter
Working counter.
Definition: datagram.h:100
#define EC_WRITE_S16(DATA, VAL)
Write a 16-bit signed value to EtherCAT data.
Definition: ecrt.h:2365
Sent (still in the queue).
Definition: datagram.h:77
Configured Address Physical Read.
Definition: datagram.h:55
void ec_datagram_output_stats(ec_datagram_t *datagram)
Outputs datagram statistics at most every second.
Definition: datagram.c:626
int ec_datagram_lwr(ec_datagram_t *datagram, uint32_t offset, size_t data_size)
Initializes an EtherCAT LWR datagram.
Definition: datagram.c:453
int ec_datagram_aprd(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APRD datagram.
Definition: datagram.c:190
ec_datagram_type_t type
Datagram type (APRD, BWR, etc.).
Definition: datagram.h:93
Logical Write.
Definition: datagram.h:62
EtherCAT master structure.
Internal.
Definition: globals.h:310
Initial state of a new datagram.
Definition: datagram.h:75
EtherCAT slave.
Definition: slave.h:199
int ec_datagram_apwr(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APWR datagram.
Definition: datagram.c:211
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
Definition: datagram.c:179
ec_datagram_state_t state
State.
Definition: datagram.h:101
CANopen over EtherCAT.
Definition: globals.h:152
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2372
size_t data_size
Size of the mailbox response data buffer.
Definition: datagram.h:124
int ec_datagram_frmw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FRMW datagram.
Definition: datagram.c:349
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
External.
Definition: globals.h:311
Main device.
Definition: globals.h:205
unsigned int skip_count
Number of requeues when not yet received.
Definition: datagram.h:112
Ethernet over EtherCAT.
Definition: globals.h:151
Auto Increment Physical Read.
Definition: datagram.h:52
int ec_datagram_brd(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRD datagram.
Definition: datagram.c:374
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.
Definition: datagram.c:299
void ec_datagram_unqueue(ec_datagram_t *datagram)
Unqueue datagram.
Definition: datagram.c:133
int ec_datagram_lrd_ext(ec_datagram_t *datagram, uint32_t offset, size_t data_size, uint8_t *external_memory)
Initializes an EtherCAT LRD datagram with external memory.
Definition: datagram.c:494
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.
Definition: datagram.c:274
EtherCAT datagram structure.
Broadcast Write.
Definition: datagram.h:59
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
Definition: datagram.h:91
int ec_datagram_aprw(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APRW datagram.
Definition: datagram.c:232
int ec_datagram_lrd(ec_datagram_t *datagram, uint32_t offset, size_t data_size)
Initializes an EtherCAT LRD datagram.
Definition: datagram.c:434
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.
Definition: datagram.c:324
int ec_datagram_prealloc(ec_datagram_t *datagram, size_t size)
Allocates internal payload memory.
Definition: datagram.c:151
Configured Address Physical Read Multiple Write.
Definition: datagram.h:66
void ec_mbox_data_clear(ec_mbox_data_t *mbox_data)
Free internal memory for mailbox response data.
Definition: datagram.c:676
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
Definition: datagram.c:566
#define EC_ERR(fmt, args...)
Convenience macro for printing EtherCAT-specific errors to syslog.
Definition: globals.h:230
int ec_datagram_brw(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRW datagram.
Definition: datagram.c:414
void ec_datagram_init(ec_datagram_t *datagram)
Constructor.
Definition: datagram.c:88
Queued for sending.
Definition: datagram.h:76
Logical ReadWrite.
Definition: datagram.h:63
Timed out (dequeued).
Definition: datagram.h:79
Broadcast Read.
Definition: datagram.h:58
ec_mbox_data_t mbox_voe_data
Received mailbox data for VoE.
Definition: slave.h:271
int ec_datagram_lrw_ext(ec_datagram_t *datagram, uint32_t offset, size_t data_size, uint8_t *external_memory)
Initializes an EtherCAT LRW datagram with external memory.
Definition: datagram.c:544
const char * ec_datagram_type_string(const ec_datagram_t *datagram)
Returns a string describing the datagram type.
Definition: datagram.c:649
uint8_t * data
Datagram payload.
Definition: datagram.h:95
Configured Address Physical ReadWrite.
Definition: datagram.h:57
struct list_head queue
Master datagram queue item.
Definition: datagram.h:89
size_t mem_size
Datagram data memory size.
Definition: datagram.h:97
Unused and should not be queued (dequeued).
Definition: datagram.h:81
Error while sending/receiving (dequeued).
Definition: datagram.h:80
Auto Increment Physical Write.
Definition: datagram.h:53
uint8_t address[EC_ADDR_LEN]
Recipient address.
Definition: datagram.h:94
Received (dequeued).
Definition: datagram.h:78
int ec_mbox_data_prealloc(ec_mbox_data_t *mbox_data, size_t size)
Allocates internal memory for mailbox response data.
Definition: datagram.c:694
Configured Address Physical Write.
Definition: datagram.h:56
uint8_t index
Index (set by master).
Definition: datagram.h:99
File-Access over EtherCAT.
Definition: globals.h:153
int ec_datagram_lrw(ec_datagram_t *datagram, uint32_t offset, size_t data_size)
Initializes an EtherCAT LRW datagram.
Definition: datagram.c:472
unsigned long jiffies_received
Jiffies, when the datagram was received.
Definition: datagram.h:110
ec_mbox_data_t mbox_coe_data
Received mailbox data for CoE.
Definition: slave.h:268
ec_mbox_data_t mbox_soe_data
Received mailbox data for SoE.
Definition: slave.h:270
size_t payload_size
Size of the mailbox response payload data.
Definition: datagram.h:125
int ec_datagram_armw(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT ARMW datagram.
Definition: datagram.c:253
int ec_datagram_bwr(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BWR datagram.
Definition: datagram.c:394
#define EC_MAX_DATA_SIZE
Resulting maximum data size of a single datagram in a frame.
Definition: globals.h:84
void ec_datagram_clear(ec_datagram_t *datagram)
Destructor.
Definition: datagram.c:119