/*
* 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 Mailbox Mailbox Functions
* @{
*/
/**
\file mailbox.h
\author EthercatSSC@beckhoff.com
\version 5.12
Changes to version V5.11:
V5.12 ECAT2: big endian changes
V5.12 MBX3: handle incomplete mailbox communication
Changes to version V5.01:
V5.11 ECAT10: change PROTO handling to prevent compiler errors
V5.11 MBX1: "return value of ""MBX_StartMailboxHandler()"" changed to UINT16"
V5.11 MBX3: set application triggered emergency and EoE data to pending if no mailbox queue is supported and another mailbox request is currently handled, Handle only one mailbox request at a time (in case that MAILBPX_QUEUE is disabled)
Changes to version - :
V5.01 : Start file change log
*/
/*-----------------------------------------------------------------------------------------
------
------ Includes
------
-----------------------------------------------------------------------------------------*/
#include "ecat_def.h"
#ifndef _MAILBOX_H_
#define _MAILBOX_H_
/*-----------------------------------------------------------------------------------------
------
------ Defines and Types
------
-----------------------------------------------------------------------------------------*/
#define MBX_TYPE_AOE 1 /**< \brief Mailbox type AoE*/
#define MBX_TYPE_EOE 2 /**< \brief Mailbox type EoE*/
#define MBX_TYPE_COE 3 /**< \brief Mailbox type CoE*/
#define MBX_TYPE_FOE 4 /**< \brief Mailbox type FoE*/
#define MBX_TYPE_SOE 5 /**< \brief Mailbox type SoE*/
#define MBX_TYPE_VOE 15 /**< \brief Mailbox type VoE*/
#define EMCY_SERVICE ((UINT8) 0x0001) /**< \brief Emergency service*/
#define COE_SERVICE ((UINT8) 0x0002) /**< \brief CoE service*/
#define SOE_SERVICE ((UINT8) 0x0004) /**< \brief SoE service*/
#define EOE_SERVICE ((UINT8) 0x0008) /**< \brief EoE service*/
#define AOE_SERVICE ((UINT8) 0x0010) /**< \brief AoE service*/
#define VOE_SERVICE ((UINT8) 0x0020) /**< \brief VoE service*/
#define FOE_SERVICE ((UINT8) 0x0040) /**< \brief FoE service*/
#define FRAGMENTS_FOLLOW ((UINT8) 0x0080) /**< \brief Fragments follow service*/
#ifndef ENTER_MBX_CRITICAL
#define ENTER_MBX_CRITICAL /**< \brief Enter mailbox critical section*/
#endif
#ifndef LEAVE_MBX_CRITICAL
#define LEAVE_MBX_CRITICAL /**< \brief Leave mailbox critical section*/
#endif
#ifndef MAX_MBX_QUEUE_SIZE
#define MAX_MBX_QUEUE_SIZE 10 /**< \brief Mailbox queue size*/
#endif
/*---------------------------------------------
- Command Codes for the mailbox type 0
-----------------------------------------------*/
#define MBXSERVICE_MBXERRORCMD 0x01 /**< \brief Mailbox error command*/
/*---------------------------------------------
- Error Codes for a mailbox error response
-----------------------------------------------*/
#define MBXERR_SYNTAX 0x01 /**< \brief Mailbox error "syntax"*/
#define MBXERR_UNSUPPORTEDPROTOCOL 0x02 /**< \brief Mailbox error "unsupported protocol"*/
#define MBXERR_INVALIDCHANNEL 0x03 /**< \brief Mailbox error "invalid channel"*/
#define MBXERR_SERVICENOTSUPPORTED 0x04 /**< \brief Mailbox error "service not supported"*/
#define MBXERR_INVALIDHEADER 0x05 /**< \brief Mailbox error "invalid header"*/
#define MBXERR_SIZETOOSHORT 0x06 /**< \brief Mailbox error "Size too short"*/
#define MBXERR_NOMOREMEMORY 0x07 /**< \brief Mailbox error "No memory"*/
#define MBXERR_INVALIDSIZE 0x08 /**< \brief Mailbox error "Invalid size"*/
#define MBXERR_SERVICEINWORK 0x09 /**< \brief Mailbox error "Service in work"*/
/**
* \brief Mailbox header
*/
typedef struct MBX_STRUCT_PACKED_START
{
UINT16 Length; /**< \brief Length*/
UINT16 Address; /**< \brief Address*/
/*ET9300 Project Handler :(#if MBX_16BIT_ACCESS) lines 103 to 120 deleted*/
UINT8 Flags[2]; /**< \brief Flags*/
/*ET9300 Project Handler :(#if BIG_ENDIAN_16BIT) lines 122 to 125 deleted*/
#define MBX_OFFS_TYPE 1 /**< \brief Protocol type offset*/
#define MBX_OFFS_COUNTER 1 /**< \brief Protocol counter offset*/
#define MBX_MASK_TYPE 0x0F /**< \brief Protocol type mask*/
#define MBX_MASK_COUNTER 0xF0 /**< \brief Protocol counter mask*/
#define MBX_SHIFT_TYPE 0 /**< \brief Protocol type shift*/
#define MBX_SHIFT_COUNTER 4 /**< \brief Protocol counter shift*/
}MBX_STRUCT_PACKED_END
TMBXHEADER;
#define MBX_HEADER_SIZE 6 /**< \brief Mailbox header size*/
#define MAX_MBX_DATA_SIZE (MAX_MBX_SIZE - MBX_HEADER_SIZE) /**< \brief Mailbox data size*/
/**
* \brief Mailbox datagram
*/
typedef struct MBX_STRUCT_PACKED_START
{
TMBXHEADER MbxHeader; /**< \brief Mailbox header*/
UINT16 Data[(MAX_MBX_DATA_SIZE >> 1)]; /**< \brief Mailbox data*/
}MBX_STRUCT_PACKED_END
TMBX;
/**
* \brief Mailbox queue
*/
typedef struct
{
UINT16 firstInQueue; /**< \brief First in Queue*/
UINT16 lastInQueue; /**< \brief Last in Queue*/
UINT16 maxQueueSize; /**< \brief Max queue size*/
TMBX MBXMEM * queue[(MAX_MBX_QUEUE_SIZE)+1]; /**< \brief Queue buffer*/
} TMBXQUEUE;
#endif //_MAILBOX_H_
/*-----------------------------------------------------------------------------------------
------
------ Global Variables
------
-----------------------------------------------------------------------------------------*/
#if defined(_MAILBOX_) && (_MAILBOX_ == 1)
#define PROTO
#else
#define PROTO extern
#endif
PROTO BOOL bReceiveMbxIsLocked; /**< \brief Receive mailbox is locked (MBoxOut, default SM0)*/
PROTO BOOL bSendMbxIsFull; /**< \brief Send mailbox is full (MBoxIn, default SM1)*/
PROTO BOOL bMbxRunning; /**< \brief Mailbox running (At least PreOP state)*/
PROTO BOOL bMbxRepeatToggle; /**< \brief Mailbox repeat toggle*/
PROTO UINT16 u16SendMbxSize; /**< \brief Send mailbox size (default SM1)*/
PROTO UINT16 u16ReceiveMbxSize; /**< \brief Receive mailbox size (default SM0)*/
PROTO UINT16 u16EscAddrReceiveMbx; /**< \brief Receive mailbox address (default SM0)*/
PROTO UINT16 u16EscAddrSendMbx; /**< \brief Send mailbox address (default SM1)*/
PROTO UINT8 u8MbxWriteCounter; /**< \brief Write mailbox counter*/
PROTO UINT8 u8MbxReadCounter; /**< \brief Read mailbox counter*/
/*ET9300 Project Handler :(#if !MAILBOX_QUEUE) lines 193 to 195 deleted*/
PROTO UINT8 u8MailboxSendReqStored; /**< \brief Mailbox send request stored*/
PROTO TMBX MBXMEM * psWriteMbx; /**< \brief Pointer to write mailbox buffer*/
PROTO TMBX MBXMEM * psReadMbx; /**< \brief Pointer to read mailbox buffer*/
PROTO TMBX MBXMEM * psRepeatMbx; /**< \brief Pointer to repeat mailbox buffer*/
PROTO TMBX MBXMEM * psStoreMbx; /**< \brief Pointer to store mailbox buffer*/
/*ET9300 Project Handler :(#if !MAILBOX_QUEUE) lines 201 to 203 deleted*/
PROTO TMBXQUEUE MBXMEM sMbxSendQueue; /**< \brief Send mailbox queue*/
PROTO TMBXQUEUE MBXMEM sMbxReceiveQueue; /**< \brief Receive mailbox queue*/
/*-----------------------------------------------------------------------------------------
------
------ Global Functions
------
-----------------------------------------------------------------------------------------*/
PROTO void MBX_Init(void);
PROTO UINT16 MBX_StartMailboxHandler(void);
PROTO void MBX_StopMailboxHandler(void);
PROTO void MBX_MailboxWriteInd(TMBX MBXMEM *pMbx);
PROTO void MBX_MailboxReadInd(void);
PROTO void MBX_MailboxRepeatReq(void);
PROTO UINT8 MBX_MailboxSendReq(TMBX MBXMEM * pMbx, UINT8 flags);
PROTO void MBX_CheckAndCopyMailbox(void);
PROTO UINT8 MBX_CopyToSendMailbox(TMBX MBXMEM *pMbx);
PROTO void MBX_Main(void);
#undef PROTO
/** @}*/