IMX8QM以太网

2023-10-29 10:44
文章标签 以太网 imx8qm

本文主要是介绍IMX8QM以太网,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

imx8qm包含两路RGMII和MDIO接口,在电路中两路RGMII可共享同一路MDIO接口或各自采用独立的MDIO接口实现对PHY的读写和控制。下面根据不同的连接方式来实现内核中dts的配置。

1. 仅使用一路RGMII接口

  • fec1 dts配置
&fec1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_fec1>;phy-mode = "rgmii-txid";phy-handle = <&ethphy0>;fsl,magic-packet;nvmem-cells = <&fec_mac0>;nvmem-cell-names = "mac-address";fsl,rgmii_rxc_dly;status = "okay";mdio {#address-cells = <1>;#size-cells = <0>;ethphy0: ethernet-phy@0 {compatible = "ethernet-phy-ieee802.3-c22";reg = <0>;at803x,eee-disabled;at803x,vddio-1p8v;qca,clk-out-frequency = <125000000>;};};
};
&iomuxc {pinctrl_fec1: fec1grp {fsl,pins = <IMX8QM_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB_PAD             0x000014a0IMX8QM_ENET0_MDC_CONN_ENET0_MDC                         0x06000020IMX8QM_ENET0_MDIO_CONN_ENET0_MDIO                       0x06000020IMX8QM_ENET0_RGMII_TX_CTL_CONN_ENET0_RGMII_TX_CTL       0x06000020IMX8QM_ENET0_RGMII_TXC_CONN_ENET0_RGMII_TXC             0x06000020IMX8QM_ENET0_RGMII_TXD0_CONN_ENET0_RGMII_TXD0           0x06000020IMX8QM_ENET0_RGMII_TXD1_CONN_ENET0_RGMII_TXD1           0x06000020IMX8QM_ENET0_RGMII_TXD2_CONN_ENET0_RGMII_TXD2           0x06000020IMX8QM_ENET0_RGMII_TXD3_CONN_ENET0_RGMII_TXD3           0x06000020IMX8QM_ENET0_RGMII_RXC_CONN_ENET0_RGMII_RXC             0x06000020IMX8QM_ENET0_RGMII_RX_CTL_CONN_ENET0_RGMII_RX_CTL       0x06000020IMX8QM_ENET0_RGMII_RXD0_CONN_ENET0_RGMII_RXD0           0x06000020IMX8QM_ENET0_RGMII_RXD1_CONN_ENET0_RGMII_RXD1           0x06000020IMX8QM_ENET0_RGMII_RXD2_CONN_ENET0_RGMII_RXD2           0x06000020IMX8QM_ENET0_RGMII_RXD3_CONN_ENET0_RGMII_RXD3           0x06000020>;};
};
  • fec2 dts配置
&fec2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_fec2>;phy-mode = "rgmii-txid";phy-handle = <&ethphy1>;fsl,magic-packet;nvmem-cells = <&fec_mac1>;nvmem-cell-names = "mac-address";fsl,rgmii_rxc_dly;status = "okay";mdio {#address-cells = <1>;#size-cells = <0>;ethphy1: ethernet-phy@1 {compatible = "ethernet-phy-ieee802.3-c22";reg = <1>;at803x,eee-disabled;at803x,vddio-1p8v;qca,clk-out-frequency = <125000000>;};};
};
&iomuxc {pinctrl_fec2: fec2grp {fsl,pins = <IMX8QM_COMP_CTL_GPIO_1V8_3V3_ENET_ENETA_PAD             0x000014a0IMX8QM_ENET1_MDC_CONN_ENET1_MDC                         0x06000020IMX8QM_ENET1_MDIO_CONN_ENET1_MDIO                       0x06000020IMX8QM_ENET1_RGMII_TX_CTL_CONN_ENET1_RGMII_TX_CTL       0x00000060IMX8QM_ENET1_RGMII_TXC_CONN_ENET1_RGMII_TXC             0x00000060IMX8QM_ENET1_RGMII_TXD0_CONN_ENET1_RGMII_TXD0           0x00000060IMX8QM_ENET1_RGMII_TXD1_CONN_ENET1_RGMII_TXD1           0x00000060IMX8QM_ENET1_RGMII_TXD2_CONN_ENET1_RGMII_TXD2           0x00000060IMX8QM_ENET1_RGMII_TXD3_CONN_ENET1_RGMII_TXD3           0x00000060IMX8QM_ENET1_RGMII_RXC_CONN_ENET1_RGMII_RXC             0x00000060IMX8QM_ENET1_RGMII_RX_CTL_CONN_ENET1_RGMII_RX_CTL       0x00000060IMX8QM_ENET1_RGMII_RXD0_CONN_ENET1_RGMII_RXD0           0x00000060IMX8QM_ENET1_RGMII_RXD1_CONN_ENET1_RGMII_RXD1           0x00000060IMX8QM_ENET1_RGMII_RXD2_CONN_ENET1_RGMII_RXD2           0x00000060IMX8QM_ENET1_RGMII_RXD3_CONN_ENET1_RGMII_RXD3           0x00000060>;}; 
};

