41#ifndef LIBETHERCAT_DATAGRAM_H
42#define LIBETHERCAT_DATAGRAM_H
44#include <libosal/types.h>
45#include <libosal/mutex.h>
58#define EC_WKC_SIZE (2u)
60typedef struct __attribute__((__packed__))
ec_frame {
61 osal_uint8_t mac_dest[6];
62 osal_uint8_t mac_src[6];
65 osal_uint16_t
len : 11;
70#define ec_frame_hdr_length (sizeof(ec_frame_t))
71#define ec_frame_length(f) ((f)->len)
72#define ec_frame_end(pframe) (&((osal_uint8_t *)(pframe))[(pframe)->len])
80 osal_uint16_t
len : 11;
86#define ec_datagram_hdr_length (sizeof(ec_datagram_t))
87#define ec_datagram_length(pdg) (ec_datagram_hdr_length + (pdg)->len + EC_WKC_SIZE)
149 osal_uint16_t adp, osal_uint16_t ado, osal_uint8_t *payload, osal_size_t payload_len);
163 osal_uint32_t adr, osal_uint8_t *payload, osal_size_t payload_len);
ethercat master common stuff
static void ec_datagram_mark_next(ec_datagram_t *pdg)
Marking next field in datagram.
Definition datagram.h:180
void ec_frame_add_datagram_log(ec_frame_t *frame, osal_uint8_t cmd, osal_uint8_t idx, osal_uint32_t adr, osal_uint8_t *payload, osal_size_t payload_len)
Add datagram at the end of frame.
static osal_uint8_t * ec_datagram_payload(ec_datagram_t *pdg)
Get pointer to datagram payload.
Definition datagram.h:213
struct ec_cyclic_datagram ec_cyclic_datagram_t
EtherCAT cyclic datagram type.
static osal_uint16_t ec_datagram_wkc(ec_datagram_t *pdg)
Get working counter of datagram.
Definition datagram.h:224
static ec_datagram_t * ec_datagram_first(ec_frame_t *pf)
Get pointer to first datagram in frame.
Definition datagram.h:191
#define ec_datagram_length(pdg)
EtherCAT datagram length.
Definition datagram.h:87
static ec_datagram_t * ec_datagram_cast(osal_uint8_t *p)
Cast pointer to ec_datagram_t type.
Definition datagram.h:171
static ec_datagram_t * ec_datagram_next(ec_datagram_t *pdg)
Get pointer to next datagram in frame.
Definition datagram.h:202
int ec_cyclic_datagram_init(ec_cyclic_datagram_t *cdg, osal_uint64_t recv_timeout)
Initialize cyclic datagram structure.
int ec_cyclic_datagram_destroy(ec_cyclic_datagram_t *cdg)
Destroy cyclic datagram structure.
struct ec_frame ec_frame_t
EtherCAT frame type.
int ec_frame_init(ec_frame_t *frame)
Initialize empty frame.
void ec_frame_add_datagram_phys(ec_frame_t *frame, osal_uint8_t cmd, osal_uint8_t idx, osal_uint16_t adp, osal_uint16_t ado, osal_uint8_t *payload, osal_size_t payload_len)
Add datagram at the end of frame.
struct ec_datagram ec_datagram_t
EtherCAT datagram type.
Data pool implementation.
void(* user_cb)(void *arg, int num)
User callback.
Definition datagram.h:97
pool_entry_t * p_entry
EtherCAT datagram from pool.
Definition datagram.h:91
osal_mutex_t lock
Lock for cyclic datagram structure.
Definition datagram.h:90
osal_timer_t timeout
Timer holding actual timeout.
Definition datagram.h:95
idx_entry_t * p_idx
EtherCAT datagram index from pool.
Definition datagram.h:92
void * user_cb_arg
User argument for user_cb.
Definition datagram.h:98
osal_uint64_t recv_timeout_ns
Datagram receive timeout in [ns].
Definition datagram.h:94
osal_uint16_t reserved
not used
Definition datagram.h:81
osal_uint32_t adr
logical address
Definition datagram.h:77
osal_uint16_t len
datagram length
Definition datagram.h:80
osal_uint16_t irq
reserved for future use
Definition datagram.h:83
osal_uint8_t idx
datagram index
Definition datagram.h:76
osal_uint16_t next
0 - last datagram, 1 - more follow
Definition datagram.h:82
osal_uint8_t cmd
ethercat command
Definition datagram.h:75
osal_uint16_t reserved
not used
Definition datagram.h:66
osal_uint16_t type
protocol type, 4 - EtherCAT command
Definition datagram.h:67
osal_uint16_t ethertype
ethertype, should be 0x88A4
Definition datagram.h:63
osal_uint16_t len
frame length
Definition datagram.h:65
index entry
Definition idx.h:54
Pool queue entry.
Definition pool.h:67