axiethernet
Vitis Drivers API Documentation
xavb_example.c File Reference

Overview

This file implements a simple example to show the usage of Audio Video Bridging (AVB) functionality of Axi Ethernet IP in loopback mode.

The example uses the PTP Timer and the PTP Rx interrupts. A PDelay_Req packet is sent and is received back (as we are in loopback mode). . After this loop backed PDelay_Req packet is received, a PDelay_Resp and PDelay_RespFollowUp packets are sent. These packets are also received. Since the source port identity of the received packets matches with our systems's own source port identity there is no further processing done.

Note

This code assumes the processor type is Microblaze, Xilinx interrupt controller (XIntc) is used in the system , and that no operating system is used.

It also assumes that all the relevant AVB interrupts are properly connected to the Intc module.

The Ethernet AVB Endpoint functionality should be enabled in the Xilinx Axi Ethernet core for this example to work.

The Axi Ethernet is used with a GMII interface. The example initializes the GMII interface with 1000 Mbps speed.

IMPORTANT NOTE: The user must define the macro XAVB_CLOCK_LOCK_THRESHOLD in xavb.h to an appropriate value as relevant for the corresponding use case. Presently it is defined to 1000 ns which is typical for telecom industry. This macro is used to compare against the slave error as calculated every time after receiving 2 successive sync/followup frames. Slave error is the difference between master time duration and slave time duration as calculated for the time gap (the time it takes to receive two successive sync/follow up frames). If slave error is greater than the value defined in XAVB_CLOCK_LOCK_THRESHOLD, then master and slave clocks are unlocked. This means the node running this SW assumes that the peer is no more capable of processing 802.1as frames. The node running the SW then waits till it successful calculates the path delay (which essentially means the peer is again capable of processing 802.1as frames.

MODIFICATION HISTORY:
Ver   Who      Date     Changes


1.00a kag/asa 08/25/10 First release 3.00a asa 04/10/12 Disabled enabling of promiscuous mode. This is required for AxiEthernet cores with version v3_01_a onwards because of a change in the AVB implementation. 4.0 asa 03/06/14 Fix for CR 740863. Added a #warning message for users of this example to take note of the fact that we have just used a typical value for XAVB_CLOCK_LOCK_THRESHOLD and users may want to change it as per their requirements.

 

Macros

#define AXIETHERNET_DEVICE_ID   XPAR_AXIETHERNET_0_DEVICE_ID
 The following constants map to the XPAR parameters created in the xparameters.h file. More...
 

Functions

void AvbGMDiscontinuityHandler (void *CallBackRef, u32 TimestampsUncertain)
 This function is the handler which will be called if the PTP drivers identify a possible discontinuity in GrandMaster time. More...
 
int main ()
 This is the main function for the AVB example. More...
 

Macro Definition Documentation

#define AXIETHERNET_DEVICE_ID   XPAR_AXIETHERNET_0_DEVICE_ID

The following constants map to the XPAR parameters created in the xparameters.h file.

They are defined here such that a user can easily change all the needed parameters in one place.

Referenced by main().

Function Documentation

void AvbGMDiscontinuityHandler ( void *  CallBackRef,
u32  TimestampsUncertain 
)

This function is the handler which will be called if the PTP drivers identify a possible discontinuity in GrandMaster time.

This handler provides an example of how to handle this situation - but this function is application specific.

Parameters
CallBackRefcontains a callback reference from the driver, in this case it is the instance pointer for the AVB driver.
TimestampsUncertain- a value of 1 indicates that there is a possible discontinuity in GrandMaster time. A value of 0 indicates that Timestamps are no longer uncertain.
Returns
None.
Note
This Handler need to be defined otherwise the XAvb_StubHandler will generate an error

Referenced by main().

int main ( void  )