summaryrefslogtreecommitdiff
path: root/include/arch/rm46l8lp/halcogen/emac.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/arch/rm46l8lp/halcogen/emac.h')
-rw-r--r--include/arch/rm46l8lp/halcogen/emac.h404
1 files changed, 404 insertions, 0 deletions
diff --git a/include/arch/rm46l8lp/halcogen/emac.h b/include/arch/rm46l8lp/halcogen/emac.h
new file mode 100644
index 0000000..c568cd7
--- /dev/null
+++ b/include/arch/rm46l8lp/halcogen/emac.h
@@ -0,0 +1,404 @@
+/**
+ * \file emac.h
+ *
+ * \brief EMAC APIs and macros.
+ *
+ * This file contains the driver API prototypes and macro definitions.
+ */
+
+/*
+* Copyright (C) 2009-2018 Texas Instruments Incorporated - 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 __EMAC_H__
+#define __EMAC_H__
+
+/* USER CODE BEGIN (0) */
+/* USER CODE END */
+
+#include "sys_common.h"
+#include "hw_reg_access.h"
+#include "hw_emac.h"
+#include "hw_emac_ctrl.h"
+#include "mdio.h"
+#include "phy_dp83640.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* USER CODE BEGIN (1) */
+/* USER CODE END */
+
+/*****************************************************************************/
+/*
+** Macros which can be used as speed parameter to the API EMACRMIISpeedSet
+*/
+#define EMAC_RMIISPEED_10MBPS (0x00000000U)
+#define EMAC_RMIISPEED_100MBPS (0x00008000U)
+
+/* Macros for enabling taken as inputs from HALCoGen GUI. */
+#define EMAC_TX_ENABLE (1U)
+#define EMAC_RX_ENABLE (1U)
+#define EMAC_MII_ENABLE (1U)
+#define EMAC_FULL_DUPLEX_ENABLE (1U)
+#define EMAC_LOOPBACK_ENABLE (0U)
+#define EMAC_BROADCAST_ENABLE (1U)
+#define EMAC_UNICAST_ENABLE (1U)
+#define EMAC_CHANNELNUMBER (0U)
+#define EMAC_PHYADDRESS (0U)
+
+/*
+ * Macros to indicate EMAC Channel Numbers
+ */
+#define EMAC_CHANNEL_0 (0x00000000U)
+#define EMAC_CHANNEL_1 (0x00000001U)
+#define EMAC_CHANNEL_2 (0x00000002U)
+#define EMAC_CHANNEL_3 (0x00000003U)
+#define EMAC_CHANNEL_4 (0x00000004U)
+#define EMAC_CHANNEL_5 (0x00000005U)
+#define EMAC_CHANNEL_6 (0x00000006U)
+#define EMAC_CHANNEL_7 (0x00000007U)
+/* Macros which can be used as duplexMode parameter to the API
+** EMACDuplexSet
+*/
+#define EMAC_DUPLEX_FULL (0x00000001U)
+#define EMAC_DUPLEX_HALF (0x00000000U)
+
+/*
+** Macros which can be used as matchFilt parameters to the API
+** EMACMACAddrSet
+*/
+/* Address not used to match/filter incoming packets */
+#define EMAC_MACADDR_NO_MATCH_NO_FILTER (0x00000000U)
+
+/* Address will be used to filter incoming packets */
+#define EMAC_MACADDR_FILTER (0x00100000U)
+
+/* Address will be used to match incoming packets */
+#define EMAC_MACADDR_MATCH (0x00180000U)
+
+/*
+** Macros which can be passed as eoiFlag to EMACRxIntAckToClear API
+*/
+#define EMAC_INT_CORE0_RX (0x1U)
+#define EMAC_INT_CORE1_RX (0x5U)
+#define EMAC_INT_CORE2_RX (0x9U)
+
+/*
+** Macros which can be passed as eoiFlag to EMACTxIntAckToClear API
+*/
+#define EMAC_INT_CORE0_TX (0x2U)
+#define EMAC_INT_CORE1_TX (0x6U)
+#define EMAC_INT_CORE2_TX (0xAU)
+/* Base Addresses */
+#define EMAC_CTRL_RAM_0_BASE 0xFC520000U
+#define EMAC_0_BASE 0xFCF78000U
+#define EMAC_CTRL_0_BASE 0xFCF78800U
+#define MDIO_0_BASE 0xFCF78900U
+
+/*MAC address length*/
+#define EMAC_HWADDR_LEN 6U
+#define MAX_EMAC_INSTANCE 1U
+#define SIZE_EMAC_CTRL_RAM 0x2000U
+#define MAX_TRANSFER_UNIT 1514U
+#define MAX_RX_PBUF_ALLOC (10U)
+#define MIN_PKT_LEN 60U
+#define MIN_PACKET_SIZE (46U)
+
+
+
+
+#define EMAC_BUF_DESC_OWNER 0x20000000U
+#define EMAC_BUF_DESC_SOP 0x80000000U
+#define EMAC_BUF_DESC_EOP 0x40000000U
+#define EMAC_BUF_DESC_EOQ 0x10000000U
+
+#define EMAC_NETSTATREGS(n) ((uint32)0x200U + (uint32)((n)*4U))
+
+/* Error Signalling Macros */
+#define EMAC_ERR_CONNECT 0x2U /* Not connected. */
+#define EMAC_ERR_OK 0x1U /* No error, everything OK. */
+
+
+/* Macros for Configuration Value Registers */
+#define EMAC_TXCONTROL_CONFIGVALUE 0x00000001U
+#define EMAC_RXCONTROL_CONFIGVALUE 0x00000001U
+#define EMAC_TXINTMASKSET_CONFIGVALUE 0x00000001U
+#define EMAC_TXINTMASKCLEAR_CONFIGVALUE 0x00000001U
+#define EMAC_RXINTMASKSET_CONFIGVALUE 0x00000001U
+#define EMAC_RXINTMASKCLEAR_CONFIGVALUE 0x00000001U
+#define EMAC_MACSRCADDRHI_CONFIGVALUE ((uint32)((uint32)0xFFU << 24U) | (uint32)((uint32)0xFFU << 16U) | (uint32)((uint32)0xFFU << 8U) | (uint32)((uint32)0xFFU))
+#define EMAC_MACSRCADDRLO_CONFIGVALUE ((uint32)((uint32)0xFFU << 8U) | (uint32)((uint32)0xFFU))
+#define EMAC_MDIOCONTROL_CONFIGVALUE 0x4114001FU
+#define EMAC_C0RXEN_CONFIGVALUE 0x00000001U
+#define EMAC_C0TXEN_CONFIGVALUE 0x00000001U
+
+/* Structure to store pending status from the Tx Interrupt Status Registers. */
+typedef struct emac_tx_int_status{
+ volatile uint32 intstatmasked; /* Pending interrupt status read from the Transmit Interrupt Status (Masked) Register (TXINTSTATMASKED) */
+ volatile uint32 intstatraw; /* Pending interrupt status read from the Transmit Interrupt Status (Unmasked) Register (TXINTSTATRAW) */
+}emac_tx_int_status_t;
+
+/* Structure to store pending status from the Rx Interrupt Status Registers. */
+typedef struct emac_rx_int_status{
+
+ volatile uint32 intstatmasked_pend; /* Reads RXnPEND value from the Receive Interrupt Status (Unmasked) Register (RXINTSTATRAW) */
+ volatile uint32 intstatmasked_threshpend; /* Reads RXnTRHESHPEND value from the Receive Interrupt Status (Unmasked) Register (RXINTSTATRAW) */
+
+ volatile uint32 intstatraw_pend; /* Reads RXnPEND value from the Receive Interrupt Status (Unmasked) Register (RXINTSTATRAW) */
+ volatile uint32 intstatraw_threshpend; /* Reads RXnTRHESHPEND value from the Receive Interrupt Status (Unmasked) Register (RXINTSTATRAW) */
+
+}emac_rx_int_status_t;
+
+/* EMAC TX Buffer descriptor data structure - Refer TRM for details about the buffer descriptor structure.*/
+typedef struct emac_tx_bd {
+ volatile struct emac_tx_bd *next;
+ volatile uint32 bufptr; /* Pointer to the actual Buffer storing the data to be transmitted. */
+ volatile uint32 bufoff_len; /*Buffer Offset and Buffer Length (16 bits each) */
+ volatile uint32 flags_pktlen; /*Status flags and Packet Length. (16 bits each)*/
+}emac_tx_bd_t;
+
+/* EMAC RX Buffer descriptor data structure - Refer TRM for details about the buffer descriptor structure. */
+typedef struct emac_rx_bd {
+ volatile struct emac_rx_bd *next; /*Used as a pointer for next element in the linked list of descriptors.*/
+ volatile uint32 bufptr; /*Pointer to the actual Buffer which will store the received data.*/
+ volatile uint32 bufoff_len; /*Buffer Offset and Buffer Length (16 bits each)*/
+ volatile uint32 flags_pktlen; /*Status flags and Packet Length. (16 bits each)*/
+}emac_rx_bd_t;
+
+/**
+ * Helper struct to hold the data used to operate on a particular
+ * receive channel
+ */
+typedef struct rxch_struct {
+ volatile emac_rx_bd_t *free_head; /*Used to point to the free buffer descriptor which can receive new data.*/
+ volatile emac_rx_bd_t *active_head; /*Used to point to the active descriptor in the chain which is receiving.*/
+ volatile emac_rx_bd_t *active_tail; /*Used to point to the last descriptor in the chain.*/
+}rxch_t;
+
+/**
+ * Helper struct to hold the data used to operate on a particular
+ * transmit channel
+ */
+typedef struct txch_struct {
+ volatile emac_tx_bd_t *free_head; /*Used to point to the free buffer descriptor which can transmit new data.*/
+ volatile emac_tx_bd_t *active_tail; /*Used to point to the last descriptor in the chain.*/
+ volatile emac_tx_bd_t *next_bd_to_process; /*Used to point to the next descriptor in the chain to be processed.*/
+}txch_t;
+/**
+ * Helper struct to hold private data used to operate the ethernet interface.
+ */
+typedef struct hdkif_struct {
+ /* MAC Address of the Module. */
+ uint8_t mac_addr[6];
+
+ /* emac base address */
+ uint32 emac_base;
+
+ /* emac controller base address */
+ volatile uint32 emac_ctrl_base;
+ volatile uint32 emac_ctrl_ram;
+
+ /* mdio base address */
+ volatile uint32 mdio_base;
+
+ /* phy parameters for this instance - for future use */
+ uint32 phy_addr;
+ boolean (*phy_autoneg)(uint32 param1, uint32 param2, uint16 param3);
+ boolean (*phy_partnerability)(uint32 param4, uint32 param5, uint16* param6);
+
+ /* The tx/rx channels for the interface */
+ txch_t txchptr;
+ rxch_t rxchptr;
+}hdkif_t;
+
+/*Ethernet Frame Structure */
+typedef struct ethernet_frame
+{
+ uint8 dest_addr[6]; /* Destination MAC Address */
+ uint8 src_addr[6]; /*Source MAC Address. */
+ uint16 frame_length; /* Data Frame Length */
+ uint8 data[1500]; /* Data */
+}ethernet_frame_t;
+
+/* Struct used to take packet data input from the user for transmit APIs. */
+typedef struct pbuf_struct {
+ /** next pbuf in singly linked pbuf chain */
+ struct pbuf_struct *next;
+
+ /**
+ * Pointer to the actual ethernet packet/packet fragment to be transmitted.
+ * The packet needs to be in the following format:
+ * |Destination MAC Address (6 bytes)| Source MAC Address (6 bytes)| Length/Type (2 bytes)| Data (46- 1500 bytes)
+ * The data can be split up over multiple pbufs which are linked as a linked list.
+ **/
+ uint8 *payload;
+
+ /**
+ * total length of this buffer and all next buffers in chain
+ * belonging to the same packet.
+ *
+ * For non-queue packet chains this is the invariant:
+ * p->tot_len == p->len + (p->next? p->next->tot_len: 0)
+ */
+ uint16 tot_len;
+
+ /** length of this buffer */
+ uint16 len;
+
+}pbuf_t;
+
+/* Structure to hold the values of the EMAC Configuration Registers. */
+typedef struct emac_config_reg_struct {
+/* EMAC Module Register Values */
+uint32 TXCONTROL; /* Transmit Control Register. */
+uint32 RXCONTROL; /* Receive Control Register */
+uint32 TXINTMASKSET; /* Transmit Interrupt Mask Set Register */
+uint32 TXINTMASKCLEAR; /* Transmit Interrupt Clear Register */
+uint32 RXINTMASKSET; /* Receive Interrupt Mask Set Register */
+uint32 RXINTMASKCLEAR; /*Receive Interrupt Mask Clear Register*/
+uint32 MACSRCADDRHI; /*MAC Source Address High Bytes Register*/
+uint32 MACSRCADDRLO; /*MAC Source Address Low Bytes Register*/
+
+/*MDIO Module Registers */
+uint32 MDIOCONTROL; /*MDIO Control Register. */
+
+/* EMAC Control Module Registers */
+uint32 C0RXEN; /*EMAC Control Module Receive Interrupt Enable Register*/
+uint32 C0TXEN; /*EMAC Control Module Transmit Interrupt Enable Register*/
+}emac_config_reg_t;
+/*****************************************************************************/
+/**
+ * @defgroup EMACMDIO EMAC/MDIO
+ * @brief Ethernet Media Access Controller/Management Data Input/Output.
+ *
+ * The EMAC controls the flow of packet data from the system to the PHY. The MDIO module controls PHY
+ * configuration and status monitoring.
+ *
+ * Both the EMAC and the MDIO modules interface to the system core through a custom interface that
+ * allows efficient data transmission and reception. This custom interface is referred to as the EMAC control
+ * module and is considered integral to the EMAC/MDIO peripheral
+ *
+ * Related Files
+ * - emac.h
+ * - emac.c
+ * - hw_emac.h
+ * - hw_emac_ctrl.h
+ * - hw_mdio.h
+ * - hw_reg_access.h
+ * - mdio.h
+ * - mdio.c
+ * @addtogroup EMACMDIO
+ * @{
+ */
+/*
+** Prototypes for the APIs
+*/
+extern uint32 EMACLinkSetup(hdkif_t *hdkif);
+extern void EMACInstConfig(hdkif_t *hdkif);
+extern void EMACTxIntPulseEnable(uint32 emacBase, uint32 emacCtrlBase,
+ uint32 ctrlCore, uint32 channel);
+extern void EMACTxIntPulseDisable(uint32 emacBase, uint32 emacCtrlBase,
+ uint32 ctrlCore, uint32 channel);
+extern void EMACRxIntPulseEnable(uint32 emacBase, uint32 emacCtrlBase,
+ uint32 ctrlCore, uint32 channel);
+extern void EMACRxIntPulseDisable(uint32 emacBase, uint32 emacCtrlBase,
+ uint32 ctrlCore, uint32 channel);
+extern void EMACRMIISpeedSet(uint32 emacBase, uint32 speed);
+extern void EMACDuplexSet(uint32 emacBase, uint32 duplexMode);
+extern void EMACTxEnable(uint32 emacBase);
+extern void EMACTxDisable(uint32 emacBase);
+extern void EMACRxEnable(uint32 emacBase);
+extern void EMACRxDisable(uint32 emacBase);
+extern void EMACTxHdrDescPtrWrite(uint32 emacBase, uint32 descHdr,
+ uint32 channel);
+extern void EMACRxHdrDescPtrWrite(uint32 emacBase, uint32 descHdr,
+ uint32 channel);
+extern void EMACInit(uint32 emacCtrlBase, uint32 emacBase);
+extern void EMACMACSrcAddrSet(uint32 emacBase, uint8 macAddr[6]);
+extern void EMACMACAddrSet(uint32 emacBase, uint32 channel,
+ uint8 macAddr[6], uint32 matchFilt);
+extern void EMACMIIEnable(uint32 emacBase);
+extern void EMACMIIDisable(uint32 emacBase);
+extern void EMACRxUnicastSet(uint32 emacBase, uint32 channel);
+extern void EMACRxUnicastClear(uint32 emacBase, uint32 channel);
+extern void EMACCoreIntAck(uint32 emacBase, uint32 eoiFlag);
+extern void EMACTxCPWrite(uint32 emacBase, uint32 channel,
+ uint32 comPtr);
+extern void EMACRxCPWrite(uint32 emacBase, uint32 channel,
+ uint32 comPtr);
+extern void EMACRxBroadCastEnable(uint32 emacBase, uint32 channel);
+extern void EMACRxBroadCastDisable(uint32 emacBase, uint32 channel);
+extern void EMACRxMultiCastEnable(uint32 emacBase, uint32 channel);
+extern void EMACRxMultiCastDisable(uint32 emacBase, uint32 channel);
+extern void EMACNumFreeBufSet(uint32 emacBase, uint32 channel,
+ uint32 nBuf);
+extern uint32 EMACIntVectorGet(uint32 emacBase);
+uint32 EMACHWInit(uint8_t macaddr[6U]);
+void EMACTxTeardown(uint32 emacBase, uint32 channel);
+void EMACRxTeardown(uint32 emacBase, uint32 channel);
+void EMACFrameSelect(uint32 emacBase, uint64 hashTable);
+void EMACTxPrioritySelect(uint32 emacBase, uint32 txPType);
+void EMACSoftReset(uint32 emacCtrlBase, uint32 emacBase);
+void EMACEnableIdleState(uint32 emacBase);
+void EMACDisableIdleState(uint32 emacBase);
+void EMACEnableLoopback(uint32 emacBase);
+void EMACDisableLoopback(uint32 emacBase);
+void EMACTxFlowControlEnable(uint32 emacBase);
+void EMACTxFlowControlDisable(uint32 emacBase);
+void EMACRxFlowControlEnable(uint32 emacBase);
+void EMACRxFlowControlDisable(uint32 emacBase);
+void EMACRxSetFlowThreshold(uint32 emacBase, uint32 channel, uint32 threshold);
+uint32 EMACReadNetStatRegisters(uint32 emacBase, uint32 statRegNo);
+void EMACDMAInit(hdkif_t *hdkif);
+boolean EMACTransmit(hdkif_t *hdkif, pbuf_t *pbuf);
+void EMACTxIntHandler(hdkif_t *hdkif);
+void EMACReceive(hdkif_t *hdkif);
+/* Notification Function to which received packets are passed after processing */
+void emacTxNotification(hdkif_t *hdkif);
+void emacRxNotification(hdkif_t *hdkif);
+void EMACTxIntStat(uint32 emacBase, uint32 channel, emac_tx_int_status_t *txintstat);
+void EMACRxIntStat(uint32 emacBase, uint32 channel, emac_rx_int_status_t *rxintstat);
+void EMACGetConfigValue(emac_config_reg_t *config_reg, config_value_type_t type);
+
+/* USER CODE BEGIN (2) */
+/* USER CODE END */
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+#endif /* __EMAC_H__ */