Macros | Enumerations | Functions | Variables
intime/nicdrv.c File Reference

EtherCAT RAW socket driver. More...

#include <ioctl.h>
#include <stdio.h>
#include <string.h>
#include <rt.h>
#include <traceapi.h>
#include "hpeif2.h"
#include "ethercattype.h"
#include "nicdrv.h"
#include "oshw.h"
Include dependency graph for intime/nicdrv.c:

Go to the source code of this file.

Macros

#define ECAT_PRINT_ERROR   printf
 
#define ECAT_PRINT_INFO   printf
 
#define ECAT_PRINT_WARN   printf
 
#define RX_PRIM   priMAC[1]
 
#define RX_SEC   secMAC[1]
 

Enumerations

enum  { ECT_RED_NONE, ECT_RED_DOUBLE }
 

Functions

void ec_setupheader (void *p)
 
int ecx_closenic (ecx_portt *port)
 
int ecx_getindex (ecx_portt *port)
 
int ecx_inframe (ecx_portt *port, int idx, int stacknumber)
 
int ecx_outframe (ecx_portt *port, int idx, int stacknumber)
 
int ecx_outframe_red (ecx_portt *port, int idx)
 
static int ecx_recvpkt (ecx_portt *port, int stacknumber)
 
void ecx_setbufstat (ecx_portt *port, int idx, int bufstat)
 
int ecx_setupnic (ecx_portt *port, const char *ifname, int secondary)
 
int ecx_srconfirm (ecx_portt *port, int idx, int timeout)
 
int ecx_waitinframe (ecx_portt *port, int idx, int timeout)
 
static int ecx_waitinframe_red (ecx_portt *port, int idx, osal_timert *timer)
 

Variables

const unsigned long interrupt_mode = NO_INTERRUPT
 
const unsigned long phy_settings = SPEED_100 | DUPLEX_FULL
 
const uint16 priMAC [3] = { 0x0101, 0x0101, 0x0101 }
 
const uint16 secMAC [3] = { 0x0404, 0x0404, 0x0404 }
 

Detailed Description

EtherCAT RAW socket driver.

Low level interface functions to send and receive EtherCAT packets. EtherCAT has the property that packets are only sent by the master, and the sent packets always return in the receive buffer. There can be multiple packets "on the wire" before they return. To combine the received packets with the original sent packets a buffer system is installed. The identifier is put in the index item of the EtherCAT header. The index is stored and compared when a frame is received. If there is a match the packet can be combined with the transmit packet and returned to the higher level function.

The socket layer can exhibit a reversal in the packet order (rare). If the Tx order is A-B-C the return order could be A-C-B. The indexed buffer will reorder the packets automatically.

The "redundant" option will configure two sockets and two NIC interfaces. Slaves are connected to both interfaces, one on the IN port and one on the OUT port. Packets are send via both interfaces. Any one of the connections (also an interconnect) can be removed and the slaves are still serviced with packets. The software layer will detect the possible failure modes and compensate. If needed the packets from interface A are resent through interface B. This layer if fully transparent for the higher layers.

Definition in file intime/nicdrv.c.

Macro Definition Documentation

◆ ECAT_PRINT_ERROR

#define ECAT_PRINT_ERROR   printf

Definition at line 78 of file intime/nicdrv.c.

◆ ECAT_PRINT_INFO

#define ECAT_PRINT_INFO   printf

Definition at line 76 of file intime/nicdrv.c.

◆ ECAT_PRINT_WARN

#define ECAT_PRINT_WARN   printf

Definition at line 77 of file intime/nicdrv.c.

◆ RX_PRIM

#define RX_PRIM   priMAC[1]

second MAC word is used for identification

Definition at line 65 of file intime/nicdrv.c.

◆ RX_SEC

#define RX_SEC   secMAC[1]

second MAC word is used for identification

Definition at line 67 of file intime/nicdrv.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Redundancy modes

Enumerator
ECT_RED_NONE 

No redundancy, single NIC mode

ECT_RED_DOUBLE 

Double redundant NIC connection

Definition at line 45 of file intime/nicdrv.c.

Function Documentation

◆ ec_setupheader()

void ec_setupheader ( void *  p)

Fill buffer with Ethernet header structure. Destination MAC is always broadcast. Ethertype is always ETH_P_ECAT.

Parameters
[out]p= buffer

Definition at line 254 of file intime/nicdrv.c.

◆ ecx_closenic()

int ecx_closenic ( ecx_portt port)
inline

Close sockets used

Returns
0

Definition at line 223 of file intime/nicdrv.c.

◆ ecx_getindex()

int ecx_getindex ( ecx_portt port)

Get new frame identifier index and allocate corresponding rx buffer.

Returns
new index.

Definition at line 270 of file intime/nicdrv.c.

◆ ecx_inframe()

int ecx_inframe ( ecx_portt port,
int  idx,
int  stacknumber 
)

