ZynqMPSoC 通过EMIO引出GEM网卡 + GMII_TO_RGMII IP,在vitis跑lwip_echo_server ping不通的问题(笔记)

  1. 创建vivado工程

        

这里的clkin给375MHz,如果是zynq则给200MHz;

2. GMII_TO_RGMII IP设置:

这里的地址默认设置为8,只要与PHY的物理地址不一样即可;

3. Vitis修改:

        

创建lwip echo server 工程后,修改以上文件,添加在vivado IP中设置的地址宏定义;此时应该可以ping通了;

4. 系统端设备树文件添加:

我这里使用的是gem1作为emio引出网口。

&gem1 {
        gmii2rgmii-phy-handle = <&gmii_to_rgmii_0>;
        phy-handle = <&phy1>;
        mdio: mdio {
                #address-cells = <1>;
                #size-cells = <0>;
                phy1: phy@8{
                        device_type = "ethernet-phy";
                };
        };
};

petalinux-config -c kernel,勾选Xilinx_GMII_TO_RGMII驱动;

编译后系统端也可以使用网口了。

### LWIP 中缺少 `emio_options` 的解决方案 当遇到 LWIP 缺少 `emio_options` 问题时,通常是因为配置文件或初始化过程中某些必要的选项未被定义。为了确保正确处理此问题并提供有效的解决方案: #### 配置检查 确认项目中的 lwipopts.h 文件已正确定义所有必需宏。对于 EMIO 支持,应特别注意如下设置[^1]: ```c #define ETHARP_TRUST_IP_MAC 0 #define LWIP_NETIF_HOSTNAME 1 ``` 这些参数可能影响到以太网接口的行为。 #### 初始化过程审查 仔细检查网络接口注册期间传递给 netif_add() 函数的数据结构体是否包含了完整的成员变量赋值。特别是 struct eth_addr 类型字段 ea 和其他关联属性应该得到适当初始化: ```c struct netif *netif; struct ethernetif *ethernet_if; // 创建新的以太网接口实例 ethernet_if = (struct ethernetif *)mem_malloc(sizeof(struct ethernetif)); if (ethernet_if != NULL) { memset(ethernet_if, 0, sizeof(struct ethernetif)); // 设置硬件地址(MAC) SMSC9218I_GetHwAddr(&ethernet_if->ethaddr.addr[0]); /* Add the interface to the netif list */ netifapi_netif_add(netif, IP_ADDR4(192, 168, 1, 1), IP_MASK_DEFAULT, IP_ADDR4(192, 168, 1, 254), ethernet_if, &ethernetif_init, &tcp_ip_input); } ``` 上述代码片段展示了如何创建一个新的以太网接口并将它添加至网络接口列表中。这里需要注意的是 MAC 地址的获取以及其它必要参数的有效设定。 #### 错误调试建议 如果仍然存在错误提示,则可以尝试通过增加日志输出来追踪具体失败位置,并利用条件编译开关控制不同级别的诊断信息显示。这有助于更精确地定位潜在缺陷所在之处。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值