一. 简介
IMX6ULL芯片内部集成了两个 10/100M 的网络 MAC 外设,所以,ALPHA开发板上的有线网络的硬件方案是:
SOC内部集成网络MAC外设+ PHY网络芯片方案。
本文来说明一下MAC网络外设的设备节点信息的实现。
因此, I.MX6ULL 网络驱动主要就是这两个网络 MAC 外设的驱动。这两个外设的驱动都是一样的,我们分析其 中 一 个 就 行 了 。
二. I.MX6ULL的MAC网络外设设备树实现说明
NXP 的 I.MX 系 列 SOC 网 络 绑 定 文 档 为
Documentation/devicetree/bindings/net/fsl-fec.txt ,此绑定文档描述了 I.MX 系列 SOC 网络设备树
节点的要求。
1. 必要属性
compatible : 这个肯定是必须的,一般是" fsl,<soc>-fec ",比如 I.MX6ULL 的 compatible 属 性就是 "fsl,imx6ul-fec", 和 "fsl,imx6q-fec" 。
reg : SOC 网络外设寄存器地址范围。
interrupts :网络中断。
phy-mode : 网络所使用的 PHY 接口模式,是 MII 还是 RMII 。
2. 可选属性
phy-reset-gpios : PHY 芯片的复位引脚。
phy-reset-duration : PHY 复位引脚复位持续时间,单位为毫秒。只有当设置了 phy-reset-gpios 属性此属性才会有效,如果不设置此属性的话 PHY 芯片复位引脚的复位持续时间默认为 1 毫秒,数值不能大于 1000 毫秒,大于 1000 毫秒的话就会强制设置为 1 毫秒。
phy-supply : PHY 芯片的电源调节。
phy-handle :连接到此网络设备的 PHY 芯片句柄。
fsl,num-tx-queues : 此属性指定发送队列的数量,如果不指定的话默认为 1 。
fsl,num-rx-queues : 此属性指定接收队列的数量,如果不指定的话默认为 2 。
fsl,magic-packet : 此属性不用设置具体的值,直接将此属性名字写到设备树里面即可,表示支持硬件魔术帧唤醒。
fsl,wakeup_irq : 此属性设置唤醒中断索引。
stop-mode : 如果此属性存在的话表明 SOC 需要设置 GPR 位来请求停止模式。
3. 可选子节点
mdio:可以设置名为"mdio"的子节点,此子节点用于指定网络外设所使用的 MDIO 总线,
主要做为 PHY 节点的容器,也就是在 mdio 子节点下指定 PHY **相关的属性信息,**具体信息可 以参考 PHY 的绑定文档 Documentation/devicetree/bindings/net/phy.txt 。
PHY 节点相关属性内容如下:
interrupts :中断属性,可以不需要。
interrupt-parent : 中断控制器句柄,可以不需要。
reg : PHY 芯片地址,必须的!
compatible : 兼容性列表,一般为" ethernet-phy-ieee802.3-c22 "或" ethernet-phy-ieee802.3-c45 ",分别对应 IEEE802.3 的 22 簇和 45 簇,默认是 22 簇。也可以设置为其他值,如果 PHY 的 ID 不知道的话,可以 compatible 属性可以设置为" ethernet-phy-idAAAA.BBBB ", AAAA 和 BBBB 的含义如下:
AAAA : PHY 的 16 位 ID 寄存器 1 值,也就是 OUI 的 bit3~18 , 16 进制格式。
BBBB : PHY 的 16 位 ID 寄存器 2 值,也就是 OUI 的 bit19~24 , 16 进制格式。
max-speed : PHY 支持的最高速度,比如 10 、 100 或 1000 。
三. IMX6ULL的MAC网络外设的设备节点(MAC网络外设的根设备节点)
打开 imx6ull.dtsi ,找到如下 I.MX6ULL 的两个网络外设节点,如下所示:
fec1: ethernet@02188000 {
compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
reg = <0x02188000 0x4000>;
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_ENET>,
<&clks IMX6UL_CLK_ENET_AHB>,
<&clks IMX6UL_CLK_ENET_PTP>,
<&clks IMX6UL_CLK_ENET_REF>,
<&clks IMX6UL_CLK_ENET_REF>;
clock-names = "ipg", "ahb", "ptp",
"enet_clk_ref", "enet_out";
stop-mode = <&gpr 0x10 3>;
fsl,num-tx-queues=<1>;
fsl,num-rx-queues=<1>;
fsl,magic-packet;
fsl,wakeup_irq = <0>;
status = "disabled";
};
fec2: ethernet@020b4000 {
compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
reg = <0x020b4000 0x4000>;
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_ENET>,
<&clks IMX6UL_CLK_ENET_AHB>,
<&clks IMX6UL_CLK_ENET_PTP>,
<&clks IMX6UL_CLK_ENET2_REF_125M>,
<&clks IMX6UL_CLK_ENET2_REF_125M>;
clock-names = "ipg", "ahb", "ptp",
"enet_clk_ref", "enet_out";
stop-mode = <&gpr 0x10 4>;
fsl,num-tx-queues=<1>;
fsl,num-rx-queues=<1>;
fsl,magic-packet;
fsl,wakeup_irq = <0>;
status = "disabled";
};
fec1 和 fec2 分别对应 I.MX6ULL 的 ENET1 和 ENET2 ,至于节点的具体属性就不分析了,上面在讲解绑定文档的时候就已经详细的讲过了。上面的IMX6ULL的MAC网络外设的设备节点 是 NXP 官方编写的,我们 不需要去修改。
接下来需要在上面 IMX6ULL的MAC网络外设的设备节点的基础上,进行添加。添加针对 APLHA开发板的设备节点信息。例如,网络 所使用的引脚 pinctrl 节点信 息, 设置网络对应的 PHY 芯片接口为 MII还是RMII,复位IO等等信息。