rt-thread/bsp/phytium/libraries/standalone/doc/reference/driver/fgmac.md

10 KiB
Raw Blame History

FGMAC 驱动程序

1. 概述

以太网控制器GMAC的主要功能是在兼容 IEEE802.3-2005 标准的以太网中发送和接收数据,支持 RGMII 的 PHY 接口

GMAC 接口特点包括

  • 支持速率 1000Mbps/100Mbps/10Mbps
  • 支持 IEEE 802.3-2005 Ethernet MACReduced Gigabit Media Independent Interface (RGMII)

2. 功能

FGMAC 驱动程序提供了以太网控制器初始化,发送/接收数据和配置PHY接口等功能

FGMAC 驱动程序的源文件包括,

├── Kconfig
├── fgmac.c 
├── fgmac.h
├── fgmac_dma.c
├── fgmac_g.c
├── fgmac_hw.c
├── fgmac_hw.h
├── fgmac_intr.c
├── fgmac_sinit.c
└── phy
    ├── ar803x
    │   ├── fgmac_ar803x.c
    │   └── fgmac_ar803x.h
    ├── fgmac_phy.c
    └── fgmac_phy.h

3. 配置方法

以下部分将指导您完成 FGMAC 驱动的硬件/软件配置:

  • 选择开发板上的特定 GMAC 控制器,连通网线
  • 通过驱动 API获取指定 GMAC 控制器的默认配置
  • 按需要修改获取的 GMAC 默认配置通过驱动API进行 GMAC 控制器的初始化
  • 通过驱动API获取 PHY 的默认配置
  • 按需要修改获取的 PHY 默认配置通过驱动API进行 PHY 的初始化
  • 分配 GMAC 数据传输使用的 DMA 描述符和 DMA 缓存区,通过驱动 API 进行注册
  • 通过驱动 API 发送/接收数据

网络通信依赖协议栈可以参考应用例程使用LWIP网络协议栈进行通信

4 应用示例

fgmac_link

启动GMAC接收网络数据并打印

fgmac_lwip_echo

启动LWIP网络协议栈通过FGMAC驱动支持开发板和网络主机的ping通

fgmac_lwip_tftp

启动LWIP网络协议栈通过FGMAC驱动支持开发板通过tftp服务获取文件

5. API参考

5.1. 用户数据结构

  • FGMAC 驱动配置数据
typedef struct
{
    u32     instance_id;  /* device instance id */
    uintptr base_addr;    /* device base address */
    u32     irq_num;      /* irq num */
    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 驱动配置数据 */
  • FGMAC 驱动控制数据

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; 
    u32 phy_speed;
    u32 phy_addr;            /* phy ic addr */
} FGmac; /* FGMAC 驱动控制数据 */
  • FGMAC DMA描述符
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 校验方法选择
enum
{
    FGMAC_CHECKSUM_BY_SOFTWARE = 0,
    FGMAC_CHECKSUM_BY_HARDWARE
}; 
  • FGMAC 中断事件类型
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
};

5.2 错误码定义

  • 模块错误码编号0x1070000
  • [0x0] FGMAC: Success
  • [0x1070001] FGMAC: wait timeout
  • [0x1070002] FGMAC: DMA address invalid
  • [0x1070003] FGMAC: driver not ready
  • [0x1070004] FGMAC: data transaction failed
  • [0x1070005] FGMAC: PHY type not support
  • [0x1070006] FGMAC: PHY is not found

5.3. 用户API接口

FGmacLookupConfig

  • 获取FGMAC驱动的默认配置参数
const FGmacConfig *FGmacLookupConfig(u32 instance_id);

Note:

  • 返回FGMAC的默认配置复制后修改配置
  • 需要确认当前平台支持输入的instance_id

Input:

  • {u32} instance_id, 驱动控制器号

Return:

  • {const FGmacConfig *}, 驱动默认配置

FGmacCfgInitialize

  • 完成FGMAC驱动实例的初始化使之可以使用
FError FGmacCfgInitialize(FGmac *instance_p, const FGmacConfig *cofig_p);

Note:

  • 此函数会重置FGMAC控制器和FGMAC控制数据

Input:

  • {FGmac} *instance_p 驱动控制数据

  • {FGmacConfig} *cofig_p 驱动配置数据

Return:

  • {FError} 驱动初始化的错误码信息FGMAC_SUCCESS 表示初始化成功,其它返回值表示初始化失败

FGmacDeInitialize

  • 完成FGMAC驱动实例去使能清零实例数据
FError FGmacDeInitialize(FGmac *instance_p);

Note:

  • 此函数会重置FGMAC控制数据

Input:

  • {FGmac} *instance_p 驱动控制数据

Return:

  • {FError} 驱动初始化的错误码信息FGMAC_SUCCESS 表示去初始化成功,其它返回值表示去初始化失败

FGmacSetupTxDescRing

  • 配置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);

Note:

  • 传入的tx_desc_tbl和tx_buf必须为32位空间地址

