SOES/soes/esc.h

511 lines
13 KiB
C
Raw Normal View History

/*
* SOES Simple Open EtherCAT Slave
*
* 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.
*/
2015-05-07 17:43:02 +02:00
/** \file
* \brief
* Headerfile for esc.h
*/
2015-05-07 17:43:02 +02:00
#ifndef __esc__
#define __esc__
2015-05-18 16:54:09 +02:00
#include <cc.h>
2015-05-20 13:15:49 +02:00
#include "config.h"
2015-05-18 16:54:09 +02:00
#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 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
// Attention! this struct is always little-endian
2015-05-18 16:54:09 +02:00
typedef struct CC_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 */
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
uint16 PSA;
uint16 Length;
uint8 Command;
uint8 Status;
uint8 ActESC;
uint8 ActPDI;
} _ESCsm2;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
uint16 PSA;
uint16 Length;
uint8 Command;
} _ESCsmCompact;
2015-05-18 16:54:09 +02:00
typedef struct CC_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;
2015-05-18 16:54:09 +02:00
typedef struct CC_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;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
_MBXh header;
uint8 b[MBXDSIZE];
} _MBX;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
uint16 numberservice;
} _COEh;
2015-05-18 16:54:09 +02:00
typedef struct CC_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;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
_MBXh mbxheader;
uint16 type;
uint16 detail;
} _MBXerr;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
_MBXh mbxheader;
_COEh coeheader;
uint8 command;
uint16 index;
uint8 subindex;
uint32 size;
} _COEsdo;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
_MBXh mbxheader;
_COEh coeheader;
_INFOh infoheader;
uint16 index;
uint16 datatype;
uint8 maxsub;
uint8 objectcode;
char name;
} _COEobjdesc;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
_MBXh mbxheader;
_COEh coeheader;
_INFOh infoheader;
uint16 index;
uint8 subindex;
uint8 valueinfo;
uint16 datatype;
uint16 bitlength;
uint16 access;
char name;
} _COEentdesc;
2015-05-18 16:54:09 +02:00
typedef struct CC_PACKED
{
uint8 opcode;
uint8 reserved;
union
{
uint32 password;
uint32 packetnumber;
uint32 errorcode;
};
} _FOEh;
#define FOEHSIZE (sizeof(_FOEh))
#define FOE_DATA_SIZE (MBXSIZEBOOT - (MBXHSIZE+FOEHSIZE))
2015-05-18 16:54:09 +02:00
typedef struct CC_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);
2015-05-20 13:15:49 +02:00
void ESC_init (const void * arg);
void ESC_reset (void);
/* 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;
2015-05-07 17:43:02 +02:00
typedef struct
{
uint8 state;
} _App;
#define APPSTATE_IDLE 0x00
#define APPSTATE_INPUT 0x01
#define APPSTATE_OUTPUT 0x02
extern _App App;
#endif