1 /*-----------------------------------------------------------------------------
2 * EthernetServices.h
3 * Copyright acontis technologies GmbH, Weingarten, Germany
4 * Response Stefan Zintgraf
5 * Description
6 *---------------------------------------------------------------------------*/
8 #ifndef INC_ETHERNETSERVICES
9 #define INC_ETHERNETSERVICES
11 /*-INCLUDES------------------------------------------------------------------*/
13 /*-DEFINES/MACROS------------------------------------------------------------*/
14 #if (!defined __cplusplus) && (!defined EC_NO_BITFIELDS)
15 #define EC_NO_BITFIELDS
16 #endif
18 #define ETHERNET_FRAME_TYPE_IP 0x0800
19 #define ETHERNET_FRAME_TYPE_ARP1 0x0806
20 #define ETHERNET_FRAME_TYPE_ARP2 0x0807
21 #define ETHERNET_FRAME_TYPE_RARP 0x8035
22 #define ETHERNET_FRAME_TYPE_VLAN 0x8100
23 #define ETHERNET_FRAME_TYPE_SNMP 0x814C
24 #define ETHERNET_FRAME_TYPE_LOOP 0x9000
25 #define ETHERNET_FRAME_TYPE_BKHF 0x88A4
26 #define ETHERNET_FRAME_TYPE_PROFINET 0x8892
28 #define ETHERNET_MIN_FRAME_LEN 60 /* frame length without CRC */
29 #define ETHERNET_MAX_FRAME_LEN 1514 /* frame length without CRC */
30 #define ETHERNET_MAX_VLAN_FRAME_LEN 1518 /* frame length without CRC */
32 #define ETHERNET_MAX_FRAMEBUF_LEN 1536 /* = 0x600 used for memory allocation */
34 /*-TYPEDEFS/ENUMS------------------------------------------------------------*/
35 #include EC_PACKED_INCLUDESTART(1)
36 typedef struct TETHERNET_ADDRESS
37 {
38 EC_T_BYTE b[6];
40 } EC_PACKED(1) ETHERNET_ADDRESS, *PETHERNET_ADDRESS;
41 #define ETHERNET_ADDRESS_LEN (6)
43 #ifdef __cplusplus
44 /* for calculating the hashvalue */
45 EC_INLINESTART EC_T_INT operator% (const ETHERNET_ADDRESS& lhs, EC_T_INT hashSize)
46 {
47 EC_T_VOID* pvData = (EC_T_VOID*)lhs.b;
48 return (EC_GETDWORD((EC_T_DWORD*)pvData) % hashSize);
49 } EC_INLINESTOP
51 EC_INLINESTART EC_T_BOOL operator== (const TETHERNET_ADDRESS& lhs, const TETHERNET_ADDRESS &addr)
52 {
53 return (0 == OsMemcmp(lhs.b, addr.b, ETHERNET_ADDRESS_LEN));
54 } EC_INLINESTOP
55 EC_INLINESTART EC_T_BOOL operator!= (const TETHERNET_ADDRESS& lhs, const TETHERNET_ADDRESS &addr)
56 {
57 return (0 != OsMemcmp(lhs.b, addr.b, ETHERNET_ADDRESS_LEN));
58 } EC_INLINESTOP
59 #endif /* __cplusplus */
61 static const ETHERNET_ADDRESS BroadcastEthernetAddress ={{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};
62 static const ETHERNET_ADDRESS FirstMulticastEthernetAddress ={{0x01,0x00,0x5E,0x00,0x00,0x00}};
63 static const ETHERNET_ADDRESS NullEthernetAddress ={{0x00,0x00,0x00,0x00,0x00,0x00}};
66 /*---------------------------------------------------------------------------*/
67 typedef struct TETHERNET_FRAME
68 {
69 ETHERNET_ADDRESS Destination; /* 0 */
70 ETHERNET_ADDRESS Source; /* 6 */
71 EC_T_WORD __FrameType; /*12 */ /* value is big endian. See also EC_ETHFRM_GET_FRAMETYPE. */
72 } EC_PACKED(1) ETHERNET_FRAME, *PETHERNET_FRAME;
73 #define ETHERNET_FRAMETYPE_LEN sizeof(EC_T_WORD)
74 #define ETHERNET_FRAME_LEN (2*ETHERNET_ADDRESS_LEN+ETHERNET_FRAMETYPE_LEN)
76 #ifdef VLAN_FRAME_SUPPORT
77 #ifdef EC_BIG_ENDIAN
78 #define EC_ETHFRM_IS_VLAN(p) ((EC_GETWORD((((EC_T_BYTE*)(p))+12)) == ETHERNET_FRAME_TYPE_VLAN) ? EC_TRUE : EC_FALSE)
79 #define EC_ETHFRM_GET_FRAMETYPE(p) EC_GETWORD((((EC_T_BYTE*)(p))+(EC_ETHFRM_IS_VLAN(p)?16:12)))
80 #define EC_ETHFRM_SET_FRAMETYPE(p, wVal) EC_SETWORD((((EC_T_BYTE*)(p))+12), (wVal))
81 #else
82 #define EC_ETHFRM_IS_VLAN(p) (((EC_WORDSWAP(EC_GETWORD((((EC_T_BYTE*)(p))+12)))) == ETHERNET_FRAME_TYPE_VLAN) ? EC_TRUE : EC_FALSE)
83 #define EC_ETHFRM_GET_FRAMETYPE(p) EC_WORDSWAP(EC_GETWORD((((EC_T_BYTE*)(p))+(EC_ETHFRM_IS_VLAN(p)?16:12))))
84 #define EC_ETHFRM_SET_FRAMETYPE(p, wVal) EC_SETWORD((((EC_T_BYTE*)(p))+12), EC_WORDSWAP(wVal))
85 #endif
86 #else
87 #ifdef EC_BIG_ENDIAN
88 #define EC_ETHFRM_GET_FRAMETYPE(p) EC_GETWORD((((EC_T_BYTE*)(p))+12))
89 #define EC_ETHFRM_SET_FRAMETYPE(p, wVal) EC_SETWORD((((EC_T_BYTE*)(p))+12), (wVal))
90 #else
91 #define EC_ETHFRM_GET_FRAMETYPE(p) EC_WORDSWAP(EC_GETWORD((((EC_T_BYTE*)(p))+12)))
92 #define EC_ETHFRM_SET_FRAMETYPE(p, wVal) EC_SETWORD((((EC_T_BYTE*)(p))+12), EC_WORDSWAP((wVal)))
93 #endif
94 #endif
96 #define EC_ETHFRM_SET_RETRYINDEX(p, byVal) (*(((EC_T_BYTE*)(p))+(6+1))) = (EC_LOBYTE((byVal)))
97 #define EC_ETHFRM_GET_RETRYINDEX(p) EC_LOBYTE((*(((EC_T_BYTE*)(p))+(6+1))))
99 #define EC_ETHFRM_ADD_RETRYINDEX(p, byVal) EC_ETHFRM_SET_RETRYINDEX((p), EC_LOBYTE((EC_ETHFRM_GET_RETRYINDEX(p)+(byVal))))
100 #define EC_ETHFRM_SET_RETRYMACIDX(p, abyMac, byVal ) EC_ETHFRM_SET_RETRYINDEX((p), EC_LOBYTE(((abyMac)[1]+(byVal))))
103 /*---------------------------------------------------------------------------*/
104 typedef struct TETYPE_VLAN_HEADER
105 {
106 EC_T_WORD __VLanType; /* 0 */
107 #if (!defined EC_NO_BITFIELDS)
108 #ifdef EC_BIG_ENDIAN
109 EC_T_WORD __VLanIdL : 8; /* 3 */
110 EC_T_WORD __Priority : 3; /* 2.5 */
111 EC_T_WORD Reserved : 1; /* 2.4 */
112 EC_T_WORD __VLanIdH : 4; /* 2.0 */
113 #else
114 EC_T_WORD __VLanIdH : 4; /* 2.0 */
115 EC_T_WORD Reserved : 1; /* 2.4 */
116 EC_T_WORD __Priority : 3; /* 2.5 */
117 EC_T_WORD __VLanIdL : 8; /* 3 */
118 #endif
119 #else
120 EC_T_WORD wVLanIdLPriorityVLanIdH;
121 #endif /* EC_NO_BITFIELDS */
122 } EC_PACKED(1) ETYPE_VLAN_HEADER, *PETYPE_VLAN_HEADER;
123 #define ETYPE_VLAN_HEADER_LEN sizeof(ETYPE_VLAN_HEADER)
125 #define EC_RESET_VLANHDR(p) OsMemset(p,0,sizeof(ETYPE_VLAN_HEADER))
126 #define EC_AL_SET_VLANHDR_IDH(p, wVal) ((p)->__VLanIdH) = ((wVal)&0xf)
127 #define EC_AL_SET_VLANHDR_IDL(p, wVal) ((p)->__VLanIdL) = ((wVal)&0xff)
128 #define EC_SET_VLANHDR_Prio(p, byVal) ((p)->__Priority) = (byVal)
129 #ifdef EC_BIG_ENDIAN
130 #define EC_SET_VLANHDR_Type(p, wVal) ((p)->__VLanType) = (wVal)
131 #else
132 #define EC_SET_VLANHDR_Type(p, wVal) ((p)->__VLanType) = EC_WORDSWAP((wVal))
133 #endif
134 #define EC_SET_VLANHDR_ID(p, wVal) EC_AL_SET_VLANHDR_IDH((p), (((wVal)>>8)&0xff)); EC_AL_SET_VLANHDR_IDL((p), (((wVal)>>0)&0xf))
136 /*---------------------------------------------------------------------------*/
137 typedef struct TETHERNET_VLAN_FRAME
138 {
139 ETHERNET_ADDRESS Destination;
140 ETHERNET_ADDRESS Source;
141 ETYPE_VLAN_HEADER VLan;
142 EC_T_WORD __FrameType; /* in host-order */
143 } EC_PACKED(1) ETHERNET_VLAN_FRAME, *PETHERNET_VLAN_FRAME;
144 #define ETHERNET_VLAN_FRAME_LEN sizeof(ETHERNET_VLAN_FRAME)
146 #ifdef VLAN_FRAME_SUPPORT
147 #define FRAMETYPE_PTR(p) (EC_ETHFRM_IS_VLAN((p)) ? & ((EC_T_WORD*)(p))[8] : &((EC_T_WORD*)(p))[6])
148 #else
149 #define FRAMETYPE_PTR(p) (&((EC_T_WORD*)(p))[6])
150 #endif
153 /*---------------------------------------------------------------------------*/
154 #define ETYPE_88A4_TYPE_ECAT 1 /* ECAT header follows */
155 #define ETYPE_88A4_TYPE_ADS 2 /* ADS header follows */
156 #define ETYPE_88A4_TYPE_IO 3 /* IO process image follows directly */
157 #define ETYPE_88A4_TYPE_NV 4 /* Network Variables */
158 #define ETYPE_88A4_TYPE_MAILBOX 5 /* MAILBOX Header follows */
160 #define ETYPE_88A4_HEADER_LEN sizeof(EC_T_WORD)
163 typedef struct TETYPE_88A4_HEADER
164 {
165 union _t_u88a4Hdr
166 {
167 EC_T_WORD __w88a4Hdr;
168 #if (!defined EC_NO_BITFIELDS)
169 struct _t_sw88a4Hdr
170 {
171 #ifdef EC_BIG_ENDIAN
172 EC_T_WORD __E88A4HdrType : 4; /* 1.4 */
173 EC_T_WORD Reserved : 1; /* 1.3 */
174 EC_T_WORD __E88A4FrameLength : 11; /* 0 */
175 #else
176 EC_T_WORD __E88A4FrameLength : 11; /* 0 */
177 EC_T_WORD Reserved : 1; /* 1.3 */
178 EC_T_WORD __E88A4HdrType : 4; /* 1.4 */
179 #endif
180 } EC_PACKED(1) sw88a4Hdr;
181 #else
182 EC_T_WORD wE88A4HdrTypeE88A4FrameLength;
183 #endif /* EC_NO_BITFIELDS */
184 } EC_PACKED(1) u88a4Hdr;
185 } EC_PACKED(1) ETYPE_88A4_HEADER, *PETYPE_88A4_HEADER;
187 #ifdef EC_NO_BITFIELDS
189 #define EC_88A4HDR_RESET(p) ((*((EC_T_WORD*)(p))) = 0)
191 #define EC_88A4HDR_GET_E88A4FRAMELEN(p) EC_GET_FRM_WORD_BITFIELD(0,11,(*((EC_T_WORD*)(p))))
192 #define EC_88A4HDR_SET_E88A4FRAMELEN(p, wVal) EC_SET_FRM_WORD_BITFIELD((*((EC_T_WORD*)(p))),(wVal),0,11)
194 #define EC_88A4HDR_GET_E88A4HDRTYPE(p) EC_GET_FRM_WORD_BITFIELD(12,4,(*((EC_T_WORD*)(p))))
195 #define EC_88A4HDR_SET_E88A4HDRTYPE(p, wVal) EC_SET_FRM_WORD_BITFIELD((*((EC_T_WORD*)(p))),(wVal),12,4)
197 #define EC_AL_88A4HDR_RESET EC_88A4HDR_RESET
199 #define EC_AL_88A4HDR_GET_E88A4FRAMELEN(p) EC_88A4HDR_GET_E88A4FRAMELEN((p))
200 #define EC_AL_88A4HDR_SET_E88A4FRAMELEN(p, wVal) EC_88A4HDR_SET_E88A4FRAMELEN((p), (wVal))
202 #define EC_AL_88A4HDR_GET_E88A4HDRTYPE(p) EC_88A4HDR_GET_E88A4HDRTYPE((p))
203 #define EC_AL_88A4HDR_SET_E88A4HDRTYPE(p, wVal) EC_88A4HDR_SET_E88A4HDRTYPE((p), (wVal))
205 #else /* EC_NO_BITFIELDS */
207 #define EC_AL_88A4HDR_RESET(p) ((p)->u88a4Hdr.__w88a4Hdr) = 0
209 #define EC_AL_88A4HDR_GET_E88A4FRAMELEN(p) EC_NTOHS(((p)->u88a4Hdr.sw88a4Hdr.__E88A4FrameLength))
210 #define EC_AL_88A4HDR_SET_E88A4FRAMELEN(p, wVal) ((p)->u88a4Hdr.sw88a4Hdr.__E88A4FrameLength) = (wVal)
212 #define EC_AL_88A4HDR_GET_E88A4HDRTYPE(p) ((p)->u88a4Hdr.sw88a4Hdr.__E88A4HdrType)
213 #define EC_AL_88A4HDR_SET_E88A4HDRTYPE(p, wVal) ((p)->u88a4Hdr.sw88a4Hdr.__E88A4HdrType) = (wVal)
215 #if (defined WITHALIGNMENT)
217 #define EC_88A4HDR_RESET(p) EC_SETWORD((p), 0)
218 #define EC_88A4HDR_GET_E88A4HDRTYPE(p) ((EC_GETWORD((p))>>12)&0xf)
219 #define EC_88A4HDR_SET_E88A4HDRTYPE(p, wVal) EC_SETWORD((p), (EC_GETWORD((p))&(~(0xf<<12))) | ((((wVal)&0xf)<<12)))
221 #define EC_88A4HDR_GET_E88A4FRAMELEN(p) (EC_GETWORD((p))&0x7ff)
222 #define EC_88A4HDR_SET_E88A4FRAMELEN(p, wVal) EC_SETWORD((p), (((wVal)&0x7ff) | (ETYPE_88A4_TYPE_ECAT<<12)))
224 #else /* WITHALIGNMENT */
226 #define EC_88A4HDR_RESET(p) EC_AL_88A4HDR_RESET((p))
228 #define EC_88A4HDR_GET_E88A4FRAMELEN(p) EC_AL_88A4HDR_GET_E88A4FRAMELEN((p))
229 #define EC_88A4HDR_SET_E88A4FRAMELEN(p, wVal) EC_AL_88A4HDR_SET_E88A4FRAMELEN((p), (wVal))
231 #define EC_88A4HDR_GET_E88A4HDRTYPE(p) EC_AL_88A4HDR_GET_E88A4HDRTYPE((p))
232 #define EC_88A4HDR_SET_E88A4HDRTYPE(p, wVal) EC_AL_88A4HDR_SET_E88A4HDRTYPE((p), (wVal))
234 #endif /* WITHALIGNMENT */
235 #endif /* EC_NO_BITFIELDS */
238 /*---------------------------------------------------------------------------*/
239 typedef struct TETHERNET_88A4_FRAME
240 {
241 ETHERNET_FRAME EthernetFrame;
242 ETYPE_88A4_HEADER E88A4Header;
243 } EC_PACKED(1) ETHERNET_88A4_FRAME, *PETHERNET_88A4_FRAME;
244 #define ETHERNET_88A4_FRAME_LEN sizeof(ETHERNET_88A4_FRAME)
246 #define SIZEOF_88A4_FRAME(p) (ETHERNET_88A4_FRAME_LEN+EC_88A4HDR_GET_E88A4FRAMELEN((p)))
247 #define ENDOF_88A4_FRAME(p) ((PETHERNET_88A4_FRAME)&(((EC_T_BYTE*)(p))[SIZEOF_88A4_FRAME((p))]))
250 /*---------------------------------------------------------------------------*/
252 #define EC_CMDHDR_OFFS_CMDIDX ((EC_T_BYTE)0)
253 #define EC_CMDHDR_OFFS_CMDIDX_CMD ((EC_T_BYTE)0)
254 #define EC_CMDHDR_OFFS_CMDIDX_IDX ((EC_T_BYTE)1)
256 #define EC_CMDHDR_OFFS_ADDR ((EC_T_BYTE)2)
257 #define EC_CMDHDR_OFFS_ADDR_ADP ((EC_T_BYTE)2)
258 #define EC_CMDHDR_OFFS_ADDR_ADO ((EC_T_BYTE)4)
260 #define EC_CMDHDR_OFFS_LEN ((EC_T_BYTE)6)
261 #define EC_CMDHDR_OFFS_LEN_LEN ((EC_T_BYTE)6)
262 #define EC_CMDHDR_OFFS_LEN_NEXT_BYTE ((EC_T_BYTE)7)
263 #define EC_CMDHDR_OFFS_IRQ ((EC_T_BYTE)8)
266 /* General EtherCAT telegram header */
267 typedef struct TETYPE_EC_CMD_HEADER
268 {
269 union _t_uCmdIdx
270 {
271 EC_T_WORD __wCmdIdx; /* 0 */
272 struct _t_swCmdIdx
273 {
274 EC_T_BYTE byCmd; /* 0 */
275 EC_T_BYTE byIdx; /* 1 */
276 } EC_PACKED(1) swCmdIdx;
277 } EC_PACKED(1) uCmdIdx;
278 union _t_uAddr
279 {
280 struct _t_sladdr
281 {
282 EC_T_WORD __adp; /* 2 */
283 EC_T_WORD __ado; /* 4 */
284 } EC_PACKED(1) sladdr;
285 EC_T_DWORD __laddr; /* 2 */
286 } EC_PACKED(1) uAddr;
287 union _t_uLen
288 {
289 #if (!defined EC_NO_BITFIELDS)
290 struct _t_slength
291 {
292 #ifdef EC_BIG_ENDIAN
293 EC_T_WORD __bNext: 1; /* 6.15 */
294 EC_T_WORD res : 4; /* 6.12 */
295 EC_T_WORD __len : 11;/* 6.0 */
296 #else
297 EC_T_WORD __len : 11;/* 6.0 */
298 EC_T_WORD res : 4; /* 6.12 */
299 EC_T_WORD __bNext: 1; /* 6.15 */
300 #endif
301 } EC_PACKED(1) slength;
302 #else
303 EC_T_WORD wNextLen;
304 #endif /* EC_NO_BITFIELDS */
305 EC_T_WORD __length; /* 6 */
306 } EC_PACKED(1) uLen;
307 EC_T_WORD __wIrq; /* 8 */
308 } EC_PACKED(1) ETYPE_EC_CMD_HEADER, *PETYPE_EC_CMD_HEADER;
309 #define ETYPE_EC_CMD_HEADER_LEN sizeof(ETYPE_EC_CMD_HEADER)
310 #define ETYPE_EC_WKC_LEN sizeof(EC_T_WORD)
311 #define ETYPE_EC_OVERHEAD (ETYPE_EC_CMD_HEADER_LEN+ETYPE_EC_WKC_LEN)
313 /* access macros */
314 /* Offset 0 */
315 #ifdef EC_BIG_ENDIAN
316 #define EC_AL_ICMDHDR_GET_CMDIDX(p) EC_WORDSWAP((p)->uCmdIdx.__wCmdIdx)
317 #else
318 #define EC_AL_ICMDHDR_GET_CMDIDX(p) ((p)->uCmdIdx.__wCmdIdx)
319 #endif
320 #define EC_AL_ICMDHDR_GET_CMDIDX_CMD(p) ((p)->uCmdIdx.swCmdIdx.byCmd)
321 #define EC_AL_ICMDHDR_GET_CMDIDX_IDX(p) ((p)->uCmdIdx.swCmdIdx.byIdx)
323 /* Offset 2 */
324 #ifdef EC_BIG_ENDIAN
325 #define EC_AL_ICMDHDR_GET_ADDR(p) EC_DWORDSWAP((p)->uAddr.__laddr)
326 #define EC_AL_ICMDHDR_GET_ADDR_ADO(p) EC_WORDSWAP((p)->uAddr.sladdr.__ado)
327 #define EC_AL_ICMDHDR_GET_ADDR_ADP(p) EC_WORDSWAP((p)->uAddr.sladdr.__adp)
329 #define EC_AL_ICMDHDR_SET_ADDR(p, dwVal) ((p)->uAddr.__laddr) = EC_DWORDSWAP((dwVal))
330 #define EC_AL_ICMDHDR_SET_ADDR_ADO(p, wVal) ((p)->uAddr.sladdr.__ado) = EC_WORDSWAP((wVal))
331 #define EC_AL_ICMDHDR_SET_ADDR_ADP(p, wVal) ((p)->uAddr.sladdr.__adp) = EC_WORDSWAP((wVal))
332 #else
333 #define EC_AL_ICMDHDR_GET_ADDR(p) EC_GETDWORD(&((p)->uAddr.__laddr))
334 #define EC_AL_ICMDHDR_GET_ADDR_ADO(p) ((p)->uAddr.sladdr.__ado)
335 #define EC_AL_ICMDHDR_GET_ADDR_ADP(p) ((p)->uAddr.sladdr.__adp)
337 #define EC_AL_ICMDHDR_SET_ADDR(p, dwVal) EC_SETDWORD(&((p)->uAddr.__laddr), dwVal)
338 #define EC_AL_ICMDHDR_SET_ADDR_ADO(p, wVal) ((p)->uAddr.sladdr.__ado) = (wVal)
339 #define EC_AL_ICMDHDR_SET_ADDR_ADP(p, wVal) ((p)->uAddr.sladdr.__adp) = (wVal)
340 #endif
342 /* Offset 6 */
343 #ifdef EC_BIG_ENDIAN
344 #define EC_AL_ICMDHDR_GET_LEN(p) EC_WORDSWAP((p)->uLen.__length)
345 #else
346 #define EC_AL_ICMDHDR_GET_LEN(p) ((p)->uLen.__length)
347 #endif
348 #if (!defined EC_NO_BITFIELDS)
349 #define EC_AL_ICMDHDR_GET_LEN_LEN(p) ((p)->uLen.slength.__len)
350 #define EC_AL_CMDHDRLEN_GET_NEXT(puLen) ((puLen)->slength.__bNext)
351 #define EC_AL_CMDHDRLEN_GET_LEN(puLen) ((puLen)->slength.__len)
352 #define EC_AL_CMDHDRLEN_SET_LEN(puLen, wVal) ((puLen)->slength.__len) = (wVal)
353 #endif
355 #ifdef EC_BIG_ENDIAN
356 #define EC_AL_CMDHDRLEN_SET_LEN_AND_NEXT(puLen, wVal, bNext) \
357 ((puLen)->__length) = EC_WORDSWAP((EC_T_WORD)(((wVal)&0x7ff) | (((bNext)&1)<<15)))
358 #else
359 #define EC_AL_CMDHDRLEN_SET_LEN_AND_NEXT(puLen, wVal, bNext) \
360 ((puLen)->__length) = ((EC_T_WORD)(((wVal)&0x7ff) | (((bNext)&1)<<15)))
361 #endif
363 /* Offset 8 */
364 #ifdef EC_BIG_ENDIAN
365 #define EC_AL_ICMDHDR_GET_IRQ(p) EC_WORDSWAP((p)->__wIrq)
366 #define EC_AL_ICMDHDR_SET_IRQ(p, wVal) {(p)->__wIrq = EC_WORDSWAP((wVal));}
367 #else
368 #define EC_AL_ICMDHDR_GET_IRQ(p) ((p)->__wIrq)
369 #define EC_AL_ICMDHDR_SET_IRQ(p, wVal) {(p)->__wIrq = (wVal);}
370 #endif
373 #if (defined EC_NO_BITFIELDS)
374 typedef EC_T_WORD TETYPE_EC_CMD_HEADER_LENGTH;
376 #define EC_CMDHDRLEN_GET_NEXT(puLen) EC_GET_FRM_WORD_BITFIELD(15,1,(puLen)->__length)
377 #define EC_CMDHDRLEN_SET_NEXT(puLen,bNext) EC_SET_FRM_WORD_BITFIELD((puLen)->__length,(bNext),15,1)
379 #define EC_CMDHDRLEN_GET_LEN(puLen) EC_GET_FRM_WORD_BITFIELD(0,11,(puLen)->__length)
380 #define EC_CMDHDRLEN_SET_LEN(puLen, wVal) EC_SET_FRM_WORD_BITFIELD((puLen)->__length,wVal,0,11)
381 #endif /* #ifdef EC_NO_BITFIELDS */
383 #if (defined EC_BIG_ENDIAN)
385 #define EC_CMDHDRLEN_SET_LEN_AND_NEXT(puLen, wVal, bNext) \
386 EC_CMDHDRLEN_SET_LEN((puLen), (wVal)) \
387 EC_CMDHDRLEN_SET_NEXT((puLen),(bNext))
388 #define EC_AL_ICMDHDR_GET_LEN_LEN EC_ICMDHDR_GET_LEN_LEN
389 #define EC_AL_CMDHDRLEN_GET_NEXT(puLen) EC_CMDHDRLEN_GET_NEXT((puLen))
390 #define EC_AL_CMDHDRLEN_GET_LEN(puLen) EC_CMDHDRLEN_GET_LEN((puLen))
391 #define EC_AL_CMDHDRLEN_SET_LEN(puLen, wVal) EC_CMDHDRLEN_SET_LEN((puLen),(wVal))
393 static EC_INLINESTART EC_T_WORD EC_ICMDHDR_GET_CMDIDX(PETYPE_EC_CMD_HEADER p)
394 {
395 return EC_GET_FRM_WORD(
396 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_CMDIDX)
397 );
398 } EC_INLINESTOP
399 #define EC_ICMDHDR_GET_CMDIDX_CMD(p) EC_AL_ICMDHDR_GET_CMDIDX_CMD((p))
400 #define EC_ICMDHDR_GET_CMDIDX_IDX(p) EC_AL_ICMDHDR_GET_CMDIDX_IDX((p))
402 static EC_INLINESTART EC_T_DWORD EC_ICMDHDR_GET_ADDR(PETYPE_EC_CMD_HEADER p)
403 {
404 return EC_GET_FRM_DWORD(
405 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_ADDR)
406 );
407 } EC_INLINESTOP
408 static EC_INLINESTART EC_T_WORD EC_ICMDHDR_GET_ADDR_ADO(PETYPE_EC_CMD_HEADER p)
409 {
410 return EC_GET_FRM_WORD(
411 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_ADDR_ADO)
412 );
413 } EC_INLINESTOP
414 static EC_INLINESTART EC_T_WORD EC_ICMDHDR_GET_ADDR_ADP(PETYPE_EC_CMD_HEADER p)
415 {
416 return EC_GET_FRM_WORD(
417 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_ADDR_ADP)
418 );
419 } EC_INLINESTOP
420 static EC_INLINESTART EC_T_WORD EC_ICMDHDR_GET_LEN(PETYPE_EC_CMD_HEADER p)
421 {
422 return EC_GET_FRM_WORD(
423 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_LEN)
424 );
425 } EC_INLINESTOP
426 static EC_INLINESTART EC_T_WORD EC_ICMDHDR_GET_LEN_LEN(PETYPE_EC_CMD_HEADER p)
427 {
428 return (EC_T_WORD)(
429 EC_GET_FRM_WORD(
430 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_LEN_LEN)
431 )&((1<<11)-1));
432 } EC_INLINESTOP
433 static EC_INLINESTART EC_T_WORD EC_ICMDHDR_GET_IRQ(PETYPE_EC_CMD_HEADER p)
434 {
435 return EC_GET_FRM_WORD(
436 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_IRQ)
437 );
438 } EC_INLINESTOP
439 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_IRQ(PETYPE_EC_CMD_HEADER p, EC_T_WORD wVal)
440 {
441 EC_SET_FRM_WORD(
442 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_IRQ),
443 wVal
444 );
445 } EC_INLINESTOP
446 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_ADDR(PETYPE_EC_CMD_HEADER p, EC_T_DWORD dwVal)
447 {
448 EC_SET_FRM_DWORD(
449 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_ADDR),
450 dwVal
451 );
452 } EC_INLINESTOP
453 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_ADDR_ADO(PETYPE_EC_CMD_HEADER p, EC_T_WORD wVal)
454 {
455 EC_SET_FRM_WORD(
456 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_ADDR_ADO),
457 wVal
458 );
459 } EC_INLINESTOP
460 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_ADDR_ADP(PETYPE_EC_CMD_HEADER p, EC_T_WORD wVal)
461 {
462 EC_SET_FRM_WORD(
463 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_ADDR_ADP),
464 wVal
465 );
466 } EC_INLINESTOP
468 #elif (defined WITHALIGNMENT) /* !EC_BIG_ENDIAN */
470 /* Offset 0 */
471 #define EC_ICMDHDR_GET_CMDIDX(p) (EC_GETWORD((p)))
472 #define EC_ICMDHDR_GET_CMDIDX_CMD(p) (((EC_T_BYTE*)(p))[0])
473 #define EC_ICMDHDR_GET_CMDIDX_IDX(p) (((EC_T_BYTE*)(p))[1])
475 /* Offset 2 */
476 #define EC_ICMDHDR_GET_ADDR(p) EC_GETDWORD( (((EC_T_BYTE*)(p))+ EC_CMDHDR_OFFS_ADDR) )
477 #define EC_ICMDHDR_GET_ADDR_ADO(p) EC_GETWORD( (((EC_T_BYTE*)(p))+ EC_CMDHDR_OFFS_ADDR_ADO) )
478 #define EC_ICMDHDR_GET_ADDR_ADP(p) EC_GETWORD( (((EC_T_BYTE*)(p))+ EC_CMDHDR_OFFS_ADDR_ADP) )
480 #define EC_ICMDHDR_SET_ADDR(p, dwVal) EC_SETDWORD( (((EC_T_BYTE*)(p))+ EC_CMDHDR_OFFS_ADDR), (dwVal))
481 #define EC_ICMDHDR_SET_ADDR_ADO(p, wVal) EC_SETWORD( (((EC_T_BYTE*)(p))+ EC_CMDHDR_OFFS_ADDR_ADO), (wVal))
482 #define EC_ICMDHDR_SET_ADDR_ADP(p, wVal) EC_SETWORD( (((EC_T_BYTE*)(p))+ EC_CMDHDR_OFFS_ADDR_ADP), (wVal))
484 /* Offset 6 */
485 #define EC_ICMDHDR_GET_LEN(p) ((EC_T_WORD)(EC_GETWORD( (((EC_T_BYTE*)(p)) + EC_CMDHDR_OFFS_LEN_LEN))))
486 #define EC_ICMDHDR_GET_LEN_LEN(p) ((EC_T_WORD)(EC_GETWORD( (((EC_T_BYTE*)(p))) + EC_CMDHDR_OFFS_LEN_LEN )&0x7ff))
488 #define EC_CMDHDRLEN_GET_NEXT(puLen) ((EC_T_WORD)((EC_GETWORD((((EC_T_BYTE*)(puLen))))>>15)&0x1))
490 #define EC_CMDHDRLEN_GET_LEN(puLen) ((EC_T_WORD)((EC_GETWORD((((EC_T_BYTE*)(puLen)))))&0x7ff))
492 #define EC_CMDHDRLEN_SET_LEN_AND_NEXT(puLen, wVal, bNext) EC_SETWORD((puLen), ((EC_T_WORD)(((wVal)&0x7ff) | (((bNext)&1)<<15))) )
495 /* Offset 8 */
496 #define EC_ICMDHDR_GET_IRQ(p) EC_GETWORD((((EC_T_BYTE*)(p)) + EC_CMDHDR_OFFS_IRQ))
497 #define EC_ICMDHDR_SET_IRQ(p, wVal) EC_SETWORD((((EC_T_BYTE*)(p)) + EC_CMDHDR_OFFS_IRQ), (wVal))
499 #else /* !EC_BIG_ENDIAN && !WITHALIGMENT */
501 /* Offset 0 */
502 #define EC_ICMDHDR_GET_CMDIDX(p) EC_AL_ICMDHDR_GET_CMDIDX((p))
503 #define EC_ICMDHDR_GET_CMDIDX_CMD(p) EC_AL_ICMDHDR_GET_CMDIDX_CMD((p))
504 #define EC_ICMDHDR_GET_CMDIDX_IDX(p) EC_AL_ICMDHDR_GET_CMDIDX_IDX((p))
506 /* Offset 2 */
507 #define EC_ICMDHDR_GET_ADDR(p) EC_AL_ICMDHDR_GET_ADDR((p))
508 #define EC_ICMDHDR_GET_ADDR_ADO(p) EC_AL_ICMDHDR_GET_ADDR_ADO((p))
509 #define EC_ICMDHDR_GET_ADDR_ADP(p) EC_AL_ICMDHDR_GET_ADDR_ADP((p))
511 #define EC_ICMDHDR_SET_ADDR(p, dwVal) EC_AL_ICMDHDR_SET_ADDR((p), (dwVal))
512 #define EC_ICMDHDR_SET_ADDR_ADO(p, wVal) EC_AL_ICMDHDR_SET_ADDR_ADO((p), (wVal))
513 #define EC_ICMDHDR_SET_ADDR_ADP(p, wVal) EC_AL_ICMDHDR_SET_ADDR_ADP((p), (wVal))
515 /* Offset 6 */
516 #define EC_ICMDHDR_GET_LEN(p) EC_AL_ICMDHDR_GET_LEN((p))
517 #define EC_ICMDHDR_GET_LEN_LEN(p) EC_AL_ICMDHDR_GET_LEN_LEN((p))
519 #ifndef EC_CMDHDRLEN_GET_NEXT
520 #define EC_CMDHDRLEN_GET_NEXT(puLen) EC_AL_CMDHDRLEN_GET_NEXT((puLen))
521 #endif
523 #ifndef EC_CMDHDRLEN_GET_LEN
524 #define EC_CMDHDRLEN_GET_LEN(puLen) EC_AL_CMDHDRLEN_GET_LEN((puLen))
525 #endif
526 #ifndef EC_CMDHDRLEN_SET_LEN
527 #define EC_CMDHDRLEN_SET_LEN(puLen, wVal) EC_AL_CMDHDRLEN_SET_LEN((puLen), (wVal))
528 #endif
530 #define EC_CMDHDRLEN_SET_LEN_AND_NEXT(puLen, wVal, bNext) EC_AL_CMDHDRLEN_SET_LEN_AND_NEXT((puLen), (wVal), (bNext))
532 /* Offset 8 */
533 #define EC_ICMDHDR_GET_IRQ(p) EC_AL_ICMDHDR_GET_IRQ((p))
534 #define EC_ICMDHDR_SET_IRQ(p, wVal) EC_AL_ICMDHDR_SET_IRQ((p), (wVal))
536 #endif /* !EC_BIG_ENDIAN && !WITHALIGMENT */
540 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_LEN(PETYPE_EC_CMD_HEADER p, EC_T_WORD wVal)
541 {
542 EC_SET_FRM_WORD(
543 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_LEN),
544 wVal
545 );
546 } EC_INLINESTOP
548 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_LEN_LEN(PETYPE_EC_CMD_HEADER p, EC_T_WORD wVal)
549 {
550 EC_T_WORD wOldVal;
551 EC_T_WORD wMask;
552 wOldVal = EC_ICMDHDR_GET_LEN((p)); /* get old value (as the len is shared with other bits) */
553 wMask = (EC_T_WORD)(~((1<<11)-1));
554 wOldVal &= wMask; /* eliminate old len value (only relevant bits) */
555 wVal = (EC_T_WORD)(wVal & ((1<<11)-1)); /* mask irrelevant bits */
556 wVal = (EC_T_WORD)(wOldVal | wVal); /* determine new length together with other bits untouched */
557 EC_ICMDHDR_SET_LEN((p),wVal); /* store it */
558 } EC_INLINESTOP
559 static EC_INLINESTART EC_T_VOID EC_ICMDHDR_SET_LEN_NEXT(PETYPE_EC_CMD_HEADER p, EC_T_BOOL bVal)
560 {
561 if (bVal)
562 {
563 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_LEN_NEXT_BYTE)[0] |=((EC_T_BYTE)0x80);
564 }
565 else
566 {
567 (((EC_T_BYTE*)p) + EC_CMDHDR_OFFS_LEN_NEXT_BYTE)[0] &=((EC_T_BYTE)~0x80);
568 }
569 } EC_INLINESTOP
571 #if (defined EC_AL_ICMDHDR_GET_LEN_LEN)
572 static EC_INLINESTART EC_T_WORD ETYPE_EC_CMD_GETLEN(PETYPE_EC_CMD_HEADER p)
573 {
574 return (EC_T_WORD)(ETYPE_EC_OVERHEAD + EC_ICMDHDR_GET_LEN_LEN(p));
575 } EC_INLINESTOP
576 static EC_INLINESTART EC_T_VOID ETYPE_EC_CMD_SETWKC(PETYPE_EC_CMD_HEADER p, EC_T_WORD wVal)
577 {
578 EC_T_BYTE* pbyCur = EC_NULL;
580 pbyCur = &(((EC_T_BYTE*)p)[ETYPE_EC_CMD_HEADER_LEN + EC_ICMDHDR_GET_LEN_LEN(p)]);
582 EC_SET_FRM_WORD(pbyCur, wVal);
583 } EC_INLINESTOP
584 static EC_INLINESTART EC_T_WORD ETYPE_EC_CMD_GETWKC(PETYPE_EC_CMD_HEADER p)
585 {
586 EC_T_BYTE* pbyCur = EC_NULL;
588 /*pbyCur = &(((EC_T_BYTE*)p)[ETYPE_EC_CMD_HEADER_LEN + p->uLen.slength.__len]);*/
589 pbyCur = &(((EC_T_BYTE*)p)[ETYPE_EC_CMD_HEADER_LEN + EC_ICMDHDR_GET_LEN_LEN( p )]);
591 return EC_GET_FRM_WORD(pbyCur);
592 } EC_INLINESTOP
593 static EC_INLINESTART EC_T_WORD ETYPE_EC_CMD_GETWKCOFF(PETYPE_EC_CMD_HEADER p)
594 {
595 return (EC_T_WORD)(ETYPE_EC_CMD_HEADER_LEN + EC_ICMDHDR_GET_LEN_LEN(p));
596 } EC_INLINESTOP
597 static EC_INLINESTART PETYPE_EC_CMD_HEADER NEXT_EcCmdHeader(PETYPE_EC_CMD_HEADER p)
598 {
599 PETYPE_EC_CMD_HEADER pRetVal = 0;
601 pRetVal = (PETYPE_EC_CMD_HEADER)(&((EC_T_BYTE*)p)[EC_ICMDHDR_GET_LEN_LEN(p) + ETYPE_EC_OVERHEAD]);
603 return pRetVal;
604 } EC_INLINESTOP
605 #endif /* EC_AL_ICMDHDR_GET_LEN_LEN */
607 /* FMMU configuration command */
608 typedef struct _ETYPE_EC_T_FMMU_CFG_CMD
609 {
610 EC_T_DWORD dwLogStartAddr; /* 0x00 */
611 EC_T_WORD wLength; /* 0x04 */
612 EC_T_BYTE byStartBit; /* 0x06 */
613 EC_T_BYTE byStopBit; /* 0x07 */
614 EC_T_WORD wPhysStart; /* 0x08 */
615 EC_T_BYTE byPhysStartBit; /* 0x0A */
616 EC_T_BYTE byType; /* 0x0B */
617 EC_T_BYTE byActivate; /* 0x0C */
618 EC_T_BYTE byReserved; /* 0x0D */
619 EC_T_WORD wReserved; /* 0x0E */
620 } EC_PACKED(1) ETYPE_EC_T_FMMU_CFG_CMD, *PETYPE_EC_T_FMMU_CFG_CMD;
622 static EC_INLINESTART EC_T_DWORD EC_ECFMMUCFGCMD_GETLOGSTARTADDR(PETYPE_EC_T_FMMU_CFG_CMD p)
623 {
624 return EC_GET_FRM_DWORD(&(p->dwLogStartAddr));
625 } EC_INLINESTOP
627 static EC_INLINESTART EC_T_WORD EC_ECFMMUCFGCMD_GETLENGTH(PETYPE_EC_T_FMMU_CFG_CMD p)
628 {
629 return EC_GET_FRM_WORD(&(p->wLength));
630 } EC_INLINESTOP
632 #define FMMU_CFG_CMD_TYPE_READ ((EC_T_BYTE)0x01)
633 #define FMMU_CFG_CMD_TYPE_WRITE ((EC_T_BYTE)0x02)
635 #define ETYPE_EC_T_FMMU_CFG_CMD_SIZE sizeof(ETYPE_EC_T_FMMU_CFG_CMD)
637 #define MAX_EC_CMD_PER_FRAME 124 /* ((ETHERNET_MAX_FRAME_LEN - 0x10)/ETYPE_EC_OVERHEAD) */
639 #define MAX_EC_DATA_LEN (ETHERNET_MAX_FRAME_LEN - ETHERNET_88A4_FRAME_LEN - ETYPE_EC_OVERHEAD)
641 /*---------------------------------------------------------------------------*/
642 typedef struct TETHERNET_88A4_HEADER
643 {
644 ETYPE_88A4_HEADER E88A4Header;
645 struct _t_sETECAT_88a4Hdr
646 { /* ETYPE_88A4_TYPE_ECAT */
647 ETYPE_EC_CMD_HEADER FirstEcCmdHeader;
648 } EC_PACKED(1)
649 sETECAT;
650 } EC_PACKED(1) ETHERNET_88A4_HEADER, *PETHERNET_88A4_HEADER;
652 /*---------------------------------------------------------------------------*/
653 typedef struct TETHERNET_88A4_MAX_FRAME
654 {
655 ETHERNET_FRAME EthernetFrame;
656 ETYPE_88A4_HEADER E88A4Header;
657 struct _t_sETECAT_maxFrame
658 { /* ETYPE_88A4_TYPE_ECAT */
659 ETYPE_EC_CMD_HEADER FirstEcCmdHeader;
660 } EC_PACKED(1)
661 sETECAT;
662 EC_T_BYTE abyData[MAX_EC_DATA_LEN];
663 EC_T_WORD __wWkc;
664 } EC_PACKED(1) ETHERNET_88A4_MAX_FRAME, *PETHERNET_88A4_MAX_FRAME;
666 typedef struct TETHERNET_88A4_MAX_VLAN_FRAME
667 {
668 ETHERNET_VLAN_FRAME EthernetFrame;
669 ETYPE_88A4_HEADER E88A4Header;
670 struct _t_sETECAT_maxVlanFrame
671 { /* ETYPE_88A4_TYPE_ECAT */
672 ETYPE_EC_CMD_HEADER FirstEcCmdHeader;
673 } EC_PACKED(1)
674 sETECAT;
675 EC_T_BYTE abyData[MAX_EC_DATA_LEN-3];
676 EC_T_WORD __wWkc;
677 } EC_PACKED(1) ETHERNET_88A4_MAX_VLAN_FRAME, *PETHERNET_88A4_MAX_VLAN_FRAME;
679 /*---------------------------------------------------------------------------*/
681 typedef struct TEcCmdDesc
682 {
683 ETYPE_EC_CMD_HEADER EcCmdHeader;
684 EC_T_WORD reserved1;
685 EC_T_BOOL bChkCntRecv;
687 EC_T_WORD reserved2;
688 EC_T_WORD cmdSize;
689 EC_T_WORD imageOffs[2]; /* in bytes */
690 EC_T_WORD imageSize[2]; /* in bytes */
691 #define EC_ECCMDDESC_PARMCOPYINPUTS 0x0001
692 #define EC_ECCMDDESC_PARMCOPYOUTPUTS 0x0002
693 #define EC_ECCMDDESC_PARMLOGMBOXSTATE 0x0004
694 EC_T_WORD cpParm;
695 EC_T_WORD cntRecv;
696 EC_T_BYTE byConfOpStatesMask; /* configuration operational state (../config/cyclic/frame/cmd/State) */
697 EC_T_BYTE reserved3[3];
698 } EC_PACKED(1) EcCmdDesc, *PEcCmdDesc;
700 #define ECCMDDESC_LEN sizeof(EcCmdDesc)
703 /*---------------------------------------------------------------------------*/
704 /* Copy information for Slave-to-Slave communication */
705 /*---------------------------------------------------------------------------*/
706 /* The master has to copy valid input data of this command from the source
707 offest (bit offs in the complete process image) to a destination offset. */
708 typedef struct
709 {
710 EC_T_WORD wSrcBitOffs;
711 EC_T_WORD wDstBitOffs;
712 EC_T_WORD wBitSize;
713 EC_T_WORD wTaskId;
714 } EC_PACKED(1) EC_T_CYC_COPY_INFO;
716 /*---------------------------------------------------------------------------*/
717 /* master properties */
718 /*---------------------------------------------------------------------------*/
719 #define EC_MASTER_PROP_MAX_NAME_LENGTH 80
720 #define EC_MASTER_PROP_MAX_VALUE_LENGTH 80
722 typedef struct _EC_T_MASTER_PROP_DESC
723 {
724 EC_T_CHAR szNameString[EC_MASTER_PROP_MAX_NAME_LENGTH]; /* name */
725 EC_T_CHAR szValueString[EC_MASTER_PROP_MAX_VALUE_LENGTH]; /* value */
726 EC_T_DWORD dwRes1;
727 EC_T_DWORD dwRes2;
728 } EC_PACKED(1) EC_T_MASTER_PROP_DESC;
731 /*---------------------------------------------------------------------------*/
732 #define ECAT_INITCMD_I_P 0x0001
733 #define ECAT_INITCMD_P_S 0x0002
734 #define ECAT_INITCMD_P_I 0x0004
735 #define ECAT_INITCMD_S_P 0x0008
736 #define ECAT_INITCMD_S_O 0x0010
737 #define ECAT_INITCMD_S_I 0x0020
738 #define ECAT_INITCMD_O_S 0x0040
739 #define ECAT_INITCMD_O_P 0x0080
740 #define ECAT_INITCMD_O_I 0x0100
741 #define ECAT_INITCMD_I_B 0x0200
742 #define ECAT_INITCMD_B_I 0x0400
744 /*
745 * The following definitions are combinations of the ECAT_INITCMD_... above.
746 * E.g. ECAT_INITCMD_IP_PS == ECAT_INITCMD_I_P | ECAT_INITCMD_P_S
747 */
748 #define ECAT_INITCMD_IP_PS 0x0003
749 #define ECAT_INITCMD_BACKTO_P 0x0088
750 #define ECAT_INITCMD_SI_OI 0x0120
751 #define ECAT_INITCMD_OSP_I 0x0124
752 #define ECAT_INITCMD_OSP_I__I_P 0x0125
753 #define ECAT_INITCMD_SP_SI_OP_OI 0x01A8
754 #define ECAT_INITCMD_IP_SP_SI_OP_OI 0x01A9
755 #define ECAT_INITCMD_I_PB 0x0201
756 #define ECAT_INITCMD_OSP_I__I_BP 0x0325
757 #define ECAT_INITCMD_BI_IP 0x0401
758 #define ECAT_INITCMD_BACKTO_I 0x0524
759 #define ECAT_INITCMD_IP_PI_BI_SI_OI 0x0525
760 #define ECAT_INITCMD_BEFORE 0x8000
762 #define ECAT_INITCMD_ADR_ERROR 0x7FFE
763 #define ECAT_INITCMD_FAILURE 0x7FFF
765 #define EC_ECINITCMDDESC_OFFS_TRANSITION ((EC_T_BYTE)ETYPE_EC_CMD_HEADER_LEN)
766 #define EC_ECINITCMDDESC_OFFS_CNT ((EC_T_BYTE)ETYPE_EC_CMD_HEADER_LEN + 2)
767 #define EC_ECINITCMDDESC_OFFS_CMTLEN ((EC_T_BYTE)ETYPE_EC_CMD_HEADER_LEN + 4)
768 #define EC_ECINITCMDDESC_OFFS_INITCMDTIMEOUT ((EC_T_BYTE)ETYPE_EC_CMD_HEADER_LEN + 7)
769 #define EC_ECINITCMDDESC_OFFS_RETRIES ((EC_T_BYTE)ETYPE_EC_CMD_HEADER_LEN + 9)
771 typedef struct TEcInitCmdDesc
772 {
773 ETYPE_EC_CMD_HEADER EcCmdHeader; /* 0 */
774 EC_T_WORD __transition; /* ETYPE_EC_CMD_HEADER_LEN + 0 = 10 */
776 EC_T_WORD __cnt; /* ETYPE_EC_CMD_HEADER_LEN + 2 */
777 EC_T_WORD __cmtLen; /* ETYPE_EC_CMD_HEADER_LEN + 4 */
778 /* (excl. \0) */
779 EC_T_BYTE byFlags; /* ETYPE_EC_CMD_HEADER_LEN + 6 */
780 /*
781 EC_T_BYTE __newCycle : 1; / * ETYPE_EC_CMD_HEADER_LEN + 6.0 * /
783 EC_T_BYTE __newFrame : 1; / * ETYPE_EC_CMD_HEADER_LEN + 6.1 * /
784 EC_T_BYTE __validate : 1; / * ETYPE_EC_CMD_HEADER_LEN + 6.2 * /
786 EC_T_BYTE __validateMask : 1; / * ETYPE_EC_CMD_HEADER_LEN + 6.3 * /
787 EC_T_BYTE reserved : 4; / * ETYPE_EC_CMD_HEADER_LEN + 6.4 * /
788 */
790 EC_T_WORD __wInitCmdTimeout; /* ETYPE_EC_CMD_HEADER_LEN + 7 */
791 /* in ms */
792 EC_T_WORD __retries; /* ETYPE_EC_CMD_HEADER_LEN + 9 */
793 EC_T_BYTE reserved2; /* ETYPE_EC_CMD_HEADER_LEN + 11 */
794 } EC_PACKED(1) EcInitCmdDesc, *PEcInitCmdDesc;
796 static EC_INLINESTART EC_T_WORD EC_ECINITCMDDESC_GET_TRANSITION(PEcInitCmdDesc p)
797 {
798 return EC_GETWORD(
799 (((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_TRANSITION)
800 );
801 } EC_INLINESTOP
803 static EC_INLINESTART EC_T_WORD EC_ECINITCMDDESC_GET_CNT(PEcInitCmdDesc p)
804 {
805 return EC_GETWORD(
806 (((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_CNT)
807 );
808 } EC_INLINESTOP
810 static EC_INLINESTART EC_T_WORD EC_ECINITCMDDESC_GET_CMTLEN(PEcInitCmdDesc p)
811 {
812 return EC_GETWORD(
813 (((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_CMTLEN)
814 );
815 } EC_INLINESTOP
817 static EC_INLINESTART EC_T_BOOL EC_ECINITCMDDESC_GET_VALIDATE(PEcInitCmdDesc p)
818 {
819 return (p->byFlags & (1<<2));
820 } EC_INLINESTOP
822 static EC_INLINESTART EC_T_BOOL EC_ECINITCMDDESC_GET_VALIDATEMASK(PEcInitCmdDesc p)
823 {
824 return (p->byFlags & (1<<3));
825 } EC_INLINESTOP
827 static EC_INLINESTART EC_T_WORD EC_ECINITCMDDESC_GET_INITCMDTIMEOUT(PEcInitCmdDesc p)
828 {
829 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_INITCMDTIMEOUT));
830 } EC_INLINESTOP
832 static EC_INLINESTART EC_T_WORD EC_ECINITCMDDESC_GET_RETRIES(PEcInitCmdDesc p)
833 {
834 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_RETRIES));
835 } EC_INLINESTOP
837 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_INITCMDTIMEOUT(PEcInitCmdDesc p, EC_T_WORD wVal)
838 {
839 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_INITCMDTIMEOUT), wVal);
840 } EC_INLINESTOP
842 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_CMTLEN(PEcInitCmdDesc p, EC_T_WORD wVal)
843 {
844 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_CMTLEN), wVal);
845 } EC_INLINESTOP
847 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_TRANSITION(PEcInitCmdDesc p, EC_T_WORD wVal)
848 {
849 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_TRANSITION), wVal);
850 } EC_INLINESTOP
852 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_RETRIES(PEcInitCmdDesc p, EC_T_WORD wVal)
853 {
854 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_RETRIES), wVal);
855 } EC_INLINESTOP
857 /* static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_NEWCYCLE(PEcInitCmdDesc p, EC_T_WORD wVal)
858 {
859 if (wVal)
860 {
861 p->byFlags |= (1<<0);
862 }
863 else
864 {
866 p->byFlags &= ~(1<<0);
867 }
868 } EC_INLINESTOP */
870 /* static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_NEWFRAME(PEcInitCmdDesc p, EC_T_WORD wVal)
871 {
872 if (wVal)
873 {
874 p->byFlags |= (1<<1);
875 }
876 else
877 {
879 p->byFlags &= ~(1<<1);
880 }
881 } EC_INLINESTOP */
883 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_VALIDATE(PEcInitCmdDesc p, EC_T_WORD wVal)
884 {
885 if (wVal)
886 {
887 p->byFlags |= (1<<2);
888 }
889 else
890 {
891 p->byFlags &= ~(1<<2);
892 }
893 } EC_INLINESTOP
895 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_VALIDATEMASK(PEcInitCmdDesc p, EC_T_WORD wVal)
896 {
897 if (wVal)
898 {
899 p->byFlags |= (1<<3);
900 }
901 else
902 {
903 p->byFlags &= ~(1<<3);
904 }
905 } EC_INLINESTOP
907 static EC_INLINESTART EC_T_VOID EC_ECINITCMDDESC_SET_CNT(PEcInitCmdDesc p, EC_T_WORD wVal)
908 {
909 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECINITCMDDESC_OFFS_CNT), wVal);
910 } EC_INLINESTOP
912 #define SIZEOF_EcInitCmdDesc(p) (sizeof(EcInitCmdDesc) + EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) + \
913 (EC_ECINITCMDDESC_GET_VALIDATE(((PEcInitCmdDesc)(p))) ? EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) : 0) + \
914 (EC_ECINITCMDDESC_GET_VALIDATEMASK(((PEcInitCmdDesc)(p))) ? EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) : 0) + \
915 (EC_ECINITCMDDESC_GET_CMTLEN(((PEcInitCmdDesc)(p))) ? EC_ECINITCMDDESC_GET_CMTLEN(((PEcInitCmdDesc)(p))) + 1 : 0))
916 #define NEXT_EcInitCmdDesc(p) (PEcInitCmdDesc)&(((EC_T_BYTE*)(p))[(sizeof(EcInitCmdDesc) + EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) + \
917 (EC_ECINITCMDDESC_GET_VALIDATE(((PEcInitCmdDesc)(p))) ? EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) : 0) + \
918 (EC_ECINITCMDDESC_GET_VALIDATEMASK(((PEcInitCmdDesc)(p))) ? EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) : 0) + \
919 (EC_ECINITCMDDESC_GET_CMTLEN(((PEcInitCmdDesc)(p))) ? EC_ECINITCMDDESC_GET_CMTLEN(((PEcInitCmdDesc)(p))) + 1 : 0))])
920 #define EcInitCmdDescData(p) (&(((EC_T_BYTE*)(p))[sizeof(EcInitCmdDesc)]))
921 #define EcInitCmdDescVData(p) (&(((EC_T_BYTE*)(p))[sizeof(EcInitCmdDesc) + EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader))]))
922 #define EcInitCmdDescVMData(p) (&(((EC_T_BYTE*)(p))[sizeof(EcInitCmdDesc) + 2*EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader))]))
923 #define EcInitCmdDescComment(p) ((EC_T_CHAR*)&(((EC_T_BYTE*)(p))[sizeof(EcInitCmdDesc) + EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) + \
924 (EC_ECINITCMDDESC_GET_VALIDATE(((PEcInitCmdDesc)(p))) ? EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) : 0) + \
925 (EC_ECINITCMDDESC_GET_VALIDATEMASK(((PEcInitCmdDesc)(p))) ? EC_ICMDHDR_GET_LEN_LEN(&(((PEcInitCmdDesc)(p))->EcCmdHeader)) : 0)]))
927 /*---------------------------------------------------------------------------*/
928 #define ECCANOPENCMDDESC_TYPE_AUTO 0
929 #define ECCANOPENCMDDESC_TYPE_DD 1
930 #define ECCANOPENCMDDESC_TYPE_USER 2
932 /*---------------------------------------------------------------------------*/
933 /* Mailbox */
934 extern EC_T_CHAR* g_cStrMbxTypeText[];
936 #define ETHERCAT_MBOX_TYPE_ERROR ((EC_T_BYTE)0) /* mailbox error response */
937 #define ETHERCAT_MBOX_TYPE_ADS ((EC_T_BYTE)1) /* AMS/ADS header follows */
938 #define ETHERCAT_MBOX_TYPE_ETHERNET ((EC_T_BYTE)2) /* ETHERCAT_ETHERNET_HEADER follows */
939 #define ETHERCAT_MBOX_TYPE_CANOPEN ((EC_T_BYTE)3) /* ETHERCAT_CANOPEN_HEADER follows */
940 #define ETHERCAT_MBOX_TYPE_FILEACCESS ((EC_T_BYTE)4) /* EC_FOE_HDR follows */
941 #define ETHERCAT_MBOX_TYPE_SOE ((EC_T_BYTE)5) /* EC_SOE_HDR follows */
942 #define ETHERCAT_MBOX_TYPE_VOE ((EC_T_BYTE)15) /* ETHERCAT_VOE_HEADER follows */
944 #define EC_ECMBOXHDR_OFFS_LENGTH ((EC_T_BYTE)0)
945 #define EC_ECMBOXHDR_OFFS_ADDRESS ((EC_T_BYTE)2)
946 #define EC_ECMBOXHDR_OFFS_CHANPRIO ((EC_T_BYTE)4)
947 #define EC_ECMBOXHDR_OFFS_TYPCRT ((EC_T_BYTE)5)
949 #define ETHERCAT_MBOX_HEADER_LEN sizeof(ETHERCAT_MBOX_HEADER)
950 #define MBXHDR_CLR(pMbx) OsDbgAssert(sizeof(*pMbx)==sizeof(ETHERCAT_MBOX_HEADER)); OsMemset(pMbx,0,sizeof(ETHERCAT_MBOX_HEADER))
952 typedef struct TETHERCAT_MBOX_HEADER
953 {
954 EC_T_WORD wLength; /* 0 */ /* following bytes */
955 EC_T_WORD wAddress; /* 2 */ /* S->M: phys addr of destination; M->S: phys addr of source; 0 = master */
956 EC_T_BYTE byChnPri; /* 4 */ /* channel, Priority */
957 EC_T_BYTE byTypCntRsvd; /* 5 */ /* wMbxType, Counter, Rsvd */
958 } EC_PACKED(1) ETHERCAT_MBOX_HEADER, *PETHERCAT_MBOX_HEADER;
960 #define EC_ECMBOXHDR_SET_MBXTYPE(p, byVal) {(p)->byTypCntRsvd = (EC_T_BYTE)(((p)->byTypCntRsvd & 0xF0) | ((byVal & 0x0F)));}
961 #define EC_ECMBOXHDR_GET_MBXTYPE(p) ((EC_T_BYTE)((p)->byTypCntRsvd & 0x0F))
963 #define EC_ECMBOXHDR_SET_COUNTER(p, byVal) {(p)->byTypCntRsvd = (EC_T_BYTE)(((p)->byTypCntRsvd & 0x8F) | ((byVal & 0x07) << 4));}
964 #define EC_ECMBOXHDR_GET_COUNTER(p) ((EC_T_BYTE)(((p)->byTypCntRsvd >> 4) & 0x07))
966 static EC_INLINESTART EC_T_VOID EC_ECMBOXHDR_SET_LENGTH(ETHERCAT_MBOX_HEADER* p, EC_T_WORD wVal)
967 {
968 EC_SET_FRM_WORD(((EC_T_PBYTE)(&(p->wLength))), wVal);
969 } EC_INLINESTOP
970 static EC_INLINESTART EC_T_WORD EC_ECMBOXHDR_GET_LENGTH(ETHERCAT_MBOX_HEADER* p)
971 {
972 return EC_GET_FRM_WORD(((EC_T_PBYTE)(&(p->wLength))));
973 } EC_INLINESTOP
975 static EC_INLINESTART EC_T_VOID EC_ECMBOXHDR_SET_ADDRESS(ETHERCAT_MBOX_HEADER* p, EC_T_WORD wVal)
976 {
977 EC_SET_FRM_WORD(((EC_T_PBYTE)(&(p->wAddress))), wVal);
978 } EC_INLINESTOP
979 static EC_INLINESTART EC_T_WORD EC_ECMBOXHDR_GET_ADDRESS(ETHERCAT_MBOX_HEADER* p)
980 {
981 return EC_GET_FRM_WORD(((EC_T_PBYTE)(&(p->wAddress))));
982 } EC_INLINESTOP
984 typedef struct TETHERCAT_MBOX_CMD
985 {
986 ETYPE_EC_CMD_HEADER EcCmdHeader;
987 ETHERCAT_MBOX_HEADER MBoxHeader;
988 } EC_PACKED(1) ETHERCAT_MBOX_CMD, *PETHERCAT_MBOX_CMD;
989 #define ETHERCAT_MBOX_CMD_LEN sizeof(ETHERCAT_MBOX_CMD)
992 typedef struct TETHERCAT_EOE_TIMESTAMP
993 {
994 EC_T_DWORD TimeStamp; /* 32 bit time stamp */
995 } ETHERCAT_EOE_TIMESTAMP, *PETHERCAT_EOE_TIMESTAMP;
996 #define ETHERCAT_EOE_TIMESTAMP_LEN sizeof(ETHERCAT_EOE_TIMESTAMP)
998 /*---------------------------------------------------------------------------*/
999 /* EoE (Ethernet over EtherCAT) */
1000 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_FRAG_REQ 0 /* EoE fragment request */
1001 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_REQ 1 /* EoE request */
1002 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_RSP 3 /* EoE response */
1003 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_SETIP_REQ 2 /* EoE set IP parameter request */
1004 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_SETIP_RSP 3 /* EoE set IP parameter response */
1005 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_SETAF_REQ 4 /* EoE set adress filter request */
1006 #define ETHERCAT_ETHERNET_FRAME_TYPE_EOE_SETAF_RSP 5 /* EoE set adress filter response */
1008 #define ETHERNET_FRAGMENT_GRANULAR 32 /* length of each fragment (except the last fragment) must be dividable by 32 */
1009 #define ETHERNET_FRAGMENT_MASK 0xFFFFFFE0
1010 #define ETHERNET_FRAGMENT_BUFFER(n) ((n+31)/32)
1011 #define ETHERNET_FRAMENUMBER_MASK 0x0000000F
1012 #define ETHERNET_MAX_FRAGMENTS 48
1013 #define ETHERNET_MAX_FRAGMENTBUFFER (ETHERNET_MAX_FRAGMENTS*ETHERNET_FRAGMENT_GRANULAR) /* 1536 */
1015 typedef struct TETHERCAT_ETHERNET_HEADER
1016 {
1017 EC_T_BYTE byTypePort; /* 0.0 */ /* frame type */
1018 /* 0.4 */ /* port number */
1020 EC_T_BYTE byBits; /* 1.0 */ /* EC_TRUE if last fragment */
1021 /* 1.1 */ /* EC_TRUE if time stamp will be appended after the EoE data in the last fragment */
1022 /* 1.2 */ /* EC_TRUE if time stamp value of the send time is requested */
1023 EC_T_WORD wNumSizeNum; /* 2.0 */ /* fragment number */
1024 /* 2.6 */ /* (complete size of the Ethernet frame + 17)/32 */
1025 /* 2.6 */ /* byte offset multiplied by 32 (if Fragment != 0); */
1026 /* buffer size multiplied by 32 (if Fragment == 0) */
1027 /* 2.12*/ /* number of the Ethernet frame */
1028 } EC_PACKED(1) ETHERCAT_ETHERNET_HEADER, *PETHERCAT_ETHERNET_HEADER;
1029 #define ETHERCAT_ETHERNET_HEADER_LEN sizeof(ETHERCAT_ETHERNET_HEADER)
1030 #define EOEHDR_CLR(pEoe) OsDbgAssert(sizeof(*pEoe)==sizeof(ETHERCAT_ETHERNET_HEADER)); OsMemset(pEoe,0,sizeof(ETHERCAT_ETHERNET_HEADER))
1032 /* wTypePortBits */
1033 #define EC_ECETHHDR_GET_FRAMETYPE(p) ((p)->byTypePort & 0xF)
1034 #define EC_ECETHHDR_SET_FRAMETYPE(p, byNewVal) {(p)->byTypePort = (EC_T_BYTE)((((p)->byTypePort) & 0xF0) | (byNewVal & 0xF));}
1036 #define EC_ECETHHDR_GET_PORT(p) ((p)->byTypePort>>4 & 0x0F)
1038 #define EC_ECETHHDR_GET_LASTFRAGMENT(p) ((p)->byBits>>0 & 0x01)
1039 #define EC_ECETHHDR_SET_LASTFRAGMENT(p, byNewVal) {(*p).byBits = (EC_T_BYTE)((((*p).byBits)& 0xFE) | (byNewVal & 1));}
1041 #define EC_ECETHHDR_GET_TIMEAPPENDED(p) ((p)->byBits>>1 & 0x01)
1042 /* #define EC_ECETHHDR_SET_TIMEAPPENDED(p, byNewVal) ((p)->byBits = (((p)->byBits)& 0XFD) | ((byNewVal & 1)<<1) */
1044 #define EC_ECETHHDR_GET_TIMEREQUEST(p) ((p)->byBits>>2 & 0x01)
1045 /* #define EC_ECETHHDR_SET_TIMEREQUEST(p, byNewVal) ((p)->byBits = (((p)->byBits)& 0XFB) | ((byNewVal & 1)<<2) */
1047 /* wNumSizeNum */
1048 #define EC_ECETHHDR_GET_FRAGMENTNUMBER(p) EC_GET_FRM_WORD_BITFIELD(0,6, (*p).wNumSizeNum)
1049 #define EC_ECETHHDR_SET_FRAGMENTNUMBER(p, wNewVal) EC_SET_FRM_WORD_BITFIELD((*p).wNumSizeNum,(wNewVal),0,6)
1051 #define EC_ECETHHDR_GET_COMPLETEFRAMESIZE(p) EC_GET_FRM_WORD_BITFIELD(6,6, p->wNumSizeNum)
1052 #define EC_ECETHHDR_SET_COMPLETEFRAMESIZE(p, wNewVal) EC_SET_FRM_WORD_BITFIELD((*p).wNumSizeNum,(wNewVal),6,6)
1054 #define EC_ECETHHDR_GET_OFFSETBUFFER(p) EC_GET_FRM_WORD_BITFIELD(6,6, p->wNumSizeNum)
1055 #define EC_ECETHHDR_SET_OFFSETBUFFER(p, wNewVal) EC_SET_FRM_WORD_BITFIELD((*p).wNumSizeNum, (wNewVal),6,6)
1057 #define EC_ECETHHDR_GET_FRAMENUMBER(p) EC_GET_FRM_WORD_BITFIELD(12,4, (*p).wNumSizeNum)
1058 #define EC_ECETHHDR_SET_FRAMENUMBER(p, wNewVal) EC_SET_FRM_WORD_BITFIELD((*p).wNumSizeNum, (wNewVal),12,4)
1061 /*---------------------------------------------------------------------------*/
1062 /* CoE (CANopen over EtherCAT) */
1063 #define ETHERCAT_CANOPEN_TYPE_EMERGENCY 1
1064 #define ETHERCAT_CANOPEN_TYPE_SDOREQ 2
1065 #define ETHERCAT_CANOPEN_TYPE_SDORES 3
1066 #define ETHERCAT_CANOPEN_TYPE_TXPDO 4
1067 #define ETHERCAT_CANOPEN_TYPE_RXPDO 5
1068 #define ETHERCAT_CANOPEN_TYPE_TXPDO_RTR 6 /* Remote transmission request of TXPDO (master requested) */
1069 #define ETHERCAT_CANOPEN_TYPE_RXPDO_RTR 7 /* Remote transmission request of RXPDO (slave requested) */
1070 #define ETHERCAT_CANOPEN_TYPE_SDOINFO 8
1072 #ifdef EC_NO_BITFIELDS
1074 typedef EC_T_WORD ETHERCAT_CANOPEN_HEADER, *PETHERCAT_CANOPEN_HEADER;
1075 #define ETHERCAT_CANOPEN_HEADER_LEN sizeof(ETHERCAT_CANOPEN_HEADER)
1076 #define COEHDR_CLR(pCan) OsDbgAssert(sizeof(*pCan)==ETHERCAT_CANOPEN_HEADER_LEN); (*(pCan) = 0)
1078 #define EC_ECCOEHDR_GET_COENUMBER(p) EC_GET_FRM_WORD_BITFIELD(0,9,*((EC_T_WORD*)p))
1079 #define EC_ECCOEHDR_SET_COENUMBER(p, wVal) EC_SET_FRM_WORD_BITFIELD(*((EC_T_WORD*)p),wVal,0,9)
1081 #define EC_ECCOEHDR_GET_COETYPE(p) EC_GET_FRM_WORD_BITFIELD(12,4,*((EC_T_WORD*)p))
1082 #define EC_ECCOEHDR_SET_COETYPE(p, wVal) EC_SET_FRM_WORD_BITFIELD(*((EC_T_WORD*)p),wVal,12,4)
1084 #else /* #ifdef EC_NO_BITFIELDS */
1086 typedef struct TETHERCAT_CANOPEN_HEADER
1087 {
1088 union _t_uCoeHdr
1089 {
1090 EC_T_WORD __wCoeHdr:16;
1091 struct _t_swCoeHdr
1092 {
1093 #ifdef EC_BIG_ENDIAN
1094 EC_T_WORD __wCoeType : 4; /* CANopen type */
1095 EC_T_WORD Reserved : 3; /* = 0 */
1096 EC_T_WORD __wCoeNumber : 9; /* e.g. PDO number */
1097 #else
1098 EC_T_WORD __wCoeNumber : 9; /* e.g. PDO number */
1099 EC_T_WORD Reserved : 3; /* = 0 */
1100 EC_T_WORD __wCoeType : 4; /* CANopen type (ETHERCAT_CANOPEN_TYPE_...) */
1101 #endif
1102 } EC_PACKED(1) swCoeHdr;
1103 } EC_PACKED(1) uCoeHdr;
1105 } EC_PACKED(1) ETHERCAT_CANOPEN_HEADER, *PETHERCAT_CANOPEN_HEADER;
1106 #define ETHERCAT_CANOPEN_HEADER_LEN sizeof(ETHERCAT_CANOPEN_HEADER)
1107 #define COEHDR_CLR(pCan) OsDbgAssert(sizeof(*pCan)==ETHERCAT_CANOPEN_HEADER_LEN); ((pCan)->uCoeHdr.__wCoeHdr = 0)
1109 #define EC_ECCOEHDR_SET_COENUMBER(p, wVal) ((p)->uCoeHdr.swCoeHdr.__wCoeNumber = (wVal))
1110 #define EC_ECCOEHDR_GET_COETYPE(p) ((p)->uCoeHdr.swCoeHdr.__wCoeType)
1111 #define EC_ECCOEHDR_SET_COETYPE(p, wVal) ((p)->uCoeHdr.swCoeHdr.__wCoeType = (wVal))
1113 #endif /* #else EC_NO_BITFIELDS */
1116 #define EC_ECSDOHDR_OFFS_INDEX ((EC_T_BYTE)1)
1117 #define EC_ECSDOHDR_OFFS_SUBINDEX ((EC_T_BYTE)3)
1118 #define EC_ECSDOHDR_OFFS_SDODATA ((EC_T_BYTE)4)
1120 typedef struct TEC_SDO_HDR
1121 {
1122 union _t_uHdr_sdoheader
1123 {
1124 /* EC_NO_BITFIELDS is always set for EC_BIG_ENDIAN, but the SET/GET macros for the Bit Field definitions below do not exist or are not used */
1125 #if (!defined EC_NO_BITFIELDS) || (defined EC_BIG_ENDIAN)
1126 struct _t_sIdq
1127 { /* Initiate Download Request */
1128 #ifdef EC_BIG_ENDIAN
1129 EC_T_BYTE Ccs : 3; /* = 1 */
1130 EC_T_BYTE Complete : 1;
1131 EC_T_BYTE Size : 2;
1132 EC_T_BYTE Expedited : 1;
1133 EC_T_BYTE SizeInd : 1;
1134 #else
1135 EC_T_BYTE SizeInd : 1;
1136 EC_T_BYTE Expedited : 1;
1137 EC_T_BYTE Size : 2;
1138 EC_T_BYTE Complete : 1;
1139 EC_T_BYTE Ccs : 3; /* = 1 */
1140 #endif /* !EC_BIG_ENDIAN */
1141 } EC_PACKED(1) Idq;
1142 struct _t_sIds
1143 { /* Initiate Download Response */
1144 #ifdef EC_BIG_ENDIAN
1145 EC_T_BYTE Scs : 3; /* = 3 */
1146 EC_T_BYTE Reserved : 5;
1147 #else
1148 EC_T_BYTE Reserved : 5;
1149 EC_T_BYTE Scs : 3; /* = 3 */
1150 #endif /* !EC_BIG_ENDIAN */
1151 } EC_PACKED(1) Ids;
1152 struct _t_sDsq
1153 { /* Download Segment Request */
1154 #ifdef EC_BIG_ENDIAN
1155 EC_T_BYTE Ccs : 3; /* = 0 */
1156 EC_T_BYTE Toggle : 1;
1157 EC_T_BYTE Size : 3;
1158 EC_T_BYTE LastSeg : 1;
1159 #else
1160 EC_T_BYTE LastSeg : 1;
1161 EC_T_BYTE Size : 3;
1162 EC_T_BYTE Toggle : 1;
1163 EC_T_BYTE Ccs : 3; /* = 0 */
1164 #endif /* !EC_BIG_ENDIAN */
1165 } EC_PACKED(1) Dsq;
1166 struct _t_sDss
1167 { /* Download Segment Response */
1168 #ifdef EC_BIG_ENDIAN
1169 EC_T_BYTE Scs : 3; /* = 1 */
1170 EC_T_BYTE Toggle : 1;
1171 EC_T_BYTE Reserved : 4;
1172 #else
1173 EC_T_BYTE Reserved : 4;
1174 EC_T_BYTE Toggle : 1;
1175 EC_T_BYTE Scs : 3; /* = 1 */
1176 #endif /* !EC_BIG_ENDIAN */
1177 } EC_PACKED(1) Dss;
1178 struct _t_sIuq
1179 { /* Initiate Upload Request */
1180 #ifdef EC_BIG_ENDIAN
1181 EC_T_BYTE Ccs : 3; /* = 2 */
1182 EC_T_BYTE Complete : 1;
1183 EC_T_BYTE Reserved : 4;
1184 #else
1185 EC_T_BYTE Reserved : 4;
1186 EC_T_BYTE Complete : 1;
1187 EC_T_BYTE Ccs : 3; /* = 2 */
1188 #endif /* !EC_BIG_ENDIAN */
1189 } EC_PACKED(1) Iuq;
1190 struct _t_sIus
1191 { /* Initiate Upload Response */
1192 #ifdef EC_BIG_ENDIAN
1193 EC_T_BYTE Scs : 3; /* = 2 */
1194 EC_T_BYTE Reserved : 1;
1195 EC_T_BYTE Size : 2;
1196 EC_T_BYTE Expedited : 1;
1197 EC_T_BYTE SizeInd : 1;
1198 #else
1199 EC_T_BYTE SizeInd : 1;
1200 EC_T_BYTE Expedited : 1;
1201 EC_T_BYTE Size : 2;
1202 EC_T_BYTE Reserved : 1;
1203 EC_T_BYTE Scs : 3; /* = 2 */
1204 #endif /* !EC_BIG_ENDIAN */
1205 } EC_PACKED(1) Ius;
1206 struct _t_sUsq
1207 { /* Upload Segment Request */
1208 #ifdef EC_BIG_ENDIAN
1209 EC_T_BYTE Ccs : 3; /* = 3 */
1210 EC_T_BYTE Toggle : 1;
1211 EC_T_BYTE Reserved : 4;
1212 #else
1213 EC_T_BYTE Reserved : 4;
1214 EC_T_BYTE Toggle : 1;
1215 EC_T_BYTE Ccs : 3; /* = 3 */
1216 #endif /* !EC_BIG_ENDIAN */
1217 } EC_PACKED(1) Usq;
1218 struct _t_sUss
1219 { /* Upload Segment Response */
1220 #ifdef EC_BIG_ENDIAN
1221 EC_T_BYTE Scs : 3; /* = 0 */
1222 EC_T_BYTE Toggle : 1;
1223 EC_T_BYTE Size : 3;
1224 EC_T_BYTE LastSeg : 1;
1225 #else
1226 EC_T_BYTE LastSeg : 1;
1227 EC_T_BYTE Size : 3;
1228 EC_T_BYTE Toggle : 1;
1229 EC_T_BYTE Scs : 3; /* = 0 */
1230 #endif /* !EC_BIG_ENDIAN */
1231 } EC_PACKED(1) Uss;
1232 struct _t_sCS
1233 { /* Abort Transfer */
1234 #ifdef EC_BIG_ENDIAN
1235 EC_T_BYTE Ccs : 3; /* = 4 */
1236 EC_T_BYTE Reserved : 5;
1237 #else
1238 EC_T_BYTE Reserved : 5;
1239 EC_T_BYTE Ccs : 3; /* = 4 */
1240 #endif /* !EC_BIG_ENDIAN */
1241 } EC_PACKED(1) Abt;
1242 #endif /* EC_NO_BITFIELDS && !EC_BIG_ENDIAN */
1243 EC_T_BYTE byCS;
1244 } EC_PACKED(1) uHdr; /* 0 */
1245 EC_T_WORD __Index; /* 1 */
1246 EC_T_BYTE SubIndex; /* 3 */
1247 EC_T_DWORD __dwSdoData; /* 4 */
1248 } EC_PACKED(1) EC_SDO_HDR, *PEC_SDO_HDR;
1250 #define SDO_HDR_INDEX_OFFSET (sizeof(EC_T_BYTE)) /* CS */
1251 #define SDO_HDR_SUB_INDEX_OFFSET (sizeof(EC_T_BYTE)+sizeof(EC_T_WORD)) /* CS + Index */
1252 #define SDO_HDR_DATA_OFFSET (sizeof(EC_T_BYTE)+sizeof(EC_T_WORD)+sizeof(EC_T_BYTE)) /* CS + Index + SubIndex */
1253 #define EC_SDO_HDR_LEN sizeof(EC_SDO_HDR)
1254 #define ETHERCAT_MIN_SDO_MBOX_LEN (ETHERCAT_MBOX_HEADER_LEN + ETHERCAT_CANOPEN_HEADER_LEN + EC_SDO_HDR_LEN)
1255 #define SDOHDR_CLR(pSdo) OsDbgAssert(sizeof(*pSdo)==EC_SDO_HDR_LEN); OsMemset(pSdo,0,EC_SDO_HDR_LEN)
1257 static EC_INLINESTART EC_T_WORD EC_ECSDOHDR_GET_INDEX(PEC_SDO_HDR p)
1258 {
1259 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOHDR_OFFS_INDEX));
1260 } EC_INLINESTOP
1261 static EC_INLINESTART EC_T_DWORD EC_ECSDOHDR_GET_SDODATA(PEC_SDO_HDR p)
1262 {
1263 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECSDOHDR_OFFS_SDODATA));
1264 } EC_INLINESTOP
1265 static EC_INLINESTART EC_T_VOID EC_ECSDOHDR_SET_INDEX(PEC_SDO_HDR p, EC_T_WORD wVal)
1266 {
1267 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOHDR_OFFS_INDEX), wVal);
1268 } EC_INLINESTOP
1269 static EC_INLINESTART EC_T_VOID EC_ECSDOHDR_SET_SDODATA(PEC_SDO_HDR p, EC_T_DWORD dwVal)
1270 {
1271 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECSDOHDR_OFFS_SDODATA), dwVal);
1272 } EC_INLINESTOP
1274 static EC_INLINESTART EC_T_PBYTE EC_ECSDOHDR_SDODATA(PEC_SDO_HDR p)
1275 {
1276 return (EC_T_PBYTE)(((EC_T_PBYTE)p) + EC_ECSDOHDR_OFFS_SDODATA);
1277 } EC_INLINESTOP
1279 /* command specifier - request */
1280 #define SDO_CCS_DOWNLOAD_SEGMENT 0
1281 #define SDO_CCS_INITIATE_DOWNLOAD 1
1282 #define SDO_CCS_INITIATE_UPLOAD 2
1283 #define SDO_CCS_UPLOAD_SEGMENT 3
1284 #define SDO_CCS_ABORT_TRANSFER 4
1286 /* command specifier - response */
1287 #define SDO_SCS_UPLOAD_SEGMENT 0
1288 #define SDO_SCS_DOWNLOAD_SEGMENT 1
1289 #define SDO_SCS_INITIATE_UPLOAD 2
1290 #define SDO_SCS_INITIATE_DOWNLOAD 3
1291 #define SDO_SCS_ABORT_TRANSFER 4 /* Not defined as valid SDO Res in ETG.1000.6
1292 but implemented on some slaves not based on ET9300 (SSC) */
1294 #define SDO_DOWNLOAD_SEGMENT_MAX_DATA 7
1296 /*****************************************************************************
1297 * CoE Abort Codes are defined in ETG.1000.6
1298 * Additional codes are defined in ETG.1020, V1.2.0, Table 21: CoE Abort Codes (extension)
1299 * See also EC_E_SDO_ABORTCODE_..., EC_SZTXT_E_SDO_ABORTCODE_..., SdoAbortToErrorCode, EC_SDO_ABORTCODE_
1300 *****************************************************************************/
1301 #define SDO_ABORTCODE_TOGGLE 0x05030000 /* Toggle bit not alternated */
1302 #define SDO_ABORTCODE_TIMEOUT 0x05040000 /* SDO protocol timed out */
1303 #define SDO_ABORTCODE_CCS_SCS 0x05040001 /* Client/server command specifier not valid or unknown */
1304 #define SDO_ABORTCODE_BLK_SIZE 0x05040002 /* Invalid block size (block mode only) */
1305 #define SDO_ABORTCODE_SEQNO 0x05040003 /* Invalid sequence number (block mode only) */
1306 #define SDO_ABORTCODE_CRC 0x05040004 /* CRC error (block mode only) */
1307 #define SDO_ABORTCODE_MEMORY 0x05040005 /* Out of memory */
1308 #define SDO_ABORTCODE_ACCESS 0x06010000 /* Unsupported access to an object */
1309 #define SDO_ABORTCODE_WRITEONLY 0x06010001 /* Attempt to read a write only object */
1310 #define SDO_ABORTCODE_READONLY 0x06010002 /* Attempt to write a read only object */
1311 #define SDO_ABORTCODE_SI_NOT_WRITTEN 0x06010003 /* Subindex cannot be written, SI0 must be 0 for write access */
1312 #define SDO_ABORTCODE_CA_TYPE_MISM 0x06010004 /* Complete access not supported for objects of variable length such as ENUM object types */
1313 #define SDO_ABORTCODE_OBJ_TOO_BIG 0x06010005 /* Object length exceeds mailbox size */
1314 #define SDO_ABORTCODE_PDO_MAPPED 0x06010006 /* Object mapped to RxPDO, SDO Download blocked */
1315 #define SDO_ABORTCODE_INDEX 0x06020000 /* Object does not exist in the object dictionary */
1316 #define SDO_ABORTCODE_PDO_MAP 0x06040041 /* Object cannot be mapped to the PDO */
1317 #define SDO_ABORTCODE_PDO_LEN 0x06040042 /* The number and length of the objects to be mapped would exceed PDO length */
1318 #define SDO_ABORTCODE_P_INCOMP 0x06040043 /* General parameter incompatibility reason */
1319 #define SDO_ABORTCODE_I_INCOMP 0x06040047 /* General internal incompatibility in the device */
1320 #define SDO_ABORTCODE_HARDWARE 0x06060000 /* Access failed due to an hardware error */
1321 #define SDO_ABORTCODE_DATA_SIZE 0x06070010 /* Data type does not match, length of service parameter does not match */
1322 #define SDO_ABORTCODE_DATA_SIZE1 0x06070012 /* Data type does not match, length of service parameter too high */
1323 #define SDO_ABORTCODE_DATA_SIZE2 0x06070013 /* Data type does not match, length of service parameter too low */
1324 #define SDO_ABORTCODE_OFFSET 0x06090011 /* Sub-index does not exist */
1325 #define SDO_ABORTCODE_DATA_RANGE 0x06090030 /* Value range of parameter exceeded (only for write access) */
1326 #define SDO_ABORTCODE_DATA_RANGE1 0x06090031 /* Value of parameter written too high */
1327 #define SDO_ABORTCODE_DATA_RANGE2 0x06090032 /* Value of parameter written too low */
1328 #define SDO_ABORTCODE_MODULE_ID_LIST_NOT_MATCH 0x06090033 /* Detected Module Ident List (0xF030) and Configured Module Ident list (0xF050) does not match */
1329 #define SDO_ABORTCODE_MINMAX 0x06090036 /* Maximum value is less than minimum value */
1330 #define SDO_ABORTCODE_GENERAL 0x08000000 /* general error*/
1331 #define SDO_ABORTCODE_TRANSFER 0x08000020 /* Data cannot be transferred or stored to the application */
1332 #define SDO_ABORTCODE_TRANSFER1 0x08000021 /* Data cannot be transferred or stored to the application because of local control */
1333 #define SDO_ABORTCODE_TRANSFER2 0x08000022 /* Data cannot be transferred or stored to the application because of the present device state */
1334 #define SDO_ABORTCODE_DICTIONARY 0x08000023 /* Object dictionary dynamic generation fails or no object dictionary is present (e.g. object dictionary is generated from file and generation fails because of an file error) */
1336 #define SDO_SUB_IDX_SUBINDEX_CNT 0
1338 #define SDO_IDX_DEVICE_TYPE 0x1000
1339 #define SDO_IDX_ERROR 0x1001
1340 #define SDO_IDX_MANUFACTURER_NAME 0x1008
1341 #define SDO_IDX_MANUFACTURER_HW_VER 0x1009
1342 #define SDO_IDX_MANUFACTURER_SW_VER 0x100A
1343 #define SDO_IDX_IDENTITY_OBJECT 0x1018
1344 #define SDO_SIDX_IDENTITY_OBJECT_VENDORID 1
1345 #define SDO_SIDX_IDENTITY_OBJECT_PCODE 2
1346 #define SDO_SIDX_IDENTITY_OBJECT_REVNO 3
1347 #define SDO_SIDX_IDENTITY_OBJECT_SERNO 4
1350 #define SDO_IDX_ETHERCAT_ADDR 0x1100
1352 #define SDO_IDX_RXPDO1_PARA 0x1400
1353 #define SDO_SIDX_RXPDXX_PARA_EXCLUDE 1
1355 #define SDO_IDX_RXPDO2_PARA 0x1401
1356 /* ... */
1357 #define SDO_IDX_RXPDO512_PARA 0x15FF
1359 #define SDO_IDX_TXPDO1_PARA 0x1800
1360 #define SDO_IDX_TXPDO2_PARA 0x1801
1361 /* ... */
1362 #define SDO_IDX_TXPDO512_PARA 0x19FF
1364 #define SDO_IDX_RXPDO1_MAPPING 0x1600
1365 #define SDO_IDX_RXPDO2_MAPPING 0x1601
1366 /* ... */
1367 #define SDO_IDX_RXPDO512_MAPPING 0x17FF
1369 #define SDO_IDX_TXPDO1_MAPPING 0x1A00
1370 #define SDO_IDX_TXPDO2_MAPPING 0x1A01
1371 /* ... */
1372 #define SDO_IDX_TXPDO512_MAPPING 0x1BFF
1374 #define SDO_IDX_SYNCMAN_TYPE 0x1C00
1375 #define SDO_IDX_SYNCMAN0_PDOASSIGN 0x1C10
1376 #define SDO_IDX_SYNCMAN1_PDOASSIGN 0x1C11
1377 #define SDO_IDX_SYNCMAN2_PDOASSIGN 0x1C12
1378 #define SDO_IDX_SYNCMAN3_PDOASSIGN 0x1C13
1380 /* ... */
1381 #define SDO_IDX_SYNCMAN31_PDOASSIGN 0x1C2F
1383 #define SDO_IDX_ECAT_MEMORY_0000_00FF 0x1D00
1384 #define SDO_IDX_ECAT_MEMORY_0100_01FF 0x1D01
1385 /* ... */
1386 #define SDO_IDX_ECAT_MEMORY_FF00_FFFF 0x1DFF
1388 /* CoE SDO Information */
1389 #define ECAT_COE_INFO_OPCODE_LIST_Q 1
1390 #define ECAT_COE_INFO_OPCODE_LIST_S 2
1391 #define ECAT_COE_INFO_OPCODE_OBJ_Q 3
1392 #define ECAT_COE_INFO_OPCODE_OBJ_S 4
1393 #define ECAT_COE_INFO_OPCODE_ENTRY_Q 5
1394 #define ECAT_COE_INFO_OPCODE_ENTRY_S 6
1395 #define ECAT_COE_INFO_OPCODE_ERROR_S 7
1397 #define ECAT_COE_INFO_LIST_TYPE_LENGTH 0
1398 #define ECAT_COE_INFO_LIST_TYPE_ALL 1
1399 #define ECAT_COE_INFO_LIST_TYPE_RXPDOMAP 2
1400 #define ECAT_COE_INFO_LIST_TYPE_TXPDOMAP 3
1401 #define ECAT_COE_INFO_LIST_TYPE_BACKUP 4
1403 #define ECAT_COE_INFO_OBJCODE_NULL 0
1404 #define ECAT_COE_INFO_OBJCODE_DOMAIN 2
1405 #define ECAT_COE_INFO_OBJCODE_DEFTYPE 5
1406 #define ECAT_COE_INFO_OBJCODE_DEFSTRUCT 6
1407 #define ECAT_COE_INFO_OBJCODE_VAR 7
1408 #define ECAT_COE_INFO_OBJCODE_ARRAY 8
1409 #define ECAT_COE_INFO_OBJCODE_RECORD 9
1411 #define ECAT_COE_INFO_OBJCAT_OPTIONAL 0
1412 #define ECAT_COE_INFO_OBJCAT_MANDATORY 1
1414 #define ECAT_COE_INFO_OBJACCESS_RO 0x07
1415 #define ECAT_COE_INFO_OBJACCESS_RW 0x3f
1417 typedef struct TETHERCAT_SDO_INFO_LIST
1418 {
1419 EC_T_WORD __ListType; /* == SDO_INFO_LIST_TYPE_XXX */
1420 struct _t_sRes_sdoinfolist
1421 {
1422 EC_T_WORD __Index[1];
1423 } EC_PACKED(1) Res;
1424 } EC_PACKED(1) ETHERCAT_SDO_INFO_LIST, *PETHERCAT_SDO_INFO_LIST;
1426 static EC_INLINESTART EC_T_WORD EC_SDOINFOLIST_GET_LISTTYPE(PETHERCAT_SDO_INFO_LIST p)
1427 {
1428 return EC_GET_FRM_WORD((((EC_T_PBYTE)p)));
1429 } EC_INLINESTOP
1430 static EC_INLINESTART EC_T_VOID EC_SDOINFOLIST_SET_LISTTYPE(PETHERCAT_SDO_INFO_LIST p, EC_T_WORD wVal)
1431 {
1432 EC_SET_FRM_WORD((((EC_T_PBYTE)p)), wVal);
1433 } EC_INLINESTOP
1435 #define EC_SDOINFOOBJ_OFFS_INDEX ((EC_T_BYTE)0)
1436 #define EC_SDOINFOOBJ_OFFS_DATATYPE ((EC_T_BYTE)2)
1438 typedef struct TETHERCAT_SDO_INFO_OBJ
1439 {
1440 EC_T_WORD __Index;
1441 struct _t_sRes_sdoinfoobj
1442 {
1443 EC_T_WORD __DataType; /* refer to data type index */
1444 EC_T_BYTE MaxSubIndex; /* max subIndex */
1445 #if (!defined EC_NO_BITFIELDS)
1446 #ifdef EC_BIG_ENDIAN
1447 EC_T_BYTE Reserved : 3; /* == 0 */
1448 EC_T_BYTE ObjCategory : 1; /* 0=optional, 1=mandatory */
1449 EC_T_BYTE ObjCode : 4; /* defined in DS 301 (Table 37) */
1450 #else
1451 EC_T_BYTE ObjCode : 4; /* defined in DS 301 (Table 37) */
1452 EC_T_BYTE ObjCategory : 1; /* 0=optional, 1=mandatory */
1453 EC_T_BYTE Reserved : 3; /* == 0 */
1454 #endif
1455 #else
1456 EC_T_BYTE byObjCodeCategory;
1457 #endif /* EC_NO_BITFIELDS */
1458 EC_T_CHAR Name[1]; /* rest of mailbox data */
1459 } EC_PACKED(1) Res;
1460 } EC_PACKED(1) ETHERCAT_SDO_INFO_OBJ, *PETHERCAT_SDO_INFO_OBJ;
1462 static EC_INLINESTART EC_T_WORD EC_SDOINFOOBJ_GET_INDEX(PETHERCAT_SDO_INFO_OBJ p)
1463 {
1464 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_SDOINFOOBJ_OFFS_INDEX));
1465 } EC_INLINESTOP
1466 static EC_INLINESTART EC_T_WORD EC_SDOINFOOBJ_GET_DATATYPE(PETHERCAT_SDO_INFO_OBJ p)
1467 {
1468 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_SDOINFOOBJ_OFFS_DATATYPE));
1469 } EC_INLINESTOP
1470 static EC_INLINESTART EC_T_VOID EC_SDOINFOOBJ_SET_INDEX(PETHERCAT_SDO_INFO_OBJ p, EC_T_WORD wVal)
1471 {
1472 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_SDOINFOOBJ_OFFS_INDEX), wVal);
1473 } EC_INLINESTOP
1474 static EC_INLINESTART EC_T_VOID EC_SDOINFOOBJ_SET_DATATYPE(PETHERCAT_SDO_INFO_OBJ p, EC_T_WORD wVal)
1475 {
1476 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_SDOINFOOBJ_OFFS_DATATYPE), wVal);
1477 } EC_INLINESTOP
1479 #define EC_ECSDOINFOENTRY_OFFS_INDEX ((EC_T_BYTE)0)
1480 #define EC_ECSDOINFOENTRY_OFFS_DATATYPE ((EC_T_BYTE)4)
1481 #define EC_ECSDOINFOENTRY_OFFS_BITLEN ((EC_T_BYTE)6)
1482 #define EC_ECSDOINFOENTRY_OFFS_BITPARM ((EC_T_BYTE)8)
1484 typedef struct TETHERCAT_SDO_INFO_ENTRY
1485 {
1486 EC_T_WORD __Index;
1487 EC_T_BYTE SubIdx;
1488 EC_T_BYTE ValueInfo; /* bit0 = ObjAccess, bit1 = ObjCategory, bit2 = PdoMapping, bit3 = UnitType */
1489 /* bit4 = DefaultValue, bit5 = MinValue, bit6 = MaxValue */
1490 struct _t_sRes_sdoinfoentry
1491 {
1492 EC_T_WORD __DataType; /* refer to data type index */
1493 EC_T_WORD __BitLen;
1494 #if (!defined EC_NO_BITFIELDS)
1495 #ifdef EC_BIG_ENDIAN
1496 EC_T_BYTE __TxPdoMapping : 1; /* */
1497 EC_T_BYTE __RxPdoMapping : 1; /* */
1498 EC_T_BYTE __ObjAccess : 6; /* bit0 = read; bit1 = write; bit2 = const. bit3 = PRE-OP bit4 = SAFE-OP bit5 = OP */
1499 #else
1500 EC_T_BYTE __ObjAccess : 6; /* bit0 = read; bit1 = write; bit2 = const. bit3 = PRE-OP bit4 = SAFE-OP bit5 = OP */
1501 EC_T_BYTE __RxPdoMapping : 1; /* */
1502 EC_T_BYTE __TxPdoMapping : 1; /* */
1503 #endif
1504 #else
1505 EC_T_BYTE byObjAccessRxPdoMappingTxPdoMapping;
1506 #endif /* EC_NO_BITFIELDS */
1507 EC_T_BYTE Reserved; /* for future use */
1508 } EC_PACKED(1) Res;
1509 } EC_PACKED(1) ETHERCAT_SDO_INFO_ENTRY, *PETHERCAT_SDO_INFO_ENTRY;
1511 static EC_INLINESTART EC_T_WORD EC_SDOINFOENTRY_GET_INDEX(PETHERCAT_SDO_INFO_ENTRY p)
1512 {
1513 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_INDEX));
1514 } EC_INLINESTOP
1515 static EC_INLINESTART EC_T_WORD EC_SDOINFOENTRY_GET_DATATYPE(PETHERCAT_SDO_INFO_ENTRY p)
1516 {
1517 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_DATATYPE));
1518 } EC_INLINESTOP
1519 static EC_INLINESTART EC_T_WORD EC_SDOINFOENTRY_GET_BITLEN(PETHERCAT_SDO_INFO_ENTRY p)
1520 {
1521 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_BITLEN));
1522 } EC_INLINESTOP
1523 static EC_INLINESTART EC_T_WORD EC_SDOINFOENTRY_GET_OBJACCESS(PETHERCAT_SDO_INFO_ENTRY p)
1524 {
1525 return (EC_T_WORD)((EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_BITLEN))>>0) & ((1<<6) - 1));
1526 } EC_INLINESTOP
1527 static EC_INLINESTART EC_T_WORD EC_SDOINFOENTRY_GET_RXPDOMAPPING(PETHERCAT_SDO_INFO_ENTRY p)
1528 {
1529 return (EC_T_WORD)((EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_BITLEN)) >> 6) & 1);
1530 } EC_INLINESTOP
1531 static EC_INLINESTART EC_T_WORD EC_SDOINFOENTRY_GET_TXPDOMAPPING(PETHERCAT_SDO_INFO_ENTRY p)
1532 {
1533 return (EC_T_WORD)((EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_BITLEN)) >> 7) & 1);
1534 } EC_INLINESTOP
1536 static EC_INLINESTART EC_T_VOID EC_SDOINFOENTRY_SET_INDEX(PETHERCAT_SDO_INFO_ENTRY p, EC_T_WORD wVal)
1537 {
1538 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_INDEX), wVal);
1539 } EC_INLINESTOP
1541 typedef struct TETHERCAT_SDO_INFO_ERROR
1542 {
1543 EC_T_DWORD __ErrorCode;
1544 EC_T_CHAR ErrorText[1]; /* rest of mailbox data */
1545 } EC_PACKED(1) ETHERCAT_SDO_INFO_ERROR, *PETHERCAT_SDO_INFO_ERROR;
1547 static EC_INLINESTART EC_T_DWORD EC_SDOINFOERROR_GET_ERRORCODE(PETHERCAT_SDO_INFO_ERROR p)
1548 {
1549 return EC_GET_FRM_DWORD(((EC_T_PBYTE)p));
1550 } EC_INLINESTOP
1551 static EC_INLINESTART EC_T_VOID EC_SDOINFOERROR_SET_ERRORCODE(PETHERCAT_SDO_INFO_ERROR p, EC_T_DWORD dwVal)
1552 {
1553 EC_SET_FRM_DWORD(((EC_T_PBYTE)p), dwVal);
1554 } EC_INLINESTOP
1556 typedef struct TETHERCAT_SDO_INFO_HEADER
1557 {
1558 /* EC_NO_BITFIELDS is always set for EC_BIG_ENDIAN, but the SET/GET macros for the Bit Field definitions below do not exist or are not used */
1559 #if (!defined EC_NO_BITFIELDS) || (defined EC_BIG_ENDIAN)
1560 #ifdef EC_BIG_ENDIAN
1561 EC_T_BYTE InComplete : 1; /* */
1562 EC_T_BYTE OpCode : 7; /* == SDO_INFO_TYPE_XXX */ /* 0 */
1563 #else
1564 EC_T_BYTE OpCode : 7; /* == SDO_INFO_TYPE_XXX */ /* 0 */
1565 EC_T_BYTE InComplete : 1; /* */
1566 #endif
1567 #else
1568 EC_T_BYTE byOpCodeInComplete;
1569 #endif /* EC_NO_BITFIELDS && !EC_BIG_ENDIAN */
1571 EC_T_BYTE Reserved; /* == 0 */ /* 1 */
1573 EC_T_WORD __FragmentsLeft; /* */ /* 2 */
1575 union _t_uInfo
1576 {
1577 ETHERCAT_SDO_INFO_LIST List;
1578 ETHERCAT_SDO_INFO_OBJ Obj;
1579 ETHERCAT_SDO_INFO_ENTRY Entry;
1580 ETHERCAT_SDO_INFO_ERROR Error;
1581 EC_T_BYTE Data[1];
1582 } EC_PACKED(1) uInfo; /* 4 */
1583 } EC_PACKED(1) ETHERCAT_SDO_INFO_HEADER, *PETHERCAT_SDO_INFO_HEADER;
1584 #define SDOINFOHDR_CLR(pSdoInfo) OsDbgAssert(sizeof(*pSdoInfo)==sizeof(ETHERCAT_SDO_INFO_HEADER)); OsMemset(pSdoInfo,0,sizeof(ETHERCAT_SDO_INFO_HEADER))
1586 static EC_INLINESTART EC_T_WORD EC_SDOINFOHDR_GET_FRAGMENTSLEFT(PETHERCAT_SDO_INFO_HEADER p)
1587 {
1588 return EC_GET_FRM_WORD((((EC_T_PBYTE)p)+2));
1589 } EC_INLINESTOP
1590 static EC_INLINESTART EC_T_VOID EC_SDOINFOHDR_SET_FRAGMENTSLEFT(PETHERCAT_SDO_INFO_HEADER p, EC_T_WORD wVal)
1591 {
1592 EC_SET_FRM_WORD((((EC_T_PBYTE)p)+2), wVal);
1593 } EC_INLINESTOP
1595 #define ETHERCAT_SDO_INFO_LISTREQ_LEN EC_OFFSETOF(ETHERCAT_SDO_INFO_HEADER, uInfo.List.Res)
1596 #define ETHERCAT_SDO_INFO_OBJREQ_LEN EC_OFFSETOF(ETHERCAT_SDO_INFO_HEADER, uInfo.Obj.Res)
1597 #define ETHERCAT_SDO_INFO_ENTRYREQ_LEN EC_OFFSETOF(ETHERCAT_SDO_INFO_HEADER, uInfo.Entry.Res)
1599 typedef struct TETHERCAT_EMERGENCY_HEADER
1600 {
1601 EC_T_WORD __ErrorCode;
1602 EC_T_BYTE ErrorRegister;
1603 EC_T_BYTE Data[5];
1604 } EC_PACKED(1) ETHERCAT_EMERGENCY_HEADER, *PETHERCAT_EMERGENCY_HEADER;
1606 static EC_INLINESTART EC_T_WORD EC_EMERGHDR_GET_ERRORCODE(PETHERCAT_EMERGENCY_HEADER p)
1607 {
1608 return EC_GET_FRM_WORD(((EC_T_PBYTE)p));
1609 } EC_INLINESTOP
1610 static EC_INLINESTART EC_T_VOID EC_EMERGHDR_SET_ERRORCODE(PETHERCAT_EMERGENCY_HEADER p, EC_T_WORD wVal)
1611 {
1612 EC_SET_FRM_WORD(((EC_T_PBYTE)p), wVal);
1613 } EC_INLINESTOP
1615 /*---------------------------------------------------------------------------*/
1616 /* FoE (File Access over EtherCAT) */
1617 #define ECAT_FOE_OPCODE_RRQ 1
1618 #define ECAT_FOE_OPCODE_WRQ 2
1619 #define ECAT_FOE_OPCODE_DATA 3
1620 #define ECAT_FOE_OPCODE_ACK 4
1621 #define ECAT_FOE_OPCODE_ERR 5
1622 #define ECAT_FOE_OPCODE_BUSY 6
1624 /* See ETG1000.6 Table 92 - Error codes of FoE */
1625 #define ECAT_FOE_ERRCODE_NOTDEFINED 0x8000 /**< \brief Not defined */
1626 #define ECAT_FOE_ERRCODE_NOTFOUND 0x8001 /**< \brief File not found */
1627 #define ECAT_FOE_ERRCODE_ACCESS 0x8002 /**< \brief No file access */
1628 #define ECAT_FOE_ERRCODE_DISKFULL 0x8003 /**< \brief Disk is full */
1629 #define ECAT_FOE_ERRCODE_ILLEGAL 0x8004 /**< \brief Illegal access */
1630 #define ECAT_FOE_ERRCODE_PACKENO 0x8005 /**< \brief Invalid packed number */
1631 #define ECAT_FOE_ERRCODE_EXISTS 0x8006 /**< \brief File not exists */
1632 #define ECAT_FOE_ERRCODE_NOUSER 0x8007 /**< \brief No User */
1633 #define ECAT_FOE_ERRCODE_BOOTSTRAPONLY 0x8008 /**< \brief Only in Bootstrap state */
1634 #define ECAT_FOE_ERRCODE_NOTINBOOTSTRAP 0x8009 /**< \brief Downloaded file name is not valid in Bootstrap state */
1635 #define ECAT_FOE_ERRCODE_NORIGHTS 0x800A /**< \brief No access rights */
1636 #define ECAT_FOE_ERRCODE_PROGERROR 0x800B /**< \brief Program error */
1637 #define ECAT_FOE_ERRCODE_INVALID_CHECKSUM 0x800C /**< \brief Wrong checksum */
1638 #define ECAT_FOE_ERRCODE_INVALID_FIRMWARE 0x800D /**< \brief Firmware does not fit for Hardware */
1639 /* 0x800E **< reserved */
1640 #define ECAT_FOE_ERRCODE_NO_FILE 0x800F /**< \brief No file to read */
1641 #define ECAT_FOE_ERRCODE_FILE_HEAD_MISSING 0x8010 /**< \brief File header does not exist */
1642 #define ECAT_FOE_ERRCODE_FLASH_PROBLEM 0x8011 /**< \brief Flash problem */
1643 #define ECAT_FOE_ERRCODE_FILE_INCOMPATIBLE 0x8012 /**< \brief File incompatible */
1645 #define EC_ECFOEHDR_OFFS_OPCODE ((EC_T_BYTE)0)
1646 #define EC_ECFOEHDR_OFFS_UHDR ((EC_T_BYTE)2)
1647 #define EC_ECFOEHDR_OFFS_ENTIRE ((EC_T_BYTE)4)
1648 #define EC_ECFOEHDR_OFFS_BUSY_TEXT ((EC_T_BYTE)8)
1650 typedef struct TEC_FOE_HDR
1651 {
1652 EC_T_BYTE OpCode; /* 0 EC_ECFOEHDR_OFFS_OPCODE: = 1 (RRQ), = 2 (WRQ), = 3 (DATA), = 4 (ACK), = 5 (ERR), = 6 (BUSY), see ECAT_FOE_OPCODE_... */
1653 EC_T_BYTE Reserved1; /* 1 */ /* = 0 */
1654 union _t_uHdr_foeheader
1655 {
1656 EC_T_DWORD __Password; /* 2 EC_ECFOEHDR_OFFS_UHDR: (ECAT_FOE_OPCODE_RRQ, ECAT_FOE_OPCODE_WRQ) = 0 if unknown */
1657 EC_T_DWORD __PacketNo; /* 2 EC_ECFOEHDR_OFFS_UHDR: (ECAT_FOE_OPCODE_DATA, ECAT_FOE_OPCODE_ACK) */
1658 EC_T_DWORD __ErrorCode;/* 2 EC_ECFOEHDR_OFFS_UHDR: (ECAT_FOE_OPCODE_ERR) */
1659 struct _t_sStatus
1660 {
1661 EC_T_WORD __Done; /* 2 EC_ECFOEHDR_OFFS_UHDR: 0...max busy progress (ECAT_FOE_OPCODE_BUSY) */
1662 EC_T_WORD __Entire; /* 4 EC_ECFOEHDR_OFFS_ENTIRE: max busy progress (ECAT_FOE_OPCODE_BUSY) */
1663 } EC_PACKED(1) sStatus;
1664 } EC_PACKED(1) uHdr;
1665 /* union */
1666 /* { */
1667 /* EC_T_CHAR Name[] (ECAT_FOE_OPCODE_RRQ, ECAT_FOE_OPCODE_WRQ) rest of mailbox data */
1668 /* EC_T_BYTE Data[] (ECAT_FOE_OPCODE_DATA) rest of mailbox data */
1669 /* EC_T_CHAR ErrorText[] (ECAT_FOE_OPCODE_ERR) rest of mailbox data */
1670 /* EC_T_CHAR BusyText[] (ECAT_FOE_OPCODE_BUSY) rest of mailbox data */
1671 /* }; */
1672 } EC_PACKED(1) EC_FOE_HDR, *PEC_FOE_HDR;
1673 #define EC_FOE_HDR_LEN sizeof(EC_FOE_HDR)
1674 #define FOEHDR_CLR(pFoe) OsDbgAssert(sizeof(*pFoe)==(EC_FOE_HDR_LEN)); OsMemset(pFoe,0,(EC_FOE_HDR_LEN))
1676 static EC_INLINESTART EC_T_BYTE EC_ECFOEHDR_GET_OPCODE(PEC_FOE_HDR p)
1677 {
1678 return p->OpCode;
1679 } EC_INLINESTOP
1680 static EC_INLINESTART EC_T_DWORD EC_ECFOEHDR_GET_PASSWORD(PEC_FOE_HDR p)
1681 {
1682 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR));
1683 } EC_INLINESTOP
1684 static EC_INLINESTART EC_T_DWORD EC_ECFOEHDR_GET_PACKETNO(PEC_FOE_HDR p)
1685 {
1686 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR));
1687 } EC_INLINESTOP
1688 static EC_INLINESTART EC_T_DWORD EC_ECFOEHDR_GET_ERRORCODE(PEC_FOE_HDR p)
1689 {
1690 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR));
1691 } EC_INLINESTOP
1692 static EC_INLINESTART EC_T_WORD EC_ECFOEHDR_GET_STATUSDONE(PEC_FOE_HDR p)
1693 {
1694 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR));
1695 } EC_INLINESTOP
1696 static EC_INLINESTART EC_T_WORD EC_ECFOEHDR_GET_STATUSENTIRE(PEC_FOE_HDR p)
1697 {
1698 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_ENTIRE));
1699 } EC_INLINESTOP
1700 static EC_INLINESTART EC_T_CHAR* EC_ECFOEHDR_GET_BUSYCOMMENT(PEC_FOE_HDR p)
1701 {
1702 return ((EC_T_CHAR*)p) + EC_ECFOEHDR_OFFS_BUSY_TEXT;
1703 } EC_INLINESTOP
1704 static EC_INLINESTART EC_T_VOID EC_ECFOEHDR_SET_OPCODE(PEC_FOE_HDR p, EC_T_BYTE byVal)
1705 {
1706 p->OpCode = byVal;
1707 } EC_INLINESTOP
1708 static EC_INLINESTART EC_T_VOID EC_ECFOEHDR_SET_PASSWORD(PEC_FOE_HDR p, EC_T_DWORD dwVal)
1709 {
1710 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR),dwVal);
1711 } EC_INLINESTOP
1712 static EC_INLINESTART EC_T_VOID EC_ECFOEHDR_SET_PACKETNO(PEC_FOE_HDR p, EC_T_DWORD dwVal)
1713 {
1714 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR),dwVal);
1715 } EC_INLINESTOP
1716 static EC_INLINESTART EC_T_VOID EC_ECFOEHDR_SET_ERRORCODE(PEC_FOE_HDR p, EC_T_DWORD dwVal)
1717 {
1718 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_ECFOEHDR_OFFS_UHDR),dwVal);
1719 } EC_INLINESTOP
1721 #define EC_ECFOEBUSYINFO_OFFS_DONE ((EC_T_BYTE)0)
1722 #define EC_ECFOEBUSYINFO_OFFS_ENTIRE ((EC_T_BYTE)2)
1724 typedef struct TETHERCAT_FOE_BUSY_INFO
1725 {
1726 EC_T_WORD __Done; /* 0 */
1727 EC_T_WORD __Entire; /* 2 */
1728 EC_T_CHAR Comment[32]; /* 4 */
1729 } EC_PACKED(1) ETHERCAT_FOE_BUSY_INFO, *PETHERCAT_FOE_BUSY_INFO;
1730 #define ETHERCAT_FOE_BUSY_INFO_LEN sizeof(ETHERCAT_FOE_BUSY_INFO)
1732 static EC_INLINESTART EC_T_WORD EC_ECFOEBUSYINFO_GET_STATUSDONE(PETHERCAT_FOE_BUSY_INFO p)
1733 {
1734 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECFOEBUSYINFO_OFFS_DONE));
1735 } EC_INLINESTOP
1736 static EC_INLINESTART EC_T_WORD EC_ECFOEBUSYINFO_GET_STATUSENTIRE(PETHERCAT_FOE_BUSY_INFO p)
1737 {
1738 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECFOEBUSYINFO_OFFS_ENTIRE));
1739 } EC_INLINESTOP
1740 static EC_INLINESTART EC_T_VOID EC_ECFOEBUSYINFO_SET_STATUSDONE(PETHERCAT_FOE_BUSY_INFO p, EC_T_WORD wVal)
1741 {
1742 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECFOEBUSYINFO_OFFS_DONE), wVal);
1743 } EC_INLINESTOP
1744 static EC_INLINESTART EC_T_VOID EC_ECFOEBUSYINFO_SET_STATUSENTIRE(PETHERCAT_FOE_BUSY_INFO p, EC_T_WORD wVal)
1745 {
1746 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECFOEBUSYINFO_OFFS_ENTIRE), wVal);
1747 } EC_INLINESTOP
1750 /*---------------------------------------------------------------------------*/
1751 /* SoE (Servo Profile over EtherCAT) */
1753 #ifdef INCLUDE_SOE_SUPPORT
1755 #define ECAT_SOE_OPCODE_RRQ 1 /*Read request*/
1756 #define ECAT_SOE_OPCODE_RRS 2 /*Read response*/
1757 #define ECAT_SOE_OPCODE_WRQ 3 /*Write request*/
1758 #define ECAT_SOE_OPCODE_WRS 4 /*Write response*/
1759 #define ECAT_SOE_OPCODE_NOTIFY 5 /*Notification*/
1760 #define ECAT_SOE_OPCODE_SLV_INFO 6 /*Slave Info*/
1761 #define ECAT_SOE_OPCODE_RESERVED 7
1763 #define ECAT_SOE_ERRCODE_INVALID_ACCESS 0x0009 /* "Invalid access to element 0" */
1764 #define ECAT_SOE_ERRCODE_NOT_EXIST 0x1001 /* "Does not exist" */
1765 #define ECAT_SOE_ERRCODE_INVL_ACC_ELEM1 0x1009 /* "Invalid access to element 1" */
1766 #define ECAT_SOE_ERRCODE_NAME_NOT_EXIST 0x2001 /* "Name does not exist" */
1767 #define ECAT_SOE_ERRCODE_NAME_UNDERSIZE 0x2002 /* "Name undersize in transmission" */
1768 #define ECAT_SOE_ERRCODE_NAME_OVERSIZE 0x2003 /* "Name oversize in transmission" */
1769 #define ECAT_SOE_ERRCODE_NAME_UNCHANGE 0x2004 /* "Name unchangeable" */
1770 #define ECAT_SOE_ERRCODE_NAME_WR_PROT 0x2005 /* "Name currently write-protected" */
1771 #define ECAT_SOE_ERRCODE_UNDERS_TRANS 0x3002 /* "Attribute undersize in transmission" */
1772 #define ECAT_SOE_ERRCODE_OVERS_TRANS 0x3003 /* "Attribute oversize in transmission" */
1773 #define ECAT_SOE_ERRCODE_ATTR_UNCHANGE 0x3004 /* "Attribute unchangeable" */
1774 #define ECAT_SOE_ERRCODE_ATTR_WR_PROT 0x3005 /* "Attribute currently write-protected" */
1775 #define ECAT_SOE_ERRCODE_UNIT_NOT_EXIST 0x4001 /* "Unit does not exist" */
1776 #define ECAT_SOE_ERRCODE_UNIT_UNDERSIZE 0x4002 /* "Unit undersize in transmission" */
1777 #define ECAT_SOE_ERRCODE_UNIT_OVERSIZE 0x4003 /* "Unit oversize in transmission" */
1778 #define ECAT_SOE_ERRCODE_UNIT_UNCHANGE 0x4004 /* "Unit unchangeable" */
1779 #define ECAT_SOE_ERRCODE_UNIT_WR_PROT 0x4005 /* "Unit currently write-protected" */
1780 #define ECAT_SOE_ERRCODE_MIN_NOT_EXIST 0x5001 /* "Minimum input value does not exist" */
1781 #define ECAT_SOE_ERRCODE_MIN_UNDERSIZE 0x5002 /* "Minimum input value undersize in transmission" */
1782 #define ECAT_SOE_ERRCODE_MIN_OVERSIZE 0x5003 /* "Minimum input value oversize in transmission" */
1783 #define ECAT_SOE_ERRCODE_MIN_UNCHANGE 0x5004 /* "Minimum input value unchangeable" */
1784 #define ECAT_SOE_ERRCODE_MIN_WR_PROT 0x5005 /* "Minimum input value currently write-protected" */
1785 #define ECAT_SOE_ERRCODE_MAX_NOT_EXIST 0x6001 /* "Maximum input value does not exist" */
1786 #define ECAT_SOE_ERRCODE_MAX_UNDERSIZE 0x6002 /* "Maximum input value undersize in transmission" */
1787 #define ECAT_SOE_ERRCODE_MAX_OVERSIZE 0x6003 /* "Maximum input value oversize in transmission" */
1788 #define ECAT_SOE_ERRCODE_MAX_UNCHANGE 0x6004 /* "Maximum input value unchangeable" */
1789 #define ECAT_SOE_ERRCODE_MAX_WR_PROT 0x6005 /* "Maximum input value currently write-protected" */
1790 #define ECAT_SOE_ERRCODE_DATA_NOT_EXIST 0x7001 /* "Data item does not exist" */
1791 #define ECAT_SOE_ERRCODE_DATA_UNDERSIZE 0x7002 /* "Data item undersize in transmission" */
1792 #define ECAT_SOE_ERRCODE_DATA_OVERSIZE 0x7003 /* "Data item oversize in transmission" */
1793 #define ECAT_SOE_ERRCODE_DATA_UNCHANGE 0x7004 /* "Data item unchangeable" */
1794 #define ECAT_SOE_ERRCODE_DATA_WR_PROT 0x7005 /* "Data item currently write-protected" */
1795 #define ECAT_SOE_ERRCODE_DATA_MIN_LIMIT 0x7006 /* "Data item less than minimum input value limit" */
1796 #define ECAT_SOE_ERRCODE_DATA_MAX_LIMIT 0x7007 /* "Data item exceeds maximum input value limit" */
1797 #define ECAT_SOE_ERRCODE_DATA_INCOR 0x7008 /* "Data item is incorrect" */
1798 #define ECAT_SOE_ERRCODE_PASWD_PROT 0x7009 /* "Data item is protected by password" */
1799 #define ECAT_SOE_ERRCODE_TEMP_UNCHANGE 0x700A /* "Data item temporary unchangeable (in AT or MDT)" */
1800 #define ECAT_SOE_ERRCODE_INVL_INDIRECT 0x700B /* "Invalid indirect" */
1801 #define ECAT_SOE_ERRCODE_TEMP_UNCHANGE1 0x700C /* "Data item temporary unchangeable (parameter or opmode...)" */
1802 #define ECAT_SOE_ERRCODE_ALREADY_ACTIVE 0x7010 /* "Command already active" */
1803 #define ECAT_SOE_ERRCODE_NOT_INTERRUPT 0x7011 /* "Command not interruptable" */
1804 #define ECAT_SOE_ERRCODE_CMD_NOT_AVAIL 0x7012 /* "Command not available (in this phase)" */
1805 #define ECAT_SOE_ERRCODE_CMD_NOT_AVAIL1 0x7013 /* "Command not available (invalid parameter...)" */
1806 #define ECAT_SOE_ERRCODE_NO_DATA 0x7014 /* "No data state"*/
1807 #define ECAT_SOE_ERRCODE_NO_DEFAULT_VALUE 0x8001 /* "No default value */
1808 #define ECAT_SOE_ERRCODE_DEFAULT_LONG 0x8002 /* "Default value transmission too long" */
1809 #define ECAT_SOE_ERRCODE_DEFAULT_WP 0x8004 /* "Default value cannot be changed, read only." */
1810 #define ECAT_SOE_ERRCODE_INVL_DRIVE_NO 0x800A /* "Invalid drive number" */
1811 #define ECAT_SOE_ERRCODE_GENERAL_ERROR 0x800B /* "General error" */
1812 #define ECAT_SOE_ERRCODE_NO_ELEM_ADR 0x800C /* "No element addressed" */
1817 #define EC_ECSOEHDR_OFFS_IDN ((EC_T_BYTE)2)
1818 #define EC_ECSOEHDR_OFFS_FRAGLEFT ((EC_T_BYTE)2)
1819 typedef struct TEC_SOE_HDR
1820 {
1821 /* EC_NO_BITFIELDS is always set for EC_BIG_ENDIAN, but the SET/GET macros for the Bit Field definitions below do not exist or are not used */
1822 #if (!defined EC_NO_BITFIELDS) || (defined EC_BIG_ENDIAN)
1823 #ifdef EC_BIG_ENDIAN
1824 EC_T_BYTE DriveNo : 3;
1825 EC_T_BYTE Error : 1;
1826 EC_T_BYTE Incomplete : 1;
1827 EC_T_BYTE OpCode : 3;
1828 #else
1829 EC_T_BYTE OpCode : 3;
1830 EC_T_BYTE Incomplete : 1;
1831 EC_T_BYTE Error : 1;
1832 EC_T_BYTE DriveNo : 3;
1833 #endif
1834 #else
1835 EC_T_BYTE byOpCodeIncompleteErrorDriveNo;
1836 #endif /* EC_NO_BITFIELDS && !EC_BIG_ENDIAN */
1837 EC_T_BYTE byElements;
1838 union _t_uIdnFragLeft
1839 {
1840 EC_T_WORD wIdn;
1841 EC_T_WORD wFragmentsLeft;
1842 } EC_PACKED(1) uIdnFragLeft;
1843 } EC_PACKED(1) EC_SOE_HDR, *PEC_SOE_HDR;
1846 typedef struct TETHERCAT_SOE_EMERGENCY_HEADER
1847 {
1848 EC_T_BYTE Data[64];
1849 } EC_PACKED(1) ETHERCAT_SOE_EMERGENCY_HEADER, *PETHERCAT_SOE_EMERGENCY_HEADER;
1851 typedef struct TETHERCAT_SOE_NOTIFICATION_HEADER
1852 {
1853 EC_T_WORD DataStatus;
1854 } EC_PACKED(1) ETHERCAT_SOE_NOTIFICATION_HEADER, *PETHERCAT_SOE_NOTIFICATION_HEADER;
1856 /* definition of bitmask for above element flags */
1857 #define SOE_BM_ELEMENTFLAG_DATATSTATE 0x01
1858 #define SOE_BM_ELEMENTFLAG_NAME 0x02
1859 #define SOE_BM_ELEMENTFLAG_ATTRIBUTE 0x04
1860 #define SOE_BM_ELEMENTFLAG_UNIT 0x08
1861 #define SOE_BM_ELEMENTFLAG_MIN 0x10
1862 #define SOE_BM_ELEMENTFLAG_MAX 0x20
1863 #define SOE_BM_ELEMENTFLAG_VALUE 0x40
1864 #define SOE_BM_ELEMENTFLAG_DEFAULT 0x80
1866 #define SOE_HDR_IDN_OFFSET (sizeof(EC_T_BYTE)+sizeof(EC_T_BYTE)) /* OpCode/... + DataState/... */
1867 #define SOE_HDR_DATA_OFFSET (sizeof(EC_T_BYTE)+sizeof(EC_T_BYTE)+sizeof(EC_T_WORD)) /* OpCode/... + DataState/... + IDN/FragLeft */
1868 #define EC_SOE_HDR_LEN sizeof(EC_SOE_HDR)
1869 #define ETHERCAT_MIN_SOE_MBOX_LEN (ETHERCAT_MBOX_HEADER_LEN + EC_SOE_HDR_LEN)
1870 #define SOEHDR_CLR(pSoe) OsDbgAssert(sizeof(*pSoe)==EC_SOE_HDR_LEN); OsMemset(pSoe,0,EC_SOE_HDR_LEN)
1872 static EC_INLINESTART EC_T_WORD EC_ECSOEHDR_GET_IDN(PEC_SOE_HDR p)
1873 {
1874 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSOEHDR_OFFS_IDN));
1875 } EC_INLINESTOP
1876 static EC_INLINESTART EC_T_WORD EC_ECSOEHDR_GET_FRAGLEFT(PEC_SOE_HDR p)
1877 {
1878 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSOEHDR_OFFS_FRAGLEFT));
1879 } EC_INLINESTOP
1880 static EC_INLINESTART EC_T_DWORD EC_ECSOEHDR_GET_ERRORCODE(PEC_SOE_HDR p)
1881 {
1882 return EC_GET_FRM_WORD((((EC_T_PBYTE)p)+SOE_HDR_DATA_OFFSET));
1883 } EC_INLINESTOP
1885 static EC_INLINESTART EC_T_VOID EC_ECSOEHDR_SET_IDN(PEC_SOE_HDR p, EC_T_WORD wVal)
1886 {
1887 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSOEHDR_OFFS_IDN), wVal);
1888 } EC_INLINESTOP
1889 static EC_INLINESTART EC_T_VOID EC_ECSOEHDR_SET_FRAGLEFT(PEC_SOE_HDR p, EC_T_WORD wVal)
1890 {
1891 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSOEHDR_OFFS_FRAGLEFT), wVal);
1892 } EC_INLINESTOP
1893 #endif /* #ifdef INCLUDE_SOE_SUPPORT */
1895 #ifdef INCLUDE_AOE_SUPPORT
1896 /*---------------------------------------------------------------------------*/
1897 /* AoE (ADS over EtherCAT) */
1898 #define ECAT_AOEHDR_COMMANDID_READ 0x002
1899 #define ECAT_AOEHDR_COMMANDID_WRITE 0x003
1900 #define ECAT_AOEHDR_COMMANDID_WRITECONTROL 0x005
1901 #define ECAT_AOEHDR_COMMANDID_READWRITE 0x009
1902 #define ECAT_AOEHDR_COMMANDID_FRAGMENTATION 0x902
1904 /*---------------------------------------------------------------------------*/
1905 /* Global error codes */
1906 #define ADSERR_NOERROR 0 /*No error*/
1907 #define ADSERR_DEVICE_INTERNAL 1 /*Internal error */
1908 /*#define ADSERR_DEVICE 2 // No Rtime */
1909 /*#define ADSERR_DEVICE 3 // Allocation locked memory error */
1910 /*#define ADSERR_DEVICE 4 // Insert mailbox error */
1911 /*#define ADSERR_DEVICE 5 // Wrong receive HMSG */
1912 #define ADSERR_DEVICE_TARGET_PORT_NOT_FOUND 6 /* target port not found */
1913 #define ADSERR_DEVICE_TARGET_MACHINE_NOT_FOUND 7 /* target machine not found */
1914 #define ADSERR_DEVICE_UNKNOWN_CMD_ID 8 /* Unknown command ID */
1915 /* #define ADSERR_DEVICE 9 // Bad task ID */
1916 /* #define ADSERR_DEVICE 10 // No IO */
1917 /* #define ADSERR_DEVICE 11 // Unknown AMS command */
1918 /* #define ADSERR_DEVICE 12 // Win 32 error */
1919 #define ADSERR_DEVICE_PORT_NOT_CONNECTED 13 /* Port not connected */
1920 #define ADSERR_DEVICE_INVALID_AMS_LENGTH 14 /* Invalid AMS length */
1921 #define ADSERR_DEVICE_INVALID_AMS_ID 15 /* Invalid AMS Net ID */
1922 /* #define ADSERR_DEVICE 16 // Low Installation level */
1923 /* #define ADSERR_DEVICE 17 // No debug available */
1924 #define ADSERR_DEVICE_PORT_DISABLED 18 /* Port disabled */
1925 #define ADSERR_DEVICE_PORT_CONNECTED 19 /* Port already connected */
1926 /* #define ADSERR_DEVICE 20 // AMS Sync Win32 error */
1927 /* #define ADSERR_DEVICE 21 // AMS Sync Timeout */
1928 /* #define ADSERR_DEVICE 22 // AMS Sync AMS error */
1929 /* #define ADSERR_DEVICE 23 // AMS Sync no index map */
1930 #define ADSERR_DEVICE_INVALID_AMS_PORT 24 /* Invalid AMS port */
1931 #define ADSERR_DEVICE_NO_MEMORY 25 /* No memory */
1932 /* #define ADSERR_DEVICE 26 // TCP send error */
1933 /* #define ADSERR_DEVICE 27 // Host unreachable */
1934 #define ADSERR_DEVICE_INVALIDAMSFRAGMENT 28 /* invalid ams fragment */
1937 /* General ADS error codes */
1938 #define ERR_ADSERRS 0x0700
1939 #define ADSERR_DEVICE_ERROR (0x00 + ERR_ADSERRS) /* Error class < device error > */
1940 #define ADSERR_DEVICE_SRVNOTSUPP (0x01 + ERR_ADSERRS) /* Service is not supported by server */
1941 #define ADSERR_DEVICE_INVALIDGRP (0x02 + ERR_ADSERRS) /* invalid indexGroup */
1942 #define ADSERR_DEVICE_INVALIDOFFSET (0x03 + ERR_ADSERRS) /* invalid indexOffset */
1943 #define ADSERR_DEVICE_INVALIDACCESS (0x04 + ERR_ADSERRS) /* reading/writing not permitted */
1944 #define ADSERR_DEVICE_INVALIDSIZE (0x05 + ERR_ADSERRS) /* parameter size not correct */
1945 #define ADSERR_DEVICE_INVALIDDATA (0x06 + ERR_ADSERRS) /* invalid parameter value(s) */
1946 #define ADSERR_DEVICE_NOTREADY (0x07 + ERR_ADSERRS) /* device is not in a ready state */
1947 #define ADSERR_DEVICE_BUSY (0x08 + ERR_ADSERRS) /* device is busy */
1948 #define ADSERR_DEVICE_INVALIDCONTEXT (0x09 + ERR_ADSERRS) /* invalid context (must be InWindows) */
1949 #define ADSERR_DEVICE_NOMEMORY (0x0A + ERR_ADSERRS) /* out of memory */
1950 #define ADSERR_DEVICE_INVALIDPARM (0x0B + ERR_ADSERRS) /* invalid parameter value(s) */
1951 #define ADSERR_DEVICE_NOTFOUND (0x0C + ERR_ADSERRS) /* not found (files, ...) */
1952 #define ADSERR_DEVICE_SYNTAX (0x0D + ERR_ADSERRS) /* syntax error in comand or file */
1953 #define ADSERR_DEVICE_INCOMPATIBLE (0x0E + ERR_ADSERRS) /* objects do not match */
1954 #define ADSERR_DEVICE_EXISTS (0x0F + ERR_ADSERRS) /* object already exists */
1955 #define ADSERR_DEVICE_SYMBOLNOTFOUND (0x10 + ERR_ADSERRS) /* symbol not found */
1956 #define ADSERR_DEVICE_SYMBOLVERSIONINVALID (0x11 + ERR_ADSERRS) /* symbol version invalid */
1957 #define ADSERR_DEVICE_INVALIDSTATE (0x12 + ERR_ADSERRS) /* server is in invalid state */
1958 #define ADSERR_DEVICE_TRANSMODENOTSUPP (0x13 + ERR_ADSERRS) /* AdsTransMode not supported */
1959 #define ADSERR_DEVICE_NOTIFYHNDINVALID (0x14 + ERR_ADSERRS) /* Notification handle is invalid */
1960 #define ADSERR_DEVICE_CLIENTUNKNOWN (0x15 + ERR_ADSERRS) /* Notification client not registered */
1961 #define ADSERR_DEVICE_NOMOREHDLS (0x16 + ERR_ADSERRS) /* no more notification handles */
1962 #define ADSERR_DEVICE_INVALIDWATCHSIZE (0x17 + ERR_ADSERRS) /* size for watch to big */
1963 #define ADSERR_DEVICE_NOTINIT (0x18 + ERR_ADSERRS) /* device not initialized */
1964 #define ADSERR_DEVICE_TIMEOUT (0x19 + ERR_ADSERRS) /* device has a timeout */
1965 #define ADSERR_DEVICE_NOINTERFACE (0x1A + ERR_ADSERRS) /* query interface failed */
1966 #define ADSERR_DEVICE_INVALIDINTERFACE (0x1B + ERR_ADSERRS) /* wrong interface required */
1967 #define ADSERR_DEVICE_INVALIDCLSID (0x1C + ERR_ADSERRS) /* class ID is invalid */
1968 #define ADSERR_DEVICE_INVALIDOBJID (0x1D + ERR_ADSERRS) /* object ID is invalid */
1969 #define ADSERR_DEVICE_PENDING (0x1E + ERR_ADSERRS) /* request is pending */
1970 #define ADSERR_DEVICE_ABORTED (0x1F + ERR_ADSERRS) /* request is aborted */
1971 #define ADSERR_DEVICE_WARNING (0x20 + ERR_ADSERRS) /* signal warning */
1972 #define ADSERR_DEVICE_INVALIDARRAYIDX (0x21 + ERR_ADSERRS) /* invalid array index */
1973 #define ADSERR_DEVICE_SYMBOLNOTACTIVE (0x22 + ERR_ADSERRS) /* symbol not active -> release handle and try again */
1974 #define ADSERR_DEVICE_ACCESSDENIED (0x23 + ERR_ADSERRS) /* access denied */
1975 #define ADSERR_CLIENT_ERROR (0x40 + ERR_ADSERRS) /* Error class < client error > */
1976 #define ADSERR_CLIENT_INVALIDPARM (0x41 + ERR_ADSERRS) /* invalid parameter at service call */
1977 #define ADSERR_CLIENT_LISTEMPTY (0x42 + ERR_ADSERRS) /* polling list is empty */
1978 #define ADSERR_CLIENT_VARUSED (0x43 + ERR_ADSERRS) /* var connection already in use */
1979 #define ADSERR_CLIENT_DUPLINVOKEID (0x44 + ERR_ADSERRS) /* invoke id in use */
1980 #define ADSERR_CLIENT_SYNCTIMEOUT (0x45 + ERR_ADSERRS) /* timeout elapsed */
1981 #define ADSERR_CLIENT_W32ERROR (0x46 + ERR_ADSERRS) /* error in win32 subsystem */
1982 #define ADSERR_CLIENT_TIMEOUTINVALID (0x47 + ERR_ADSERRS) /* ? */
1983 #define ADSERR_CLIENT_PORTNOTOPEN (0x48 + ERR_ADSERRS) /* ads dll */
1984 #define ADSERR_CLIENT_NOAMSADDR (0x49 + ERR_ADSERRS) /* ads dll */
1985 #define ADSERR_CLIENT_SYNCINTERNAL (0x50 + ERR_ADSERRS) /* internal error in ads sync */
1986 #define ADSERR_CLIENT_ADDHASH (0x51 + ERR_ADSERRS) /* hash table overflow */
1987 #define ADSERR_CLIENT_REMOVEHASH (0x52 + ERR_ADSERRS) /* key not found in hash table */
1988 #define ADSERR_CLIENT_NOMORESYM (0x53 + ERR_ADSERRS) /* no more symbols in cache */
1989 #define ADSERR_CLIENT_SYNCRESINVALID (0x54 + ERR_ADSERRS) /* invalid response received */
1990 #define ADSERR_CLIENT_SYNCPORTLOCKED (0x55 + ERR_ADSERRS) /* sync port is locked */
1993 typedef struct _EC_AOE_HDR
1994 {
1995 EC_T_BYTE oTargetNetId[6]; /* 0: destination NetID */
1996 EC_T_WORD wTargetPort; /* 6: destination port */
1997 EC_T_BYTE oSenderNetId[6]; /* 8: source NetID */
1998 EC_T_WORD wSenderPort; /* 14: source port */
1999 EC_T_WORD wCmdId; /* 16: command id */
2000 EC_T_WORD wStateFlags; /* 18: state flags */
2001 EC_T_DWORD dwDataSize; /* 20: count bytes for actual command (excl. AmsHead) */
2002 EC_T_DWORD dwErrorCode; /* 24: error code (only for responses) */
2003 EC_T_DWORD dwAoeInvokeId; /* 28: will be copied unchanged from request to response */
2004 } EC_PACKED(1) EC_AOE_HDR, *PEC_AOE_HDR;
2005 #define EC_AOE_HDR_OFFS_TARGET_NET_ID ((EC_T_BYTE)0)
2006 #define EC_AOE_HDR_OFFS_TARGET_PORT ((EC_T_BYTE)6)
2007 #define EC_AOE_HDR_OFFS_SENDER_NET_ID ((EC_T_BYTE)8)
2008 #define EC_AOE_HDR_OFFS_SENDER_PORT ((EC_T_BYTE)14)
2009 #define EC_AOE_HDR_OFFS_CMD_ID ((EC_T_BYTE)16)
2010 #define EC_AOE_HDR_OFFS_STATE_FLAGS ((EC_T_BYTE)18)
2011 #define EC_AOE_HDR_OFFS_DATA_SIZE ((EC_T_BYTE)20)
2012 #define EC_AOE_HDR_OFFS_ERROR_CODE ((EC_T_BYTE)24)
2013 #define EC_AOE_HDR_OFFS_INVOKE_ID ((EC_T_BYTE)28)
2015 static EC_INLINESTART EC_T_WORD EC_AOE_HDR_GET_TARGET_PORT(EC_AOE_HDR* p)
2016 {
2017 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_TARGET_PORT));
2018 } EC_INLINESTOP
2019 static EC_INLINESTART EC_T_WORD EC_AOE_HDR_GET_SENDER_PORT(EC_AOE_HDR* p)
2020 {
2021 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_SENDER_PORT));
2022 } EC_INLINESTOP
2023 static EC_INLINESTART EC_T_WORD EC_AOE_HDR_GET_CMD_ID(EC_AOE_HDR* p)
2024 {
2025 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_CMD_ID));
2026 } EC_INLINESTOP
2027 static EC_INLINESTART EC_T_WORD EC_AOE_HDR_GET_STATE_FLAGS(EC_AOE_HDR* p)
2028 {
2029 return EC_GET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_STATE_FLAGS));
2030 } EC_INLINESTOP
2031 static EC_INLINESTART EC_T_DWORD EC_AOE_HDR_GET_DATA_SIZE(EC_AOE_HDR* p)
2032 {
2033 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_DATA_SIZE));
2034 } EC_INLINESTOP
2035 static EC_INLINESTART EC_T_DWORD EC_AOE_HDR_GET_ERROR_CODE(EC_AOE_HDR* p)
2036 {
2037 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_ERROR_CODE));
2038 } EC_INLINESTOP
2039 static EC_INLINESTART EC_T_DWORD EC_AOE_HDR_GET_INVOKE_ID(EC_AOE_HDR* p)
2040 {
2041 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_INVOKE_ID));
2042 } EC_INLINESTOP
2044 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_TARGET_PORT(EC_AOE_HDR* p, EC_T_WORD wVal)
2045 {
2046 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_TARGET_PORT), wVal);
2047 } EC_INLINESTOP
2048 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_SENDER_PORT(EC_AOE_HDR* p, EC_T_WORD wVal)
2049 {
2050 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_SENDER_PORT), wVal);
2051 } EC_INLINESTOP
2052 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_CMD_ID(EC_AOE_HDR* p, EC_T_WORD wVal)
2053 {
2054 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_CMD_ID), wVal);
2055 } EC_INLINESTOP
2056 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_STATE_FLAGS(EC_AOE_HDR* p, EC_T_WORD wVal)
2057 {
2058 EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_STATE_FLAGS), wVal);
2059 } EC_INLINESTOP
2060 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_DATA_SIZE(EC_AOE_HDR* p, EC_T_DWORD dwVal)
2061 {
2062 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_DATA_SIZE), dwVal);
2063 } EC_INLINESTOP
2064 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_ERROR_CODE(EC_AOE_HDR* p, EC_T_DWORD dwVal)
2065 {
2066 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_ERROR_CODE), dwVal);
2067 } EC_INLINESTOP
2068 static EC_INLINESTART EC_T_VOID EC_AOE_HDR_SET_INVOKE_ID(EC_AOE_HDR* p, EC_T_DWORD dwVal)
2069 {
2070 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + EC_AOE_HDR_OFFS_INVOKE_ID), dwVal);
2071 } EC_INLINESTOP
2073 /* Command ID 2 (Read request) */
2074 typedef struct _ETHERCAT_AOE_READ_REQ_HEADER
2075 {
2076 EC_T_DWORD dwIndexGroup;
2077 EC_T_DWORD dwIndexOffset;
2078 EC_T_DWORD dwReadLength;
2079 } EC_PACKED(1) ETHERCAT_AOE_READ_REQ_HEADER, *PETHERCAT_AOE_READ_REQ_HEADER;
2081 /* Command ID 2 (Read response) */
2082 typedef struct _ETHERCAT_AOE_READ_RES_HEADER
2083 {
2084 EC_T_DWORD dwResult;
2085 EC_T_DWORD dwReadLength;
2086 /* EC_T_BYTE dwReadData[1]; */
2087 } EC_PACKED(1) ETHERCAT_AOE_READ_RES_HEADER, *PETHERCAT_AOE_READ_RES_HEADER;
2090 /* Command ID 3 (Write request) */
2091 typedef struct _ETHERCAT_AOE_WRITE_REQ_HEADER
2092 {
2093 EC_T_DWORD dwIndexGroup; /* 0 */
2094 EC_T_DWORD dwIndexOffset; /* 4 */
2095 EC_T_DWORD dwWriteLength; /* 8 */
2096 /* EC_T_BYTE dwWriteData[1]; */ /* 12 */
2097 } EC_PACKED(1) ETHERCAT_AOE_WRITE_REQ_HEADER, *PETHERCAT_AOE_WRITE_REQ_HEADER;
2098 #define ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_INDEX_GROUP ((EC_T_BYTE)0)
2099 #define ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_INDEX_OFFSET ((EC_T_BYTE)4)
2100 #define ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_WRITE_LENGTH ((EC_T_BYTE)8)
2101 #define ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_WRITE_DATA ((EC_T_BYTE)12)
2102 static EC_INLINESTART EC_T_DWORD ETHERCAT_AOE_WRITE_REQ_HEADER_GET_INDEX_GROUP(PETHERCAT_AOE_WRITE_REQ_HEADER p)
2103 {
2104 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_INDEX_GROUP));
2105 } EC_INLINESTOP
2106 static EC_INLINESTART EC_T_DWORD ETHERCAT_AOE_WRITE_REQ_HEADER_GET_INDEX_OFFSET(PETHERCAT_AOE_WRITE_REQ_HEADER p)
2107 {
2108 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_INDEX_OFFSET));
2109 } EC_INLINESTOP
2110 static EC_INLINESTART EC_T_DWORD ETHERCAT_AOE_WRITE_REQ_HEADER_GET_WRITE_LENGTH(PETHERCAT_AOE_WRITE_REQ_HEADER p)
2111 {
2112 return EC_GET_FRM_DWORD((((EC_T_PBYTE)p) + ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_WRITE_LENGTH));
2113 } EC_INLINESTOP
2115 static EC_INLINESTART EC_T_VOID ETHERCAT_AOE_WRITE_REQ_HEADER_SET_INDEX_GROUP(PETHERCAT_AOE_WRITE_REQ_HEADER p, EC_T_DWORD dwVal)
2116 {
2117 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_INDEX_GROUP), dwVal);
2118 } EC_INLINESTOP
2119 static EC_INLINESTART EC_T_VOID ETHERCAT_AOE_WRITE_REQ_HEADER_SET_INDEX_OFFSET(PETHERCAT_AOE_WRITE_REQ_HEADER p, EC_T_DWORD dwVal)
2120 {
2121 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_INDEX_OFFSET), dwVal);
2122 } EC_INLINESTOP
2123 static EC_INLINESTART EC_T_VOID ETHERCAT_AOE_WRITE_REQ_HEADER_SET_WRITE_LENGTH(PETHERCAT_AOE_WRITE_REQ_HEADER p, EC_T_DWORD dwVal)
2124 {
2125 EC_SET_FRM_DWORD((((EC_T_PBYTE)p) + ETHERCAT_AOE_WRITE_REQ_HEADER_OFFS_WRITE_LENGTH), dwVal);
2126 } EC_INLINESTOP
2128 /* Command ID 3 (Write response) */
2129 typedef struct _ETHERCAT_AOE_WRITE_RES_HEADER
2130 {
2131 EC_T_DWORD dwResult;
2132 } EC_PACKED(1) ETHERCAT_AOE_WRITE_RES_HEADER, *PETHERCAT_AOE_WRITE_RES_HEADER;
2134 /* Command ID 5 (Write Control request) */
2135 typedef struct _ETHERCAT_AOE_WRITECONTROL_REQ_HEADER
2136 {
2137 EC_T_WORD wAoEState;
2138 EC_T_WORD wDeviceState;
2139 EC_T_DWORD dwWriteLength;
2140 /* EC_T_BYTE dwWriteData[1]; */
2141 } EC_PACKED(1) ETHERCAT_AOE_WRITECONTROL_REQ_HEADER, *PETHERCAT_AOE_WRITECONTROL_REQ_HEADER;
2143 /* Command ID 5 (Write Control response) */
2144 typedef struct _ETHERCAT_AOE_WRITECONTROL_RES_HEADER
2145 {
2146 EC_T_DWORD dwResult;
2147 } EC_PACKED(1) ETHERCAT_AOE_WRITECONTROL_RES_HEADER, *PETHERCAT_AOE_WRITECONTROL_RES_HEADER;
2149 /* Command ID 9 (ReadWrite request) */
2150 typedef struct _ETHERCAT_AOE_READWRITE_REQ_HEADER
2151 {
2152 EC_T_DWORD dwIndexGroup;
2153 EC_T_DWORD dwIndexOffset;
2154 EC_T_DWORD dwReadLength;
2155 EC_T_DWORD dwWriteLength;
2156 /* EC_T_BYTE dwWriteData[1]; */
2157 } EC_PACKED(1) ETHERCAT_AOE_READWRITE_REQ_HEADER, *PETHERCAT_AOE_READWRITE_REQ_HEADER;
2159 /* Command ID 9 (ReadWrite response) */
2160 /* Response it equal to ETHERCAT_AOE_READ_RES_HEADER -> do not define a own one */
2162 typedef struct _EC_AOE_CMD_HDR
2163 {
2164 union _t_uCmd
2165 {
2166 ETHERCAT_AOE_READ_REQ_HEADER oReadReqHdr;
2167 ETHERCAT_AOE_WRITE_REQ_HEADER oWriteReqHdr;
2168 ETHERCAT_AOE_WRITECONTROL_REQ_HEADER oWriteControlReqHdr;
2169 ETHERCAT_AOE_READWRITE_REQ_HEADER oReadWriteReqHdr;
2170 } EC_PACKED(1) uCmd;
2171 EC_T_DWORD dwUsedLength;
2172 } EC_PACKED(1) EC_AOE_CMD_HDR, *PEC_AOE_CMD_HDR;
2175 #define EC_ECAOEHDR_STATEFLAG_REQ 0x0004
2176 #define EC_ECAOEHDR_STATEFLAG_RES 0x0005
2178 #define EC_AOE_HDR_LEN sizeof(EC_AOE_HDR)
2179 #define ETHERCAT_AOE_READ_REQ_HEADER_LEN sizeof(ETHERCAT_AOE_READ_REQ_HEADER)
2180 #define ETHERCAT_AOE_WRITE_REQ_HEADER_LEN sizeof(ETHERCAT_AOE_WRITE_REQ_HEADER)
2181 #define ETHERCAT_AOE_READWRITE_REQ_HEADER_LEN sizeof(ETHERCAT_AOE_READWRITE_REQ_HEADER)
2182 #define ETHERCAT_AOE_WRITECONTROL_REQ_HEADER_LEN sizeof(ETHERCAT_AOE_WRITECONTROL_REQ_HEADER)
2184 #define ETHERCAT_MIN_AOE_MBOX_LEN (ETHERCAT_MBOX_HEADER_LEN + EC_AOE_HDR_LEN)
2185 #define AOEHDR_CLR(pAoe) OsDbgAssert(sizeof(*pAoe)==(EC_AOE_HDR_LEN)); OsMemset(pAoe,0,(EC_AOE_HDR_LEN))
2187 #endif /* INCLUDE_AOE_SUPPORT */
2189 /*---------------------------------------------------------------------------*/
2190 #define EC_ECMBXCMDDESC_OFFS_TRANSITION ((EC_T_BYTE)0)
2191 #define EC_ECMBXCMDDESC_OFFS_PROTOCOL ((EC_T_BYTE)2)
2192 #define EC_ECMBXCMDDESC_OFFS_DATALEN ((EC_T_BYTE)4)
2193 #define EC_ECMBXCMDDESC_OFFS_CMTLEN ((EC_T_BYTE)8)
2194 #define EC_ECMBXCMDDESC_OFFS_MBXCMDTIMEOUT ((EC_T_BYTE)10)
2195 #define EC_ECMBXCMDDESC_OFFS_RETRIES ((EC_T_BYTE)12)
2196 #define EC_ECMBXCMDDESC_OFFS_IGNOREFAILURE ((EC_T_BYTE)14)
2197 #define EC_ECMBXCMDDESC_OFFS_FIXED ((EC_T_BYTE)15)
2198 #define EC_ECMBXCMDDESC_OFFS_HANDLE ((EC_T_BYTE)16)
2199 #define EC_ECMBXCMDDESC_OFFS_FOENAMESIZE ((EC_T_BYTE)32)
2200 #define EC_ECMBXCMDDESC_OFFS_FOEPASSWORD ((EC_T_BYTE)36)
2202 typedef struct TEcMailboxCmdDesc
2203 {
2204 EC_T_WORD __transition; /* 0 */
2205 EC_T_WORD __protocol; /* 2 */
2206 EC_T_DWORD __dataLen; /* 4 */
2207 EC_T_WORD __cmtLen; /* 8 */ /* (excl. \0) */
2208 EC_T_WORD __wMbxCmdTimeout; /* 10 */ /* in ms */
2209 EC_T_WORD __retries; /* 12 */
2210 EC_T_BYTE __ignorefailure; /* 14 */
2211 EC_T_BYTE __fixed; /* 15 */
2212 EC_T_DWORD __handle; /* 16 */
2213 EC_T_DWORD reserved2[3]; /* 20 */
2214 union _t_uMbxHdr
2215 {
2216 struct _t_sCoe
2217 {
2218 EC_SDO_HDR EcSdoHeader; /* 32 */
2219 EC_T_BYTE data[1]; /* 32 + EC_SDO_HDR_LEN */
2220 /* data[dataLen-sizeof(sdo)]; */
2221 } EC_PACKED(1) coe;
2222 struct _t_sEoe
2223 {
2224 EC_T_BYTE data[1]; /* 32 + ETHERCAT_EOE_HEADER_LEN */
2225 /* data[dataLen-sizeof(sdo)]; */
2226 } EC_PACKED(1) eoe;
2227 #if (defined INCLUDE_FOE_SUPPORT)
2228 struct _t_sFoe
2229 {
2230 EC_FOE_HDR EcFoeHeader; /* 32 */
2231 EC_T_CHAR name[1]; /* 40 */ /* no \0 */
2232 /* EC_T_BYTE data[]; */
2233 } EC_PACKED(1) foe;
2234 #endif
2235 #ifdef INCLUDE_SOE_SUPPORT
2236 struct _t_sSoe
2237 {
2238 EC_SOE_HDR EcSoeHeader; /* 32 */
2239 EC_T_BYTE data[1]; /* 32 + EC_SDO_HDR_LEN */
2240 /* data[dataLen-sizeof(sdo)]; */
2241 } EC_PACKED(1) soe;
2242 #endif
2243 #ifdef INCLUDE_AOE_SUPPORT
2244 struct _t_sAoe
2245 {
2246 EC_AOE_HDR EcAoeHeader; /* 32 */
2247 EC_T_BYTE data[1]; /* 32 + ETHERCAT_ADO_HEADER_LEN */
2248 /* data[dataLen-sizeof(sdo)]; */
2249 } EC_PACKED(1) aoe;
2250 #endif
2251 EC_T_BYTE data[1]; /* 32 */ /* data[dataLen]; */
2252 } EC_PACKED(1) uMbxHdr;
2253 /* EC_T_CHAR cmt[cmtLen+1]; */
2254 } EC_PACKED(1) EcMailboxCmdDesc, *PEcMailboxCmdDesc;
2256 static EC_INLINESTART EC_T_WORD EC_ECMBXCMDDESC_GET_TRANSITION(PEcMailboxCmdDesc p)
2257 {
2258 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_TRANSITION));
2259 } EC_INLINESTOP
2260 static EC_INLINESTART EC_T_WORD EC_ECMBXCMDDESC_GET_PROTOCOL(PEcMailboxCmdDesc p)
2261 {
2262 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_PROTOCOL));
2263 } EC_INLINESTOP
2264 static EC_INLINESTART EC_T_DWORD EC_ECMBXCMDDESC_GET_DATALEN(PEcMailboxCmdDesc p)
2265 {
2266 return EC_GETDWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_DATALEN));
2267 } EC_INLINESTOP
2268 static EC_INLINESTART EC_T_WORD EC_ECMBXCMDDESC_GET_CMTLEN(PEcMailboxCmdDesc p)
2269 {
2270 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_CMTLEN));
2271 } EC_INLINESTOP
2272 static EC_INLINESTART EC_T_WORD EC_ECMBXCMDDESC_GET_MBXTIMEOUT(PEcMailboxCmdDesc p)
2273 {
2274 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_MBXCMDTIMEOUT));
2275 } EC_INLINESTOP
2276 static EC_INLINESTART EC_T_WORD EC_ECMBXCMDDESC_GET_RETRIES(PEcMailboxCmdDesc p)
2277 {
2278 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_RETRIES));
2279 } EC_INLINESTOP
2280 static EC_INLINESTART EC_T_BYTE EC_ECMBXCMDDESC_GET_IGNOREFAILURE(PEcMailboxCmdDesc p)
2281 {
2282 return *(((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_IGNOREFAILURE);
2283 } EC_INLINESTOP
2284 static EC_INLINESTART EC_T_BYTE EC_ECMBXCMDDESC_GET_FIXED(PEcMailboxCmdDesc p)
2285 {
2286 return *(((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_FIXED);
2287 } EC_INLINESTOP
2288 static EC_INLINESTART EC_T_DWORD EC_ECMBXCMDDESC_GET_HANDLE(PEcMailboxCmdDesc p)
2289 {
2290 return EC_GETDWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_HANDLE));
2291 } EC_INLINESTOP
2292 static EC_INLINESTART EC_T_WORD EC_ECMBXCMDDESC_GET_FOENAMESIZE(PEcMailboxCmdDesc p)
2293 {
2294 return EC_GETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_FOENAMESIZE));
2295 } EC_INLINESTOP
2296 static EC_INLINESTART EC_T_DWORD EC_ECMBXCMDDESC_GET_FOEPASSWORD(PEcMailboxCmdDesc p)
2297 {
2298 return EC_GETDWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_FOEPASSWORD));
2299 } EC_INLINESTOP
2300 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_IGNOREFAILURE(PEcMailboxCmdDesc p, EC_T_BOOL bVal)
2301 {
2302 *(((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_IGNOREFAILURE) = (EC_T_BYTE)(bVal?1:0);
2303 } EC_INLINESTOP
2304 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_FIXED(PEcMailboxCmdDesc p, EC_T_BOOL bVal)
2305 {
2306 *(((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_FIXED) = (EC_T_BYTE)(bVal?1:0);
2307 } EC_INLINESTOP
2308 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_HANDLE(PEcMailboxCmdDesc p, EC_T_DWORD dwVal)
2309 {
2310 EC_SETDWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_HANDLE), dwVal);
2311 } EC_INLINESTOP
2312 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_DATALEN(PEcMailboxCmdDesc p, EC_T_DWORD dwVal)
2313 {
2314 EC_SETDWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_DATALEN), dwVal);
2315 } EC_INLINESTOP
2316 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_CMTLEN(PEcMailboxCmdDesc p, EC_T_WORD wVal)
2317 {
2318 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_CMTLEN), wVal);
2319 } EC_INLINESTOP
2320 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_PROTOCOL(PEcMailboxCmdDesc p, EC_T_WORD wVal)
2321 {
2322 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_PROTOCOL), wVal);
2323 } EC_INLINESTOP
2324 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_TRANSITION(PEcMailboxCmdDesc p, EC_T_WORD wVal)
2325 {
2326 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_TRANSITION), wVal);
2327 } EC_INLINESTOP
2328 static EC_INLINESTART EC_T_VOID EC_ECMBXCMDDESC_SET_MBXTIMEOUT(PEcMailboxCmdDesc p, EC_T_WORD wVal)
2329 {
2330 EC_SETWORD((((EC_T_PBYTE)p) + EC_ECMBXCMDDESC_OFFS_MBXCMDTIMEOUT), wVal);
2331 } EC_INLINESTOP
2332 #define SIZEOF_EcMailboxCmdDesc(p) (EC_OFFSETOF(EcMailboxCmdDesc, uMbxHdr.data) + EC_ECMBXCMDDESC_GET_DATALEN(((PEcMailboxCmdDesc)(p))) + EC_ECMBXCMDDESC_GET_CMTLEN(((PEcMailboxCmdDesc)(p))) + 1)
2333 #define EcMailboxCmdDescComment(p) (EC_T_CHAR*)&(((EC_T_BYTE*)(p))[EC_OFFSETOF(EcMailboxCmdDesc, uMbxHdr.data) + EC_ECMBXCMDDESC_GET_DATALEN(((PEcMailboxCmdDesc)(p)))])
2335 typedef struct _EC_T_EEP_REGS
2336 {
2337 EC_T_WORD wCtrlStatus; /* 0x0502 */
2338 EC_T_DWORD dwEEPAddress; /* 0x0504 */
2339 EC_T_BYTE abyEEPData[4]; /* 0x0508 */
2340 } EC_PACKED(1) EC_T_SB_EEP_REGS, *EC_PT_SB_EEP_REGS;
2342 /* Represents an IP address */
2343 typedef union _EC_T_IPADDR
2344 {
2345 EC_T_DWORD dwAddr;
2346 struct _t_sAddr
2347 {
2348 EC_T_BYTE by[4];
2349 } EC_PACKED(1) sAddr;
2350 } EC_PACKED(1) EC_T_IPADDR, *EC_PT_IPADDR;
2352 /** \struct Structure of an IP header */
2353 typedef struct TEC_IP_HEADER
2354 {
2355 #if (!defined EC_NO_BITFIELDS) || (defined EC_BIG_ENDIAN)
2356 #ifdef EC_BIG_ENDIAN
2357 EC_T_BYTE byVersion : 4; /**< version */
2358 EC_T_BYTE byHeaderLength : 4; /**< header length */
2359 #else
2360 EC_T_BYTE byHeaderLength : 4; /**< header length */
2361 EC_T_BYTE byVersion : 4; /**< version */
2362 #endif
2363 #endif
2364 EC_T_BYTE byTos; /**< type of service */
2365 EC_T_WORD wTotalLength; /**< total length */
2366 EC_T_WORD wId; /**< identification */
2367 EC_T_WORD wFragmentOffset; /**< fragment offset field */
2368 EC_T_BYTE byTtl; /**< time to live */
2369 EC_T_BYTE byProtocol; /**< protocol */
2370 EC_T_WORD wCheckSum; /**< checksum */
2371 EC_T_IPADDR dwSrcAddr; /**< source address */
2372 EC_T_IPADDR dwDstAddr; /**< destination address */
2373 } EC_PACKED(1) EC_IP_HEADER, *PEC_IP_HEADER;
2375 #define EC_PROTOCOL_UDP (17)
2377 /** \struct Structure of an UDP header */
2378 typedef struct TEC_UDP_HEADER
2379 {
2380 EC_T_WORD wSrcPort;
2381 EC_T_WORD wDstPort;
2382 EC_T_WORD wLength;
2383 EC_T_WORD wCheckSum;
2384 } EC_PACKED(1) EC_UDP_HEADER, *PEC_UDP_HEADER;
2386 #include EC_PACKED_INCLUDESTOP
2388 /*-HELPER FUNCTIONS-----------------------------------------------------------*/
2389 extern char* GetStateChangeNameShort(EC_T_WORD transition);
2391 #endif /* INC_ETHERNETSERVICES */
2393 /*-END OF SOURCE FILE--------------------------------------------------------*/