注意:在只使用一路以太网时请将另一路的网口的“status”属性设置为“disabled”。

2. 公用一路MDIO接口

参考“1”中方式进行如下修改:

&fec1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_fec1>;phy-mode = "rgmii-txid";phy-handle = <&ethphy0>;fsl,magic-packet;nvmem-cells = <&fec_mac0>;nvmem-cell-names = "mac-address";fsl,rgmii_rxc_dly;status = "okay";mdio {#address-cells = <1>;#size-cells = <0>;ethphy0: ethernet-phy@0 {compatible = "ethernet-phy-ieee802.3-c22";reg = <0>;at803x,eee-disabled;at803x,vddio-1p8v;qca,clk-out-frequency = <125000000>;};ethphy1: ethernet-phy@1 {compatible = "ethernet-phy-ieee802.3-c22";reg = <1>;at803x,eee-disabled;at803x,vddio-1p8v;qca,clk-out-frequency = <125000000>;};                };
};
&fec2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_fec2>;phy-mode = "rgmii-txid";phy-handle = <&ethphy1>;fsl,magic-packet;nvmem-cells = <&fec_mac1>;nvmem-cell-names = "mac-address";fsl,rgmii_rxc_dly;status = "okay";
};

另外在pinctrl的配置中注释掉不用的 MDIO接口,将需要用的 MDIO接口配置在pinctrl_fec1中。

3. 单独用各自的MDIO接口

这种情况下的配置和“1”中的相同,将两个网口都使能。关于为啥需要在两个网口的节点中分别定义各自的“mdio”节点,这个可以参考驱动(drivers/net/ethernet/freescale/fec_main.c)中fec_enet_mii_init函数。

//下面是部分代码
static int fec_enet_mii_init(struct platform_device *pdev)
{static struct mii_bus *fec0_mii_bus;static bool *fec_mii_bus_share;struct net_device *ndev = platform_get_drvdata(pdev);struct fec_enet_private *fep = netdev_priv(ndev);bool suppress_preamble = false;struct device_node *node;int err = -ENXIO;u32 mii_speed, holdtime;u32 bus_freq;/** The i.MX28 dual fec interfaces are not equal.* Here are the differences:**  - fec0 supports MII & RMII modes while fec1 only supports RMII*  - fec0 acts as the 1588 time master while fec1 is slave*  - external phys can only be configured by fec0** That is to say fec1 can not work independently. It only works* when fec0 is working. The reason behind this design is that the* second interface is added primarily for Switch mode.** Because of the last point above, both phys are attached on fec0* mdio interface in board design, and need to be configured by* fec0 mii_bus.*/if ((fep->quirks & FEC_QUIRK_SINGLE_MDIO) && fep->dev_id > 0) {/* fec1 uses fec0 mii_bus */if (mii_cnt && fec0_mii_bus) {fep->mii_bus = fec0_mii_bus;*fec_mii_bus_share = true;mii_cnt++;return 0;}return -ENOENT;}   ......bus_freq = 2500000; /* 2.5MHz by default */node = of_get_child_by_name(pdev->dev.of_node, "mdio");if (node) {of_property_read_u32(node, "clock-frequency", &bus_freq);suppress_preamble = of_property_read_bool(node,"suppress-preamble");}......fep->mii_bus->name = "fec_enet_mii_bus";fep->mii_bus->read = fec_enet_mdio_read;fep->mii_bus->write = fec_enet_mdio_write;snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",pdev->name, fep->dev_id + 1);fep->mii_bus->priv = fep;fep->mii_bus->parent = &pdev->dev;err = of_mdiobus_register(fep->mii_bus, node);if (err)goto err_out_free_mdiobus;......
}

上面代码可以看出,通过fec下的mdio子节点来获取一个device_node,of_mdiobus_register注册mdiobus时会将这个device_node传入。
仿照上面的修改后,如果系统启动时在打开eth1提示“fec 5b05000.ethernet eth1: Unable to connect to phy”。说明fec2上的PHY未被识别到。在fec_enet_mii_init函数中添加测试点会发现,这个函数被调用了两次,但是“of_mdiobus_register(fep->mii_bus, node);”注册mdiobus却只被调用了一次。按照DTS中的配置,因为我们在每路网口下都配置mdio节点,所以这里应该是需要调用两次“of_mdiobus_register(fep->mii_bus, node);”来注册各自的mdiobus的。在函数内的第一个“if ((fep->quirks & FEC_QUIRK_SINGLE_MDIO) && fep->dev_id > 0)”前后添加测试log,会发现在fec_enet_mii_init被第二次调用的时候,在这个if中函数返回了。返回的原因if语句前的注释也进行了说明。所以现在需要让函数继续执行,而不是在这里返回,解决的思路就是fep->quirks中取消FEC_QUIRK_SINGLE_MDIO的设置。在“fec_probe”函数中能找到关于这个的设置,并且刚好得调用fec_enet_mii_init函数之前。