Input:

  • {FGmac *}instance_p 驱动控制数据

  • {volatile FGmacDmaDesc *} tx_desc_tbl 发送DMA描述符表(数组)

  • {u8} *tx_buf 发送DMA缓冲区(数组,每一个描述符对应一个缓冲区)

  • {const fsize_t} tx_pre_buf_len 单个DMA缓冲区的字节数

  • {const fsize_t} tx_buf_num DMA描述符或者DMA缓存区的数目

Return:

  • {FError} TX DMA初始化的错误码信息FGMAC_SUCCESS 表示TX DMA初始化成功其它返回值表示TX DMA初始化失败

FGmacSetupRxDescRing

  • 配置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);

Note:

  • 传入的rx_desc_tbl和rx_buf必须为32位空间地址

Input:

  • {FGmac *}instance_p 驱动控制数据
  • {volatile FGmacDmaDesc *} rx_desc_tbl 接收DMA描述符表(数组)
  • {u8} *rx_buf 接收DMA缓冲区(数组,每一个描述符对应一个缓冲区)
  • {const fsize_t} rx_pre_buf_len 单个DMA缓冲区的字节数
  • {const fsize_t} rx_buf_num DMA描述符或者DMA缓存区的数目

Return:

  • {FError} RX DMA初始化的错误码信息FGMAC_SUCCESS 表示RX DMA初始化成功其它返回值表示RX DMA初始化失败

FGmacInterruptHandler

  • FGMAC中断处理函数
void FGmacInterruptHandler(s32 vector, void *param);

Note:

  • 此函数运行在中断上下文

Input:

  • {s32} vector, 中断向量号,此处没有用到
  • {void} *param, 中断输入参数此处传入的是FGMAC的驱动控制数据

Return:

FGmacRegisterEvtHandler

  • 注册FGMAC中断事件响应函数
void FGmacRegisterEvtHandler(FGmac *instance_p, u32 evt, FGmacEvtHandler handler);

Note:

  • 注册的函数handler会在中断上下文执行

Input:

  • {FGmac} *instance_p 驱动控制数据
  • {u32} evt 中断事件类型
  • {FGmacEvtHandler} handler 中断事件响应函数

Return:

FGmacStartTrans

  • 使能FGMAC DMA使之可以接收/发送数据
FError FGmacStartTrans(FGmac *instance_p);

Note:

  • 调用函数前需要确保FGMAC驱动初始化成功

Input:

  • {FGmac} *instance_p 驱动控制数据

Return:

  • {FError} FGMAC_SUCCESS 表示启动成功,其它返回值表示启动失败

FGmacStopTrans

  • 去使能FGMAC DMA, 使之不再能接收/发送数据
FError FGmacStopTrans(FGmac *instance_p);

Note:

  • 调用函数前需要确保FGMAC驱动初始化成功

Input:

  • {FGmac} *instance_p 驱动控制数据

Return:

  • {FError} FGMAC_SUCCESS 表示去启动成功,其它返回值表示去启动失败

FGmacRecvFrame

  • 通过FGMAC接收数据帧
FError FGmacRecvFrame(FGmac *instance_p)

Note:

  • 调用函数前需要确保FGMAC驱动初始化成功

Input:

  • {FGmac} *instance_p 驱动控制数据

Return:

  • {FError} FGMAC_SUCCESS 表示接收数据帧成功,其它返回值表示接收数据帧失败

FGmacSendFrame

  • 通过FGMAC发送数据帧
FError FGmacSendFrame(FGmac *instance_p, u32 frame_len);

Note:

  • 通过FGMAC发送数据帧

Input:

  • {FGmac} *instance_p 驱动控制数据

  • {u32} frame_len 数据帧长度

Return:

  • {FError} FGMAC_SUCCESS 表示发送数据帧成功,其它返回值表示发送数据帧失败

FGmacPhyLookupConfig

  • 获取FGMAC PHY默认配置参数
void FGmacPhyLookupConfig(u32 gmac_instance_id, FGmac *instance_p);

Note:

调用此函数前确保 FGMAC 驱动初始化已经成功

Input:

  • {u32} gmac_instance_id FGMAC id
  • {FGmac} *instance_p FGMAC 控制数据

Return:

FGmacPhyCfgInitialize

  • 查找GMAC连接的phy芯片地址完成FGMAC PHY驱动实例的初始化使之可以使用
FError FGmacPhyCfgInitialize(FGmac *instance_p);

Note:

  • 调用此函数前确保 FGMAC 驱动初始化已经成功

Input:

  • {FGmac} *instance_p GMAC控制数据

Return:

  • {FError} FGMAC_SUCCESS 表示PHY设置成功其它返回值表示PHY设置失败

FGmacSetInterruptMask

  • 设置FGMAC中断屏蔽位
void FGmacSetInterruptMask(FGmac *instance_p, u32 intr_type, u32 mask, boolean enable);

Note:

  • 在FGMAC驱动初始化成功后调用此函数

Input:

  • {FGmac} *instance_p 驱动控制数据

  • {u32} intr_type 中断类型 GMAC中断/DMA中断

  • {u32} mask 中断屏蔽标志位

  • {boolean} enable TRUE: 使能中断FALSE: 去使能中断

Return: