f2838x_cm_cia402_solution/device/driverlib_cm/ethernet.h

3576 lines
146 KiB
C

//###########################################################################
//
// FILE: ethernet.h
//
// TITLE: CM Ethernet driver.
//
//###########################################################################
//
//
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################
#ifndef ETHERNET_H
#define ETHERNET_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
//! \addtogroup ethernet_api Ethernet
//! @{
//
//*****************************************************************************
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_emac.h"
#include "inc/hw_emac_ss.h"
#include "interrupt.h"
#include "platform_port.h"
//
//Transmit Store and Forward Shift Value
//
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TSF_S 1U
#define ETHERNET_MAC_CONFIGURATION_DM_S 13U//Duplex Mode Shift Value
#define ETHERNET_MAC_CONFIGURATION_LM_S 12U
//
//MAC Packet Filter Register Bit Field Enumerations
//
#define ETHERNET_MAC_PACKET_FILTER_PCF_FILTER_ALL_CTRL 0U
#define ETHERNET_MAC_PACKET_FILTER_PCF_FWD_ALL_EXCEPTPASS 1U
#define ETHERNET_MAC_PACKET_FILTER_PCF_FWD_ALL_WITHOUT_ADDRESS_FILTER 2U
#define ETHERNET_MAC_PACKET_FILTER_PCF_FWD_ALL_WITH_ADDRESS_FILTER 3U
//
//MAC Configuration Enumerations
//
#define ETHERNET_MAC_CONFIGURATION_DM_FULL_DUPLEX 1U
#define ETHERNET_MAC_CONFIGURATION_DM_HALF_DUPLEX 0U
#define ETHERNET_MAC_CONFIGURATION_LM_LOOPBACK_ENABLED 1U
#define ETHERNET_MAC_CONFIGURATION_LM_LOOPBACK_DISABLED 0U
#define ETHERNET_MAC_RXQ_CONTROL_RXQEN_ENABLED_GENERIC 2U
//
//MAC WatchDog Timeout Enumerations
//
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_2KB 0U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_3KB 1U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_4KB 2U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_5KB 3U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_6KB 4U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_7KB 5U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_8KB 6U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_9KB 7U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_10KB 8U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_11KB 9U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_12KB 10U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_13KB 11U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_14KB 12U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_15KB 13U
#define ETHERNET_MAC_WATCHDOG_TIMEOUT_WTO_15383 14U
//
//Value of F for WTO is reserved and hence not defined
//
//Threshold value defines for Transmit Threshold
//Enumerations for MTL_TXQn_OPMode Register
//These values can be used as an argument for Ethernet_setMTLTxQueueOpMode func
//
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_32 0U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_64 1U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_96 2U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_128 3U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_192 4U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_256 5U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_384 6U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TTC_512 7U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TXQ_DISABLED 0U
#define ETHERNET_MTL_TXQ0_OPERATION_MODE_TXQ_ENABLED 2U
//
//Enumerations for DMA_Mode Register
//
#define ETHERNET_DMA_OPERATION_MODE_PR_TX1_RX1 0U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX2_RX1 1U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX3_RX1 2U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX4_RX1 3U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX5_RX1 4U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX6_RX1 5U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX7_RX1 6U
#define ETHERNET_DMA_OPERATION_MODE_PR_TX8_RX1 7U
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_TXQ_DISABLED 0U
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_TXQ_ENABLED 2U
#define ETHERNET_DMA_OPERATION_MODE_DA_ROUND_ROBIN 0U
#define ETHERNET_DMA_OPERATION_MODE_DA_FIXED_PRIORITY 1U
//
//MTL OP Mode Register Bit Field Enumerations
//
#define ETHERNET_MTL_OPERATON_MODE_SCHALG_WRR 0U
#define ETHERNET_MTL_OPERATON_MODE_SCHALG_WFQ 1U
#define ETHERNET_MTL_OPERATON_MODE_SCHALG_DWRR 2U
#define ETHERNET_MTL_OPERATON_MODE_SCHALG_STRICT_PRIORITY 3U
#define ETHERNET_MTL_OPERATION_MODE_RAA_SP 0U
#define ETHERNET_MTL_OPERATION_MODE_RAA_WSP 1U
#define ETHERNET_MTL_OPERATION_MODE_RAA_S 2U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_256 0U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_512 1U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_768 2U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_1024 3U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_1280 4U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_1536 5U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_1792 6U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_2048 7U
#define ETHERNET_MTL_Q_OP_MODE_QSIZE_4096 15U
//
//Enumeration for MTL_TxQ0_Operation_Mode Register
//
#define ETHERNET_MTL_TXQ_OPMODE_TSF_ENABLE 1U
#define ETHERNET_MTL_TXQ_OPMODE_TSF_DISABLE 0U
//
//Enumeration for MTL_RxQ0_Operation_Mode Register
//
#define ETHERNET_MTL_RX_Q_OP_MODE_RSF_ENABLE 1U
#define ETHERNET_MTL_RX_Q_OP_MODE_RSF_DISABLE 0U
//
//Enumerations for MTL_RXQn_OPMode Register
//
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_RTC_64 0U
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_RTC_32 1U
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_RTC_96 2U
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_RTC_128 3U
#define ETHERNET_MTL_RXQ0_OPERATION_MODE_RSF_S 5U
//
//Enumeration for DMA_CH(#i)_RX_Control Register
//Received Buffer Size
//Our Configuration has 2bits(since 4 bytes is burst size)
//for the lower bits and Bit 0 is for Enable
//Hence it should be left shift by 3
//
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_16 4U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_32 8U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_64 16U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_128 32U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_256 64U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_512 128U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_1K 256U
#define ETHERNET_DMA_CHX_RX_CONTROL_RBSZ_2K 512U
//
// Following defines are used for Timestamping module configuration.
//
#define ETHERNET_MAC_SUBNANOSECONDS_INC_MULTIPLIER 0x100U // 2^8
#define ETHERNET_MAC_DIGITAL_ROLLOVER_ACCURACY 1U // 1ns acc.
#define ETHERNET_MAC_BINARY_ROLLOVER_ACCURACY 0.465F // 0.465 ns acc.
//
// MAC_PPSx_Target_Time_Nanoseconds Register bit fields
//
/*
* TODO : This register can have many instances depending on the
* instances of the PPS in MAC.
*/
#define ETHERNET_MAC_PPS_TARGET_TIME_SECONDS 0x0B80U
#define ETHERNET_MAC_PPS_TARGET_TIME_NANOSECONDS 0x0B84U
#define ETHERNET_MAC_PPS_WIDTH 0x0B8CU
#define ETHERNET_MAC_PPS_INTERVAL 0x0B88U
#define ETHERNET_MAC_PPS_TARGET_TIME_NANOSECONDS_TRGTBUSY 0x80000000U
#define ETHERNET_MAC_PPS_OUT_INSTANCE_0 0x0U
#define ETHERNET_MAC_PPS_OUT_INSTANCE_1 0x1U
//
// AUX Timestamp related
//
#define ETHERNET_MAC_AUX_TIMESTAMP_FIFO_DEPTH 0x4U
//
// Enumeration for ETHERNET_SS_O_PTPTSTRIGSEL0/1 register
//
#define ETHERNET_SS_PTPTSTRIGSEL_AUX_TRIG_SEL0 0x1U
#define ETHERNET_SS_PTPTSTRIGSEL_AUX_TRIG_SEL1 0x2U
//
// Enumeration for EMACSS_PTPTSSWTRIG0/1 register
//
#define ETHERNET_SS_PTPTSSWTRIG_PTP_AUX_TS_SW_TRIG0 0x1U
#define ETHERNET_SS_PTPTSSWTRIG_PTP_AUX_TS_SW_TRIG1 0x2U
//
// Maximum 32 configurations are allowed.
//
#define ETHERNET_SS_PTPTSTRIGSEL_AUX_TRIG_SEL_MAX_VALUE 0x1FU
//
//MAC_PPS_Control Register bit-fields
//
#define ETHERNET_MAC_PPS_CONTROL_PPSEN0 4U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL0_S 5U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL0_M 3U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL1_S 13U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL1_M 3U
//
//Enumeration for MAC_PPS_Control Register
//
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL_INTERRUPT 0x0U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL_RESERVED 0x1U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL_INTERRUPT_PULSE 0x2U
#define ETHERNET_MAC_PPS_CONTROL_TRGTMODSEL_PULSE 0x3U
#define ETHERNET_MAC_PPS_CONTROL_PPSEN0_PPS_FIXED_MODE 0x0U
#define ETHERNET_MAC_PPS_CONTROL_PPSEN0_PPS_FLEXIBLE_MODE 0x1U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_SINGLE_PULSE 0x0U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_1HZ 0x1U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_2HZ 0x2U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_4HZ 0x3U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_8HZ 0x4U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_16HZ 0x5U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_32HZ 0x6U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_64HZ 0x7U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_128HZ 0x8U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_256HZ 0x9U
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_512HZ 0xAU
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_1024HZ 0xBU
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_2048HZ 0xCU
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_4096HZ 0xDU
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_8192HZ 0xEU
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_16384HZ 0xFU
#define ETHERNET_MAC_PPS_CONTROL_PPSCTRL_PPS_OUTPUT_32768HZ 0x10U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_NONE 0x0U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_START_SINGLE 0x1U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_START_TRAIN 0x2U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_CANCEL_START 0x3U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_STOP_AT_TIME 0x4U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_STOP_NOW 0x5U
#define ETHERNET_MAC_PPS_CONTROL_PPSCMD_COMMAND_CANCEL_STOP 0x6U
//
//Enumerations for VLAN Incl Register
//
#define ETHERNET_MAC_VLAN_INCL_VLP_S 18U
//
//Static means the Tag control is provided in the VLC Field
//
#define ETHERNET_MAC_VLAN_INCL_VLP_STATIC 1U
//
//Dynamic means the VLC field is ignored and uses Context Descriptor
//
#define ETHERNET_MAC_VLAN_INCL_VLP_DYNAMIC 0U
#define ETHERNET_MAC_VLAN_INCL_CSVL_S 19U
#define ETHERNET_MAC_VLAN_INCL_VLTI_S 20U
#define ETHERNET_MAC_VLAN_INCL_CBTI_S 21U
#define ETHERNET_MAC_VLAN_INCL_ADDR_S 24U
#define ETHERNET_MAC_VLAN_INCL_ADDR_M 0x1000000U
#define ETHERNET_MAC_VLAN_INCL_RDWR_S 30U
#define ETHERNET_MAC_VLAN_INCL_BUSY_S 31U
//
//For MAC_ Inner VLAN Register
//
#define ETHERNET_MAC_INNER_VLAN_INCL_VLP_S 18U
#define ETHERNET_MAC_INNER_VLAN_INCL_CSVL_S 19U
#define ETHERNET_MAC_INNER_VLAN_INCL_VLTI_S 20U
//
//For MAC_VLAN_TAG_DATA Register
//
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_16_S 16U
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_17_S 17U
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_18_S 18U
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_19_S 19U
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_20_S 20U
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_24_S 24U
#define ETHERNET_MAC_VLAN_TAG_DATA_DATA_25_S 25U
//
//For MAC_VLAN_TAG_Ctrl Register
//
#define ETHERNET_MAC_VLAN_TAG_CTRL_CT_READ 1U
#define ETHERNET_MAC_VLAN_TAG_CTRL_CT_WRITE 0U
#define ETHERNET_MAC_VLAN_TAG_CTRL_ERIVLT_S 27U
#define ETHERNET_MAC_VLAN_TAG_CTRL_ERIVLT_M 0x8000000U
//
// VLAN Tag Hash Table Match
//
#define ETHERNET_MAC_VLAN_TAG_CTRL_VTHM_M 0x2000000U
//
//Enumerations for DMA Mode Register
//
#define ETHERNET_DMA_MODE_INTM_MODE0 0U
#define ETHERNET_DMA_MODE_INTM_MODE1 1U
#define ETHERNET_DMA_MODE_INTM_MODE2 2U
//
//Defines for MDIO_ADDRESS register
//
#define ETHERNET_MDIO_ADDRESS_C45E_S 1U
#define ETHERNET_MDIO_ADDRESS_HIGHCLK_ENABLE_S 11U
#define ETHERNET_MAC_MDIO_ADDRESS_GOC_0_S 2U
#define ETHERNET_MAC_MDIO_ADDRESS_GOC_WRITE 1U
#define ETHERNET_MAC_MDIO_ADDRESS_GOC_READ 3U
#define ETHERNET_MAC_MDIO_ADDRESS_GOC_POSTREAD_INC 2U
//
//Defines for MAC_ADDRESS Register
//
#define ETHERNET_MAC_ADDRESS0_HIGH_DCS_S 16U
//
//Defines for MTL_RXQ_DMA_MAP0 register
//
#define ETHERNET_MTL_RXQ_DMA_MAP0_DDMACH_S 4U
#define ETHERNET_MTL_RXQ_DMA_MAP0_QDMACH_S 8U
//
//Defines for REVMII Registers
//
#define ETHERNET_REVMII_PHY_CONTROL 0x0U
#define ETHERNET_REVMII_COMMON_STATUS 0x1U
#define ETHERNET_REVMII_COMMON_EXT_STATUS 0xFU
#define ETHERNET_REVMII_INTERRUPT_STATUS_MASK 0x10U
#define ETHERNET_REVMII_REMOTE_PHY_STATUS 0x11U
//
//Bit field defines for the REVMII Registers used
//
//REVMII Interrupt Status Mask Register
//
#define ETHERNET_REVMII_INTERRUPT_STATUS_MASK_LSI_M 0x100U
//
//Generic Enable Disable Defines
//
#define ETHERNET_ENABLE 1U
#define ETHERNET_DISABLE 0U
//
//hw_emac.h defines ends
//
//
//hw_emac_SS.h defines
//
#define ETHERNET_SS_CTRLSTS_CLK_LM_S 4U
#define ETHERNET_SS_CTRLSTS_CLK_SRC_SEL_S 7U
//
//Enumerations for CTRLSTS Register
//
#define ETHERNET_SS_CTRLSTS_PHY_INTF_SEL_GMII 0U
/* Values 1-3 Reserved*/
#define ETHERNET_SS_CTRLSTS_PHY_INTF_SEL_RMII 4U
#define ETHERNET_SS_CTRLSTS_PHY_INTF_SEL_REVMII 7U
#define ETHERNET_SS_CTRLSTS_LMCLKSEL_NORMAL 0U
#define ETHERNET_SS_CTRLSTS_LMCLKSEL_INTERNAL 1U
#define ETHERNET_SS_CTRLSTS_CLK_SRC_SEL_EXTERNAL 0U
#define ETHERNET_SS_CTRLSTS_CLK_SRC_SEL_INTERNAL 1U
#define ETHERNET_SS_CTRLSTS_FLOW_CTRL_EN_ENABLED 3U
#define ETHERNET_SS_CTRLSTS_FLOW_CTRL_EN_DISABLED 0U
#define ETHERNET_SS_CTRLSTS_WRITE_KEY_VALUE 0xA5U
//
//hw_emac_SS.h ends
//
#define ETHERNET_NUMSTATS 56U
#define ETHERNET_MAX_NUM_DMA_CHANNELS 2U
#define ETHERNET_MAX_DMA_DIR 2U
#define ETHERNET_CH_DIR_TX 0U
#define ETHERNET_CH_DIR_RX 1U
/*Hardware Descriptor related flags*/
/* Interrupt on Completion */
#define ETHERNET_TX_DESC_IOC 0x80000000U
/*Owner ship Flag in Buffer Descriptor */
#define ETHERNET_DESC_OWNER 0x80000000U
/*First/Last Descriptor indicator Flag*/
#define ETHERNET_TX_DESC_FIRST_DESC 0x20000000U
#define ETHERNET_TX_DESC_LAST_DESC 0x10000000U
#define ETHERNET_TX_DESC_TTSE 0x40000000U
#define ETHERNET_RX_DESC_IOC 0x40000000U
#define ETHERNET_RX_DESC_BUF1_VALID 0x01000000U //24th Bit
#define ETHERNET_RX_DESC_BUF2_VALID 0x02000000U //25th Bit
#define ETHERNET_TX_DESC_TSE_ENABLE 0x00040000U //18th Bit
#define ETHERNET_TX_DESC_BUF2LENGTH_S 16U
#define ETHERNET_TX_DESC_SAIC_NO_SA_INC 0U
#define ETHERNET_TX_DESC_SAIC_INS_SA 1U
#define ETHERNET_TX_DESC_SAIC_REPL_SA 2U
#define ETHERNET_TX_DESC_SAIC_S 23U
#define ETHERNET_TX_DESC_CPC_S 26U
#define ETHERNET_TX_DESC_CIC_S 16U
#define ETHERNET_TX_CTXT_DESC_IVLAN_TAG_S 16U
#define ETHERNET_TX_DESC_VTIR_S 14U
#define ETHERNET_TX_DESC_TTSS 0x00020000U
#define ETHERNET_TX_CTXT_DESC_IVTIR_TAG_S 18U
#define ETHERNET_DESCRIPTORS_NUM_TX 16U
#define ETHERNET_DESCRIPTORS_NUM_TX_PER_CHANNEL 8U
#define ETHERNET_DESCRIPTORS_NUM_RX 16U
#define ETHERNET_DESCRIPTORS_NUM_RX_PER_CHANNEL 8U
#define ETHERNET_DESCRIPTORS_NUM (ETHERNET_DESCRIPTORS_NUM_TX + \
ETHERNET_DESCRIPTORS_NUM_RX )
/*
* | 31:16 | 15:14 | 13:0 |
* | Inner VLAN Tag | x | Max Seg. Size |
*/
#define ETHERNET_PKT_EXTENDED_FLAG_IVT_S 16U
#define ETHERNET_PKT_EXTENDED_FLAG_MSS_S 0U
#define ETHERNET_PKT_EXTENDED_FLAG_IVT_M 0xFFFF0000U
#define ETHERNET_PKT_EXTENDED_FLAG_MSS_M 0x00003FFFU
/*
* | 31 | 30 |29:28| 27 | 26 |25:24|23 |22:20|19:18| 17 | 16 |15:0|
* | OWN|CTXT| x |OSTC|TCMSSV| x |CDE| x |IVTIR|IVLTV|VLTV| VT |
*/
#define ETHERNET_PKT_EXTENDED_FLAG_IVTIR_S 18U
#define ETHERNET_PKT_EXTENDED_FLAG_VT_S 0U
#define ETHERNET_PKT_EXTENDED_FLAG_CTXT 0x40000000U
#define ETHERNET_PKT_EXTENDED_FLAG_OSTC 0x08000000U
#define ETHERNET_PKT_EXTENDED_FLAG_TCMSSV 0x04000000U
#define ETHERNET_PKT_EXTENDED_FLAG_CDE 0x00800000U
#define ETHERNET_PKT_EXTENDED_FLAG_VTIR_M 0x000C0000U
#define ETHERNET_PKT_EXTENDED_FLAG_VTIR_S 18U
#define ETHERNET_PKT_EXTENDED_FLAG_VTIR_NOTAG 0U
#define ETHERNET_PKT_EXTENDED_FLAG_VTIR_REMOVE 1U
#define ETHERNET_PKT_EXTENDED_FLAG_VTIR_INSERT 2U
#define ETHERNET_PKT_EXTENDED_FLAG_VTIR_REPLACE 3U
#define ETHERNET_PKT_EXTENDED_FLAG_IVLTV 0x00020000U
#define ETHERNET_PKT_EXTENDED_FLAG_VLTV 0x00010000U
#define ETHERNET_PKT_EXTENDED_FLAG_VT_M 0x0000FFFFU
#define ETHERNET_PKT_EXTENDED_FLAG_VLAN 0x5U
#define ETHERNET_PKT_EXTENDED_FLAG_TSO 0x6U
#define ETHERNET_PKT_EXTENDED_FLAG_OST 0x7U
//
//Layout of Flags Field in Tx Packet Descriptor
//|31|30|29 |28 |27 |26 |25 |24 |23 |22 |21|20|19|18 |17 |16 |
//|x |x |SOP|EOP|CPC|CPC|SAIC|SAIC|VLIC|VLIC|x | x|x |TSE|CIC|CIC|
//
#define ETHERNET_PKT_FLAG_SOP_S 29U
#define ETHERNET_PKT_FLAG_EOP_S 28U
#define ETHERNET_PKT_FLAG_CPC_S 26U
#define ETHERNET_PKT_FLAG_SAIC_S 24U
#define ETHERNET_PKT_FLAG_VLIC_S 22U
#define ETHERNET_PKT_FLAG_TSE_S 18U
#define ETHERNET_PKT_FLAG_CIC_S 16U
//
// Per packet control flags
//
#define ETHERNET_PKT_FLAG_TTSE 0x40000000U
#define ETHERNET_PKT_FLAG_SOP 0x20000000U
#define ETHERNET_PKT_FLAG_EOP 0x10000000U
#define ETHERNET_PKT_FLAG_CPC 0x0c000000U
#define ETHERNET_PKT_FLAG_SAIC 0x03000000U
#define ETHERNET_PKT_FLAG_VLIC 0x00C00000U
#define ETHERNET_PKT_FLAG_TSE 0x00040000U
#define ETHERNET_PKT_FLAG_CIC 0x00030000U
//
//VLAN Tag Insertion Flags
//
#define ETHERNET_PKT_FLAG_NO_VLAN 0x00000000U
#define ETHERNET_PKT_FLAG_VLAN_REMOVAL 0x00400000U
#define ETHERNET_PKT_FLAG_VLAN_INSERTION 0x00800000U
#define ETHERNET_PKT_FLAG_VLAN_REPLACE 0x00C00000U
//
//CRC insertion Control Flags
//
#define ETHERNET_PKT_FLAG_CRC_PAD_INS 0x00000000U
#define ETHERNET_PKT_FLAG_CRC_INS_NO_PAD 0x04000000U
#define ETHERNET_PKT_FLAG_CRC_PAD_DIS 0x08000000U
#define ETHERNET_PKT_FLAG_CRC_REPL_NO_PAD 0x0C000000U
//
//SA Insertion Flags
//
#define ETHERNET_PKT_FLAG_SA_NO_INS 0x00000000U
#define ETHERNET_PKT_FLAG_SA_INS 0x01000000U
#define ETHERNET_PKT_FLAG_SA_REPLACE 0x02000000U
//
//L3 L4 Checksum Control Flags
//
#define ETHERNET_PKT_FLAG_CS_NO_INS 0x00000000U
#define ETHERNET_PKT_FLAG_CS_IP_INS 0x00010000U
#define ETHERNET_PKT_FLAG_CS_IP_PAYLOAD_INS_NO_PSEUDO 0x00020000U
#define ETHERNET_PKT_FLAG_CS_IP_PAYLOAD_PSEUDO_INS 0x00030000U
#define ETHERNET_NUM_PORTS 1U
#define ETHERNET_DMA_CHANNEL_NUM_0 0U
#define ETHERNET_DMA_CHANNEL_NUM_1 1U
//
#define ETHERNET_RX_NORMAL_DESC_RDES1_TSA_LBIT_POS 0xeU
#define ETHERNET_RX_CONTEXT_DESC_RDES3_CTXT_HBIT_POS 0x1eU
#define ETHERNET_DRV_DEVMAGIC 0x0acefaceU
#define ETHERNET_ERROR_CODE (0x2000000U)
#define ETHERNET_ERROR_INFO (ETHERNET_ERROR_CODE)
#define ETHERNET_ERROR_WARNING (ETHERNET_ERROR_CODE | 0x10000000U)
#define ETHERNET_ERROR_MINOR (ETHERNET_ERROR_CODE | 0x20000000U)
#define ETHERNET_ERROR_MAJOR (ETHERNET_ERROR_CODE | 0x30000000U)
#define ETHERNET_ERROR_CRITICAL (ETHERNET_ERROR_CODE | 0x40000000U)
#define ETHERNET_ERR_INVALID_HANDLE (ETHERNET_ERROR_MAJOR + 1U)
#define ETHERNET_ERR_INVALID_PARAM (ETHERNET_ERROR_MAJOR + 2U)
#define ETHERNET_ERR_BAD_PACKET (ETHERNET_ERROR_MAJOR + 3U)
#define ETHERNET_RET_SUCCESS 0U
//
//Interrupt related defines
//
#define ETHERNET_GENERIC_INTERRUPT 0U
#define ETHERNET_TX_INTR_CH0 1U
#define ETHERNET_TX_INTR_CH1 2U
#define ETHERNET_RX_INTR_CH0 3U
#define ETHERNET_RX_INTR_CH1 4U
#define ETHERNET_NUM_INTERRUPTS 5U
//
// Define for deriving the offset of channel specific registers
//
#define ETHERNET_CHANNEL_OFFSET (0x80U)
//
// Define for deriving the offset of Queue specific registers
//
#define ETHERNET_QUEUE_OFFSET (0x40U)
//
//Define for Signalling Early Rx Completion
//
typedef enum
{
ETHERNET_COMPLETION_NORMAL = 0x00U, //!Normal Packet Completion
ETHERNET_COMPLETION_EARLY = 0x01U //!<Master write to slave
} Ethernet_CompletionMode;
//
//These Flags are used by the LLD during the Interrupt callbacks
//Layout of Flags Field in Completion Callback
//|31|30|29 |28 |27 |26 |25 |24 |23 |22 |21|20|19|18|17 |16 |
//|Tx|Rx|Early|
//
// To signal Tx, Rx and Early completion
//
#define ETHERNET_INTERRUPT_FLAG_TRANSMIT 0x80000000U
#define ETHERNET_INTERRUPT_FLAG_RECEIVE 0x40000000U
#define ETHERNET_INTERRUPT_FLAG_EARLY 0x20000000U
//*****************************************************************************
//
//! PTP Ingress/Egress Correction related defines follow.
//
//*****************************************************************************
#define ETHERNET_MAC_TIMESTAMP_CONTROL_DIGITAL_ROLLOVER \
ETHERNET_MAC_TIMESTAMP_CONTROL_TSCTRLSSR
#define ETHERNET_MAC_TIMESTAMP_CONTROL_BINARY_ROLLOVER 0x0U
#define ETHERNET_MAC_TIMESTAMP_CONTROL_DIGITAL_ROLLOVER_MAX 0x3B9AC9FFU
#define ETHERNET_MAC_TIMESTAMP_CONTROL_BINARY_ROLLOVER_MAX 0x7FFFFFFFU
//
// Sub nanosecond scalar value : (2^8) = 256
//
#define ETHERNET_MAC_TIMESTAMP_INGRESS_CORR_SUBNANOSEC_SCALAR 0x00000100U
//
// Asym correction (Ingress/Egress) is programmed by first scaling the
// nanoseconds asym by the value : (2^16) = 65536 = 0x10000
//
#define ETHERNET_MAC_TIMESTAMP_ASYM_CORR_SCALAR 0x10000U
//*****************************************************************************
//
//! PTP Higher Word related defines follow.
//
//*****************************************************************************
#define ETHERNET_MAC_TIMESTAMP_SYSTEM_TIME_SOURCE_INTERNAL 0x0U
#define ETHERNET_MAC_TIMESTAMP_SYSTEM_TIME_SOURCE_EXTERNAL \
ETHERNET_MAC_TIMESTAMP_CONTROL_ESTI
#define ETHERNET_MAC_SYSTEM_TIME_HIGHER_WORD_NOT_VALID 0xFFFFFFFFU
//*****************************************************************************
//
//! PTP Offload related Enums and Structures follow.
//
//*****************************************************************************
/*
* Triggers for two PTP message types are supported in the driver.
* 1. Sync Message
* 2. Peer Delay Request Message
*/
typedef enum
{
ETHERNET_PTO_P_DELAY_REQ_MESSAGE_TRIGGER,
ETHERNET_PTO_SYNC_MESSAGE_TRIGGER
}Ethernet_PTPOffloadMsgTrigger;
/*
* The switch for automatic sending of Delay Request and Delay Response
* messages when PTP Offload is enabled.
*/
typedef enum
{
ETHERNET_PTO_DELAY_REQ_DELAY_RESP_DISABLE =
ETHERNET_MAC_PTO_CONTROL_DRRDIS,
ETHERNET_PTO_DELAY_REQ_DELAY_RESP_ENABLE =
!ETHERNET_MAC_PTO_CONTROL_DRRDIS
}Ethernet_PTPOffloadDelayReqRespMode;
typedef enum
{
ETHERNET_PTO_AUTO_SYNC_MESSAGE_ENABLE =
ETHERNET_MAC_PTO_CONTROL_ASYNCEN,
ETHERNET_PTO_AUTO_SYNC_MESSAGE_DISABLE =
!ETHERNET_MAC_PTO_CONTROL_ASYNCEN
}Ethernet_PTPOffloadAutoSyncMode;
typedef enum
{
ETHERNET_PTO_AUTO_P_DELAY_REQ_MESSAGE_ENABLE =
ETHERNET_MAC_PTO_CONTROL_APDREQEN,
ETHERNET_PTO_AUTO_P_DELAY_REQ_MESSAGE_DISABLE =
!ETHERNET_MAC_PTO_CONTROL_APDREQEN
}Ethernet_PTPOffloadAutoPDelayReqMode;
typedef enum
{
ETHERNET_PTO_P_DELAY_RESP_MESSAGE_DISABLE =
ETHERNET_MAC_PTO_CONTROL_PDRDIS,
ETHERNET_PTO_P_DELAY_RESP_MESSAGE_ENABLE =
!ETHERNET_MAC_PTO_CONTROL_PDRDIS
}Ethernet_PTPOffloadPDelayRespMode;
typedef enum
{
ETHERNET_PTP_OFFLOAD_ENABLE = ETHERNET_MAC_PTO_CONTROL_PTOEN,
ETHERNET_PTP_OFFLOAD_DISABLE = !ETHERNET_MAC_PTO_CONTROL_PTOEN
}Ethernet_PTPOffloadEnableMode;
typedef enum
{
ETHERNET_PTO_DELAY_REQ_DELAY_RESP_GENERATION,
ETHERNET_PTO_AUTO_SYNC_MESSAGE,
ETHERNET_PTO_AUTO_P_DELAY_REQ_MESSAGE,
ETHERNET_PTO_P_DELAY_RESP_GENERATION,
} Ethernet_PTPOffloadModeType;
//*****************************************************************************
//
//! Log Message Interval structure that is needed to notify the driver of the
//! three values -
//! 1. Minimum Interval between successive Peer Delay Request messages
//! 2. Delay Request messages to Sync message ratio, that is for how many
//! Sync messages that a slave receives, it should send a Delay Request
//! message.
//! 3. Minimum Interval between successive Sync messages in the master.
//!
//! The driver programs these value in the corresponding register which is then
//! used to send automated PTP messages by the hardware when PTP Offloading is
//! enabled.
//
//*****************************************************************************
typedef struct
{
int8_t logMinPdelayReqInterval;
int8_t delayReqToSyncRatio;
int8_t logSyncInterval;
}Ethernet_LogMsgIntervalConfig;
//*****************************************************************************
//
//! Source Port Identity structure that is needed to notify the driver of the
//! source_port_id value as needed by the PTP Offload Engine to frame the PTP
//! header in the hardware when PTP Offloading is enabled. This is a 10 Byte
//! long field as specified in the IEEE 1588 Protocol.
//
//*****************************************************************************
typedef struct
{
uint32_t id0;
uint32_t id1;
uint32_t id2;
} Ethernet_SourcePortIdentity;
//*****************************************************************************
//
//! PTP Offload Configuration Parameters structure, that the application/higher
//! layer may use to set configuration and send this structure to the driver
//! to enable corresponding PTP Offload features.
//
//*****************************************************************************
typedef struct
{
uint8_t domainNumber;
Ethernet_PTPOffloadDelayReqRespMode ptoDelayReqRespMode;
Ethernet_PTPOffloadAutoSyncMode ptoAutoPtpSyncMode;
Ethernet_PTPOffloadAutoPDelayReqMode ptoAutoPDelayReqMode;
Ethernet_PTPOffloadPDelayRespMode ptoPDelayRespMode;
Ethernet_SourcePortIdentity srcPortId;
Ethernet_LogMsgIntervalConfig logMsgIntervalConf;
}Ethernet_PTPOffloadConfigParams;
//*****************************************************************************
//
//! Statistics Software defines Structure that groups the different
//! RMON Statistics in the Peripheral. Refer to TRM for further details
//! of each of the elements
//
//*****************************************************************************
typedef struct {
//
//TX Statistics
//
uint32_t txOctetCountGoodBad; //0x714
uint32_t txPacketCountGoodBad; //0x718
uint32_t txBroadcastPacketsGood; //0x71C
uint32_t txMulticastPacketsGood; //0x720
uint32_t tx64OctetsPacketsGood;
uint32_t tx65to127OctetsPacketsGood;
uint32_t tx128to255OctetsPacketsGood;
uint32_t tx256to511OctetsPacketsGood;
uint32_t tx512to1023OctetsPacketsGood;
uint32_t tx1024toMaxOctetsPacketsGood;
uint32_t txUnicastPacketsGoodBad;
uint32_t txMulticastPacketsGoodBad;
uint32_t txBroadcastPacketsGoodBad;
uint32_t txUnderFlowErrorPackets;
uint32_t txSingleCollisionGoodPackets;
uint32_t txMultipleCollisionGoodPackets;
uint32_t txDeferredPackets;
uint32_t txLateCollisionPackets;
uint32_t txExcessiveCollisionPackets;
uint32_t txCarrierErrorPackets;
uint32_t txOctetCountGood;
uint32_t txPacketCountGood;
uint32_t txExcessiveDeferralError;
uint32_t txPausePackets;
uint32_t txVLANPacketsGood;
uint32_t txOSizePacketsGood;
uint32_t reserved_1;
//
//RX Statistics
//
uint32_t rxPacketsCountGoodBad;
uint32_t rxOctetCountGoodBad;
uint32_t rxOctetCountGood;
uint32_t rxBroadcastPacketsGood;
uint32_t rxMulticastPacketsGood;
uint32_t rxCRCErrorPackets;
uint32_t rxAlignmentErrorPackets;
uint32_t rxRuntErrorPackets;
uint32_t rxJabberErrorPackets;
uint32_t rxUnderSizePacketsGood;
uint32_t rxOverSizePacketsGood;
uint32_t rx64OctetsPacketsGoodBad;
uint32_t rx65to127OctetsPacketsGoodBad;
uint32_t rx128to255OctetsPacketsGoodBad;
uint32_t rx256to511OctetsPacketsGoodBad;
uint32_t rx512to1023OctetsPacketsGoodBad;
uint32_t rx1024toMaxOctetsPacketsGoodBad;
uint32_t rxUnicastPacketsGood;
uint32_t rxLengthErrorPackets;
uint32_t rxOutOfRangeTypePackets;
uint32_t rxPausePackets;
uint32_t rxFIFOOverFlowPackets;
uint32_t rxVLANPacketsGoodBad;
uint32_t rxWatchDogErrorPackets;
uint32_t rxReceiveErrorPackets;
uint32_t rxControlPacketsGood;
//
//LPI Related Statistics
//
uint32_t txLPIUsecCounter;
uint32_t txLPITranCounter;
uint32_t rxLPIUsecCounter;
uint32_t rxLPITranCounter;
}Ethernet_Statistics;
//*****************************************************************************
//
//! Generic Hardware Descriptor Structure definition
//! that can be used for Transmit,Receive and Context Descriptors
//
//*****************************************************************************
typedef struct {
uint32_t des0;
uint32_t des1;
uint32_t des2;
uint32_t des3;
} Ethernet_HW_descriptor;
typedef uint32_t Ethernet_Pkt_Flag_T;
typedef uint32_t Ethernet_Pkt_Extended_Flag_T;
//*****************************************************************************
//
//! EMAC Packet Structure, that the application/higher layer
//! uses to Send a packet
//! and Driver notifies to the higher layer using this structure
//! For Multiple Packets/Buffers this structure is chained
//
//*****************************************************************************
typedef struct Ethernet_Pkt_Desc_T
{
/**< Next descriptor pointer use this if multiple
descriptors are chained else keep it 0 */
struct Ethernet_Pkt_Desc_T *nextPacketDesc;
/** < Pointer to the Buffer/Header if TSO is enabled */
uint8_t *dataBuffer;
/** < Pointer to Second Buffer */
uint8_t *dataBuffer2;
/**< Physical Length of the buffer (read only) */
uint32_t bufferLength;
/**< Physical Length of the buffer dataBuffer2 (read only) */
uint32_t buffer2Length;
/**< Tx/Rx Channel 0-1 (Valid on SOP only) */
uint32_t pktChannel;
/**< Length of Packet (Valid on SOP only)
(same as validLength on single frag Pkt) */
uint32_t pktLength;
/**< Packet flags, SOP, EOP */
Ethernet_Pkt_Flag_T flags;
/**< No of frags in packet (SOP only), normally 1 */
uint32_t numPktFrags;
/* Data Offset usually set it to Zero can be used if buffer does
not start from address 0 of pBuffer*/
uint32_t dataOffset;
/* No of bytes of packet valid in this buffer*/
uint32_t validLength;
/*
* Rx Descriptor use - case:
* Thes two fields are filled by the hardware and returned to application
* in the callback.
*
* Tx Descriptor use - case:
* This timestamp placeholder can also be used by the application to send
* a custom timestamp to the driver (tx context descriptor for one - step
* timestamping).
*/
uint32_t timeStampLow;
uint32_t timeStampHigh;
/* Flag to indicate to the application that a buffer is discarded. */
uint8_t nextBufferDiscarded;
Ethernet_Pkt_Extended_Flag_T extendedFlags;
uint16_t innerVlanTag;
uint32_t mssTso;
uint16_t vlanTag;
}Ethernet_Pkt_Desc;
//*****************************************************************************
//
//! MAC Address Structure to by used
//! by Higher layer to pass MAC address to the Driver
//
//*****************************************************************************
typedef struct {
uint8_t channelNum;
/* Receive Channel number to which the MAC address to be assigned */
uint8_t addr[6];
/* MAC address specific to channel */
} Ethernet_MACAddrConfig;
//*****************************************************************************
//
//! EMAC Wrapper Subsystem Configuration used in Initializing the
//! Configuration during Ethernet_Init
//
//*****************************************************************************
typedef struct {
uint8_t phyIntfSel;
uint8_t LoopBackModeClkSel;
uint8_t clkSrcSel;
uint8_t flowControlEn;
} Ethernet_SubSystemConfig;
//*****************************************************************************
//
//! Filter Coniguration Structure
//! That maps to MAC Filter Configuration Register of the MAC
//
//*****************************************************************************
typedef struct {
uint32_t promiscuousMode:1;
uint32_t hashUnicast:1;
uint32_t hashMulticast:1;
uint32_t daInverseFilter:1;
uint32_t passAllMulticast:1;
uint32_t disableBroadCastPackets:1;
uint32_t passControlPackets:2;
uint32_t saInverseFilter:1;
uint32_t saFilterEnable:1;
uint32_t hashPerfectFilter:1;
uint32_t reserved1:5;
uint32_t vlanFilterEnable:1;
uint32_t reserved2:3;
uint32_t l3L4FilterEnable:1;
uint32_t dropNonTCP:1;
uint32_t reserved3:9;
uint32_t receiveAll:1;
}Ethernet_MACFilterConfig;
//*****************************************************************************
//
//! Generic Handle structure
//! Not used now but for NDK Layer
//
//*****************************************************************************
typedef void *Ethernet_Handle;
typedef enum
{
ETHERNET_TX_CHANNEL_TSE_DISABLE ,
ETHERNET_TX_CHANNEL_TSE_ENABLE
}Ethernet_EnableTSO;
//*****************************************************************************
//
//! Per Channel Information Structure
//! Stores the individual channel Parameters
//
//*****************************************************************************
typedef struct
{
uint32_t chNum;
/**< Channel Number */
uint32_t chDir;
/**< Channel Direction */
uint32_t numBD;
/**< Maximum Number of Buffer Descriptors allocated for this channel */
uint32_t bufSize;
/**< Buffer size */
uint32_t enableSplitHeader;
/**< Enables the Split Header Option in the RX Path */
uint32_t descriptorSkipLength;
/** For Storing the flag whether the
Store and Forward mode is enabled or Threshold mode is enabled **/
uint32_t storeNForward;
/**Threshold level for transmit and receive used by hardware
only in Threshold mode**/
uint32_t queueThreshold;
/** It has to be a multiple of 8
For Receive, the number of beats(Each beat is 32 bit / 4 bytes)
This plays a role in when Early Interrupts are generated for
received packets.
For Transmit, the number of bytes to be transferred in a block
by the DMA**/
uint32_t burstLength;
/**<Queue Size for Tx and Rx should be in range
ETHERNET_MTL_Q_OP_MODE_QSIZE_256 to ETHERNET_MTL_Q_OP_MODE_QSIZE_4096 */
uint32_t dmaQueueSize;
/** Used only for Receive Channel: Configures the Receive buffer size
For Threshold mode: It is recommended to configure this as integral multiple
of burstLength.
Each Receive buffer is of this size*/
uint32_t dmaBufferSize;
//**< Enable/Disable of Transport Segmentation in Hardware */
Ethernet_EnableTSO enableTSE;
/** used only with TCP Segmentation Offload Enabled**/
uint16_t maximumSegmentSize;
}Ethernet_ChInfo;
//*****************************************************************************
//
//! This structure maps to the bit fields of DMA Mode of Ethernet module.
//! Used to fill DMA Mode register. Default values are configured in
//! Ethernet_getInitConfig() and can be overwritten before calling
//! Ethernet_getHandle() API
//
//*****************************************************************************
typedef struct {
uint32_t SoftwareReset:1;
uint32_t TxRxArbitration:1;
uint32_t TransmitArbitration:3;
uint32_t Reserved4:3;
uint32_t DescriptorPostedWrite:1;
uint32_t Reserved3:2;
uint32_t TransmitPriority:1;
uint32_t PriorityRatio:3;
uint32_t Reserved2:1;
/** DMA Interrupt mode can be one of the following values:
ETHERNET_DMA_MODE_INTM_MODE0
ETHERNET_DMA_MODE_INTM_MODE1
ETHERNET_DMA_MODE_INTM_MODE2
Refer TRM for the definition of these modes */
uint32_t InterruptMode:2;
uint32_t Reserved1:14;
}Ethernet_DmaMode;
typedef enum
{
ETHERNET_EEE_RX_LPI_MAGICPKT_RECEIVED = 0U,
ETHERNET_EEE_RX_LPI_RMTWKUP_PKT_RECEIVED = 1U
}Ethernet_EEE_eventType;
//*****************************************************************************
//
//! Init Configuration Structure used in Ethernet_getHandle
//! The Ethernet_getInitConfig() API fills a known good value of this structure
//! can be modified to change the default settings.
//! An instance of this is stored fully in the Global Book Keeping structure
//! for Maintaining the Configuration Specified by the Higher Layer/User
//
//*****************************************************************************
typedef struct
{
/**Link Speed- Currently not used by driver.
use Ethernet_setMACConfiguration() to set different Speed
only 10 / 100 Mbps supported*/
uint8_t linkSpeed;
/**Link Mode ETHERNET_MAC_CONFIGURATION_DM_FULL_DUPLEX or
ETHERNET_MAC_CONFIGURATION_DM_HALF_DUPLEX */
uint8_t linkMode;
/** Total number of MAC addresses to be assigned for
all receive channels - not used by driver currently. */
uint8_t totalNumMacAddrs;
/** Enables or disables the Loopback mode
ETHERNET_MAC_CONFIGURATION_LM_LOOPBACK_ENABLED or
ETHERNET_MAC_CONFIGURATION_LM_LOOPBACK_DISABLED */
uint8_t loopbackMode;
/** Not used by driver currently - For Future use*/
Ethernet_MACAddrConfig *macAddr;
/** Subsystem Configuration Settings */
Ethernet_SubSystemConfig emacSSConfig;
/*DMA Mode Register Settings */
/**Priority Ratio between Tx and RX.
Use macro ETHERNET_DMA_OPERATION_MODE_PR_TXx_RX1 */
uint8_t priorityRatio;
/**Transmit Arbitration Algorithm when multiple Tx DMAs are selected
- reserved for future use.Use Ethernet_setDMAMode() to set this parameter
of DMA*/
uint8_t transmitArbitrationAlgorithm;
/** DMA Arbitration between Tx and Rx Path - reserved for future use
use Ethernet_setDMAMode() to set this parameter */
uint8_t dmaArbitrationScheme;
/**MAC Transfer Layer Operation Mode Settings Tx Scheduling either
ETHERNET_MTL_OPERATON_MODE_SCHALG_STRICT_PRIORITY or
ETHERNET_MTL_OPERATON_MODE_SCHALG_WRR*/
uint8_t txSchedulingAlgoritm;
/**Receive Arbitration algorithm must be ETHERNET_MTL_OPERATION_MODE_RAA_SP
or ETHERNET_MTL_OPERATION_MODE_RAA_WSP*/
uint8_t receiveArbitrationAlgorithm;
/** MAC Filter Settings not currently used by this driver.
Use Ethernet_setMACPacketFilter() API for setting the Filter configs*/
Ethernet_MACFilterConfig macFilterConfig;
/** Not currently used by driver. reserved for Future Use */
uint32_t noofPacketsRxBuffer;
/** Maximum Packet Length of Rx Buffer. Not currently used by Driver*/
uint32_t maxPacketLengthRxBuffer;
/** Channel Configuration for each channel available in Hardware*/
Ethernet_ChInfo
chInfo[ETHERNET_MAX_DMA_DIR][ETHERNET_MAX_NUM_DMA_CHANNELS];
/** Number of DMA Channels 1 to ETHERNET_MAX_NUM_DMA_CHANNELS */
uint32_t numChannels;
/** Packet Maximum Transfer Unit. For checking Packet Length in
Ethernet_sendPacket() API */
uint32_t pktMTU;
/** DMA Mode configuration settings used by Ethernet_getHandle() API */
Ethernet_DmaMode dmaMode;
/** can be used by higher layer for buffer handling */
void *pBuf;
/** This must be passed by application before calling Ethernet_getHandle()
API. This is the Receive Buffer for incoming packets*/
uint8_t *rxBuffer;
/** Receive packet call back called when a Packet is Received by the LLD
*/
Ethernet_Pkt_Desc * (*pfcbRxPacket)(Ethernet_Handle handleApplication,
Ethernet_Pkt_Desc *pPacket);
/** Get packet call back called by this driver when it needs a packet
from Application */
Ethernet_Pkt_Desc * (*pfcbGetPacket)(void);
/** Free packet call back called after the completion of Tx and
when the buffer needs to handled back to application */
void (*pfcbFreePacket)(Ethernet_Handle handleApplication,
Ethernet_Pkt_Desc *pPacket);
/** Clear enqueued packets call back called during RBU error to drop
all enqueued RX packets*/
void (*pfcbDeletePackets)();
/** Callback for Asynchronous EEE Events Magic Packet Received
or Remote Wakeup Packet Received */
void (*pfcbLPIPacketReceived)(Ethernet_EEE_eventType type,
void *buff);
}Ethernet_InitConfig;
typedef enum
{
ETHERNET_SS_PHY_INTF_SEL_MII = 0U,
/* Values 1-3 Reserved*/
ETHERNET_SS_PHY_INTF_SEL_RMII = 4U,
ETHERNET_SS_PHY_INTF_SEL_REVMII = 7U
} Ethernet_SS_phyInterfaceMode;
typedef enum
{
ETHERNET_SS_CLK_SRC_EXTERNAL = 0U ,
ETHERNET_SS_CLK_SRC_INTERNAL = 1U
}Ethernet_SS_clockSelection;
//*****************************************************************************
//
//! This Structure should be passed to Ethernet_InitInterface() API
//
//*****************************************************************************
typedef struct
{
uint32_t ssbase; //!Base Address of Subsystem Wrapper Registers
uint32_t enet_base; //!Base Address of Ethernet Registers
Ethernet_SS_phyInterfaceMode phyMode; //!Physical interface selected
//!Clock Configuration selection for ReVMII/RMII modes
Ethernet_SS_clockSelection clockSel;
uint8_t localPhyAddress; //!used in case of RevMII
uint8_t remotePhyAddress; //!used in case of RevMII
/** Peripheral Number to be used when calling the
ptrPlatformPeripheralEnable(), ptrPlatformPeripheralReset() APIs*/
uint32_t peripheralNum;
/** Platform specific Peripheral Enable API to be called to enable
Ethernet, Ethernet Subsystem module clocks */
void (*ptrPlatformPeripheralEnable)(uint32_t peripheralNum);
/** Platform specific Peripheral Reset API to be called to reset
Ethernet and Ethernet Subsystem module */
void (*ptrPlatformPeripheralReset)(uint32_t peripheralNum);
/** Platform specific Interrupt Enable API to enable a specific interrupt
shall be called with interruptNum entries*/
void (*ptrPlatformInterruptEnable)(uint32_t interruptNumber);
/** Platform specific Interrupt Disable API to enable a specific interrupt
shall be called with interruptNum entries*/
void (*ptrPlatformInterruptDisable)(uint32_t interruptNumber);
/** Platform specific Interrupt Numbers for Ethernet interrupts that
should be passed to ptrPlatformInterruptEnable() and
ptrPlatformInterruptDisable() APIs*/
uint32_t interruptNum[ETHERNET_NUM_INTERRUPTS];
}Ethernet_InitInterfaceConfig;
//*****************************************************************************
//
//! Generic Packet Queue Structure - Contains a head and Tail pointer
//! Two instances of such Structure is used in each channel
//
//*****************************************************************************
typedef struct {
/**
* @brief Number of packets in queue
*/
uint32_t count;
/**
* @brief Pointer to first packet
*/
Ethernet_Pkt_Desc *head;
/**
* @brief Pointer to last packet
*/
Ethernet_Pkt_Desc *tail;
} Ethernet_PKT_Queue_T;
//*****************************************************************************
//
//! Forward Declaration of Device Structure see structure Definition below
//!
//
//*****************************************************************************
typedef struct Ethernet_Devicest Ethernet_Device;
//*****************************************************************************
//
//! Per Channel Channel Descriptor Structure
//! Maintains two queues one for Wait Queue that is submitted by the User
//! Desc Queue that is Queued to the Hardware
//! It also maintains the Descriptor pointers
//*****************************************************************************
typedef struct {
Ethernet_Device *devicePtr;
Ethernet_PKT_Queue_T descQueue;
/**< Packets queued as desc */
Ethernet_PKT_Queue_T waitQueue;
/**< Packets waiting for TX desc */
Ethernet_ChInfo *chInfo;
/**< Channel info */
uint32_t descMax;
/**< Max number of desc (buffs) */
uint32_t descCount;
/**< Current number of desc */
Ethernet_HW_descriptor *descFirst;
uint32_t indexFirst;
uint32_t indexLast;
uint32_t indexRead;
uint32_t indexWrite;
uint32_t dmaInProgress;
/* Flag to indicate DMA transaction is in progress */
} Ethernet_DescCh;
typedef Ethernet_DescCh Ethernet_TxChDesc;
typedef Ethernet_DescCh Ethernet_RxChDesc;
//*****************************************************************************
//
//!DMA Object that combines the Tx and Rx Channel Descritor Structures
//!
//
//*****************************************************************************
typedef struct
{
Ethernet_TxChDesc txDma[ETHERNET_MAX_NUM_DMA_CHANNELS];
Ethernet_RxChDesc rxDma[ETHERNET_MAX_NUM_DMA_CHANNELS];
bool chIsInit[ETHERNET_MAX_DMA_DIR][ETHERNET_MAX_NUM_DMA_CHANNELS];
}Ethernet_DmaObj;
//*****************************************************************************
//
//! Base Address Definition Structure
//! Stores the Base Address of the Subsystem and the Ethernet module
//
//*****************************************************************************
typedef struct {
uint32_t ss_base;
uint32_t enet_base;
}Ethernet_BaseConfig;
//*****************************************************************************
//
//! Global Book keeping Structure maintained throughout
//!
//
//*****************************************************************************
struct Ethernet_Devicest{
/**The Base addresses populated from the _InitInterfaceConfig structure
in the Ethernet_initInterface() API call*/
Ethernet_BaseConfig baseAddresses;
/** Main DMA Book keeping structure of the driver*/
Ethernet_DmaObj dmaObj;
/** Handle provided to application with callbacks*/
Ethernet_Handle handleApplication[ETHERNET_NUM_PORTS];
/** Phy number - useful if phy number is discovered - RFU*/
uint32_t phyNum;
/** Pointer to Descriptor array*/
Ethernet_HW_descriptor *descs;
/** Pointer to Transmit Descriptor Array*/
Ethernet_HW_descriptor *txDesc;
/** Pointer to Receive Descriptor Array*/
Ethernet_HW_descriptor *rxDesc;
/** Receive Buffer Address initialized in Ethernet_getHandle() API*/
uint8_t *rxBuffer;
/** Buffer index for the sample simple buffer handling function of this
driver Ethernet_getPacketBuffer()*/
uint8_t rxBuffIndex;
/** Maximum Size of Ethernet Packet */
uint32_t pktMTU;
/** A reference number stored to make sure that this structure is not
corrupted*/
uint32_t devMagic;
/** The Driver initialization configuration structure returned in
Ethernet_initInterface() can be filled with known good values with a call to
Ethernet_getInitConfig() and used by Ethernet_getHandle() to initialize the
hardware */
Ethernet_InitConfig initConfig;
/** The following parameters are copied from the
Ethernet_InitInterfaceConfig structure when the driver is initialized with
Ethernet_initInterface() API call */
void (*ptrPlatformPeripheralEnable)(uint32_t PeripheralName);
void (*ptrPlatformPeripheralReset)(uint32_t PeripheralName);
void (*ptrPlatformInterruptEnable)(uint32_t interruptNumber);
void (*ptrPlatformInterruptDisable)(uint32_t interruptNumber);
uint32_t interruptNum[ETHERNET_NUM_INTERRUPTS];
};
//
//Define for Signalling Early Rx Completion
//
typedef enum
{
//
//When Static it indicates that the routing is based on the
//Static configuration configured
//
ETHERNET_RX_DMA_QUEUE_STATIC = 0x00U,
//
//When Dynamic this bit indicates that the packets received in
//Queue are routed to a particular DMA channel as decided
//in the MAC Receiver based on the DMA channel number
//programmed in the L3-L4 filter registers, or the Ethernet DA
//address
//
ETHERNET_RX_DMA_QUEUE_DYNAMIC = 0x01U
} Ethernet_RxDMAQueueMode;
//*****************************************************************************
//
//! The structure for Rx Queue Configuration
//! Used by the driver in Rx Queue Configuration
//
//*****************************************************************************
typedef struct {
uint32_t reserved_0:4;
uint32_t PTPQ:1;
uint32_t reserved_1:7;
uint32_t UPQ:1;
uint32_t reserved_2:3;
uint32_t MCBCQ:1;
uint32_t reserved_3:3;
uint32_t MCBCQEN:1;
uint32_t reserved_4:1;
uint32_t TPQC:1;
uint32_t reserved_5:9;
} Ethernet_RxQControl;
typedef enum
{
ETHERNET_CHANNEL_0 ,
ETHERNET_CHANNEL_1
} Ethernet_ChannelNum;
typedef enum
{
ETHERNET_QUEUE_0 ,
ETHERNET_QUEUE_1
} Ethernet_QueueNum;
typedef enum
{
ETHERNET_SET_CONFIG_VLAN_TX_OUTER ,
ETHERNET_SET_CONFIG_VLAN_TX_INNER,
ETHERNET_SET_CONFIG_VLAN_TX_CHANNEL_BASED,
ETHERNET_SET_CONFIG_VLAN_TX_DOUBLE_VLAN,
ETHERNET_SET_CONFIG_VLAN_TX_PACKET_BASED,
ETHERNET_SET_CONFIG_VLAN_INNER_TX_PACKET_BASED,
ETHERNET_SET_CONFIG_DOUBLE_VLAN,
ETHERNET_SET_CONFIG_FILTER_VLAN_PERFECT,
ETHERNET_SET_CONFIG_FILTER_VLAN_HASH,
ETHERNET_SET_CONFIG_FILTER_L3_L4,
ETHERNET_SET_CONFIG_EEE_TX,
ETHERNET_SET_CONFIG_EEE_TX_ENABLE,
ETHERNET_SET_CONFIG_EEE_TX_DISABLE,
ETHERNET_SET_CONFIG_RX_MAGIC_DETECT_ENABLE,
ETHERNET_SET_CONFIG_RX_REMOTE_WAKEUP_FILTER,
ETHERNET_SET_CONFIG_RX_REMOTE_WAKEUP_ENABLE,
ETHERNET_SET_CONFIG_MAX
}Ethernet_SetConfigParam;
typedef enum
{
ETHERNET_VLAN_TX_NONE,
ETHERNET_VLAN_TX_DELETE,
ETHERNET_VLAN_TX_INSERT,
ETHERNET_VLAN_TX_REPLACE
}Ethernet_VlanTxTagControl;
typedef enum
{
ETHERNET_VLAN_TYPE_C ,// CVLAN TYPE 0x8100 Tag
ETHERNET_VLAN_TYPE_S
}Ethernet_VlanType;
typedef enum
{
ETHERNET_VLAN_TAG_SOURCE_REG,
ETHERNET_VLAN_TAG_SOURCE_DESC
}Ethernet_VlanTagSource;
//*****************************************************************************
//
//! The structure for VLAN Tag Configuration
//! Used in Transmit VLAN Tagging
//
//*****************************************************************************
typedef struct
{
//!16 bit VLAN ID
uint16_t vlan_tag;
//!Whether the tag has to inserted/replaced/Deleted
Ethernet_VlanTxTagControl vlanTagControl;
//!S-VLAN or C-VLAN Type
Ethernet_VlanType vlanType;
}Ethernet_VlanConfig;
//*****************************************************************************
//
//! The structure for Dual VLAN Tag Configuration
//! Used in Transmit Dual VLAN Tagging
//
//*****************************************************************************
typedef struct
{
Ethernet_VlanConfig outerVLANConfig;
Ethernet_VlanConfig innerVLANConfig;
}Ethernet_DoubleVLANConfig;
//*****************************************************************************
//
//! The structure for Channel based VLAN Tag Insertion Configuration
//! Used in Transmit VLAN Tagging
//
//*****************************************************************************
typedef struct
{
//!16 bit VLAN ID
uint16_t vlan_tag;
//!S-VLAN or C-VLAN Type
Ethernet_VlanType vlanType;
//! Channel Number
Ethernet_ChannelNum channelNum;
}Ethernet_VLANCBTIConfig;
//
//Rx Filter Configuration
//
typedef enum
{
ETHERNET_VLAN_PERFECT_FILTER_DISABLED,
ETHERNET_VLAN_PERFECT_FILTER_ENABLED
}Ethernet_VlanRxPerfectFilterEnable;
typedef enum
{
ETHERNET_VLAN_PERFECT_FILTER_COMPARE_16BITS,
ETHERNET_VLAN_PERFECT_FILTER_COMPARE_12BITS
}Ethernet_VlanRxPerfectFilterCompareMode;
typedef enum
{
ETHERNET_VLAN_PERFECT_FILTER_TYPE_COMPARISON_ENABLED,
ETHERNET_VLAN_PERFECT_FILTER_TYPE_COMPARISON_DISABLED
}Ethernet_VlanRxPerfectFilterTypeComparison;
typedef enum
{
ETHERNET_VLAN_RX_FILTER_INNER_VLAN_DISABLED,
ETHERNET_VLAN_RX_FILTER_INNER_VLAN_ENABLED
}Ethernet_VlanRxFilter_InnerVLANEnable;
typedef enum
{
ETHERNET_DMA_CHANNELNUM_DISABLED,
ETHERNET_DMA_CHANNELNUM_ENABLED
}Ethernet_DMA_channelEnableDisable;
//*****************************************************************************
//
//! The structure for VLAN Perfect Filter Configuration
//! Used in Receive VLAN Filter
//
//*****************************************************************************
typedef struct
{
uint8_t filterid;
//!<Index of VLAN Filter 0-3
uint16_t vlanid;
//!<VLAN ID to be compared with
Ethernet_VlanRxPerfectFilterEnable vlanEnableDisable;
//!<Filter is Enabled or Disabled
Ethernet_VlanRxPerfectFilterCompareMode vlanFilterMode;
//!<12 bit or 16 bit Comparison
Ethernet_VlanRxPerfectFilterTypeComparison vlanPerfectTypeComparisonDisable;
//!<Disable or enable Type comparison
//
//Set if SVLAN comparison Reset for CVLAN
//
Ethernet_VlanType vlanType;
//!<CVLAN 0x8100 or SVLAN 0x88A8
Ethernet_VlanRxFilter_InnerVLANEnable innerVLANEnabled;
//!<InnerVLAN comparison Enable
Ethernet_DMA_channelEnableDisable dmaChannelEnable;
//!<DMA Channel number enable
Ethernet_ChannelNum dmaChannelNum;
//!< DMA Channel Num to which matching packets received should be Routed
}Ethernet_VLAN_Perfect_FilterParams;
//*****************************************************************************
//
//! The structure for VLAN Hash Filter
//! Used in Receive VLAN Filtering
//
//*****************************************************************************
typedef struct
{
Ethernet_VlanRxFilter_InnerVLANEnable innerVLANEnabled;
uint16_t hashFilterMap;
}Ethernet_Vlan_Hash_FilterParams;
//*****************************************************************************
//
//! Value that can be passed to Ethernet_setConfig() as the buffPtr
//! parameter.
//! If layer3ProtocolSel is 1(for IPv6) make sure only
//! either of layer3IPDestAddressMatchEnable or layer3IPSrcAddressMatchEnable
//! is set
//
//*****************************************************************************
typedef struct
{
uint8_t filterid;//!< Filter number 0-3
Ethernet_DMA_channelEnableDisable dmaChannelEnable;
//!< Channel Num Enabled/Disabled
Ethernet_ChannelNum dmaChannelNum;
//!< DMA Channel Number where the packets should be destined if passes
uint8_t layer4DestinationPortMatchEnable;
//!< If Set Enables Destination Port Matching for L4
uint8_t layer4SourcePortMatchEnable;
//!< If Set Enables Source Port Matching for L4
uint8_t layer4ProtocolSel;//!< 0- TCP 1-UDP
uint16_t layer4DestinationPort;
//!< 16bit Layer 4 Destination Port number to be matched
uint16_t layer4SourcePort;
//!<16bit Layer 4 Port Source Port number to be matched
//
//For L3HDBM
//
uint8_t layer3ProtocolSel;
//!<0- IPv4 1- IPV6
uint8_t layer3DestHigherBitsMask;
//!< Number of Bits to be masked for Layer 3 Destination Address
uint8_t layer3SrcHigherBitsMask;
//!< Number of Bits to be masked for Layer 3 Source Address
uint8_t layer3IPDestAddressMatchEnable;
//!< Enables Comparison of IP Dest Address
uint8_t layer3IPSrcAddressMatchEnable;
//!<Enables Comparison of IP Src Address
uint32_t layer3Address0;
//!< Source Address for IPv4 or Bits[31:0] for IPv6
uint32_t layer3Address1;
//!< Destination Address for IPv4 or Bits[63:32] for IPv6
uint32_t layer3Address2;
//!< Bits[95:64] for IPv6 ,Unused for IPv4
uint32_t layer3Address3;
//!< Bits[127:96] for IPv6 ,Unused for IPv4
}Ethernet_L3_L4_FilterParams;
//*****************************************************************************
//
//! The structure for L3/L4 Filter configuration
//! Used by the driver in L3/L4 Filter Configuration programming
//
//*****************************************************************************
typedef struct {
uint32_t L3PEN:1;
uint32_t reserved_0:1;
uint32_t L3SAM:1;
uint32_t L3SAIM:1;
uint32_t L3DAM:1;
uint32_t L3DAIM:1;
uint32_t L3HSBM:5;
uint32_t L3HDBM:5;
uint32_t L4PEN:1;
uint32_t reserved_1:1;
uint32_t L4SPM:1;
uint32_t L4SPIM:1;
uint32_t L4DPM:1;
uint32_t L4DPIM:1;
uint32_t reserved_2:2;
uint32_t DMACHN:1;
uint32_t reserved_3:3;
uint32_t DMACHEN:1;
uint32_t reserved_4:3;
} Ethernet_L3_L4_Control;
//*****************************************************************************
//
//! The structure for Energy Efficient Ethernet Configuration(EEE)
//! Used in Transmit EEE configuration
//
//*****************************************************************************
typedef struct
{
//
//b31 |b30 |b29 |b28 |b27 |
//LSTVAL|TWTVAL|LETVAL|TMICROVAL|PLSVAL|
//b3.......|b2 |b1 |b0
//TXCLKGATE|LPITXA|PLS|Rsvd
//
uint32_t flags;
//!<Specifies minimum time in Milliseconds for which Link Status
//!< has to be up for LPI pattern to be sent to PHY from MAC
//!< Hardware default is 1 Second as per IEEE Standard
uint16_t linkStatusTimer;
//!< Specifies the minimum time for which MAC should wait to
//!< from when it stops sending LPI to when it starts transmission
//!< specified in micro Seconds
uint16_t transitionWaitTimer;
//!<Time in micro Seconds MAC will wait to enter EEE
//!<Bits 0-2 reserved Granularity in Steps of 8 micro seconds
uint32_t entryTimer;
//!< Number of Clock cycles of IP in 1 us
//! < If clock is 125 Mhz then program 125 -1 =124
uint16_t tickOneMicroSecCounter;
}Ethernet_EEE_Tx_Params;
#define ETHERNET_EEE_TX_CONTROL_LST_VALID 0x80000000U
#define ETHERNET_EEE_TX_CONTROL_TWT_VALID 0x40000000U
#define ETHERNET_EEE_TX_CONTROL_LET_VALID 0x20000000U
#define ETHERNET_EEE_TX_CONTROL_TMICRO_VALID 0x10000000U
#define ETHERNET_EEE_TX_CONTROL_PLS_VALID 0x80000000U
#define ETHERNET_EEE_TX_CONTROL_PLS_UP 0x00000002U
#define ETHERNET_EEE_TX_CONTROL_AUTOEEE_ENABLED 0x00000004U
#define ETHERNET_EEE_TX_CONTROL_EEE_ENABLED 0x00000001U
#define ETHERNET_EEE_TX_CONTROL_TXCLKGATE_ENABLED 0x00000008U
//*****************************************************************************
//
//! The structure for Remote Wake up Filter Configuration.
//! Used in Receive EEE Path
//! The device supports 1 to ETHERNET_RWKUP_FILTER_NUM number of filters
//! This structure configures the filters for the same.
//
//*****************************************************************************
typedef struct
{
/** The CRC of the selected bytes for filter 0 */
uint16_t filterCRC0;
/** The CRC of the selected bytes for filter 1 */
uint16_t filterCRC1;
/** The CRC of the selected bytes for filter 2 */
uint16_t filterCRC2;
/** The CRC of the selected bytes for filter 3 */
uint16_t filterCRC3;
/**The Bytes to be selected for Filter 0.A bit set to 1 selects that byte*/
uint32_t filterByteMask0;
/**The Bytes to be selected for Filter 1.A bit set to 1 selects that byte*/
uint32_t filterByteMask1;
/**The Bytes to be selected for Filter 2.A bit set to 1 selects that byte*/
uint32_t filterByteMask2;
/**The Bytes to be selected for Filter 3.A bit set to 1 selects that byte*/
uint32_t filterByteMask3;
/**The offset in incoming packet from where filter 0 has to be applied*/
uint8_t filterOffset0;
/**The offset in incoming packet from where filter 1 has to be applied*/
uint8_t filterOffset1;
/**The offset in incoming packet from where filter 2 has to be applied*/
uint8_t filterOffset2;
/**The offset in incoming packet from where filter 3 has to be applied*/
uint8_t filterOffset3;
/**The filter commands for the filter 0 can be an OR of
ETHERNET_RWKUP_FILTER_COMMAND_ENABLE - this must be set to enable filter
ETHERNET_RWKUP_FILTER_COMMAND_AND_PREVIOUS - implements Boolean logic
of combining with previous filter
ETHERNET_RWKUP_FILTER_COMMAND_INVERSE - reverses logic of CRC function
that rejects packets with matching CRC value
ETHERNET_RWKUP_FILTER_COMMAND_MULTICAST - applies only to multicast
packets
*/
uint8_t filterCommand0;
/**The filter commands for the filter 1 can be an OR of
ETHERNET_RWKUP_FILTER_COMMAND_ENABLE - this must be set to enable filter
ETHERNET_RWKUP_FILTER_COMMAND_AND_PREVIOUS - implements Boolean logic
of combining with previous filter
ETHERNET_RWKUP_FILTER_COMMAND_INVERSE - reverses logic of CRC function
that rejects packets with matching CRC value
ETHERNET_RWKUP_FILTER_COMMAND_MULTICAST - applies only to multicast
packets
*/
uint8_t filterCommand1;
/**The filter commands for the filter 2 can be an OR of
ETHERNET_RWKUP_FILTER_COMMAND_ENABLE - this must be set to enable filter
ETHERNET_RWKUP_FILTER_COMMAND_AND_PREVIOUS - implements Boolean logic
of combining with previous filter
ETHERNET_RWKUP_FILTER_COMMAND_INVERSE - reverses logic of CRC function
that rejects packets with matching CRC value
ETHERNET_RWKUP_FILTER_COMMAND_MULTICAST - applies only to multicast
packets
*/
uint8_t filterCommand2;
/**The filter commands for the filter 3 can be an OR of
ETHERNET_RWKUP_FILTER_COMMAND_ENABLE - this must be set to enable filter
ETHERNET_RWKUP_FILTER_COMMAND_AND_PREVIOUS - implements Boolean logic
of combining with previous filter
ETHERNET_RWKUP_FILTER_COMMAND_INVERSE - reverses logic of CRC function
that rejects packets with matching CRC value
ETHERNET_RWKUP_FILTER_COMMAND_MULTICAST - applies only to multicast
packets
*/
uint8_t filterCommand3;
/** ORed value of any of the following Macros:
ETHERNET_RWKUP_FILTER_CONFIG0_ENABLED - only if this is set Filter 0 is
configured.
ETHERNET_RWKUP_FILTER_CONFIG1_ENABLED - only if this is set Filter 1 is
configured.
ETHERNET_RWKUP_FILTER_CONFIG2_ENABLED - only if this is set Filter 2 is
configured.
ETHERNET_RWKUP_FILTER_CONFIG3_ENABLED - only if this is set Filter 3 is
configured */
uint8_t flags;
}Ethernet_RemoteWakeUp_Filter_Config;
#define ETHERNET_RWKUP_FILTER_CONFIG0_ENABLED 0x1U
#define ETHERNET_RWKUP_FILTER_CONFIG1_ENABLED 0x2U
#define ETHERNET_RWKUP_FILTER_CONFIG2_ENABLED 0x4U
#define ETHERNET_RWKUP_FILTER_CONFIG3_ENABLED 0x8U
#define ETHERNET_RWKUP_FILTER_COMMAND_ENABLE 0x1U
#define ETHERNET_RWKUP_FILTER_COMMAND_AND_PREVIOUS 0x2U
#define ETHERNET_RWKUP_FILTER_COMMAND_INVERSE 0x4U
#define ETHERNET_RWKUP_FILTER_COMMAND_MULTICAST 0x8U
#define ETHERNET_RWKUP_FILTER_NUM 0x4U
#define ETHERNET_RWKUP_FILTER_NUM_WORDS 0x8U
typedef enum
{
ETHERNET_RX_FLOW_CONTROL_1KB,
ETHERNET_RX_FLOW_CONTROL_1_5_KB, //For1.5 KB
ETHERNET_RX_FLOW_CONTROL_2KB,
ETHERNET_RX_FLOW_CONTROL_2_5KB,
ETHERNET_RX_FLOW_CONTROL_3KB,
ETHERNET_RX_FLOW_CONTROL_3_5KB,
ETHERNET_RX_FLOW_CONTROL_4KB,
}Ethernet_ReceiveFlowControlLevel;
//*****************************************************************************
//
//! Ethernet_initInterface
//! Initialise the Ethernet Interface with this API.
//! This is the First API of the Low Level Driver
//! that should be called by application/Higher layer stack.
//! Turns on the Clocks to Ethernet interface.
//! The Module Initialization is done in Ethernet_getHandle API the user must
//! fill the Parameters for Init in the Struture returned by the API
//!
//! \param interfaceConfig Configuration Structure to be used for initializing
//! interface
//! \return Pointer to Init Config Structure
//! to be used in Ethernet_getHandle() API
//
//*****************************************************************************
extern Ethernet_InitConfig *Ethernet_initInterface(
Ethernet_InitInterfaceConfig interfaceConfig);
//*************************************************************************
//
// Ethernet_initRxChannel
//
//! Initializes the Rx DMA Channel and makes it ready for receive
//! \param
//! chInfo : Pointer to the Channel info Structure for the channel to be init
//! \return none
//
//************************************************************************
extern uint32_t Ethernet_initRxChannel(Ethernet_ChInfo *chInfo);
//**********************************************************************
//! Enables MAC for transmission and reception
//!
//! \param base Base Address of the Ethernet Module
//! \param flags ORed value of flags to be set
//! (ETHERNET_MAC_CONFIGURATION_RE, ETHERNET_MAC_CONFIGURATION_TE)
//! \return None
//***********************************************************************
extern void Ethernet_setMACConfiguration(uint32_t base,
uint32_t flags);
//**********************************************************************
//! Disables MAC for transmission and reception
//!
//! \param base Base Address of the Ethernet Module
//! \param flags ORed value of flags to be set
//! (ETHERNET_MAC_CONFIGURATION_RE, ETHERNET_MAC_CONFIGURATION_TE)
//! \return None
//***********************************************************************
extern void Ethernet_clearMACConfiguration(uint32_t base,
uint32_t flags);
//*****************************************************************************
//
//! Ethernet_shutdownInterface
//! This API can be used for dynamically shutting down the
//! Ethernet interface. This shutsdown the DMA Receiver, Transmit
//! Engines and disables the MAC Reception and transmission.
//! For getting the interface to work the application should use
//! Ethernet_initInterface() and Ethernet_getHandle() APIs
//! to get the interface back to Normal operation.
//!
//! \param None
//! \return None
//
//*****************************************************************************
extern void Ethernet_shutdownInterface(void);
//*****************************************************************************
//
//! Ethernet_getInitConfig()
//! Builds a default Configuration of the Module
//! The Module Initialization is done in Ethernet_getHandle API the user must
//! fill the Parameters for Init using the Ethernet_InitConfig Struture.
//! This API helps to fill the contents of the Init Config Structure
//! The Ethernet_InitConfig structure variables are populated to a known
//! good values
//! Higher Layer/User can refer to this implementation for creating a different
//! Configuration
//! \param pConfig Ethernet_InitConfig structure pointer could be returned
//! Ethernet_InitInterface() API
//! \returns Nothing
//
//*****************************************************************************
extern void Ethernet_getInitConfig(Ethernet_InitConfig *pConfig);
//*****************************************************************************
//
//! Ethernet_getHandle must be called before using the interface
//! For Sending and Receiving the Packets over Ethernet
//! Must pass the filled Init Configuration Structure(that is returned by
//! _initInterface call
//! This initializes the Ethernet module as per the configuration
//! structure provided.
//! The Driver moves to initialized state
//! ready for Sending/Receiving the packets
//!
//! \param handleApplication - can be any application specific passed back
//! during callbacks
//! \param ethernetInitConfigPtr - Pointer to the Filled up InitConfig Structure
//! that is provided in _initInterface call
//! \param ethernetHandlePtr - returns a handle
//! (Pointer to Book Keeping Structure).
//! This must be provided in subsequent calls to SendPacket or other APIs
//! \return ETHERNET_RET_SUCCESS on Success
//!
//
//*****************************************************************************
extern uint32_t Ethernet_getHandle(Ethernet_Handle handleApplication,
Ethernet_InitConfig *ethernetInitConfigPtr,
Ethernet_Handle *ethernetHandlePtr);
//*****************************************************************************
//
//! Configure the Specified aspect of the Ethernet driver
//! \param hEMAC handle returned by Ethernet_getHandle API
//! \param setParam the parameter to be set can be any of the following values:
//! - \b ETHERNET_SET_CONFIG_VLAN_TX_OUTER -
//! for setting outer VLAN TX Parameters
//! in case of dual VLAN or single VLAN
//! - \b ETHERNET_SET_CONFIG_VLAN_TX_INNER - for setting inner VLAN TX
//! Parameters
//!. in case of inner VLAN
//! - \b ETHERNET_SET_CONFIG_VLAN_TX_DOUBLE_VLAN -
//! configures both Inner and Outer VLAN
//!TX parameters
//! - \b ETHERNET_SET_CONFIG_FILTER_VLAN_PERFECT -
//! for configuring the VLAN Tag Perfect Filtering
//! - \b ETHERNET_SET_CONFIG_FILTER_L3_L4 - for configuring L3,L4 Filters
//! \param buffPtr the pointer to the Parameter structure being set
//! - if setParam is ETHERNET_SET_CONFIG_VLAN_TX_OUTER address of
//! Ethernet_VlanConfig structure
//! - if setParam is ETHERNET_SET_CONFIG_VLAN_TX_INNER address of
//! Ethernet_VlanConfig structure
//! - if setParam is ETHERNET_SET_CONFIG_VLAN_TX_DOUBLE_VLAN address of
//! Ethernet_DoubleVLANConfig structure
//! - if setParam is ETHERNET_SET_CONFIG_FILTER_VLAN_PERFECT address
//! of Ethernet_VLAN_Perfect_FilterParams structure
//! - if setParam is ETHERNET_SET_CONFIG_FILTER_L3_L4 address of
//! Ethernet_L3_L4_FilterParams structure
//! \param size size of the buffer being passed in buffPtr
//!
//! \return ETHERNET_RET_SUCCESS in case of Success and
//! other Error code in case of failure
//!
//*****************************************************************************
extern uint32_t Ethernet_setConfig(Ethernet_Handle hEMAC,
Ethernet_SetConfigParam setParam,
void *buffPtr,
uint32_t size);
//*****************************************************************************
//
//! Configure PTP Currently not implemented
//!
//*****************************************************************************
extern uint32_t Ethernet_configurePTP(Ethernet_Handle hEMAC);
//*****************************************************************************
//
//! Ethernet_sendPacket
//! This API is to be used to Send Packet(s) over Ethernet
//! This does a non Blocking Send over the Ethernet Interface
//! The Master DMA inbuilt with the module is Programmed to pick up the
//! Provided buffers
//! and transfer to the Ethernet module TX FIFO.
//! The Completion of DMA results in a Per channel DMA completion interrupt,
//! for which there is a completion ISR
//! The ISR is used to signal the end of packet transmission.
//! The Buffers provided to the LLD over this API
//! can be reclaimed as part of the TX.
//! The Higher layer has to prepare Packet Descriptors for each Buffer
//! and chain them if needed
//! The Packet Boundaries can be specified in the flags using
//! the ETHERNET_PKT_FLAG_SOP and ETHERNET_PKT_FLAG_SOP flags.
//! If there is a single packet it must use
//! both the flags ORred in the packet flags.
//! On completion of Transmit of a Paket,
//! the Driver picks up the Submitted Packet from Queue
//! and returns the Packet Structure as an argument to the Callback function.
//! Interrupt callback handling
//! \param hEMAC- Handle to the EMAC returned in _Open call
//! \param pktPtr - Pointer to the Packet Descriptor structure.
//! If Multiple packets are to be transmitted
//! multiple Descriptors can be chained
//! and single call to _SendPacket can be done
//! Even if a single packet is split into multiple buffers,
//! multiple Descriptors to be chained
//! The First Descriptor should have SOP set and EOP should be set in the last
//! The number of fragments must be specified
//! \return ETHERNET_RET_SUCCESS on Success or Error Codes on Failture
//
//*****************************************************************************
extern uint32_t Ethernet_sendPacket(Ethernet_Handle hEMAC,
Ethernet_Pkt_Desc *pktPtr);
//*****************************************************************************
//
//! Ethernet_getStatistics()
//! API To get the RMON Statistics
//! Combines all the RMON Statistics in a single call
//!
//! \param hEMAC - Handle Provided by _Open call
//! \param statisticsPtr- the Pointer to Statistics structure to be filled
//! \return ETHERNET_RET_SUCCESS on success
//!
//
//*****************************************************************************
extern uint32_t Ethernet_getStatistics(Ethernet_Handle hEMAC,
Ethernet_Statistics *statisticsPtr);
//***************************************************************************
//
//! Ethernet_clearHandle
//! Not implemented Currently
//!
//**************************************************************************
extern void Ethernet_clearHandle(Ethernet_Handle *phEMAC);
//**************************************************************************
//! Ethernet_shutdownInterface()
//! Used to Shutdown the interface - To be implemented
//! No Arguments and Does not Return anything
//**************************************************************************
extern void Ethernet_shutdownInterface(void);
//**************************************************************************
//! Ethernet_clearStatistics()
//! Used to Clear the RMON Statistics - To be implemeted
//! \param ethernetHandlePtr - Handle provided in Ethernet_getHandle API call
//! \return none
//**************************************************************************
extern void Ethernet_clearStatistics(Ethernet_Handle *ethernetHandlePtr);
//*****************************************************************************
//
//! Configures the Queueing model for a given DMA Queue and assigns
//! static channel number for Static mapping of Queue to Channel number
//!
//! \param base is the base address of the controller.
//! \param Ethernet_RxDMAQueueMode configures whether it is Static or Dynamic
//! mapping of the Channels
//! ETHERNET_RX_DMA_QUEUE_STATIC - provides a static mapping of given queue
//! to channel specified in mappedChannel for the queue queueNum
//! ETHERNET_RX_DMA_QUEUE_DYNAMIC - provides a dynamic mapping based on the
//! filters like MAC/L3/L4/VLAN
//! \param queueNum specifies the queue number for which the parameter
//! is getting configured
//! \param mappedChannel is the channel number which is assigned in case
//! of static mapping in case of Dynamic mapping this parameter is ignored
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_setDMARxQueueMode(uint32_t base,
Ethernet_RxDMAQueueMode mode,
Ethernet_QueueNum queueNum,
Ethernet_ChannelNum mappedChannel);
//*********************************************************************
//! Ethernet_transmitISR()
//! Transmit Packet Completion Interrupt Service Routine
//! This low level driver currently uses the design where every transmit
//! packet will have the Interrupt on Completion Set
//! For each packet provided by the application for Transmit the driver
//! forms a Transmit Descriptor which is submitted into the Transmit Ring
//! of the Ethernet module
//! Each packet's Interrupt on Completion flag is Set in the Tx Descriptor
//! For each packet Completion interrupt the ISR sees which channel
//! has completion interrupt and handles the corresponding Tx Desc Queue
//! The Packet completion is signalled to the application by calling
//! the Callback function provided by the application
//! \return None
//************************************************************************
extern interrupt void Ethernet_transmitISR(void);
//************************************************************************
//! Ethernet_receiveISR()
//! Receive Packet Completion Interrupt Service Routine
//! for each buffer which is submitted to the Ethernet channel Rx Ring
//! the IOC flag in the Received descriptor is set which
//! results in an interrupt for each packet
//! The ISR pops the packet from Descriptor Queue DescQueue and
//! calls the Rx Callback function registered by the Hiher layer
//! calls Ethernet_removePacketsFromRxQueue to implement the same
//! \return None
//***********************************************************************
extern interrupt void Ethernet_receiveISR(void);
//************************************************************************
//! Ethernet_genericISR()
//! Generic Interrupt Service Routine
//! \return None
//***********************************************************************
extern interrupt void Ethernet_genericISR(void);
//
//Application specific Callback functions
//
//****************************************************************************
//!
//! This function is a callback function called by the Driver when it needs
//! a Packet for Receive Operation.
//!This can be replaced by the Higher layer stack
//! application while integrating this layer of driver
//!
//****************************************************************************
extern Ethernet_Pkt_Desc *Ethernet_getPacketBuffer(void);
//****************************************************************************
//!
//! This function is a callback function called by the Driver to handle the
//! Transmit Complete Callback that can be used to reclaim the buffer
//! Placeholder function that can be changed while initializing the Init
//! Structure
//!
//****************************************************************************
extern void Ethernet_releaseTxPacketBuffer(Ethernet_Handle handleApplication,
Ethernet_Pkt_Desc *pPacket);
//*****************************************************************************
//!
//! This callback function is called by the application
//! when a Rx packet is available
//! Can be changed by the higher layer stack
//!
//*****************************************************************************
extern Ethernet_Pkt_Desc *Ethernet_receivePacketCallback(
Ethernet_Handle handleApplication,
Ethernet_Pkt_Desc *pPacket);
//*****************************************************************************
//
//! Configures the Ethernet MAC's IEEE 1588 timestamping options.
//!
//! \param base is the base address of the controller.
//! \param config contains flags selecting particular configuration
//! options.
//! \param subSecondInc is the number that the IEEE 1588 subsecond clock
//! should increment on each tick.
//!
//! This function is used to configure the operation of the Ethernet MAC's
//! internal timestamping clock. This clock is used to timestamp incoming
//! and outgoing packets and as an accurate system time reference when
//! IEEE 1588 Precision Time Protocol is in use.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_setConfigTimestampPTP(uint32_t base, uint32_t config,
float subSecondInc);
//*****************************************************************************
//
//! Returns the current IEEE 1588 timestamping configuration.
//!
//! \param base is the base address of the controller.
//! \param subSecondInc points to storage that is written with the
//! current subsecond increment value for the IEEE 1588 clock.
//!
//! This function may be used to retrieve the current MAC timestamping
//! configuration.
//!
//! \return current state of the \e ETHERNET_O_MAC_TIMESTAMP_CONTROL register.
//
//*****************************************************************************
extern uint32_t Ethernet_getConfigTimestampPTP(uint32_t base,
float *subSecondInc);
//*****************************************************************************
//
//! Enables packet timestamping and starts the system clock running.
//!
//! \param base is the base address of the controller.
//!
//! This function is used to enable the system clock used to timestamp
//! Ethernet frames and to enable that timestamping.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_enableSysTimePTP(uint32_t base);
//*****************************************************************************
//
//! Disables packet timestamping and stops the system clock.
//!
//! \param base is the base address of the controller.
//!
//! This function is used to stop the system clock used to timestamp
//! Ethernet frames and to disable timestamping.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_disableSysTimePTP(uint32_t base);
//*****************************************************************************
//
//! Sets the current system time.
//!
//! \param base is the base address of the controller.
//! \param seconds is the seconds value of the new system clock setting.
//! \param subSeconds is the subseconds value of the new system clock
//! setting.
//!
//! This function may be used to set the current system time. The system
//! clock is set to the value passed in the \e seconds and
//! \e subSeconds parameters.
//!
//! The meaning of \e subseconds depends on the current system time
//! configuration. If Ethernet_setConfigTimestampPTP() was previously called
//! with the "DIGITAL ROLLOVER" configuration option, each bit in the
//! \e subSeconds value represents 1 ns. If "BINARY ROLLOVER" was
//! specified instead, a \e subSeconds bit represents 0.46 ns.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_setSysTimePTP(uint32_t base, uint32_t seconds,
uint32_t subSeconds);
//*****************************************************************************
//
//! Gets the current system time.
//!
//! \param base is the base address of the controller.
//! \param seconds points to storage for the current seconds value.
//! \param subSeconds points to storage for the current subseconds value.
//!
//! This function may be used to get the current system time.
//!
//! The meaning of \e subseconds depends on the current system time
//! configuration. If Ethernet_setConfigTimestampPTP() was previously called
//! with the "DIGITAL ROLLOVER" configuration option, each bit in the
//! \e subSeconds value represents 1 ns. If "BINARY ROLLOVER" was
//! specified instead, a \e subSeconds bit represents 0.46 ns.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_getSysTimePTP(uint32_t base, uint32_t *seconds,
uint32_t *subSeconds);
//*****************************************************************************
//
//! Adjusts the current system time upwards or downwards by a given amount.
//!
//! \param base is the base address of the controller.
//! \param seconds is the seconds value of the time update to apply.
//! \param subSeconds is the subseconds value of the time update to apply.
//! \param addSub defines the direction of the update, whether to add or.
//!
//! This function may be used to adjust the current system time either upwards
//! or downwards by a given amount. The size of the adjustment is given by
//! the \e seconds and \e subSeconds parameter and the direction
//! by the \e addSub parameter. When \e addSub is \e true, the system time is
//! advanced by the interval given. When it is \e false, the time is retarded
//! by the interval.
//!
//! The meaning of \e subseconds depends on the current system time
//! configuration. If Ethernet_setConfigTimestampPTP() was previously called
//! with the "DIGITAL ROLLOVER" configuration option, each bit in the
//! \e subSeconds value represents 1 ns. If "BINARY ROLLOVER" was
//! specified instead, a \e subSeconds bit represents 0.46 ns.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_updateSysTimePTP(uint32_t base, uint32_t seconds,
uint32_t subSeconds, bool addSub);
//*****************************************************************************
//
//! This API fetches the transmit timestamp of the PTP packet sent out on the
//! line which is captured when PTP Offload is enabled.
//!
//! \param base is the base address of the controller.
//! \param seconds is the seconds field of the captured transmit timestamp.
//! \param nanoSeconds is the nano-seconds field of the captured transmit
//! timestamp.
//!
//! When PTP Offload is enabled, the transmit timestamp of the packet is
//! captured and corresponding interrupt status bit is set. For example, if
//! the device is configured as slave, then transmit timestamp for outgoing
//! 'Delay Request' packet is captured.
//!
//! \return Transmit Timestamp Status Missed indicator.
//
//*****************************************************************************
extern uint32_t Ethernet_getOneStepTransmitTimestampPTP(uint32_t base,
uint32_t *seconds,
uint32_t *nanoSeconds);
//*****************************************************************************
//
//! Adjusts the system time update rate when using the fine correction method.
//!
//! \param base is the base address of the controller.
//! \param addend is the number to add to the accumulator register on
//! each tick of the Reference PTP Clock.
//!
//! This function is used to control the rate of update of the system time
//! when in fine update mode. Fine correction mode is selected if
//! \e ETHERNET_MAC_TIMESTAMP_CONTROL_TSCFUPDT is supplied in the \e config
//! parameter passed to a previous call to Ethernet_setConfigTimestampPTP().
//! Fine update mode is typically used when synchronizing the local clock to
//! the IEEE 1588 master clock. The subsecond counter is incremented by the
//! number passed to Ethernet_setConfigTimestampPTP() in the \e subSecondInc
//! parameter each time a 32-bit accumulator register generates a carry.
//! The accumulator register is incremented by the "addend" value on each main
//! oscillator tick, and this addend value is modified to allow fine control
//! over the rate of change of the timestamp counter. The addend value is
//! calculated using the ratio of the main oscillator clock rate and the
//! desired IEEE 1588 clock rate and the \e subSecondInc value is set to
//! correspond to the desired IEEE 1588 clock rate.
//!
//! As an example, using digital rollover mode and a 100 MHz Reference PTP
//! clock with a desired IEEE 1588 clock accuracy of 50 MHz, and having made
//! a previous call to Ethernet_setConfigTimestampPTP() with \e subSecondInc
//! set to the 50 MHz clock period of 20 ns, the initial \e addend value
//! would be set to 0x80000000 to generate a carry on every second Reference
//! PTP clock tick. Because the system time updates each time the accumulator
//! overflows, small changes in the \e addend value can be used to very
//! finely control the system time rate.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_setAddend(uint32_t base, uint32_t addend);
//*****************************************************************************
//
//! Returns the number of Auxiliary Timestamp Snapshots available in the
//! Auxiliary Snapshot FIFO.
//!
//! \param base is the base address of the controller.
//!
//! A value equal to \e ETHERNET_MAC_AUX_TIMESTAMP_FIFO_DEPTH indicates that
//! the Auxiliary Snapshot FIFO is full.
//!
//! \return None.
//
//*****************************************************************************
extern uint32_t Ethernet_getDepthAuxSnapshotFIFO(uint32_t base);
//*****************************************************************************
//
//! Sets the software trigger for Auxiliary Timestamp.
//!
//! \param base is the base address of the controller.
//! \param trigSelect is the trigger input for which software trigger is
//! intended.
//!
//! This function can be used to trigger an auxiliary timestamp event initiated
//! by the software.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_setTimestampSWTrigger(uint32_t base, uint32_t trigSelect);
//*****************************************************************************
//
//! Configures the Auxiliary Timestamp Unit with intended Triggers.
//!
//! \param base is the base address of the controller.
//! \param trigSelect is the auxiliary snapshot input to be programmed.
//! \param trigValue
//!
//! This function configures the Auxiliary Timestamp unit to store a snapshot
//! of the system time based on an external event. The snapshots taken for
//! any input are stored in a common FIFO. \e Ethernet_getAuxSnapshotTrigId()
//! can be used to know the Input/Trigger Id is for which Timestamp is
//! available for reading at the top of this FIFO.
//! \e Ethernet_dequeueAuxSnapshotFIFO() can then be used to get the 64-bit
//! timestamp. FIFO is cleared by calling \e Ethernet_clearAuxSnapshotFIFO().
//! Auxiliary timestamp snapshots can be recorded based on triggers of system
//! events to track the sequence of events as well as measure latency/delay
//! between two events and so on. The feature can then be used effectively to
//! feed further control signaling choices, trace the sequence of events for
//! debug or analysis purposes. CPU subsystem & device level exceptions like
//! NMI, causes of NMI, Error pin status can be explicitly tracked with
//! timestamp to aid debug or to report any systemic errors.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_configAuxTimestampTrigger(uint32_t base,
uint32_t trigSelect,
uint32_t trigValue);
//*****************************************************************************
//
//! Clears/Resets the Auxiliary Timestamp Snapshot FIFO.
//!
//! \param base is the base address of the controller.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_clearAuxSnapshotFIFO(uint32_t base);
//*****************************************************************************
//
//! Disable the Auxiliary Timestamping for events.
//!
//! \param base is the base address of the controller.
//! \param trigInstance denotes the Auxiliary Snapshot Trigger Instance.
//!
//! This function can be used to disable the trigger instance for which
//! Auxiliary Timestamp Snapshots need not be captured.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_disableAuxSnapshot(uint32_t base, uint32_t trigInstance);
//*****************************************************************************
//
//! Enables the Auxiliary Timestamping for events.
//!
//! \param base is the base address of the controller.
//! \param trigInstance denotes the Auxiliary Snapshot Trigger Instance.
//!
//! This function can be used to enable the trigger instance for which
//! Auxiliary Timestamp Snapshots needs to be captured.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_enableAuxSnapshot(uint32_t base, uint32_t trigInstance);
//*****************************************************************************
//
//! Read the top of Auxiliary Timestamp Snapshot FIFO.
//!
//! \param base is the base address of the controller.
//! \param seconds denotes the Higher 32 bits of the 64-bit Auxiliary Timestamp
//! stored in the Auxiliary Timestamp Snapshot FIFO.
//! \param nanoSeconds denotes the Lower 32 bits of the 64-bit Auxiliary
//! Timestamp stored in the Auxiliary Timestamp Snapshot FIFO.
//!
//! This function can be used to read the content of a 64-bit wide Auxiliary
//! Timestamp Snapshot FIFO with a depth configured as
//! \e ETHERNET_MAC_AUX_TIMESTAMP_FIFO_DEPTH. The top of the FIFO is removed
//! only when the last byte of \e ETHERNET_O_MAC_AUXILIARY_TIMESTAMP_SECONDS
//! is read.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_dequeueAuxSnapshotFIFO(uint32_t base, uint32_t *seconds,
uint32_t *nanoSeconds);
//*****************************************************************************
//
//! Get the Id of trigger instance for the top item of Auxiliary Snapshot FIFO.
//!
//! \param base is the base address of the controller.
//! \param id is pointer to the value of trigger instance identifier.
//!
//! This function can be used to identify the Auxiliary trigger inputs for
//! which the timestamp is available in the Auxiliary Snapshot FIFO.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_getAuxSnapshotTrigId(uint32_t base, uint32_t *id);
//*****************************************************************************
//!
//! Sets the action to be triggered when the target system time is reached.
//!
//! \param base is the base address of the controller.
//! \param target is the intended action upon reaching target time.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_selectTargetInterruptOrPulsePPS(uint32_t base,
uint32_t ppsNum,
uint32_t target);
//*****************************************************************************
//!
//! Sets the PPS output in fixed pulse mode.
//!
//! \param base is the base address of the controller.
//! \param freq is the frequency of the output generated on the PPS pin.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setFixedModePPS(uint32_t base, uint32_t freq);
//*****************************************************************************
//!
//! Sets the PPS output in flexible/command mode.
//!
//! \param base is the base address of the controller.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setFlexibleModePPS(uint32_t base);
//*****************************************************************************
//!
//! Sets the target and mode of PPS in one API.
//! Internally calls Ethernet_setTargetPPS(), Ethernet_setFixedModePPS() and
//! Ethernet_setFlexibleModePPS() to configure the PPS in one shot.
//!
//! \param base is the base address of the controller.
//! \param target is the intended action upon reaching target time.
//! \param mode is the PPS output mode.
//! \param fixedFreq is the frequency of the output generated on the PPS pin.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_configurePPS(uint32_t base, uint32_t target, uint32_t mode,
uint32_t fixedFreq);
//*****************************************************************************
//
//! Sets the target system time at which the next PPS interrupt/pulse is
//! generated.
//!
//! \param base is the base address of the controller.
//! \param ppsNum is the instance of the PPS.
//! \param seconds is the second value of the desired target time.
//! \param subSeconds is the subseconds value of the desired target time.
//!
//! This function may be used to schedule an interrupt/PPS at some future time.
//! The time reference for the function is the IEEE 1588 time as returned by
//! Ethernet_getSysTimePTP(). To generate an interrupt when the system
//! time exceeds a given value, call this function to set the desired time,
//! then Ethernet_selectTargetInterruptOrPulsePPS() to enable the interrupt.
//! When the system time increments past the target time, an Ethernet interrupt
//! is generated.
//!
//! The accuracy of the interrupt timing depends on the Ethernet timer
//! update frequency and the subsecond increment value currently in use. The
//! interrupt is generated on the first timer increment that causes the
//! system time to be greater than or equal to the target time set.
//!
//! \return None.
//
//*****************************************************************************
extern void Ethernet_setTargetTimePPS(uint32_t base, uint32_t ppsNum,
uint32_t seconds, uint32_t subSeconds);
//*****************************************************************************
//!
//! Sets the interval and width of the pulse that is to be generated in
//! flexible/command PPS mode.
//!
//! \param base is the base address of the controller.
//! \param ppsNum is the instance of the PPS.
//! \param width is the pulse width.
//! \param interval is the pulse interval.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setPeriodPPS(uint32_t base, uint32_t ppsNum,
uint32_t width, uint32_t interval);
//*****************************************************************************
//!
//! Programs the command to control the pulse/train start/stop behaviour
//! when PPS flexible/command mode is set.
//!
//! \param base is the base address of the controller.
//! \param ppsNum is the instance of the PPS.
//! \param ppsCmd is the command to be programmed.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setCmdPPS(uint32_t base, uint32_t ppsNum,
uint32_t ppsCmd);
//*****************************************************************************
//!
//! Programs the PTP Offload Configuration into the PTO_Control Register.
//!
//! \param base is the base address of the controller.
//! \param config is the 32 bit register value to be programmed.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_writeConfigPTPOffload(uint32_t base, uint32_t config);
//*****************************************************************************
//!
//! Returns the raw PTP Offload Configuration from the PTO_Control Register.
//!
//! \param base is the base address of the controller.
//!
//! \return 32 bit PTO_Control Register dump.
//!
//*****************************************************************************
extern uint32_t Ethernet_readConfigPTPOffload(uint32_t base);
//*****************************************************************************
//!
//! Programs the Log Message Interval register with the configuration needed
//! for sending automatic messages when PTP Offloading is enabled.
//!
//! \param base is the base address of the controller.
//! \param config is the 32 bit register value to be programmed.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_writeLogMsgIntervalPTPOffload(uint32_t base,
uint32_t config);
//*****************************************************************************
//!
//! Returns the raw Log Message Interval register value.
//!
//! \param base is the base address of the controller.
//!
//! \return 32 bit Log Message Interval Register dump.
//!
//*****************************************************************************
extern uint32_t Ethernet_readLogMsgIntervalPTPOffload(uint32_t base);
//*****************************************************************************
//!
//! Sets the bit that will trigger one-time sending of PTP Peer Delay Request
//! message by the hardware when PTP Offloading is enabled. Before PTP Offload
//! engine can send this message, it expects that the PTP header related
//! information should have been already programmed by the application.
//!
//! \param base is the base address of the controller.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setPDelayReqMsgTriggerPTPOffload(uint32_t base);
//*****************************************************************************
//!
//! Sets the bit that will trigger one-time sending of PTP SYNC
//! message by the hardware when PTP Offloading is enabled. Before PTP Offload
//! engine can send this message, it expects that the PTP header related
//! information to be already programmed by the application.
//!
//! \param base is the base address of the controller.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setSyncMsgTriggerPTPOffload(uint32_t base);
//*****************************************************************************
//!
//! To enable or disable the PTP Offload engine. Once enabled, it arms the
//! hardware to automatically send or respond to PTP messages on the line.
//! Before this feature can be used, the engine expects that the PTP header
//! related information to be already programmed by the application.
//!
//! \param base is the base address of the controller.
//! \param enableDisable is the on/off switch value that is to be programmed.
//!
//! \return None.
//!
//*****************************************************************************
extern void
Ethernet_enableDisablePTPOffload(uint32_t base,
Ethernet_PTPOffloadEnableMode enableDisable);
//*****************************************************************************
//!
//! To switch on/off multiple automatic PTP send/response messages for master
//! or slave mode.
//! Ordinary/Boundary clock: In Master mode, hardware can generate Sync or
//! Delay Response messages. Similarly, when configured in slave mode, the
//! hardware can generate automatic responses to Delay Request messages.
//! Transparent clock: Whether the hardware is configured in master or slave
//! mode, it can generate the Peer Delay Request messages or respond with
//! Peer Delay Response messages.
//!
//! \param base is the base address of the controller.
//! \param ptoModeType type of the message for which the switch setting needs
//! to be programmed. This can be any of the following automatic types:
//! 1. Delay Request/ Delay Response message generation.
//! 2. Sync message generation.
//! 3. Peer Delay Request message generation.
//! 4. Peer Delay Response message generation.
//! \param ptoModeConf is the on/off switch value corresponding to ptoModeType.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setMsgSwitchesPTPOffload(uint32_t base,
Ethernet_PTPOffloadModeType ptoModeType,
void *ptoModeConf);
//*****************************************************************************
//!
//! This API configures the Domain Number in the hardware. This is a part of
//! standard PTP Header and the hardware uses this pre-configured value
//! while sending automatic PTP messages.
//!
//! \param base is the base address of the controller.
//! \param domainNumber is the 8-bit value to be programmed in the controller.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setDomainNumberPTPOffload(uint32_t base,
uint8_t domainNumber);
//*****************************************************************************
//!
//! This API configures the Source Port Id in the hardware. This is a part of
//! standard PTP Header and the hardware uses this pre-configured value
//! while sending automatic PTP messages. This is a 10-octet value.
//!
//! \param base is the base address of the controller.
//! \param spi0 is octet 1 to octet 4 of the Source Port Id.
//! \param spi1 is octet 5 to octet 8 of the Source Port Id.
//! \param spi2 is octet 9 and octet 10 of the Source Port Id.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setSourcePortIdPTPOffload(uint32_t base,
uint32_t spi0,
uint32_t spi1,
uint32_t spi2);
//*****************************************************************************
//!
//! This API configures the periodicity of the automatically generated SYNC
//! message when the PTP node is Master. Allowed values are -15 to 15.
//! For a given value of the log sync interval (n), the time interval between
//! consective Sync packets is given by:
//! 2^(30+n) nanoSec, when -15 <= n <= -1
//! 2^n sec, when 0 <= n <= 15
//!
//! \param base is the base address of the controller.
//! \param value is actual value of periodicity to be configured.
//! Allowed values are -15 to 15. Negative value must be represented
//! in 2's-complement form. For example, if the required value is -1,
//! the value programmed must be 0xFF.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setLogSyncIntervalPTPOffload(uint32_t base, uint8_t value);
//*****************************************************************************
//!
//! This API configures the frequency of the automatically generated Delay
//! Request messages. Delay Request messages are generated by the slave node.
//! The master sends this information (logMinDelayReqInterval) in the DelayResp
//! PTP messages to the slave. The Receiver(slave) processes this value
//! from the received DelayResp messages and updates this field accordingly.
//! In the Slave mode, the host must not write/update this register unless it
//! has to override the received value.
//! \param base is the base address of the controller.
//! \param value is the 8-bit frequency value of DelayReq messages to be
//! configured. It can be one of the following:
//! 0: DelayReq generated for every received SYNC
//! 1: DelayReq generated every alternate reception of SYNC
//! 2: for every 4 SYNC messages
//! 3: for every 8 SYNC messages
//! 4: for every 16 SYNC messages
//! 5: for every 32 SYNC messages
//! 6-7: Reserved
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setDelaySyncRatioPTPOffload(uint32_t base, uint8_t value);
//*****************************************************************************
//!
//! This API configures the periodicity of the automatically generated Peer
//! Delay Request message when the node is configured as transparent clock.
//! Allowed values are -15 to 15.
//!
//! \param base is the base address of the controller.
//! \param value is actual value of periodicity to be configured.
//! Allowed values are -15 to 15. Negative value must be represented
//! in 2's-complement form. For example, if the required value is -1,
//! the value programmed must be 0xFF.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setLogMinPDelayReqIntervalPTPOffload(uint32_t base,
uint8_t value);
//*****************************************************************************
//!
//! This is a wrapper API that allows configuring the PTP Offload engine in
//! the hardware. This includes the PTP header related information such as
//! Domain Number, Source Port Id, LogSyncInterval, Delay Sync Ratio,
//! LogMinPDelayInterval. It also configures various automatic PTP message
//! switches such as Sync, Delay Request, Delay Response, Peer Delay Request.
//!
//! \param base is the base address of the controller.
//! \param ptoConfigParams is the structure that holds PTP Offload related
//! settings like source port id, domain number, log message interval,
//! automatic PTP message switches.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setConfigPTPOffload(uint32_t base,
Ethernet_PTPOffloadConfigParams ptoConfigParams);
//*****************************************************************************
//!
//! This API enables One-step timestamping feature for PTP packets over UDP.
//! PTP requires the timestamp to be captured while the packet (SFD of the
//! packet) is on the line and one step timestamp requires the origin timestamp
//! and/or correction field to be updated in the PTP header while the packet is
//! being transmitted on the line. Because the PTP message is present in the
//! UDP payload, it is not possible to update the checksum field in the UDP
//! header for modifications made to the PTP message, because it is already
//! transmitted by then.
//! Hence the hardware appends two bytes to the UDP payload and modifies those
//! two bytes in order to keep the already transmitted UDP checksum same.
//!
//! \param base is the base address of the controller.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_enableUDPChecksumUpdatePTP(uint32_t base);
//*****************************************************************************
//!
//! This API enables the correction for latency and synchronization in the
//! timestamp captured in the Receive side at the internal snapshot point. It
//! is achieved by configuring the correction value (Ingress Correction Value)
//! in the hardware. This value is always negative.
//! According to the IEEE 1588 specification, a timestamp must be captured when
//! the message timestamp point (leading edge of the first bit of the octet
//! immediately following the Start Frame Delimiter octet) crosses the boundary
//! between the node and the network.Because the reference timing source (the
//! PTP clock clk_ptp_ref_i) is different from the MAC Tx or Rx clock, the
//! captured timestamp must be corrected for latency issues because of
//! synchronization. In addition, latency issues between the internal snapshot
//! point and the recommended capture point (the boundary between the node and
//! the network), must also be corrected.
//!
//! \param base is the base address of the controller.
//! \param nanoSeconds is the Ingress Correction value to be programmed.
//! For Binary Rollover, accuracy is 1 ns. For Digital Rollover,
//! accuracy is ~0.466ns.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setIngressCorrectionPTP(uint32_t base,
int32_t nanoSeconds);
//*****************************************************************************
//!
//! This API enables the correction for latency and synchronization in the
//! timestamp captured in the Transmit side at the internal snapshot point. It
//! is achieved by configuring the correction value (Egress Correction Value)
//! in the hardware.
//! According to the IEEE 1588 specification, a timestamp must be captured when
//! the message timestamp point (leading edge of the first bit of the octet
//! immediately following the Start Frame Delimiter octet) crosses the boundary
//! between the node and the network. Because the reference timing source (the
//! PTP clock clk_ptp_ref_i) is different from the MAC Tx or Rx clock, the
//! captured timestamp must be corrected for latency issues because of
//! synchronization. In addition, latency issues between the internal snapshot
//! point and the recommended capture point (the boundary between the node and
//! the network), must also be corrected.
//!
//! \param base is the base address of the controller.
//! \param nanoSeconds is the Egress Correction value to be programmed.
//! For Binary Rollover, accuracy is 1 ns. For Digital Rollover,
//! accuracy is ~0.466ns.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setEgressCorrectionPTP(uint32_t base,
int32_t nanoSeconds);
//*****************************************************************************
//!
//! This API fetches the 80-bit timestamp from the hardware. IEEE 1588-2008
//! defines a reference time in 64-bit format whereas IEEE 1588-2002 defines
//! an 80-bit format. Further the PTP subsystem provides two input sources:
//! 1. External Timestamp Input (Only 64 bit)
//! 2. Internal Timestamp Input (80 bit)
//! The timestamp maintained in the hardware is 64-bit wide. The overflow
//! to upper 16-bits of seconds register happens once in 130 years. The
//! values of the upper 16-bits of the seconds field are exposed through
//! this API.
//!
//! \param base is the base address of the controller.
//! \param higherWord is the upper 16-bits of seconds value.
//! \param seconds is the lower 32-bits of seconds value.
//! \param subSeconds is the 32-bit subSecond(nanoseconds) value.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_getSysTimeWithHigherWordPTP(uint32_t base,
uint32_t *higherWord,
uint32_t *seconds,
uint32_t *subSeconds);
//*****************************************************************************
//!
//! This API programs the Egress correction with sub-nanoseconds accuracy.
//! The fractional part of the egress correction value represents the
//! sub-nanoseconds value that needs to be programmed. The integer part
//! represents the nanoseconds value.
//!
//! \param base is the base address of the controller.
//! \param nanoSeconds is the floating point nanosecond value from which the
//! fractional part is extrapolated by multiplying with 2^8 and
//! programmed in the hardware.
//!
//! \return None.
//!
//*****************************************************************************
extern void Ethernet_setSubNanosecEgressCorrectionPTP(uint32_t base,
float nanoSeconds);
//*****************************************************************************
//!
//! This API programs the Ingress correction with sub-nanoseconds accuracy.
//! The fractional part of the Ingress correction value represents the
//! sub-nanoseconds value that needs to be programmed. The integer part
//! represents the nanoseconds value.
//!
//! \param base is the base address of the controller.
//! \param nanoSeconds is the floating point nanosecond value from which the
//! fractional part is extrapolated by multiplying with 2^8 and
//! programmed in the hardware.
//!
//! \return None.
//*****************************************************************************
extern void Ethernet_setSubNanosecIngressCorrectionPTP(uint32_t base,
float nanoSeconds);
//*****************************************************************************
//!
//! This API programs the Asymmetric Egress correction value in nanosecs
//! which is subtracted from the correction field of the PTP packet being
//! transmitted on the line.
//!
//! \param base is the base address of the controller.
//! \param nanoSeconds is the floating point nanosecond value which is to be
//! subtracted from the correction field of the outgoing PTP packet.
//!
//! \return None.
//*****************************************************************************
extern void Ethernet_setAsymEgressCorrectionPTP(uint32_t base,
float nanoSeconds);
//*****************************************************************************
//!
//! This API programs the Asymmetric Ingress correction value in nanosecs
//! which is added to the correction field of the PTP packet being received
//! on the line.
//!
//! \param base is the base address of the controller.
//! \param nanoSeconds is the floating point nanosecond value which is to be
//! added to the correction field of the incoming PTP packet.
//!
//! \return None.
//*****************************************************************************
extern void Ethernet_setAsymIngressCorrectionPTP(uint32_t base,
float nanoSeconds);
//*************************************************************************
//! Ethernet_isTimestampIntActive()
//!
//! This API checks whether the source of an interrupt (generic) is
//! timestamp based. A Timestamp interrupt may arise due to following
//! reasons:
//! 1. Transmit timestamp is captured for a packet when PTP Offload mode is
//! enabled.
//! 2. The system time value is equal to or exceeds the value specified in
//! the Target Time High and Low registers.
//! 3. There is an overflow in the Seconds register.
//! 4. Target Time Error occurred, that is, programmed target time already
//! elapsed.
//! 5. Auxiliary snapshot trigger is asserted when Auxiliary Snapshot
//! feature is enabled.
//!
//! \param none
//!
//! \return \e true if the Timestamp Interrupt Status bit is set.
//! \e false if the Timestamp Interrupt Status bit is reset.
//
//************************************************************************
extern bool Ethernet_isTimestampIntActive(void);
//*************************************************************************
//! Ethernet_isTransmitTimestampStatusSet()
//!
//! This API checks whether the source of the timestamp interrupt is
//! "Transmit timestamp is captured for a packet when PTP Offload mode is
//! enabled."
//! If it is set, the application shall use the \e
//! Ethernet_getOneStepTransmitTimestampPTP() API to read the captured
//! timestamp for the transmitted packet.
//! Note that this Transmit Timestamp Status will be reset only if the
//! captured timestamp is read by calling above API.
//!
//! \param none
//!
//! \return \e true if the Transmit Timestamp Status bit is set.
//! \e false if the Transmit Timestamp Status bit is reset.
//
//************************************************************************
extern bool Ethernet_isTransmitTimestampStatusSet(void);
//
//MDIO Functions
//
//***************************************************************************
//
//! Configures the Parameters of MDIO/Station Management Interface
//!
//! The MDIO interface is used to access the external PHY
//! \param base - Base Address of the Ethernet Module
//! \param clockHigh
//! - \b 0 - for Lower frequency ranges between 1Mhz to 2.5 Mhz range
//! - \b 1- for higher frequency ranges
//! as programmed in clockRange parameter
//!
//! \param clockRange- following are the allowed values
//! - \b 0-5 with clockHigh 0 configures between 1 Mhz to 2.5 Mhz Range
//! - \b 0-7 with clockHigh 1 For higher Frequency ranges,
//! refer TRM other values are reserved
//! \param clause45Enable
//! - \b 0 -Operates Clause22 Mode
//! - \b 1 - Operates in Clause45 Mode
//! \return None
//
//***************************************************************************
extern void Ethernet_configureMDIO(uint32_t base,
uint32_t clockHigh,
uint32_t clockRange,
uint32_t clause45Enable
);
//************************************************************************
//! Configures the Address of PHY which is addressed by this MAC
//! For RevMII Interface mode, this API configures the address of
//! RevMII module as to be programmed from the other MAC
//! \param base Base Address of the Ethernet Module
//! \param phyAddr Address of the PHY
//! 0-31 are valid addresses. Other values are reserved
//! \return None
//***********************************************************************
extern void Ethernet_configurePHYAddress(uint32_t base,
uint8_t phyAddr);
extern uint8_t Ethernet_getPHYMode(uint32_t base);
extern uint16_t Ethernet_readPHYRegister(uint32_t base,
uint16_t regAddress);
extern void Ethernet_writePHYRegister(uint32_t base,
uint8_t regAddress,
uint16_t writeData);
//*************************************************************************
//
// Ethernet_setMACAddr
//
//! \param
//! base: Base Address of Ethernet module
//! instanceNum : 0-3 , the instance of MAC address register to be programmed
//! MacAddr High : Higher two bytes of MAC address in the lower two bytes
//! Higher 16 bits are ignored
//! MacAddrLow : Lower 4 bytes of the MAC address
//! channelNum DMA Channel number to which this is mapped
//! Function to program the MAC Address
//! \return none
//
//************************************************************************
void Ethernet_setMACAddr(uint32_t base, uint8_t instanceNum,
uint32_t MACAddrHigh, uint32_t MACAddrLow,
Ethernet_ChannelNum channelNum);
//**********************************************************************
//! Gives the MAC address of the instance passed
//!
//! \param base Base Address of the Ethernet Module
//! \param instanceNum instance number of MAC address
//! 0-3 are valid instance numbers
//! \param MACAddrHigh Higher two bytes of MAC address
//! in the lower nibble
//! \param MACAddrLow Lower word of MAC address bytes
//! \return None
//***********************************************************************
extern void Ethernet_getMACAddr(uint32_t base,
uint8_t instanceNum,
uint32_t *macAddrHigh,
uint32_t *macAddrLow);
//**********************************************************************
//! Clears the Interrupt flags of the specific DMA Channel number
//!
//! \param base Base Address of the Ethernet Module
//! \param ChannelNum Channel number of DMA
//! 0,1 are valid Channel Numbers
//! \param flags ORed value of flags to be cleared
//! the set flags will be cleared in the DMA Channel
//! \return None
//***********************************************************************
extern void Ethernet_clearDMAChannelInterrupt(uint32_t base,
uint32_t channelNum,
uint32_t flags);
//***************************************************************************
//! This function helps to enable specified flags in
//! DMA_CH0_INTERRUPT_ENABLE register of the Ethernet Module
//!
//! \param baseAddress Base Address of the Ethernet modules
//! \param channelNum Channel number which has to be programmed 0 or 1
//! \param flags ORed Flags of the Register to be enabled
//! \return none
//**************************************************************************
extern void Ethernet_enableDmaInterrupt(uint32_t baseAddress,
uint32_t channelNum,
uint32_t flags);
//***************************************************************************
//! This function helps to disable specified flags in
//! DMA_CHn_INTERRUPT_ENABLE register of the Ethernet Module
//!
//! \param baseAddress Base Address of the Ethernet modules
//! \param channelNum Channel number which has to be programmed 0 or 1
//! \param flags ORed Flags of the Register to be enabled. Example:
//! ETHERNET_DMA_CH0_INTERRUPT_ENABLE_TBUE,
//! ETHERNET_DMA_CH0_INTERRUPT_ENABLE_NIE,
//! ETHERNET_DMA_CH0_INTERRUPT_ENABLE_RBUE.
//! \return none
//**************************************************************************
extern void Ethernet_disableDmaInterrupt(uint32_t baseAddress,
uint32_t channelNum,
uint32_t flags);
//***************************************************************************
//! This function helps to enable specified flags in
//! MTL_Qn_INTERRUPT_CONTROL_STATUS register of the Ethernet Module
//!
//! \param baseAddress Base Address of the Ethernet modules
//! \param queueNum Queue number which has to be programmed 0 or 1
//! \param flags ORed Flags of the Register to be enabled. Example:
//! ETHERNET_MTL_Q0_INTERRUPT_CONTROL_STATUS_RXOIE,
//! ETHERNET_MTL_Q0_INTERRUPT_CONTROL_STATUS_TXUIE,
//! ETHERNET_MTL_Q0_INTERRUPT_CONTROL_STATUS_RXOVFIS.
//! \return none
//**************************************************************************
extern void Ethernet_enableMTLInterrupt(uint32_t baseAddress,
uint32_t queueNum,
uint32_t flags);
//***************************************************************************
//! This function disables the DMA from receiving anymore packets from fifo
//!
//! \param baseAddress Base Address of the Ethernet modules
//! \param channelNum Channel number which has to be programmed 0 or 1
//! \return none
//**************************************************************************
extern void Ethernet_disableRxDMAReception(uint32_t base,
uint8_t channelNum);
//***************************************************************************
//! This function enables the DMA for receiving packets from fifo
//!
//! \param baseAddress Base Address of the Ethernet modules
//! \param channelNum Channel number which has to be programmed 0 or 1
//! \return none
//**************************************************************************
extern void Ethernet_enableRxDMAReception(uint32_t base,
uint8_t channelNum);
//*************************************************************************
//! This function sets the Transmit Descriptor Tail Pointer of the Transmit
//! DMA Ring. Configures the End of Tx Descriptor Ring
//! \param baseAddress Base Address of Ethernet module
//! \param channelNum the channel number of the register to be configured
//! 0,1 are valid Channel numbers
//! \param write_data pointer to the Descriptor
//! 32 bit pointer to the hardware descriptor structure
//! \return none
//*************************************************************************
extern void Ethernet_writeTxDescTailPointer(uint32_t baseAddress,
uint32_t channelNum, Ethernet_HW_descriptor *write_data);
//**********************************************************************
//! This sets the Transmit Start Bit in DMA Channel Tx Control
//! Register
//! \param base Base Address of the Ethernet Module
//! \param channelNum instance number of DMA channel
//! 0,1 are valid Channel Numbers
//! \return None
//**********************************************************
void Ethernet_setDMAChannelTransmitStart(uint32_t base, uint32_t channelNum);
//**********************************************************************
//! This returns the Count of the Fragments which have been DMAed
//! in the packet which is currently being written by DMA from line
//! This is typically used in Early Receive Interrupt (Generic Interrupt)
//! handling to identify how many chunks(programmed Buffer size)
//! has been received during Threshold mode/Early Receive interrupt handling.
//! This shall be reset if the Receive Completion interrupt has been
//! asserted for the current packet
//!
//! \param base Base Address of the Ethernet Module
//! \param channelNum instance number of DMA channel
//! 0,1 are valid Channel Numbers
//! \return 16 bit value of number of chunks received in current packet
//***********************************************************************
extern uint16_t Ethernet_getRxERICount(uint32_t base, uint32_t channelNum);
//***********************************************************************
//! Ethernet_addPacketsIntoRxQueue
//!
//! \param:
//! channelDescPtr - Pointer to Channel Descriptor Structure
//! to which the Receive buffer has to be enqueued
//! This function calls the higher layer callback function to get the buffers
//! for receive from application and queues them up in Desc Queue
//! For the Receive channels the Wait queue is not used only the Desc Queue
//! is used by the driver
//! \return none
//***********************************************************************
extern void Ethernet_addPacketsIntoRxQueue(Ethernet_DescCh *channelDescPtr);
//**********************************************************************
//! Ethernet_removePacketsFromRxQueue()
//!
//! \param
//! channelDescPtr - Receive channel Desctiptor Pointer from which the
//! Packet has to be Defines
//! completionMode
//!
//! This function is called from the Receive Completion Interrupt Handler
//! This fills the PacketDescriptor Structure for handing over the packet
//! And fills with the received packet details
//! Calls the Receive Packet Callback function provided by higher layer
//! \return None
//**********************************************************************
extern void Ethernet_removePacketsFromRxQueue(Ethernet_DescCh *channelDescPtr,
Ethernet_CompletionMode completionMode);
//*************************************************************************
//
// Ethernet_writeRxDescTailPointer
//
//! \param
//! baseAddress: Base Address of Ethernet module
//! channelNum : 0 or 1, the channel number of the register to be configured
//! write_data : pointer to the Descriptor
//! Function to write to DMA_CHx_RXDESC_TAIL_POINTER register
//! This configures the beginning of Rx Descriptor Ring
//! \return none
//
//*************************************************************************
extern void Ethernet_writeRxDescTailPointer(uint32_t baseAddress,
uint32_t channelNum, Ethernet_HW_descriptor *write_data);
//**********************************************************************
//! Enables the Flow Control in the Transmit Path for the given
//! queue number
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return None
//***********************************************************************
static inline void Ethernet_enableTransmitFlowControl(uint32_t base,
uint8_t queueNum)
{
//
//Set the Transmit Flow Control Enable bit
//This is applicable to both Full duplex and
//Half duplex modes
//Subsequent Queue registers are offset by 0x4 in
//the register memory map
//
HWREG(base + ETHERNET_O_MAC_Q0_TX_FLOW_CTRL + (queueNum*4U)) |=
ETHERNET_MAC_Q0_TX_FLOW_CTRL_TFE;
}
//**********************************************************************
//! Disables the Flow Control in the Transmit Path for the given
//! queue number
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return None
//***********************************************************************
static inline void Ethernet_disableTransmitFlowControl(uint32_t base,
uint8_t queueNum)
{
//
//Clear the Transmit Flow Control Enable bit
//This is applicable to both Full duplex and
//Half duplex modes
//Subsequent Queue registers are offset by 0x4 in
//the register memory map
//
HWREG(base + ETHERNET_O_MAC_Q0_TX_FLOW_CTRL + (queueNum*4U)) &=
~ETHERNET_MAC_Q0_TX_FLOW_CTRL_TFE;
}
//**********************************************************************
//! Programs the Pause Time in the Transmit Path for the given
//! queue number. This shall be used when sending Pause Packets
//! in full duplex mode for Flow control. The MAC Address 0 shall
//! be used as the source address
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \param pauseTime 16 bit Pause Time to be used in the Pause packets
//!
//! \return None
//***********************************************************************
static inline void Ethernet_setTransmitPauseTime(uint32_t base,
uint8_t queueNum,
uint16_t pauseTime)
{
HWREG(base + ETHERNET_O_MAC_Q0_TX_FLOW_CTRL + (queueNum * 4U)) &=
~ETHERNET_MAC_Q0_TX_FLOW_CTRL_PT_M;
HWREG(base + ETHERNET_O_MAC_Q0_TX_FLOW_CTRL + (queueNum * 4U)) |=
pauseTime << ETHERNET_MAC_Q0_TX_FLOW_CTRL_PT_S;
}
//**********************************************************************
//! Triggers the Flow Control in the Transmit Path for the given
//! queue number. In full duplex mode this results in Pause Frame
//! sent on the line and in half duplex mode the Back pressure
//! is activated. This API should not be called when the Flow control
//! is already in progress. Use Ethernet_getTransmitFlowControlStatus()
//! to get the status and call this if Flow control is not active
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return None
//***********************************************************************
static inline void Ethernet_triggerTransmitFlowControl(uint32_t base,
uint8_t queueNum)
{
//
//This triggers transmit of Pause frames in full duplex mode
//or activation of back presssure in half duplex mode
//
HWREG(base + ETHERNET_O_MAC_Q0_TX_FLOW_CTRL + (queueNum * 4U)) |=
ETHERNET_MAC_Q0_TX_FLOW_CTRL_FCB_BPA;
}
//**********************************************************************
//! Gives the Transmit Flow control Status of the given Queue
//! This API can be used before calling Ethernet_triggerTransmitFlowControl()
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return 0 if Flow Control is not active
//! 1 if Flow Control is active
//***********************************************************************
static inline uint8_t Ethernet_getTransmitFlowControlStatus(uint32_t base,
uint8_t queueNum)
{
return(HWREG(base + ETHERNET_O_MAC_Q0_TX_FLOW_CTRL + (queueNum * 4U)) &
ETHERNET_MAC_Q0_TX_FLOW_CTRL_FCB_BPA);
}
//**********************************************************************
//! This API enables the Hardware Flow Control Mechanism in the receive Path
//! When a Pause Packet is received in Full duplex mode,the flow control
//! mechanism is triggered in Transmit path. For Half Duplex mode
//! the pause packets are only detected as control Packets.
//! It may be practically efficient to use this feature if the Receive Queue
//! size is 4K bytes.
//! By default only Pause Packets with special MAC address 0180C2000001
//! If unicast Pause Packets are to be handled then use
//! Ethernet_enableUnicastPauseFrameDetect() API to enable Unicast Pause.
//! Suggested use after calling Ethernet_enableMACReceiveFlowControl()
//! after enabling Receive Flow Control at MAC level.and configuring the
//! thresholds using Ethernet_configureReceiveFlowcontrol() API.
//! To disable the same use Ethernet_disableReceiveFlowControl() API
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return None
//***********************************************************************
static inline void Ethernet_enableReceiveFlowControl(uint32_t base,
uint8_t queueNum)
{
//
//Enable the Hardware Flow Control
//
HWREG(base + ETHERNET_O_MTL_RXQ0_OPERATION_MODE +
(queueNum * ETHERNET_QUEUE_OFFSET)) |=
ETHERNET_MTL_RXQ0_OPERATION_MODE_EHFC;
}
//**********************************************************************
//! This API disables the Hardware Flow Control Mechanism in the receive Path
//! To Enable use Ethernet_disableReceiveFlowControl()
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return None
//***********************************************************************
static inline void Ethernet_disableReceiveFlowControl(uint32_t base,
uint8_t queueNum)
{
//
//Clear the EHFC bit for the queueNumber provided
//
HWREG(base + ETHERNET_O_MTL_RXQ0_OPERATION_MODE +
(queueNum * ETHERNET_QUEUE_OFFSET)) &=
~ETHERNET_MTL_RXQ0_OPERATION_MODE_EHFC;
}
//**********************************************************************
//! This API configures the parameters for the Hardware Flow Control Mechanism
//! in the receive Path of the Receive Queue
//! When a Pause Packet is received in Full duplex mode,the flow control
//! mechanism is triggered in Transmit path. For Half Duplex mode
//! the pause packets are only detected as control Packets
//! The Activation level controls when it is triggered and Deactivation level
//! controls when it is deactivated.
//!
//! \param base Base Address of the Ethernet Module
//! \param queueNum instance number of MAC address
//! 0,1 are valid queue Numbers
//! \return None
//***********************************************************************
static inline void Ethernet_configureReceiveFlowcontrol(uint32_t base,
uint8_t queueNum,
Ethernet_ReceiveFlowControlLevel activationLevel,
Ethernet_ReceiveFlowControlLevel deActivationLevel)
{
//
//First clear the contents of the Activation and Deactivation
//Levels
//
HWREG(base + (queueNum * ETHERNET_QUEUE_OFFSET) +
ETHERNET_O_MTL_RXQ0_OPERATION_MODE) &=
~ETHERNET_MTL_RXQ0_OPERATION_MODE_RFA_M;
HWREG(base + (queueNum * ETHERNET_QUEUE_OFFSET) +
ETHERNET_O_MTL_RXQ0_OPERATION_MODE) &=
~ETHERNET_MTL_RXQ0_OPERATION_MODE_RFD_M;
//
//Program the Threshold levels
//
HWREG(base + (queueNum * ETHERNET_QUEUE_OFFSET) +
ETHERNET_O_MTL_RXQ0_OPERATION_MODE) |=
(uint8_t)activationLevel << ETHERNET_MTL_RXQ0_OPERATION_MODE_RFA_S;
//
//Deactivation level for Receive Flow Control
//
HWREG(base + (queueNum * ETHERNET_QUEUE_OFFSET) +
ETHERNET_O_MTL_RXQ0_OPERATION_MODE) |=
(uint8_t)deActivationLevel << ETHERNET_MTL_RXQ0_OPERATION_MODE_RFD_S;
}
//**********************************************************************
//! This API enables the Receive Flow control at MAC Level
//!
//! \param base Base Address of the Ethernet Module
//! \return None
//***********************************************************************
static inline void Ethernet_enableMACReceiveFlowControl(uint32_t base)
{
HWREG(base + ETHERNET_O_MAC_RX_FLOW_CTRL) |=
ETHERNET_MAC_RX_FLOW_CTRL_RFE;
}
//**********************************************************************
//! This API disables the Receive Flow control at MAC Level
//!
//! \param base Base Address of the Ethernet Module
//! \return None
//***********************************************************************
static inline void Ethernet_disableMACReceiveFlowControl(uint32_t base)
{
HWREG(base + ETHERNET_O_MAC_RX_FLOW_CTRL) &=
~ETHERNET_MAC_RX_FLOW_CTRL_RFE;
}
//**********************************************************************
//! This API enables the Received unicast Pause Packets to be treated
//! as Flow control packets. By default only the Multicast address
//! pause packets are treated as Flow Control Packets
//! This API enables MAC Address 0 also to be considered as a unicast
//!
//! \param base Base Address of the Ethernet Module
//! \return None
//***********************************************************************
static inline void Ethernet_enableUnicastPauseFrameDetect(uint32_t base)
{
HWREG(base + ETHERNET_O_MAC_RX_FLOW_CTRL) |=
ETHERNET_MAC_RX_FLOW_CTRL_UP;
}
//**********************************************************************
//! This API disables the Received unicast Pause Packets to be treated
//! as Flow control packets. Only the special Multicast address
//! pause packets are treated as Flow Control Packets
//! This API enables MAC Address 0 also to be considered as a unicast
//!
//! \param base Base Address of the Ethernet Module
//! \return None
//***********************************************************************
static inline void Ethernet_disableUnicastPauseFrameDetect(uint32_t base)
{
HWREG(base + ETHERNET_O_MAC_RX_FLOW_CTRL) &=
~ETHERNET_MAC_RX_FLOW_CTRL_UP;
}
//*****************************************************************************
//
// Close the Doxygen group
//! @}
//
//****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif