/* * SOES Simple Open EtherCAT Slave * * File : esc.h * Version : 0.9.2 * Date : 22-02-2010 * Copyright (C) 2007-2013 Arthur Ketels * Copyright (C) 2012-2013 rt-labs. * * SOES is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2 as published by the Free * Software Foundation. * * SOES is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * As a special exception, if other files instantiate templates or use macros * or inline functions from this file, or you compile this file and link it * with other works to produce a work based on this file, this file does not * by itself cause the resulting work to be covered by the GNU General Public * License. However the source code for this file must still be made available * in accordance with section (3) of the GNU General Public License. * * This exception does not invalidate any other reasons why a work based on * this file might be covered by the GNU General Public License. * * The EtherCAT Technology, the trade name and logo "EtherCAT" are the intellectual * property of, and protected by Beckhoff Automation GmbH. */ /** \file * \brief * Headerfile for esc.h */ #ifndef __esc__ #define __esc__ /* storage modifier for data stored in flashmemory */ #define FLASHSTORE const #define PACKED __attribute__((__packed__)) #define ESCREG_ADDRESS 0x0010 #define ESCREG_DLSTATUS 0x0110 #define ESCREG_ALCONTROL 0x0120 #define ESCREG_ALSTATUS 0x0130 #define ESCREG_ALERROR 0x0134 #define ESCREG_ALEVENT_SM_MASK 0x0310 #define ESCREG_ALEVENT_SMCHANGE 0x0010 #define ESCREG_ALEVENT_CONTROL 0x0001 #define ESCREG_ALEVENT_SM2 0x0400 #define ESCREG_ALEVENT_SM3 0x0800 #define ESCREG_WDSTATUS 0x0440 #define ESCREG_SM0 0x0800 #define ESCREG_SM0STATUS (ESCREG_SM0 + 5) #define ESCREG_SM0PDI (ESCREG_SM0 + 7) #define ESCREG_SM1 (ESCREG_SM0 + 0x08) #define ESCREG_SM2 (ESCREG_SM0 + 0x10) #define ESCREG_SM3 (ESCREG_SM0 + 0x18) #define ESCREG_LOCALTIME 0x0910 #define ESCREG_SMENABLE_BIT 0x01 #define ESCREG_AL_STATEMASK 0x001f #define ESCREG_AL_ALLBUTINITMASK 0x0e #define ESCREG_AL_ERRACKMASK 0x0f #define ESCinit 0x01 #define ESCpreop 0x02 #define ESCboot 0x03 #define ESCsafeop 0x04 #define ESCop 0x08 #define ESCerror 0x10 #define INIT_TO_INIT 0x11 #define INIT_TO_PREOP 0x21 #define INIT_TO_BOOT 0x31 #define INIT_TO_SAFEOP 0x41 #define INIT_TO_OP 0x81 #define PREOP_TO_INIT 0x12 #define PREOP_TO_PREOP 0x22 #define PREOP_TO_BOOT 0x32 #define PREOP_TO_SAFEOP 0x42 #define PREOP_TO_OP 0x82 #define BOOT_TO_INIT 0x13 #define BOOT_TO_PREOP 0x23 #define BOOT_TO_BOOT 0x33 #define BOOT_TO_SAFEOP 0x43 #define BOOT_TO_OP 0x83 #define SAFEOP_TO_INIT 0x14 #define SAFEOP_TO_PREOP 0x24 #define SAFEOP_TO_BOOT 0x34 #define SAFEOP_TO_SAFEOP 0x44 #define SAFEOP_TO_OP 0x84 #define OP_TO_INIT 0x18 #define OP_TO_PREOP 0x28 #define OP_TO_BOOT 0x38 #define OP_TO_SAFEOP 0x48 #define OP_TO_OP 0x88 #define ALERR_NONE 0x0000 #define ALERR_INVALIDSTATECHANGE 0x0011 #define ALERR_UNKNOWNSTATE 0x0012 #define ALERR_BOOTNOTSUPPORTED 0x0013 #define ALERR_INVALIDBOOTMBXCONFIG 0x0015 #define ALERR_INVALIDMBXCONFIG 0x0016 #define ALERR_INVALIDSMCONFIG 0x0017 #define ALERR_WATCHDOG 0x001B #define ALERR_INVALIDOUTPUTSM 0x001D #define ALERR_INVALIDINPUTSM 0x001E #define MBXERR_SYNTAX 0x0001 #define MBXERR_UNSUPPORTEDPROTOCOL 0x0002 #define MBXERR_INVALIDCHANNEL 0x0003 #define MBXERR_SERVICENOTSUPPORTED 0x0004 #define MBXERR_INVALIDHEADER 0x0005 #define MBXERR_SIZETOOSHORT 0x0006 #define MBXERR_NOMOREMEMORY 0x0007 #define MBXERR_INVALIDSIZE 0x0008 #define ABORT_NOTOGGLE 0x05030000 #define ABORT_UNKNOWN 0x05040001 #define ABORT_UNSUPPORTED 0x06010000 #define ABORT_WRITEONLY 0x06010001 #define ABORT_READONLY 0x06010002 #define ABORT_NOOBJECT 0x06020000 #define ABORT_TYPEMISMATCH 0x06070010 #define ABORT_NOSUBINDEX 0x06090011 #define ABORT_GENERALERROR 0x08000000 #define ABORT_NOTINTHISSTATE 0x08000022 #define MBXstate_idle 0x00 #define MBXstate_inclaim 0x01 #define MBXstate_outclaim 0x02 #define MBXstate_outreq 0x03 #define MBXstate_outpost 0x04 #define MBXstate_backup 0x05 #define MBXstate_again 0x06 #define COE_DEFAULTLENGTH 0x0a #define COE_HEADERSIZE 0x0a #define COE_SEGMENTHEADERSIZE 0x03 #define COE_SDOREQUEST 0x02 #define COE_SDORESPONSE 0x03 #define COE_SDOINFORMATION 0x08 #define COE_COMMAND_SDOABORT 0x80 #define COE_COMMAND_UPLOADREQUEST 0x40 #define COE_COMMAND_UPLOADRESPONSE 0x40 #define COE_COMMAND_UPLOADSEGMENT 0x00 #define COE_COMMAND_UPLOADSEGREQ 0x60 #define COE_COMMAND_DOWNLOADRESPONSE 0x60 #define COE_COMMAND_LASTSEGMENTBIT 0x01 #define COE_SIZE_INDICATOR 0x01 #define COE_EXPEDITED_INDICATOR 0x02 #define COE_COMPLETEACCESS 0x10 #define COE_TOGGLEBIT 0x10 #define COE_INFOERROR 0x07 #define COE_GETODLISTRESPONSE 0x02 #define COE_GETODRESPONSE 0x04 #define COE_ENTRYDESCRIPTIONRESPONSE 0x06 #define COE_VALUEINFO_ACCESS 0x01 #define COE_VALUEINFO_OBJECT 0x02 #define COE_VALUEINFO_MAPPABLE 0x04 #define COE_VALUEINFO_TYPE 0x08 #define COE_VALUEINFO_DEFAULT 0x10 #define COE_VALUEINFO_MINIMUM 0x20 #define COE_VALUEINFO_MAXIMUM 0x40 #define MBXSIZE 0x80 #define MBXSIZEBOOT 0x80 #define MBXBUFFERS 3 #define MBX0_sma 0x1000 #define MBX0_sml MBXSIZE #define MBX0_sme MBX0_sma+MBX0_sml-1 #define MBX0_smc 0x26 #define MBX1_sma 0x1080 #define MBX1_sml MBXSIZE #define MBX1_sme MBX1_sma+MBX1_sml-1 #define MBX1_smc 0x22 #define MBX0_sma_b 0x1000 #define MBX0_sml_b MBXSIZEBOOT #define MBX0_sme_b MBX0_sma_b+MBX0_sml_b-1 #define MBX0_smc_b 0x26 #define MBX1_sma_b 0x1080 #define MBX1_sml_b MBXSIZEBOOT #define MBX1_sme_b MBX1_sma_b+MBX1_sml_b-1 #define MBX1_smc_b 0x22 #define SM2_sma 0x1100 #define SM2_smc 0x24 #define SM2_act 0x01 #define SM3_sma 0x1180 #define SM3_smc 0x20 #define SM3_act 0x01 #define MBXHSIZE sizeof(_MBXh) #define MBXDSIZE MBXSIZE-MBXHSIZE #define MBXERR 0x00 #define MBXAOE 0x01 #define MBXEOE 0x02 #define MBXCOE 0x03 #define MBXFOE 0x04 #define MBXODL 0x10 #define MBXOD 0x20 #define MBXED 0x30 #define MBXSEU 0x40 #define MBXSED 0x50 #define SMRESULT_ERRSM0 0x01 #define SMRESULT_ERRSM1 0x02 #define SMRESULT_ERRSM2 0x04 #define SMRESULT_ERRSM3 0x08 #define FOE_ERR_NOTDEFINED 0x8000 #define FOE_ERR_NOTFOUND 0x8001 #define FOE_ERR_ACCESS 0x8002 #define FOE_ERR_DISKFULL 0x8003 #define FOE_ERR_ILLEGAL 0x8004 #define FOE_ERR_PACKETNO 0x8005 #define FOE_ERR_EXISTS 0x8006 #define FOE_ERR_NOUSER 0x8007 #define FOE_ERR_BOOTSTRAPONLY 0x8008 #define FOE_ERR_NOTINBOOTSTRAP 0x8009 #define FOE_ERR_NORIGHTS 0x800A #define FOE_ERR_PROGERROR 0x800B #define FOE_OP_RRQ 1 #define FOE_OP_WRQ 2 #define FOE_OP_DATA 3 #define FOE_OP_ACK 4 #define FOE_OP_ERR 5 #define FOE_OP_BUSY 6 #define FOE_READY 0 #define FOE_WAIT_FOR_ACK 1 #define FOE_WAIT_FOR_FINAL_ACK 2 #define FOE_WAIT_FOR_DATA 3 #define EC_LITTLE_ENDIAN // Attention! this struct is always little-endian typedef struct PACKED { uint16 PSA; uint16 Length; #if defined(EC_LITTLE_ENDIAN) uint8 Mode:2; uint8 Direction:2; uint8 IntECAT:1; uint8 IntPDI:1; uint8 WTE:1; uint8 R1:1; uint8 IntW:1; uint8 IntR:1; uint8 R2:1; uint8 MBXstat:1; uint8 BUFstat:2; uint8 R3:2; uint8 ECsm:1; uint8 ECrep:1; uint8 ECr4:4; uint8 EClatchEC:1; uint8 EClatchPDI:1; uint8 PDIsm:1; uint8 PDIrep:1; uint8 PDIr5:6; #endif #if defined(EC_BIG_ENDIAN) uint8 R1:1; uint8 WTE:1; uint8 IntPDI:1; uint8 IntECAT:1; uint8 Direction:2; uint8 Mode:2; uint8 R3:2; uint8 BUFstat:2; uint8 MBXstat:1; uint8 R2:1; uint8 IntR:1; uint8 IntW:1; uint8 EClatchPDI:1; uint8 EClatchEC:1; uint8 ECr4:4; uint8 ECrep:1; uint8 ECsm:1; uint8 PDIr5:6; uint8 PDIrep:1; uint8 PDIsm:1; #endif } _ESCsm; /* Attention! this struct is always little-endian */ typedef struct PACKED { uint16 PSA; uint16 Length; uint8 Command; uint8 Status; uint8 ActESC; uint8 ActPDI; } _ESCsm2; typedef FLASHSTORE struct PACKED { uint16 PSA; uint16 Length; uint8 Command; } _ESCsmCompact; typedef struct PACKED { uint16 ALevent; uint16 ALstatus; uint16 ALcontrol; uint16 ALerror; uint16 DLstatus; uint16 address; uint8 mbxcnt; uint8 mbxincnt; uint8 mbxoutpost; uint8 mbxbackup; uint8 xoe; uint8 txcue; uint8 mbxfree; uint8 segmented; void *data; uint16 entries; uint16 frags; uint16 fragsleft; #if defined(EC_LITTLE_ENDIAN) uint8 r1:1; uint8 toggle:1; uint8 r2:6; #endif #if defined(EC_BIG_ENDIAN) uint8 r2:6; uint8 toggle:1; uint8 r1:1; #endif uint8 SMtestresult; int16 temp; uint16 wdcnt; uint32 PrevTime; uint32 Time; _ESCsm SM[4]; } _ESCvar; typedef struct PACKED { uint16 length; uint16 address; #if defined(EC_LITTLE_ENDIAN) uint8 channel:6; uint8 priority:2; uint8 mbxtype:4; uint8 mbxcnt:4; #endif #if defined(EC_BIG_ENDIAN) uint8 priority:2; uint8 channel:6; uint8 mbxcnt:4; uint8 mbxtype:4; #endif } _MBXh; typedef struct PACKED { _MBXh header; uint8 b[MBXDSIZE]; } _MBX; typedef struct PACKED { uint16 numberservice; } _COEh; typedef struct PACKED { #if defined(EC_LITTLE_ENDIAN) uint8 opcode:7; uint8 incomplete:1; #endif #if defined(EC_BIG_ENDIAN) uint8 incomplete:1; uint8 opcode:7; #endif uint8 reserved; uint16 fragmentsleft; } _INFOh; typedef struct PACKED { _MBXh mbxheader; uint16 type; uint16 detail; } _MBXerr; typedef struct PACKED { _MBXh mbxheader; _COEh coeheader; uint8 command; uint16 index; uint8 subindex; uint32 size; } _COEsdo; typedef struct PACKED { _MBXh mbxheader; _COEh coeheader; _INFOh infoheader; uint16 index; uint16 datatype; uint8 maxsub; uint8 objectcode; char name; } _COEobjdesc; typedef struct PACKED { _MBXh mbxheader; _COEh coeheader; _INFOh infoheader; uint16 index; uint8 subindex; uint8 valueinfo; uint16 datatype; uint16 bitlength; uint16 access; char name; } _COEentdesc; typedef struct PACKED { uint8 opcode; uint8 reserved; union { uint32 password; uint32 packetnumber; uint32 errorcode; }; } _FOEh; #define FOEHSIZE (sizeof(_FOEh)) #define FOE_DATA_SIZE (MBXSIZEBOOT - (MBXHSIZE+FOEHSIZE)) typedef struct PACKED { _MBXh mbxheader; _FOEh foeheader; union { char filename[FOE_DATA_SIZE]; uint8 data[FOE_DATA_SIZE]; char errortext[FOE_DATA_SIZE]; }; } _FOE; /* state definition in mailbox * 0 : idle * 1 : claimed for inbox * 2 : claimed for outbox * 3 : request post outbox * 4 : outbox posted not send * 5 : backup outbox * 6 : mailbox needs to be transmitted again */ typedef struct { uint8 state; } _MBXcontrol; typedef struct esc_cfg { void (*pre_state_change_hook) (uint8 * as, uint8 * an); void (*post_state_change_hook) (uint8 * as, uint8 * an); } esc_cfg_t; void ESC_config (esc_cfg_t * cfg); void ESC_ALerror (uint16 errornumber); void ESC_ALstatus (uint8 status); void ESC_SMstatus (uint8 n); uint8 ESC_WDstatus (void); uint8 ESC_claimbuffer (void); uint8 ESC_startmbx (uint8 state); void ESC_stopmbx (void); void MBX_error (uint16 error); uint8 ESC_mbxprocess (void); void ESC_xoeprocess (void); uint8 ESC_startinput (uint8 state); void ESC_stopinput (void); uint8 ESC_startoutput (uint8 state); void ESC_stopoutput (void); void ESC_ALevent (void); void ESC_state (void); /* From hardware file */ uint8 ESC_read (uint16 address, void *buf, uint16 len, void *tALevent); uint8 ESC_write (uint16 address, void *buf, uint16 len, void *tALevent); void ESC_init (void * arg); /* From application */ extern void APP_safeoutput (); extern volatile _ESCvar ESCvar; extern _MBX MBX[MBXBUFFERS]; extern _MBXcontrol MBXcontrol[MBXBUFFERS]; extern uint8 MBXrun; extern uint16 SM2_sml, SM3_sml; #endif