一. 简介
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.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等等信息。