static int
fec_probe(struct platform_device *pdev)
{....../* board only enable one mii bus in default */if (!of_get_property(np, "fsl,mii-exclusive", NULL))fep->quirks |= FEC_QUIRK_SINGLE_MDIO;ret = fec_enet_mii_init(pdev);if (ret)goto failed_mii_init;......
}

从代码可以看出只要在dts中添加“fsl,mii-exclusive”属性会跳过FEC_QUIRK_SINGLE_MDIO的设置。如下:

&fec2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_fec2>;phy-mode = "rgmii-txid";phy-handle = <&ethphy1>;fsl,magic-packet;fsl,mii-exclusive;......
};

重新编译烧写验证可以发现eth1正常。

这篇关于IMX8QM以太网的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300112

相关文章

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

60.以太网数据回环实验(3)以太网数据收发器接收模块

(1)状态设计: ST_IDLE        :空闲状态ST_PREAMBLE     :前导码+帧起始界定符ST_ETH_HEAD     :以太网帧头:目标MAC地址+源MAC地址+类型/长度ST_IP_HEAD         :IP首部ST_UDP_HEAD     :UDP首部(8个字节)ST_RX_DATA        :接收数据状态ST_RX_DONE

以太网属性找不到身份验证

有时候我们需要在以太网属性里 添加身份验证,但是打开之后发现可能没有这个tab页。查询资料,整理如下: 设置、本地服务、找到wired AutoConfig 属相设置:启动,应用,确定! 然后回来发现以太网属性,就会有身份验证一栏了。

以太网通信之ARP

免责声明: 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。 读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证

虹科干货|以太网系列FAQ(二):如何用EES记录和识别多个ECU流量?

面对包含众多设备的复杂网络,我们该如何有效地记录流量信息?在捕获到大量数据后,又如何确保每个数据包都能准确地与其生成设备相关联?更关键的是,如何在不改变原有网络路由的前提下实现这些目标?那么,如何利用虹科EES(增强型以太网交换机)来完成这些任务呢?本文将为您详细解答。 虹科EES如何实现流量记录与识别? 请想象有4个ECU在网络中,通讯方式如图1所示,在不改变网络拓扑的前提下记录这些ECU产

【网络基础】数据链路层总结:深入探讨其功能、协议与以太网技术

文章目录 数据链路层1. 前言(tmp)2. 对比理解 “数据链路层” 和 “网络层”3. 以太网4. ARP协议5. 其他重要协议 / 技术 总结 此前我们对网络层IP协议等进行了系统的学习,下面进行数据链路层的分析学习 数据链路层 1. 前言(tmp) 如之前的路由过程,我们知道通过在路由器间的跳跃,可以从本主机到目标主机的跨网络通信,但IP只是提供了转发的策略,实际上设

【网络基础】探讨以太网:封装解包、MTU、MAC地址与碰撞

文章目录 1. 概念2. 帧格式3. 如何解包和封装4. 整体网络思想 谈 跨网络通信5. 碰撞问题① 汇总整体的网络通信过程,发现问题并补充细节 6. 认识MAC地址7. 对比理解MAC地址与IP地址8. 认识MTU① MTU对UDP协议的影响② MTU对TCP协议的影响③ MSS 与 MTU的关系④ 命令 查看硬件地址MAC与MTU⑤ MTU 与 分片 1. 概念 “以太网

800G和1.6T以太网:创新与挑战

随着大数据、5G网络、云计算和物联网(IoT)技术的广泛应用,市场对带宽和数据传输速率的更高需求日益增长,800G和1.6T网络速率的升级备受期待。本文将从800G以太网和1.6T网络在升级方面的所做出的创新举措及其所面临的主要挑战两个方面,深入探讨数据中心未来的发展方向。 以太网速率随时间变化 网络升级所要面临的挑战: 如何提高800G以太网的速率和容量? 当前的800G以太网

【网络】数据链路层协议——以太网,ARP协议

目录 1.局域网转发 2.MAC地址 2.1.什么是MAC地址 2.2.Mac地址的作用 2.3.MAC地址和IP地址的区别和联系 3.以太网协议 4.MTU,IP MTU,MSS 4.1.MTU 4.2. IP MTU 4.3. MSS 4.4. 区别及联系 5.局域网的数据碰撞 5.1.局域网内通信过程  5.2.数据碰撞问题 5.3.令牌环网和以太网解决数据碰撞

《通信技术 - 以太网》详解以太网(一)

1 以太网的由来 以太网不是单一协议,而是不同标准的完整集合。这些标准来自 IEEE,它们的名字都以 802.3 开头。 以太网技术起源于施乐帕洛阿尔托研究中心的先锋技术项目。人们通常认为以太网发明于1973年,当年鲍勃.梅特卡夫(Bob Metcalfe)给他PARC的老板写了一篇有关以太网潜力的备忘录。但是梅特卡夫本人认为以太网是之后几年才出现的。在1976年,梅特卡夫和他的助手David