三 Linux 网络驱动-MAC、PHY层驱动框架

I. 网络外设设备树
I. 有两个 10/100M 的网络 MAC 外设 , 因此 I. 网络驱动主要就是这两个网络 MAC 外设的驱动 。这两个外设的驱动都是一样的 , 我们分析其 中一个就行了 , 首先肯定是设备树 ,  NXP 的 I.MX 系 列 SOC 网 络 绑 定 文 档 为 ///net/fsl-fec.txt , 此绑定文档描述了 I.MX 系列 SOC 网络设备树 节点的要求 。
①、必要属性
:这个肯定是必须的 , 一般是“fsl,-fec” , 比如 I. 的属 性就是"fsl,-fec",和"fsl,imx6q-fec" 。
reg:SOC 网络外设寄存器地址范围 。
:网络中断 。
phy-mode:网络所使用的 PHY 接口模式 , 是 MII 还是 RMII 。
②、可选属性
phy-reset-gpios:PHY 芯片的复位引脚 。
phy-reset-:PHY 复位引脚复位持续时间 , 单位为毫秒 。只有当设置了 phy-reset-gpios 属性此属性才会有效 , 如果不设置此属性的话 PHY 芯片复位引脚的复位持续时间默认为 1 毫秒 , 数值不能大于 1000 毫秒 , 大于 1000 毫秒的话就会强制设置为 1 毫秒 。
phy-:PHY 芯片的电源调节 。
phy-:连接到此网络设备的 PHY 芯片句柄 。
fsl,num-tx-:此属性指定发送队列的数量 , 如果不指定的话默认为 1 。
fsl,num-rx-:此属性指定接收队列的数量 , 如果不指定的话默认为 2 。
fsl,:此属性设置唤醒中断索引 。
stop-mode:如果此属性存在的话表明 SOC 需要设置 GPR 位来请求停止模式 。
③、可选子节点
mdio:可以设置名为“mdio”的子节点 , 此子节点用于指定网络外设所使用的 MDIO 总线 ,  主要作为 PHY 节点的容器 , 也就是在 mdio 子节点下指定 PHY 相关的属性信息 , 具体信息可 以参考 PHY 的绑定文档 ///net/phy.txt 。
PHY 节点相关属性内容如下:
:中断属性 , 可以不需要 。
-:中断控制器句柄 , 可以不需要 。
reg:PHY 芯片地址 , 必须的!
:兼容性列表 , 一般为“-phy-.3-c22”或“-phy-.3- c45” , 分别对应 .3 的 22 簇和 45 簇 , 默认是 22 簇 。也可以设置为其他值 , 如果 PHY 的 ID 不知道的话可以属性可以设置为“-phy-.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 。
打开.dtsi,找到I.的两个网络外设节点 , 如图:
fec1: ethernet@02188000 {compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";reg = <0x02188000 0x4000>;interrupts = ,;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 = ,;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=