SOEM EtherCAT Master library for STM Nucleo F767ZI
Dependents: EasyCAT_LAB_simple EasyCAT_LAB_very_simple EasyCAT_LAB
- This repository contains the SOEM (Simple Open EtherCAT® Master) library by rt-labs, that has been ported in the ecosystem by AB&T Tecnologie Informatiche.
- It has been developed for the EasyCAT LAB , a complete educational and experimental EtherCAT® system, composed of one master and two slaves .
- The EasyCAT LAB is provided as a kit by AB&T Tecnologie Informatiche, to allow everybody to have an educational EtherCAT® system up and running in a matter of minutes.
Warning
- Currently only the Nucleo STM32F767ZI board is supported.
SOEM/ethercateoe.h@0:543d6784d4cc, 2019-06-11 (annotated)
- Committer:
- EasyCAT
- Date:
- Tue Jun 11 10:29:09 2019 +0000
- Revision:
- 0:543d6784d4cc
SOEM EtherCAT Master Library for STM Nucleo F767ZI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EasyCAT | 0:543d6784d4cc | 1 | /* |
EasyCAT | 0:543d6784d4cc | 2 | * Licensed under the GNU General Public License version 2 with exceptions. See |
EasyCAT | 0:543d6784d4cc | 3 | * LICENSE file in the project root for full license information |
EasyCAT | 0:543d6784d4cc | 4 | */ |
EasyCAT | 0:543d6784d4cc | 5 | |
EasyCAT | 0:543d6784d4cc | 6 | /** \file |
EasyCAT | 0:543d6784d4cc | 7 | * \brief |
EasyCAT | 0:543d6784d4cc | 8 | * Headerfile for ethercatfoe.c |
EasyCAT | 0:543d6784d4cc | 9 | */ |
EasyCAT | 0:543d6784d4cc | 10 | |
EasyCAT | 0:543d6784d4cc | 11 | #ifndef _ethercateoe_ |
EasyCAT | 0:543d6784d4cc | 12 | #define _ethercateoe_ |
EasyCAT | 0:543d6784d4cc | 13 | |
EasyCAT | 0:543d6784d4cc | 14 | #ifdef __cplusplus |
EasyCAT | 0:543d6784d4cc | 15 | extern "C" |
EasyCAT | 0:543d6784d4cc | 16 | { |
EasyCAT | 0:543d6784d4cc | 17 | #endif |
EasyCAT | 0:543d6784d4cc | 18 | |
EasyCAT | 0:543d6784d4cc | 19 | #include <ethercattype.h> |
EasyCAT | 0:543d6784d4cc | 20 | |
EasyCAT | 0:543d6784d4cc | 21 | /** DNS length according to ETG 1000.6 */ |
EasyCAT | 0:543d6784d4cc | 22 | #define EOE_DNS_NAME_LENGTH 32 |
EasyCAT | 0:543d6784d4cc | 23 | /** Ethernet address length not including VLAN */ |
EasyCAT | 0:543d6784d4cc | 24 | #define EOE_ETHADDR_LENGTH 6 |
EasyCAT | 0:543d6784d4cc | 25 | |
EasyCAT | 0:543d6784d4cc | 26 | #define EOE_MAKEU32(a,b,c,d) (((uint32_t)((a) & 0xff) << 24) | \ |
EasyCAT | 0:543d6784d4cc | 27 | ((uint32_t)((b) & 0xff) << 16) | \ |
EasyCAT | 0:543d6784d4cc | 28 | ((uint32_t)((c) & 0xff) << 8) | \ |
EasyCAT | 0:543d6784d4cc | 29 | (uint32_t)((d) & 0xff)) |
EasyCAT | 0:543d6784d4cc | 30 | |
EasyCAT | 0:543d6784d4cc | 31 | #if !defined(EC_BIG_ENDIAN) && defined(EC_LITTLE_ENDIAN) |
EasyCAT | 0:543d6784d4cc | 32 | |
EasyCAT | 0:543d6784d4cc | 33 | #define EOE_HTONS(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8)) |
EasyCAT | 0:543d6784d4cc | 34 | #define EOE_NTOHS(x) EOE_HTONS(x) |
EasyCAT | 0:543d6784d4cc | 35 | #define EOE_HTONL(x) ((((x) & 0x000000ffUL) << 24) | \ |
EasyCAT | 0:543d6784d4cc | 36 | (((x) & 0x0000ff00UL) << 8) | \ |
EasyCAT | 0:543d6784d4cc | 37 | (((x) & 0x00ff0000UL) >> 8) | \ |
EasyCAT | 0:543d6784d4cc | 38 | (((x) & 0xff000000UL) >> 24)) |
EasyCAT | 0:543d6784d4cc | 39 | #define EOE_NTOHL(x) EOE_HTONL(x) |
EasyCAT | 0:543d6784d4cc | 40 | #else |
EasyCAT | 0:543d6784d4cc | 41 | #define EOE_HTONS(x) (x) |
EasyCAT | 0:543d6784d4cc | 42 | #define EOE_NTOHS(x) (x) |
EasyCAT | 0:543d6784d4cc | 43 | #define EOE_HTONL(x) (x) |
EasyCAT | 0:543d6784d4cc | 44 | #define EOE_NTOHL(x) (x) |
EasyCAT | 0:543d6784d4cc | 45 | #endif /* !defined(EC_BIG_ENDIAN) && defined(EC_LITTLE_ENDIAN) */ |
EasyCAT | 0:543d6784d4cc | 46 | |
EasyCAT | 0:543d6784d4cc | 47 | /** Get one byte from the 4-byte address */ |
EasyCAT | 0:543d6784d4cc | 48 | #define eoe_ip4_addr1(ipaddr) (((const uint8_t*)(&(ipaddr)->addr))[0]) |
EasyCAT | 0:543d6784d4cc | 49 | #define eoe_ip4_addr2(ipaddr) (((const uint8_t*)(&(ipaddr)->addr))[1]) |
EasyCAT | 0:543d6784d4cc | 50 | #define eoe_ip4_addr3(ipaddr) (((const uint8_t*)(&(ipaddr)->addr))[2]) |
EasyCAT | 0:543d6784d4cc | 51 | #define eoe_ip4_addr4(ipaddr) (((const uint8_t*)(&(ipaddr)->addr))[3]) |
EasyCAT | 0:543d6784d4cc | 52 | |
EasyCAT | 0:543d6784d4cc | 53 | /** Set an IP address given by the four byte-parts */ |
EasyCAT | 0:543d6784d4cc | 54 | #define EOE_IP4_ADDR_TO_U32(ipaddr,a,b,c,d) \ |
EasyCAT | 0:543d6784d4cc | 55 | (ipaddr)->addr = EOE_HTONL(EOE_MAKEU32(a,b,c,d)) |
EasyCAT | 0:543d6784d4cc | 56 | |
EasyCAT | 0:543d6784d4cc | 57 | /** Header frame info 1 */ |
EasyCAT | 0:543d6784d4cc | 58 | #define EOE_HDR_FRAME_TYPE_OFFSET 0 |
EasyCAT | 0:543d6784d4cc | 59 | #define EOE_HDR_FRAME_TYPE (0xF << 0) |
EasyCAT | 0:543d6784d4cc | 60 | #define EOE_HDR_FRAME_TYPE_SET(x) (((x) & 0xF) << 0) |
EasyCAT | 0:543d6784d4cc | 61 | #define EOE_HDR_FRAME_TYPE_GET(x) (((x) >> 0) & 0xF) |
EasyCAT | 0:543d6784d4cc | 62 | #define EOE_HDR_FRAME_PORT_OFFSET 4 |
EasyCAT | 0:543d6784d4cc | 63 | #define EOE_HDR_FRAME_PORT (0xF << 4) |
EasyCAT | 0:543d6784d4cc | 64 | #define EOE_HDR_FRAME_PORT_SET(x) (((x) & 0xF) << 4) |
EasyCAT | 0:543d6784d4cc | 65 | #define EOE_HDR_FRAME_PORT_GET(x) (((x) >> 4) & 0xF) |
EasyCAT | 0:543d6784d4cc | 66 | #define EOE_HDR_LAST_FRAGMENT_OFFSET 8 |
EasyCAT | 0:543d6784d4cc | 67 | #define EOE_HDR_LAST_FRAGMENT (0x1 << 8) |
EasyCAT | 0:543d6784d4cc | 68 | #define EOE_HDR_LAST_FRAGMENT_SET(x) (((x) & 0x1) << 8) |
EasyCAT | 0:543d6784d4cc | 69 | #define EOE_HDR_LAST_FRAGMENT_GET(x) (((x) >> 8) & 0x1) |
EasyCAT | 0:543d6784d4cc | 70 | #define EOE_HDR_TIME_APPEND_OFFSET 9 |
EasyCAT | 0:543d6784d4cc | 71 | #define EOE_HDR_TIME_APPEND (0x1 << 9) |
EasyCAT | 0:543d6784d4cc | 72 | #define EOE_HDR_TIME_APPEND_SET(x) (((x) & 0x1) << 9) |
EasyCAT | 0:543d6784d4cc | 73 | #define EOE_HDR_TIME_APPEND_GET(x) (((x) >> 9) & 0x1) |
EasyCAT | 0:543d6784d4cc | 74 | #define EOE_HDR_TIME_REQUEST_OFFSET 10 |
EasyCAT | 0:543d6784d4cc | 75 | #define EOE_HDR_TIME_REQUEST (0x1 << 10) |
EasyCAT | 0:543d6784d4cc | 76 | #define EOE_HDR_TIME_REQUEST_SET(x) (((x) & 0x1) << 10) |
EasyCAT | 0:543d6784d4cc | 77 | #define EOE_HDR_TIME_REQUEST_GET(x) (((x) >> 10) & 0x1) |
EasyCAT | 0:543d6784d4cc | 78 | |
EasyCAT | 0:543d6784d4cc | 79 | /** Header frame info 2 */ |
EasyCAT | 0:543d6784d4cc | 80 | #define EOE_HDR_FRAG_NO_OFFSET 0 |
EasyCAT | 0:543d6784d4cc | 81 | #define EOE_HDR_FRAG_NO (0x3F << 0) |
EasyCAT | 0:543d6784d4cc | 82 | #define EOE_HDR_FRAG_NO_SET(x) (((x) & 0x3F) << 0) |
EasyCAT | 0:543d6784d4cc | 83 | #define EOE_HDR_FRAG_NO_GET(x) (((x) >> 0) & 0x3F) |
EasyCAT | 0:543d6784d4cc | 84 | #define EOE_HDR_FRAME_OFFSET_OFFSET 6 |
EasyCAT | 0:543d6784d4cc | 85 | #define EOE_HDR_FRAME_OFFSET (0x3F << 6) |
EasyCAT | 0:543d6784d4cc | 86 | #define EOE_HDR_FRAME_OFFSET_SET(x) (((x) & 0x3F) << 6) |
EasyCAT | 0:543d6784d4cc | 87 | #define EOE_HDR_FRAME_OFFSET_GET(x) (((x) >> 6) & 0x3F) |
EasyCAT | 0:543d6784d4cc | 88 | #define EOE_HDR_FRAME_NO_OFFSET 12 |
EasyCAT | 0:543d6784d4cc | 89 | #define EOE_HDR_FRAME_NO (0xF << 12) |
EasyCAT | 0:543d6784d4cc | 90 | #define EOE_HDR_FRAME_NO_SET(x) (((x) & 0xF) << 12) |
EasyCAT | 0:543d6784d4cc | 91 | #define EOE_HDR_FRAME_NO_GET(x) (((x) >> 12) & 0xF) |
EasyCAT | 0:543d6784d4cc | 92 | |
EasyCAT | 0:543d6784d4cc | 93 | /** EOE param */ |
EasyCAT | 0:543d6784d4cc | 94 | #define EOE_PARAM_OFFSET 4 |
EasyCAT | 0:543d6784d4cc | 95 | #define EOE_PARAM_MAC_INCLUDE (0x1 << 0) |
EasyCAT | 0:543d6784d4cc | 96 | #define EOE_PARAM_IP_INCLUDE (0x1 << 1) |
EasyCAT | 0:543d6784d4cc | 97 | #define EOE_PARAM_SUBNET_IP_INCLUDE (0x1 << 2) |
EasyCAT | 0:543d6784d4cc | 98 | #define EOE_PARAM_DEFAULT_GATEWAY_INCLUDE (0x1 << 3) |
EasyCAT | 0:543d6784d4cc | 99 | #define EOE_PARAM_DNS_IP_INCLUDE (0x1 << 4) |
EasyCAT | 0:543d6784d4cc | 100 | #define EOE_PARAM_DNS_NAME_INCLUDE (0x1 << 5) |
EasyCAT | 0:543d6784d4cc | 101 | |
EasyCAT | 0:543d6784d4cc | 102 | /** EoE frame types */ |
EasyCAT | 0:543d6784d4cc | 103 | #define EOE_FRAG_DATA 0 |
EasyCAT | 0:543d6784d4cc | 104 | #define EOE_INIT_RESP_TIMESTAMP 1 |
EasyCAT | 0:543d6784d4cc | 105 | #define EOE_INIT_REQ 2 /* Spec SET IP REQ */ |
EasyCAT | 0:543d6784d4cc | 106 | #define EOE_INIT_RESP 3 /* Spec SET IP RESP */ |
EasyCAT | 0:543d6784d4cc | 107 | #define EOE_SET_ADDR_FILTER_REQ 4 |
EasyCAT | 0:543d6784d4cc | 108 | #define EOE_SET_ADDR_FILTER_RESP 5 |
EasyCAT | 0:543d6784d4cc | 109 | #define EOE_GET_IP_PARAM_REQ 6 |
EasyCAT | 0:543d6784d4cc | 110 | #define EOE_GET_IP_PARAM_RESP 7 |
EasyCAT | 0:543d6784d4cc | 111 | #define EOE_GET_ADDR_FILTER_REQ 8 |
EasyCAT | 0:543d6784d4cc | 112 | #define EOE_GET_ADDR_FILTER_RESP 9 |
EasyCAT | 0:543d6784d4cc | 113 | |
EasyCAT | 0:543d6784d4cc | 114 | /** EoE parameter result codes */ |
EasyCAT | 0:543d6784d4cc | 115 | #define EOE_RESULT_SUCCESS 0x0000 |
EasyCAT | 0:543d6784d4cc | 116 | #define EOE_RESULT_UNSPECIFIED_ERROR 0x0001 |
EasyCAT | 0:543d6784d4cc | 117 | #define EOE_RESULT_UNSUPPORTED_FRAME_TYPE 0x0002 |
EasyCAT | 0:543d6784d4cc | 118 | #define EOE_RESULT_NO_IP_SUPPORT 0x0201 |
EasyCAT | 0:543d6784d4cc | 119 | #define EOE_RESULT_NO_DHCP_SUPPORT 0x0202 |
EasyCAT | 0:543d6784d4cc | 120 | #define EOE_RESULT_NO_FILTER_SUPPORT 0x0401 |
EasyCAT | 0:543d6784d4cc | 121 | |
EasyCAT | 0:543d6784d4cc | 122 | |
EasyCAT | 0:543d6784d4cc | 123 | /** EOE ip4 address in network order */ |
EasyCAT | 0:543d6784d4cc | 124 | typedef struct eoe_ip4_addr { |
EasyCAT | 0:543d6784d4cc | 125 | uint32_t addr; |
EasyCAT | 0:543d6784d4cc | 126 | }eoe_ip4_addr_t; |
EasyCAT | 0:543d6784d4cc | 127 | |
EasyCAT | 0:543d6784d4cc | 128 | /** EOE ethernet address */ |
EasyCAT | 0:543d6784d4cc | 129 | PACKED_BEGIN |
EasyCAT | 0:543d6784d4cc | 130 | typedef struct PACKED eoe_ethaddr |
EasyCAT | 0:543d6784d4cc | 131 | { |
EasyCAT | 0:543d6784d4cc | 132 | uint8_t addr[EOE_ETHADDR_LENGTH]; |
EasyCAT | 0:543d6784d4cc | 133 | } eoe_ethaddr_t; |
EasyCAT | 0:543d6784d4cc | 134 | PACKED_END |
EasyCAT | 0:543d6784d4cc | 135 | |
EasyCAT | 0:543d6784d4cc | 136 | /** EoE IP request structure, storage only, no need to pack */ |
EasyCAT | 0:543d6784d4cc | 137 | typedef struct eoe_param |
EasyCAT | 0:543d6784d4cc | 138 | { |
EasyCAT | 0:543d6784d4cc | 139 | uint8_t mac_set : 1; |
EasyCAT | 0:543d6784d4cc | 140 | uint8_t ip_set : 1; |
EasyCAT | 0:543d6784d4cc | 141 | uint8_t subnet_set : 1; |
EasyCAT | 0:543d6784d4cc | 142 | uint8_t default_gateway_set : 1; |
EasyCAT | 0:543d6784d4cc | 143 | uint8_t dns_ip_set : 1; |
EasyCAT | 0:543d6784d4cc | 144 | uint8_t dns_name_set : 1; |
EasyCAT | 0:543d6784d4cc | 145 | eoe_ethaddr_t mac; |
EasyCAT | 0:543d6784d4cc | 146 | eoe_ip4_addr_t ip; |
EasyCAT | 0:543d6784d4cc | 147 | eoe_ip4_addr_t subnet; |
EasyCAT | 0:543d6784d4cc | 148 | eoe_ip4_addr_t default_gateway; |
EasyCAT | 0:543d6784d4cc | 149 | eoe_ip4_addr_t dns_ip; |
EasyCAT | 0:543d6784d4cc | 150 | char dns_name[EOE_DNS_NAME_LENGTH]; |
EasyCAT | 0:543d6784d4cc | 151 | } eoe_param_t; |
EasyCAT | 0:543d6784d4cc | 152 | |
EasyCAT | 0:543d6784d4cc | 153 | /** EOE structure. |
EasyCAT | 0:543d6784d4cc | 154 | * Used to interpret EoE mailbox packets. |
EasyCAT | 0:543d6784d4cc | 155 | */ |
EasyCAT | 0:543d6784d4cc | 156 | PACKED_BEGIN |
EasyCAT | 0:543d6784d4cc | 157 | typedef struct PACKED |
EasyCAT | 0:543d6784d4cc | 158 | { |
EasyCAT | 0:543d6784d4cc | 159 | ec_mbxheadert mbxheader; |
EasyCAT | 0:543d6784d4cc | 160 | uint16_t frameinfo1; |
EasyCAT | 0:543d6784d4cc | 161 | union |
EasyCAT | 0:543d6784d4cc | 162 | { |
EasyCAT | 0:543d6784d4cc | 163 | uint16_t frameinfo2; |
EasyCAT | 0:543d6784d4cc | 164 | uint16_t result; |
EasyCAT | 0:543d6784d4cc | 165 | }; |
EasyCAT | 0:543d6784d4cc | 166 | uint8 data[0]; |
EasyCAT | 0:543d6784d4cc | 167 | } ec_EOEt; |
EasyCAT | 0:543d6784d4cc | 168 | PACKED_END |
EasyCAT | 0:543d6784d4cc | 169 | |
EasyCAT | 0:543d6784d4cc | 170 | int ecx_EOEdefinehook(ecx_contextt *context, void *hook); |
EasyCAT | 0:543d6784d4cc | 171 | int ecx_EOEsetIp(ecx_contextt *context, |
EasyCAT | 0:543d6784d4cc | 172 | uint16 slave, |
EasyCAT | 0:543d6784d4cc | 173 | uint8 port, |
EasyCAT | 0:543d6784d4cc | 174 | eoe_param_t * ipparam, |
EasyCAT | 0:543d6784d4cc | 175 | int timeout); |
EasyCAT | 0:543d6784d4cc | 176 | int ecx_EOEgetIp(ecx_contextt *context, |
EasyCAT | 0:543d6784d4cc | 177 | uint16 slave, |
EasyCAT | 0:543d6784d4cc | 178 | uint8 port, |
EasyCAT | 0:543d6784d4cc | 179 | eoe_param_t * ipparam, |
EasyCAT | 0:543d6784d4cc | 180 | int timeout); |
EasyCAT | 0:543d6784d4cc | 181 | int ecx_EOEsend(ecx_contextt *context, |
EasyCAT | 0:543d6784d4cc | 182 | uint16 slave, |
EasyCAT | 0:543d6784d4cc | 183 | uint8 port, |
EasyCAT | 0:543d6784d4cc | 184 | int psize, |
EasyCAT | 0:543d6784d4cc | 185 | void *p, |
EasyCAT | 0:543d6784d4cc | 186 | int timeout); |
EasyCAT | 0:543d6784d4cc | 187 | int ecx_EOErecv(ecx_contextt *context, |
EasyCAT | 0:543d6784d4cc | 188 | uint16 slave, |
EasyCAT | 0:543d6784d4cc | 189 | uint8 port, |
EasyCAT | 0:543d6784d4cc | 190 | int * psize, |
EasyCAT | 0:543d6784d4cc | 191 | void *p, |
EasyCAT | 0:543d6784d4cc | 192 | int timeout); |
EasyCAT | 0:543d6784d4cc | 193 | int ecx_EOEreadfragment( |
EasyCAT | 0:543d6784d4cc | 194 | ec_mbxbuft * MbxIn, |
EasyCAT | 0:543d6784d4cc | 195 | uint8 * rxfragmentno, |
EasyCAT | 0:543d6784d4cc | 196 | uint16 * rxframesize, |
EasyCAT | 0:543d6784d4cc | 197 | uint16 * rxframeoffset, |
EasyCAT | 0:543d6784d4cc | 198 | uint16 * rxframeno, |
EasyCAT | 0:543d6784d4cc | 199 | int * psize, |
EasyCAT | 0:543d6784d4cc | 200 | void *p); |
EasyCAT | 0:543d6784d4cc | 201 | |
EasyCAT | 0:543d6784d4cc | 202 | #ifdef __cplusplus |
EasyCAT | 0:543d6784d4cc | 203 | } |
EasyCAT | 0:543d6784d4cc | 204 | #endif |
EasyCAT | 0:543d6784d4cc | 205 | |
EasyCAT | 0:543d6784d4cc | 206 | #endif |