/* * Copyright : (C) 2022 Phytium Information Technology, Inc. * All Rights Reserved. * * This program is OPEN SOURCE software: you can redistribute it and/or modify it * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd, * either version 1.0 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the Phytium Public License for more details. * * * FilePath: fgmac.h * Date: 2022-04-06 14:46:52 * LastEditTime: 2022-04-06 14:46:58 * Description:  This file is for gmac driver. * * Modify History: * Ver   Who        Date         Changes * ----- ------     --------    -------------------------------------- * 1.0 huanghe 2021/07/13 first release */ #ifndef FGMAC_H #define FGMAC_H #include "ftypes.h" #include "fassert.h" #include "ferror_code.h" #include "fkernel.h" #ifdef __cplusplus extern "C" { #endif /***************************** Include Files *********************************/ #define FGMAC_PHY_MAX_NUM 32U /************************** Constant Definitions *****************************/ #define FGMAC_SUCCESS FT_SUCCESS #define FGMAC_ERR_TIMEOUT FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 1) #define FGMAC_ERR_INVALID_DMA_MEM FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 2) #define FGMAC_ERR_NOT_READY FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 3) #define FGMAC_ERR_TRANS_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 4) #define FGMAC_ERR_PHY_NOT_SUPPORT FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 5) #define FGMAC_ERR_PHY_IS_NOT_FOUND FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 6) #define FGMAC_ERR_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 7) #define FGMAC_ERR_PHY_AUTO_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 8) #define FGMAC_ERR_CODE_PREFIX FGMAC_ERR_TIMEOUT & (FT_ERRCODE_SYS_MODULE_MASK | FT_ERRCODE_SUB_MODULE_MASK) #define FGMAC_NUM_OF_ERR_CODE 5 /********发送描述符********/ /* TDES0 包含发送的帧状态和描述符所有权信息 */ #define FGMAC_DMA_TDES0_DEFERRED BIT(0) #define FGMAC_DMA_TDES0_UNDERFLOW_ERROR BIT(1) #define FGMAC_DMA_TDES0_EXCESSIVE_DEFERRAL BIT(2) #define FGMAC_DMA_TDES0_COLLISION_COUNT_MASK GENMASK(6, 3) #define FGMAC_DMA_TDES0_VLAN_FRAME BIT(7) #define FGMAC_DMA_TDES0_EXCESSIVE_COLLISIONS BIT(8) #define FGMAC_DMA_TDES0_LATE_COLLISION BIT(9) #define FGMAC_DMA_TDES0_NO_CARRIER BIT(10) #define FGMAC_DMA_TDES0_LOSS_CARRIER BIT(11) #define FGMAC_DMA_TDES0_PAYLOAD_ERROR BIT(12) #define FGMAC_DMA_TDES0_FRAME_FLUSHED BIT(13) #define FGMAC_DMA_TDES0_JABBER_TIMEOUT BIT(14) #define FGMAC_DMA_TDES0_ERROR_SUMMARY BIT(15) #define FGMAC_DMA_TDES0_IP_HEADER_ERROR BIT(16) #define FGMAC_DMA_TDES0_TIME_STAMP_STATUS BIT(17) /* 指示已捕获相应发送帧的时间戳 */ #define FGMAC_DMA_TDES0_OWN BIT(31) /* 该位表示描述符归 DMA 所有 */ /* TDES1 包含缓冲区大小和控制描述符链/环和正在传输的帧的其他位 */ #define FGMAC_DMA_TDES1_BUFFER1_SIZE_MASK GENMASK(10, 0) #define FGMAC_DMA_TDES1_BUFFER2_SIZE_MASK GENMASK(21, 11) #define FGMAC_DMA_TDES1_BUFFER2_SIZE_SHIFT 11 #define FGMAC_DMA_TDES1_TIME_STAMP_ENABLE BIT(22) #define FGMAC_DMA_TDES1_DISABLE_PADDING BIT(23) #define FGMAC_DMA_TDES1_SECOND_ADDRESS_CHAINED BIT(24) #define FGMAC_DMA_TDES1_END_RING BIT(25) #define FGMAC_DMA_TDES1_CRC_DISABLE BIT(26) #define FGMAC_DMA_TDES1_CHECKSUM_INSERTION_MASK GENMASK(28, 27) #define FGMAC_DMA_TDES1_CHECKSUM_INSERTION_SHIFT 27 #define FGMAC_DMA_TDES1_FIRST_SEGMENT BIT(29) #define FGMAC_DMA_TDES1_LAST_SEGMENT BIT(30) #define FGMAC_DMA_TDES1_INTERRUPT BIT(31) /********接收描述符********/ /* RDES0 包含接收的帧状态,帧长度和描述符所有权信息 */ #define FGMAC_DMA_RDES0_PAYLOAD_CSUM_ERR BIT(0) #define FGMAC_DMA_RDES0_CRC_ERROR BIT(1) #define FGMAC_DMA_RDES0_DRIBBLING BIT(2) #define FGMAC_DMA_RDES0_MII_ERROR BIT(3) #define FGMAC_DMA_RDES0_RECEIVE_WATCHDOG BIT(4) #define FGMAC_DMA_RDES0_FRAME_TYPE BIT(5) #define FGMAC_DMA_RDES0_COLLISION BIT(6) #define FGMAC_DMA_RDES0_IPC_CSUM_ERROR BIT(7) #define FGMAC_DMA_RDES0_LAST_DESCRIPTOR BIT(8) #define FGMAC_DMA_RDES0_FIRST_DESCRIPTOR BIT(9) #define FGMAC_DMA_RDES0_VLAN_TAG BIT(10) #define FGMAC_DMA_RDES0_OVERFLOW_ERROR BIT(11) #define FGMAC_DMA_RDES0_LENGTH_ERROR BIT(12) #define FGMAC_DMA_RDES0_SA_FILTER_FAIL BIT(13) #define FGMAC_DMA_RDES0_DESCRIPTOR_ERROR BIT(14) #define FGMAC_DMA_RDES0_ERROR_SUMMARY BIT(15) #define FGMAC_DMA_RDES0_FRAME_LEN_MASK (0x3FFF << 16) /* GENMASK(29, 16)*/ #define FGMAC_DMA_RDES0_FRAME_LEN_SHIFT 16 #define FGMAC_DMA_RDES0_DA_FILTER_FAIL BIT(30) #define FGMAC_DMA_RDES0_OWN BIT(31) /* RDES1 包含缓冲区大小和控制描述符链/环的其他位 */ #define FGMAC_DMA_RDES1_BUFFER1_SIZE_MASK GENMASK(10, 0) #define FGMAC_DMA_RDES1_BUFFER2_SIZE_MASK GENMASK(21, 11) #define FGMAC_DMA_RDES1_BUFFER2_SIZE_SHIFT 11 #define FGMAC_DMA_RDES1_SECOND_ADDRESS_CHAINED BIT(24) #define FGMAC_DMA_RDES1_END_RING BIT(25) #define FGMAC_DMA_RDES1_DISABLE_IC BIT(31) /* Operational Mode */ enum { FGMAC_CHECKSUM_BY_SOFTWARE = 0, FGMAC_CHECKSUM_BY_HARDWARE }; /* software checksum or hardware checksum */ enum { FGMAC_TX_COMPLETE_EVT = 0, FGMAC_RX_COMPLETE_EVT, FGMAC_LINK_STATUS_EVT, FGMAC_PHY_STATUS_EVT, FGMAC_DMA_ERR_EVT, FGMAC_INTR_EVT_NUM }; /* interrupt event type */ /**************************** Type Definitions *******************************/ /** * This typedef contains configuration information for the device. */ typedef struct { u32 instance_id; /* device instance id */ uintptr base_addr; /* device base address */ u32 irq_num; /* irq num */ u32 irq_prority; /* device intrrupt priority */ u32 cheksum_mode; /* hardware or software checksum */ u32 duplex_mode; /* selects the MAC duplex mode: Half-Duplex or Full-Duplex mode */ u32 max_packet_size; /* max num of bytes in frame transfer */ u32 mdc_clk_hz; /* MDC clock access PHY. [1.0MHz ~2.5MHz] */ boolean en_auto_negtiation; /* auto-negotiation or not */ u32 speed; /* sets the Ethernet speed: 10/100/1000 Mbps. */ } FGmacConfig; /* FGMAC 驱动配置数据 */ /** * This typedef contains driver instance data. The user is required to allocate a * variable of this type for every device in the system. A pointer * to a variable of this type is then passed to the driver API functions. */ typedef struct { volatile u32 status; u32 ctrl; u32 buf_addr; u32 next; } FGmacDmaDesc; /* FGMAC DMA描述符 */ typedef struct { u32 desc_idx; /* For Current Desc position */ u32 desc_buf_idx; /* For Current Desc buffer buf position */ u32 desc_max_num; /* Max Number for Desc and Desc buffer */ u8 *desc_buf_base; /* Desc buffer Base */ } FGmacRingDescData; /* FGMAC DMA描述符表(链式)相关数据 */ typedef void (*FGmacEvtHandler)(void *pCtrl); typedef struct { FGmacConfig config; /* Current active configs */ u32 is_ready; /* Device is initialized and ready */ FGmacRingDescData rx_ring; /* RX DMA descriptor data (idx, length) */ volatile FGmacDmaDesc *rx_desc; /* RX DMA descriptor table in ring */ FGmacRingDescData tx_ring; /* TX DMA descriptor data (idx, length) */ volatile FGmacDmaDesc *tx_desc; /* TX DMA descriptor table in ring */ FGmacEvtHandler evt_handler[FGMAC_INTR_EVT_NUM]; /* User registered interrupt handler */ u32 phy_valid_mask; /* phy valid addr sequence mask */ u32 phy_speed; u32 phy_addr; /* phy max valid addr, or the unique value */ u16 phy_id1; /*phy tag,only value to identify phy*/ } FGmac; /* FGMAC 驱动控制数据 */ /************************** Variable Definitions *****************************/ /***************** Macros (Inline Functions) Definitions *********************/ /************************** Function Prototypes ******************************/ /* 获取FGMAC驱动的默认配置参数 */ const FGmacConfig *FGmacLookupConfig(u32 instance_id); /* 完成FGMAC驱动实例的初始化,使之可以使用 */ FError FGmacCfgInitialize(FGmac *instance_p, const FGmacConfig *cofig_p); /* 完成FGMAC驱动实例去使能,清零实例数据 */ FError FGmacDeInitialize(FGmac *instance_p); /* 配置FGMAC的发送DMA描述符和缓冲区 */ FError FGmacSetupTxDescRing(FGmac *instance_p, volatile FGmacDmaDesc *tx_desc_tbl, u8 *tx_buf, const fsize_t tx_pre_buf_len, const fsize_t tx_buf_num); /* 配置FGMAC的接收DMA描述符和缓冲区 */ FError FGmacSetupRxDescRing(FGmac *instance_p, volatile FGmacDmaDesc *rx_desc_tbl, u8 *rx_buf, const fsize_t rx_pre_buf_len, const fsize_t rx_buf_num); /* FGMAC中断处理函数 */ void FGmacInterruptHandler(s32 vector, void *param); /* 注册FGMAC中断事件处理函数 */ void FGmacRegisterEvtHandler(FGmac *instance_p, u32 evt, FGmacEvtHandler handler); /* 使能FGMAC DMA,使之可以接收/发送数据 */ FError FGmacStartTrans(FGmac *instance_p); /* 去使能FGMAC DMA, 使之不再能接收/发送数据 */ FError FGmacStopTrans(FGmac *instance_p); /* 通过FGMAC接收数据帧 */ FError FGmacRecvFrame(FGmac *instance_p); /* 通过FGMAC发送数据帧 */ FError FGmacSendFrame(FGmac *instance_p, u32 frame_len); /* 设置FGMAC中断屏蔽位 */ void FGmacSetInterruptMask(FGmac *instance_p, u32 intr_type, u32 mask); /* 设置FGMAC中断使能位 */ void FGmacSetInterruptUmask(FGmac *instance_p, u32 intr_type, u32 mask); /*fgmac deplex mode configuration */ void FGmacControllerDuplexConfig(FGmac *instance_p, u32 duplex); /*fgmac speed configuration */ void FGmacControllerSpeedConfig(FGmac *instance_p, u32 speed); #ifdef __cplusplus } #endif #endif