/* * This source file is part of the EtherCAT Slave Stack Code licensed by Beckhoff Automation GmbH & Co KG, 33415 Verl, Germany. * The corresponding license agreement applies. This hint shall not be removed. * https://www.beckhoff.com/media/downloads/slave-stack-code/ethercat_ssc_license.pdf */ /** * \addtogroup FoE FileTransfer over EtherCAT * @{ */ /** \file ecatfoe.h \author EthercatSSC@beckhoff.com \version 5.12
Changes to version V5.11:
V5.12 FOE2: handle 16bit only access

Changes to version V5.10:
V5.11 FOE1: handle busy on a read request, change OPMode to OPCode (same terms as in the spec)

Changes to version V5.01:
V5.10 FOE1: Add new FoE error codes (0x800C,0x800D,0x800F)
V5.10 FOE2: Update file handling to support File sizes greater than 0x8000 Bytes (change value of "FOE_MAXDATA")

Changes to version - :
V5.01 : Start file change log */ /*----------------------------------------------------------------------------------------- ------ ------ Includes ------ -----------------------------------------------------------------------------------------*/ #include "esc.h" #include "mailbox.h" #ifndef _ECATFOE_H_ #define _ECATFOE_H_ /*----------------------------------------------------------------------------------------- ------ ------ Defines and Types ------ -----------------------------------------------------------------------------------------*/ /*--------------------------------------------- - Services -----------------------------------------------*/ #define ECAT_FOE_OPCODE_RRQ 1 /**< \brief Read request*/ #define ECAT_FOE_OPCODE_WRQ 2 /**< \brief Write request*/ #define ECAT_FOE_OPCODE_DATA 3 /**< \brief Data datagram*/ #define ECAT_FOE_OPCODE_ACK 4 /**< \brief Acknowledge datagram*/ #define ECAT_FOE_OPCODE_ERR 5 /**< \brief Error datagram*/ #define ECAT_FOE_OPCODE_BUSY 6 /**< \brief Busy datagram*/ /*--------------------------------------------- - States -----------------------------------------------*/ #define FOE_READY 0 /**< \brief Ready state*/ #define FOE_WAIT_FOR_ACK 1 /**< \brief Wait for acknowledgement state*/ #define FOE_WAIT_FOR_DATA 2 /**< \brief Wait for data state*/ #define FOE_WAIT_FOR_RESET 3 /**< \brief Wait for reset state*/ #define FOE_WAIT_FOR_LAST_ACK 4 /**< \brief Wait for last acknowledgement state*/ #define FOE_PROGRAMMING 5 /**< \brief Programming state*/ #define FOE_WAIT_FOR_LAST_DATA 6 /**< \brief Wait for last data state*/ /*ET9300 Project Handler :(#if FC1100_HW) lines 71 to 73 deleted*/ /** \brief FoE header*/ typedef struct MBX_STRUCT_PACKED_START { UINT16 OpCode; /**< \brief OpCode * * 1 : RRQ
* 2 : WRQ
* 3 : DATA
* 4 : ACK
* 5 : ERR
* 6 : BUSY*/ union MBX_STRUCT_PACKED_START { UINT16 Password[2]; /**< \brief Password (used in Read request and Write request). 0 if unknown*/ UINT16 PacketNo[2]; /**< \brief Packet number (used in DATA and ACK datagram)*/ UINT16 ErrorCode[2]; /**< \brief Error code (used in ERR datagram)*/ /*ET9300 Project Handler :(#if BIG_ENDIAN_16BIT) lines 94 to 97 deleted*/ #define FOE_COMMAND_LOWWORD 0 #define FOE_COMMAND_HIGHWORD 1 struct MBX_STRUCT_PACKED_START { UINT16 Done; /**< \brief Done indication (used in BUSY datagram)*/ UINT16 Entire; /**< \brief Entire indication (used in BUSY datagram)*/ }MBX_STRUCT_PACKED_END Busy; /**< \brief Busy variable*/ }MBX_STRUCT_PACKED_END Cmd; /**< \brief Command field*/ }MBX_STRUCT_PACKED_END TFOEHEADER; #define FOE_HEADER_SIZE SIZEOF(TFOEHEADER) /**< \brief FoE header size*/ /** \brief Complete FoE datagram*/ typedef struct MBX_STRUCT_PACKED_START { TMBXHEADER MbxHeader; /**< \brief Mailbox header*/ TFOEHEADER FoeHeader; /**< \brief FoE header*/ UINT16 Data[((MAX_MBX_DATA_SIZE)-(FOE_HEADER_SIZE)) >> 1]; /**< \brief FoE Data buffer*/ }MBX_STRUCT_PACKED_END TFOEMBX; /*ET9300 Project Handler :(#if FC1100_HW) lines 128 to 130 deleted*/ /*--------------------------------------------- - Results -----------------------------------------------*/ #define FOE_ERROR 0x8000 /**< \brief Error result*/ #define FOE_FINISHED ((FOE_ERROR)-1) /**< \brief Datagram finished*/ #define FOE_FINISHED_NOACK ((FOE_FINISHED)-1) /**< \brief Datagram finished no acknowledgement*/ #define FOE_ACK ((FOE_FINISHED_NOACK)-1) /**< \brief Acknowledgement*/ #define FOE_ACKFINISHED ((FOE_ACK)-1) /**< \brief Acknowledgement finished*/ #define FOE_WAIT ((FOE_ACKFINISHED)-1) /**< \brief Wait */ #define FOE_MAXBUSY ((FOE_WAIT)-1) /**< \brief Max busy indication*/ #define FOE_MAXBUSY_ZERO ((FOE_MAXBUSY)-100) /**< \brief Min busy indication*/ #define FOE_MAXDATA ((FOE_MAXBUSY_ZERO)-1) /**< \brief Maximum data within one FoE Datagram*/ #endif //_ECATFOE_H_ #if _ECATFOE_ #define PROTO #else #define PROTO extern #endif /*----------------------------------------------------------------------------------------- ------ ------ Global Variables ------ -----------------------------------------------------------------------------------------*/ PROTO UINT32 u32PacketNo; /**< \brief Stores the actual packet number to be expected*/ PROTO UINT32 u32FileOffset; /**< \brief Stores the next file offset to be sent */ PROTO UINT32 u32LastFileOffset; /**< \brief Stores the actual sent file offset */ PROTO UINT16 u16FileAccessState; /**< \brief Stores the actual state of the file transmission sequence */ PROTO TMBX MBXMEM * pFoeSendStored; /**