EC-Mater + TTS (PDK1.0.6 PSDK3.3.0.4)
[apps/tidep0079.git] / EC_Master_SysBios_Am572x / Workspace / SYSBIOS_AM57xx / emllICSS / icssEmacEcDevice.h
1 /*-----------------------------------------------------------------------------
2  * iccs_emac_ec_device.h    header file
3  * Description              Internal used types and structures for ICSS EMAC
4  *                          Ethercat LinkLayer
5  *---------------------------------------------------------------------------*/
7 #ifndef INC_ICCSEMACECDEVICE_H
8 #define INC_ICCSEMACECDEVICE_H
10 //Comment this to use in non-TTS mode.
11 #ifndef TTS
12 #define TTS
13 #endif
15 /*-INCLUDE-------------------------------------------------------------------*/
16 #include <ti/drv/icss_emac/icss_emacDrv.h>
18 #ifndef __cplusplus
20 #include "LinkOsLayer.h"
21 #include "icssPrivate.h"
23 /*-DEFINES-------------------------------------------------------------------*/
25 /*-TYPEDEFS/ENUMS------------------------------------------------------------*/
26 typedef struct _T_ICSS_EC_DESC
27 {
28    EC_T_DWORD dwNext;   // Next Descriptor Pointer
29    EC_T_DWORD dwBuffer; // Buffer Pointer
30    EC_T_DWORD dwLen;    // Buffer Offset | Buffer Length
31    EC_T_DWORD dwMode;   // Flags | Packet Length
32 } T_ICSS_EC_DESC, *PT_ICSS_EC_DESC;
34 // CPSW hardware DMA descriptor structure
35 typedef struct _T_CPSW_DESC
36 {
37    EC_T_DWORD dwNext;   // Next Descriptor Pointer
38    EC_T_DWORD dwBuffer; // Buffer Pointer
39    EC_T_DWORD dwLen;    // Buffer Offset | Buffer Length
40    EC_T_DWORD dwMode;   // Flags | Packet Length
41 } T_CPSW_DESC, *PT_CPSW_DESC;
43 typedef enum
44 {
45   BS_FREE = 0,
46   BS_ALLOC,
47   BS_DMA_STARTED,
48 } T_CPSW_BUFSTATE;
50 // Buffer management entry. Size is 16 byte in order to make debugging more comfortable.
51 typedef struct _T_CPSW_BUFENTRY
52 {
53    EC_T_DWORD         dwMagicKey;    // Magic key for sanity checks.
54    T_CPSW_BUFSTATE    eBufState;
55    EC_T_DWORD         dwDescIdx;     // Assigned T_CPSW_DESC descriptor index (set during send operation)
56    EC_T_DWORD         dwFrameLen;    // Debugging: This info is also stored in the DMA descriptor
57 } T_CPSW_BUFENTRY, *PT_CPSW_BUFENTRY;
58 #define CPSW_BUFENTRY_SIZE 16 // Constant expression, because VS preprocessor doesn't understand sizeof()
60 // Helper acccess structure (used for casting raw memory)
61 #if (CACHELINE_SIZE > CPSW_BUFENTRY_SIZE)
62 #  define CPSW_BUFENTRY_FRAME_OFFSET CACHELINE_SIZE
63 #else
64 #  define CPSW_BUFENTRY_FRAME_OFFSET CPSW_BUFENTRY_SIZE
65 #endif
66 typedef struct _T_CPSW_FRAMEBUFENTRY
67 {
68    T_CPSW_BUFENTRY bufentry;
69 #if (CPSW_BUFENTRY_FRAME_OFFSET != CPSW_BUFENTRY_SIZE)
70    EC_T_BYTE       abyCacheAlignmentBuffer[CPSW_BUFENTRY_FRAME_OFFSET - CPSW_BUFENTRY_SIZE];
71 #endif
72    EC_T_BYTE       pFrame[1];     // Framebuffer
73 } T_CPSW_FRAMEBUFENTRY, *PT_CPSW_FRAMEBUFENTRY;
75 typedef struct _T_ICSS_EC_INTERNAL *PT_ICSS_EC_INTERNAL;
76 typedef struct _ICSS_EC_REGS *ICSS_EC_REGS;
77 typedef struct _ICSS_EC_HOST_REGS *ICSS_EC_HOST_REGS;
78 typedef struct _ICSS_EC_ALE_REGS *ICSS_EC_ALE_REGS;
79 typedef struct _ICSS_EC_CPDMA_REGS *ICSS_EC_CPDMA_REGS;
80 typedef struct _ICSS_EC_STATERAM_REGS *ICSS_EC_STATERAM_REGS;
81 typedef struct _ICSS_EC_SS_REGS *ICSS_EC_SS_REGS;
82 typedef struct _ICSS_EC_MDIO_REGS *ICSS_EC_MDIO_REGS;
83 typedef struct _ICSS_EC_SLAVE_REGS *ICSS_EC_SLAVE_REGS;
84 typedef struct _ICSS_EC_SLIVER_REGS *ICSS_EC_SLIVER_REGS;
86 typedef struct _ICSS_EC_REGSET
87 {
88            //PC-- For the moment I used same Reg as in ICSS_EmacBaseAddressHandle_T
89            EC_T_DWORD dwPrussMiiMdioRegs;   /*! MDIO Base register */
90            EC_T_DWORD dwDataRam0BaseAddr;   /*! DataRam 0 Base Address */
91            EC_T_DWORD dwDataRam1BaseAddr;   /*! DataRam 0 Base Address */
92            EC_T_DWORD dwL3OcmcBaseAddr;     /*! L3 OCMC Base Address */
93            EC_T_DWORD dwSharedDataRamBaseAddrs;    /*! PRUSS Shared RAM Base Address */
94            EC_T_DWORD dwPrussIntcRegs;      /*! Pruss INTC Register Base Address */
95            EC_T_DWORD dwPrussPru0CtrlRegs;  /*! PRU0 Control register Base Address */
96            EC_T_DWORD dwPrussPru1CtrlRegs;  /*! PRU1 Control register Base Address */
97            EC_T_DWORD dwPrussIepRegs;       /*! PRUSS IEP register Base Address */
98            EC_T_DWORD dwPrussCfgRegs;       /*! Pruss CFG register Base Address */
99            EC_T_DWORD dwPrussMiiRtCfgRegsBaseAddr;  /*! MII RT Config register Base Address */
101 } ICSS_EC_REGSET, *PICSS_EC_REGSET;
103 typedef struct _T_ICSS_EC_INTERNAL
105    // Misc
106    EC_T_DWORD                  dwSignature;
107    EC_T_LINK_PARMS_ICSS        oInitParms;
108    EC_T_RECEIVEFRAMECALLBACK   pfReceiveFrameCallback; //PC-- TODO: check if this is required or not due to demo working on RX polling mode only
109    EC_T_VOID*                  pvCallbackContext;
110    ICSS_EC_REGSET              regs; // Register set
111    T_PCIINFO                   oCardInfo; // PCI info
112    EC_T_DWORD                  dwPhyFeatures;
113    EC_T_DWORD                  oAdapterObject;
114    EC_T_DWORD                  dwIrqEvent; // storage for interrupt events
115    EC_T_LINKOS_IRQ_PARM        oIrqParms; // IRQ handling
116    EC_T_DWORD                  dwLosalHandle;
117    EC_T_DWORD                  dwLinkStatus;
119    // RX
120    volatile T_ICSS_EC_DESC*       pRxDesc; // Descriptor base address (len: dwRxDescSize byte)
121    volatile T_ICSS_EC_DESC*       pRxTailDesc; // Point to last dtor (nextp == NULL)
122    EC_T_DWORD                  dwRxDescSize; // Size of all RX descriptors (ICSS_EC_RXDESCNT * sizeof(T_ICSS_EC_DESC)) in byte
123    volatile EC_T_BYTE*         pRxBuffer; // Buffer base address (len: dwRxBufferSize byte)
124    EC_T_DWORD                  dwRxBufferSize; // Size of all RX buffers (ICSS_EC_RXDMABUFCNT * ICSS_EC_RXBUFLEN) in byte
125    EC_T_DWORD                  dwRxDescIdx; // Ringbuffer index (RX T_ICSS_EC_BUFENTRY)
126    EC_T_DWORD                  dwRxBufIdx; // Ringbuffer index (RX buffers)
127 #if defined COPY_FRAME
128    EC_T_BYTE*                  pRxCachedBuffer; // Cached buffer base address (len: dwRxCachedBufferSize byte)
129    EC_T_DWORD                  dwRxCachedBufferSize; // Size of all cached RX buffers (ICSS_EC_RXCACHEDBUFCNT * ICSS_EC_RXBUFLEN) in byte
130    EC_T_BYTE*                  pRxCachedBufferOriginal; // buffer address which was returned from malloc, but which can be not alligned
131 #endif
133    // TX
134    volatile T_ICSS_EC_DESC*       pTxDesc; // Pointer to dtor list
135    volatile T_ICSS_EC_DESC*       pTxTailDesc; // Last processed dtor
136    EC_T_DWORD                  dwTxDescSize; // Size of all TX descriptors (ICSS_EC_TXDESCNT * sizeof(T_ICSS_EC_DESC)) in byte
137    volatile EC_T_BYTE*         pTxBuffer; // Buffer base address (len: dwTxBufferSize byte)
138    EC_T_DWORD                  dwTxBufferSize; // Size of all TX buffers (ICSS_EC_TXDMABUFCNT * ICSS_EC_TXBUFLEN) in byte
139    EC_T_DWORD                  dwTxDescIdx; // Next free TX Ringbuffer index (TX T_ICSS_EC_BUFENTRY)
140    EC_T_DWORD                  dwTxBufIdx; // Ringbuffer index (TX buffers)
141 #if defined COPY_FRAME
142    EC_T_BYTE*                  pTxCachedBuffer; // Cached buffer base address (len: dwTxCachedBufferSize byte)
143    EC_T_DWORD                  dwTxCachedBufferSize; // Size of all cached TX buffers (ICSS_EC_TXCACHEDBUFCNT * ICSS_EC_TXBUFLEN) in byte
144    EC_T_BYTE*                  pTxCachedBufferOriginal; // buffer address which was returned from malloc, but which can be not alligned
145 #endif
147    // Instance Mgt
148    PT_ICSS_EC_INTERNAL            pPrev;
149    PT_ICSS_EC_INTERNAL            pNext;
151 } T_ICSS_EC_INTERNAL, *PT_ICSS_EC_INTERNAL;
153 //PC-- Below Added for a RX buffer Queue
154 /* Queue structure - RX circular buffer*/
155 #define MAX_NUM_BUF 16
156 #define BUF_SIZE 1024
157 #define ERROR_QUEUE   2
158 #define ERROR_MEMORY  3
160 typedef struct _BufferQueue
162         EC_T_BYTE* const buffer[MAX_NUM_BUF*BUF_SIZE];
163         EC_T_INT NumWriteBuf;
164     EC_T_INT NumReadBuf;
165         EC_T_INT PktLength[MAX_NUM_BUF];
166     EC_T_INT head;
167     EC_T_INT NumAllocBuf;
169 } BufferQueue, *PT_BUF_QUEUE;
171 /*
172  * Function: QueueCreate
173  * A new empty queue is created and returned.
174  */
175 PT_BUF_QUEUE QueueBufCreate(void);
177 /* Function: QueueDestroy
178  * Function frees all memory associated with the queue.
179  */
180 void QueueBufDestroy(PT_BUF_QUEUE BufQueue);
182 /*
183  * Functions: QueueBufIsEmpty, QueueBufIsFull
184  * Return a true/false value based on whether the queue is empty or full, respectively.
185  */
186 EC_T_INT QueueBufIsEmpty(PT_BUF_QUEUE BufQueue);
187 EC_T_INT QueueBufIsFull(PT_BUF_QUEUE BufQueue);
189 /*
190  * Functions: QueueFreeBuf
191  * Free a Buffer in FIFO Queue. Return if Buffer was "read" by upperlayer
192  */
193 EC_T_INT QueueFreeBuf(PT_BUF_QUEUE BufQueue);
195 /*
196  * Functions: QueueAllocBuf
197  * Return a pointer to a free Buffer in FIFO Queue.
198  */
199 EC_T_BYTE* QueueAllocBuf(PT_BUF_QUEUE BufQueue);
201 PT_CPSW_FRAMEBUFENTRY FrameBufEntryCreate(void);
202 #endif  //__cplusplus
204 #ifdef __cplusplus
205 extern "C"
207 #endif
208 #ifdef TTS
209 //Required for TTS.
210 extern ICSS_EmacHandle emachandle2;
211 extern ICSS_EmacHandle emachandle3;
212 //extern int8_t TTSSemCreate();
213 extern SemaphoreP_Handle ttsP1TxSem;
214 extern SemaphoreP_Handle ttsP2TxSem;
215 uint32_t deInitTTS(ICSS_EmacHandle icssEmacHandle);
216 EC_T_BYTE initTTS(ICSS_EmacHandle icssEmacHandle, uint32_t cyclePeriod);
217 #endif
218 #ifdef __cplusplus
219 } /* extern "C"*/
220 #endif
222 #endif // INC_ICCSEMACECDEVICE_H