SOEM EtherCAT Master library for STM Nucleo F767ZI

Dependents:   EasyCAT_LAB_simple EasyCAT_LAB_very_simple EasyCAT_LAB

  • It has been developed for the EasyCAT LAB , a complete educational and experimental EtherCAT® system, composed of one master and two slaves .

Warning

/media/uploads/EasyCAT/easycat_lab.jpg

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?

UserRevisionLine numberNew 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