www.pudn.com > ethercat-slave-source-code.rar > ecatfoe.h, change:2013-05-03,size:9490b


/** 
 * \addtogroup FoE FileTransfer over EtherCAT 
 * @{ 
 */ 
 
/** 
\file ecatfoe.h 
\author EthercatSSC@beckhoff.com 
 
\version 5.10 
 
<br>Changes to version V5.01:<br> 
V5.10 FOE1: Add new FoE error codes (0x800C,0x800D,0x800F)<br> 
V5.10 FOE2: Update file handling to support File sizes greater than 0x8000 Bytes (change value of "FOE_MAXDATA")<br> 
<br>Changes to version - :<br> 
V5.01 : Start file change log 
 */ 
 
#ifndef _ECATFOE_H_ 
#define _ECATFOE_H_ 
 
/*----------------------------------------------------------------------------------------- 
------ 
------    Includes 
------ 
-----------------------------------------------------------------------------------------*/ 
#include "esc.h" 
#include "mailbox.h" 
 
/*----------------------------------------------------------------------------------------- 
------ 
------    Defines and Types 
------ 
-----------------------------------------------------------------------------------------*/ 
 
/*--------------------------------------------- 
-    Error Codes 
-----------------------------------------------*/ 
#define    ECAT_FOE_ERRCODE_NOTDEFINED          0x8000 /**< \brief Not defined*/ 
#define    ECAT_FOE_ERRCODE_NOTFOUND            0x8001 /**< \brief File not found*/ 
#define    ECAT_FOE_ERRCODE_ACCESS              0x8002 /**< \brief No file access*/ 
#define    ECAT_FOE_ERRCODE_DISKFULL            0x8003 /**< \brief Disk is full*/ 
#define    ECAT_FOE_ERRCODE_ILLEGAL             0x8004 /**< \brief Illegal access*/ 
#define    ECAT_FOE_ERRCODE_PACKENO             0x8005 /**< \brief Invalid packed number*/ 
#define    ECAT_FOE_ERRCODE_EXISTS              0x8006 /**< \brief File not exists*/ 
#define    ECAT_FOE_ERRCODE_NOUSER              0x8007 /**< \brief No User*/ 
#define    ECAT_FOE_ERRCODE_BOOTSTRAPONLY       0x8008 /**< \brief Only in Bootstrap state*/ 
#define    ECAT_FOE_ERRCODE_NOTINBOOTSTRAP      0x8009 /**< \brief Not in Bootstrap state*/ 
#define    ECAT_FOE_ERRCODE_NORIGHTS            0x800A /**< \brief No access rights*/ 
#define    ECAT_FOE_ERRCODE_PROGERROR           0x800B /**< \brief Program error*/ 
/* ECATCHANGE_START(V5.10) FOE1*/ 
#define    ECAT_FOE_ERRCODE_INVALID_CHECKSUM    0x800C /**< \brief Wrong checksum */ 
#define    ECAT_FOE_ERRCODE_INVALID_FIRMWARE    0x800D /**< \brief Firmware does not fit for Hardware*/ 
#define    ECAT_FOE_ERRCODE_NO_FILE             0x800F /**< \brief No file to read*/ 
/* ECATCHANGE_END(V5.10) FOE1*/ 
 
 
 
/*--------------------------------------------- 
-    Services 
-----------------------------------------------*/ 
#define    ECAT_FOE_OPMODE_RRQ                  1 /**< \brief Read request*/ 
#define    ECAT_FOE_OPMODE_WRQ                  2 /**< \brief Write request*/ 
#define    ECAT_FOE_OPMODE_DATA                 3 /**< \brief Data datagram*/ 
#define    ECAT_FOE_OPMODE_ACK                  4 /**< \brief Acknowledge datagram*/ 
#define    ECAT_FOE_OPMODE_ERR                  5 /**< \brief Error datagram*/ 
#define    ECAT_FOE_OPMODE_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*/ 
 
 
/*CODE_INSERT_START (MBX_FILE_PACKED_START)*/ 
#if FC1100_HW 
#pragma pack(push, 1) 
#endif 
/*CODE_INSERT_END*/ 
 
 
typedef struct MBX_STRUCT_PACKED_START 
{ 
    UINT16    Cmd; 
        #define    EFW_CMD_IGNORE               0 
        #define    EFW_CMD_MEMORY_TRANSFER      1 
        #define    EFW_CMD_WRCODE               2 
        #define    EFW_CMD_CHK_DEVID            3 
        #define    EFW_CMD_CHK_DEVICEID         3 
        #define    EFW_CMD_CHKSUM               4 
        #define    EFW_CMD_WRCODECHKSUM         5 
        #define    EFW_CMD_SET_DEVID            6 
        #define    EFW_CMD_CHKSUMCHKSUM         6 
        #define    EFW_CMD_BOOTCHKSUM           7 
        #define    EFW_CMD_SET_EEPROM           10 
    UINT16    Size; 
    UINT32    Address; 
#if !CONTROLLER_16BIT && !CONTROLLER_32BIT 
    UINT8       Data[BL_PAGE_SIZE]; 
#else 
    UINT16      Data[BL_PAGE_SIZE>>1]; 
#endif 
}MBX_STRUCT_PACKED_END 
TEFWUPDATE; 
 
#define FW_UPDATE_SIZE  SIZEOF(TEFWUPDATE) 
 
 
 
/** \brief FoE header*/ 
typedef struct  MBX_STRUCT_PACKED_START 
{ 
    UINT16        OpMode; /**< \brief OpMode 
                             * 
                             * 1 : RRQ<br> 
                             * 2 : WRQ<br> 
                             * 3 : DATA<br> 
                             * 4 : ACK<br> 
                             * 5 : ERR<br> 
                             * 6 : BUSY*/ 
    union MBX_STRUCT_PACKED_START 
    { 
        UINT32        Password; /**< \brief Password (used in Read request and Write request). 0 if unknown*/ 
        UINT32        PacketNo; /**< \brief Packet number (used in DATA and ACK datagram)*/ 
        UINT32        ErrorCode; /**< \brief Error code (used in ERR datagram)*/ 
        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; 
 
 
/*CODE_INSERT_START (MBX_FILE_PACKED_END)*/ 
#if FC1100_HW 
#pragma pack(pop) 
#endif 
/*CODE_INSERT_END*/ 
 
 
/*--------------------------------------------- 
-    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*/ 
/* ECATCHANGE_START(V5.10) FOE2*/ 
#define    FOE_MAXDATA                          ((FOE_MAXBUSY_ZERO)-1) /**< \brief Maximum data within one FoE Datagram*/ 
/* ECATCHANGE_END(V5.10) FOE2*/ 
 
#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; /**<If the mailbox service could not be sent (or stored), 
                                                                                the FoE service will be stored in this variable 
                                                                                and will be sent automatically from the mailbox handler 
                                                                                (FOE_ContinueInd) when the send mailbox will be read 
                                                                                the next time from the master */ 
/*----------------------------------------------------------------------------------------- 
------ 
------   Global Functions 
------ 
-----------------------------------------------------------------------------------------*/ 
 
PROTO    void     FOE_Init(void); 
PROTO    UINT8 FOE_ServiceInd(TFOEMBX MBXMEM * pFoeInd); 
PROTO    void     FOE_ContinueInd(TMBX MBXMEM * pMbx); 
 
#undef PROTO 
/** @}*/