Non blocking receive frame function. Uses RX buffer and index to combine read frame with transmitted frame. To compensate for received frames that are out-of-order all frames are stored in their respective indexed buffer. If a frame was placed in the buffer previously, the function retrieves it from that buffer index without calling ec_recvpkt. If the requested index is not already in the buffer it calls ec_recvpkt to fetch it. There are three options now, 1 no frame read, so exit. 2 frame read but other than requested index, store in buffer and exit. 3 frame read with matching index, store in buffer, set completed flag in buffer status and exit.

Parameters
[in]idx= requested index of frame
[in]stacknumber= 0=primary 1=secondary stack
Returns
Workcounter if a frame is found with corresponding index, otherwise EC_NOFRAME or EC_OTHERFRAME.

Definition at line 474 of file intime/nicdrv.c.

◆ ecx_outframe()

int ecx_outframe ( ecx_portt port,
int  idx,
int  stacknumber 
)

Transmit buffer over socket (non blocking).

Parameters
[in]idx= index in tx buffer array
[in]stacknumber= 0=Primary 1=Secondary stack
Returns
socket send result

Definition at line 324 of file intime/nicdrv.c.

◆ ecx_outframe_red()

int ecx_outframe_red ( ecx_portt port,
int  idx 
)

Transmit buffer over socket (non blocking).

Parameters
[in]idx= index in tx buffer array
Returns
socket send result

Definition at line 387 of file intime/nicdrv.c.

◆ ecx_recvpkt()

static int ecx_recvpkt ( ecx_portt port,
int  stacknumber 
)
static

Non blocking read of socket. Put frame in temporary buffer.

Parameters
[in]stacknumber= 0=primary 1=secondary stack
Returns
>0 if frame is available and read

Definition at line 428 of file intime/nicdrv.c.

◆ ecx_setbufstat()

void ecx_setbufstat ( ecx_portt port,
int  idx,
int  bufstat 
)

Set rx buffer status.

Parameters
[in]idx= index in buffer array
[in]bufstat= status to set

Definition at line 310 of file intime/nicdrv.c.

◆ ecx_setupnic()

int ecx_setupnic ( ecx_portt port,
const char *  ifname,
int  secondary 
)

Basic setup to connect NIC to socket.

Parameters
[in]ifname= Name of NIC device, f.e. "eth0"
[in]secondary= if >0 then use secondary stack instead of primary
Returns
>0 if succeeded

Definition at line 89 of file intime/nicdrv.c.

◆ ecx_srconfirm()

int ecx_srconfirm ( ecx_portt port,
int  idx,
int  timeout 
)

Blocking send and receive frame function. Used for non processdata frames. A datagram is build into a frame and transmitted via this function. It waits for an answer and returns the workcounter. The function retries if time is left and the result is WKC=0 or no frame received.

The function calls ec_outframe_red() and ec_waitinframe_red().

Parameters
[in]idx= index of frame
[in]timeout= timeout in us
Returns
Workcounter or EC_NOFRAME

Definition at line 684 of file intime/nicdrv.c.

◆ ecx_waitinframe()

int ecx_waitinframe ( ecx_portt port,
int  idx,
int  timeout 
)

Blocking receive frame function. Calls ec_waitinframe_red().

Parameters
[in]idx= requested index of frame
[in]timeout= timeout in us
Returns
Workcounter if a frame is found with corresponding index, otherwise EC_NOFRAME.

Definition at line 649 of file intime/nicdrv.c.

◆ ecx_waitinframe_red()

static int ecx_waitinframe_red ( ecx_portt port,
int  idx,
osal_timert timer 
)
static

Blocking redundant receive frame function. If redundant mode is not active then it skips the secondary stack and redundancy functions. In redundant mode it waits for both (primary and secondary) frames to come in. The result goes in an decision tree that decides, depending on the route of the packet and its possible missing arrival, how to reroute the original packet to get the data in an other try.

Parameters
[in]idx= requested index of frame
[in]timer= absolute timeout time
Returns
Workcounter if a frame is found with corresponding index, otherwise EC_NOFRAME.

Definition at line 563 of file intime/nicdrv.c.

Variable Documentation

◆ interrupt_mode

const unsigned long interrupt_mode = NO_INTERRUPT

Definition at line 81 of file intime/nicdrv.c.

◆ phy_settings

const unsigned long phy_settings = SPEED_100 | DUPLEX_FULL

Definition at line 82 of file intime/nicdrv.c.

◆ priMAC

const uint16 priMAC[3] = { 0x0101, 0x0101, 0x0101 }

Primary source MAC address used for EtherCAT. This address is not the MAC address used from the NIC. EtherCAT does not care about MAC addressing, but it is used here to differentiate the route the packet traverses through the EtherCAT segment. This is needed to find out the packet flow in redundant configurations.

Definition at line 60 of file intime/nicdrv.c.

◆ secMAC

const uint16 secMAC[3] = { 0x0404, 0x0404, 0x0404 }

Secondary source MAC address used for EtherCAT.

Definition at line 62 of file intime/nicdrv.c.



soem
Author(s): Arthur Ketels and M.J.G. van den Molengraft
autogenerated on Mon Feb 28 2022 23:46:57