]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - apps/tidep0079.git/blob - EC_Master_SysBios_Am572x_20170214/SDK/INC/EthernetServices.h
TTS
[apps/tidep0079.git] / EC_Master_SysBios_Am572x_20170214 / SDK / INC / EthernetServices.h
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 */
60     
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))))
101             
103 /*---------------------------------------------------------------------------*/
104 typedef struct TETYPE_VLAN_HEADER
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 
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
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            
198                                                                             
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))
201                                                                                          
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
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)
264                     
266 /* General EtherCAT telegram header */
267 typedef struct TETYPE_EC_CMD_HEADER
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)
322                                                 
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
341        
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
372                                                 
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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 */
469   
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))
483                                             
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))
505    
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))
514                                          
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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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
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
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
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
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
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
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
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 * /
782     
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 * /
785     
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)
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)
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)
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)
819     return (p->byFlags & (1<<2));
820 } EC_INLINESTOP
822 static EC_INLINESTART EC_T_BOOL EC_ECINITCMDDESC_GET_VALIDATEMASK(PEcInitCmdDesc p)
824     return (p->byFlags & (1<<3));
825 } EC_INLINESTOP
827 static EC_INLINESTART EC_T_WORD EC_ECINITCMDDESC_GET_INITCMDTIMEOUT(PEcInitCmdDesc p)
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)
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)
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)
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)
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)
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)
859     if (wVal)
860     {
861         p->byFlags |= (1<<0);
862     }
863     else
864     {
865         
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)
872     if (wVal)
873     {
874         p->byFlags |= (1<<1);
875     }
876     else
877     {
878         
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)
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)
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)
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
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)
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)
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)
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)
981     return EC_GET_FRM_WORD(((EC_T_PBYTE)(&(p->wAddress))));
982 } EC_INLINESTOP
984 typedef struct TETHERCAT_MBOX_CMD
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)
990           
992 typedef struct TETHERCAT_EOE_TIMESTAMP
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
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
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;
1104            
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
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)
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)
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)
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)
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)
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) */
1293                                                         
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
1349                                                         
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
1368                                                         
1369 #define SDO_IDX_TXPDO1_MAPPING                          0x1A00
1370 #define SDO_IDX_TXPDO2_MAPPING                          0x1A01
1371 /* ... */
1372 #define SDO_IDX_TXPDO512_MAPPING                        0x1BFF
1373                                                         
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
1402                                                         
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
1410                                                         
1411 #define ECAT_COE_INFO_OBJCAT_OPTIONAL                   0
1412 #define ECAT_COE_INFO_OBJCAT_MANDATORY                  1
1413                                                         
1414 #define ECAT_COE_INFO_OBJACCESS_RO                      0x07
1415 #define ECAT_COE_INFO_OBJACCESS_RW                      0x3f
1417 typedef struct TETHERCAT_SDO_INFO_LIST
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)
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)
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
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)
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
1538     EC_SET_FRM_WORD((((EC_T_PBYTE)p) + EC_ECSDOINFOENTRY_OFFS_INDEX), wVal);
1539 } EC_INLINESTOP
1540        
1541 typedef struct TETHERCAT_SDO_INFO_ERROR
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)
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)
1553     EC_SET_FRM_DWORD(((EC_T_PBYTE)p), dwVal);
1554 } EC_INLINESTOP
1556 typedef struct TETHERCAT_SDO_INFO_HEADER
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)
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)
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
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)
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)
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
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)
1678     return p->OpCode;
1679 } EC_INLINESTOP
1680 static EC_INLINESTART EC_T_DWORD EC_ECFOEHDR_GET_PASSWORD(PEC_FOE_HDR p)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
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)
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
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
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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
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
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
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--------------------------------------------------------*/