本文章对Linux 网络驱动实验中的设备树进行介绍,Linux网络驱动程序比较复杂,只要学会应用。
1、I.MX6ULL 网络外设设备树
- 示例代码 69.4.1.2 网络引脚 pinctrl 信息
- pinctrl_enet1: enet1grp {
- fsl,pins = <
- MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
- MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
- MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
- MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
- MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
- MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
- MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
- MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
- >;
- };
-
- pinctrl_enet2: enet2grp {
- fsl,pins = <
- MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0
- MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0
- MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0
- MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0
- MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0
- MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0
- MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0
- MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
- MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
- MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
- >;
- };
-
- /*enet1 reset zuozhongkai*/
- pinctrl_enet1_reset: enet1resetgrp {
- fsl,pins = <
- /* used for enet1 reset */
- MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
- >;
- };
-
- /*enet2 reset zuozhongkai*/
- pinctrl_enet2_reset: enet2resetgrp {
- fsl,pins = <
- /* used for enet2 reset */
- MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
- >;
- };
-
- &fec1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_enet1
- &pinctrl_enet1_reset>;
- phy-mode = "rmii";
- phy-handle = <ðphy0>;
- phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
- phy-reset-duration = <200>;
- status = "okay";
- };
-
- &fec2 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_enet2
- &pinctrl_enet2_reset>;
- phy-mode = "rmii";
- phy-handle = <ðphy1>;
- phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
- phy-reset-duration = <200>;
- status = "okay";
- mdio {
- #address-cells = <1>;
- #size-cells = <0>;
-
- ethphy0: ethernet-phy@0 {
- compatible = "ethernet-phy-ieee802.3-c22";
- reg = <0>;
- };
-
- ethphy1: ethernet-phy@1 {
- compatible = "ethernet-phy-ieee802.3-c22";
- reg = <1>;
- };
- };
- };
ENET1 网口的节点属性,设置 ENET1 所使用的引脚 pinctrl 节点信息,设置网络对应的 PHY 芯片接口为 RMII,这个要根据实际的硬件来设置。设置 PHY 芯片的句柄为 ethphy0,MDIO 节点会设置 PHY 信息。其他的属性信息就很好理解了,基本已经在上面讲解绑定文档的时候说过了。
ENET2 网口的节点属性,基本和 ENET1 网口一致,区别就是多了第 mdio 子节点,前面讲解绑定文档的时候说了,mido 子节点用于描述 MIDO 总线,在此子节点内会包含 PHY 节点信息。这里一共有两个 PHY 子节点:ethphy0 和 ethphy1,分别对应ENET1 和 ENET2 的 PHY 芯片。比如“ethphy0: ethernet-phy@0”就是 ENET1 的 PHY节点名字,“@”后面的 0 就是此 PHY 芯片的芯片地址,reg 属性也是描述 PHY 芯片地址的,这点和 IIC 设备节点很像。其他地方就没什么好多的了,绑定文档已经讲解的很清楚了。
单网卡使用
1、只使用 ENET2 网卡
-
- &fec1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_enet1
- &pinctrl_enet1_reset>;
- phy-mode = "rmii";
- phy-handle = <ðphy0>;
- phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
- phy-reset-duration = <200>;
- status = "disabled";
- };
将 status 改为“disabled”。
ifconfig -a //查看所有网卡
2、只使用 ENET1
(1)屏蔽或删除掉 fec2 节点内容网卡
(2)修改 ENET1 对应的 fec1 节点信息。
- &fec1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_enet1
- &pinctrl_enet1_reset>;
- phy-mode = "rmii";
- phy-handle = <ðphy0>;
- phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
- phy-reset-duration = <200>;
- status = "okay";
- mdio {
- #address-cells = <1>;
- #size-cells = <0>;
- ethphy0: ethernet-phy@0 {
- compatible = "ethernet-phy-ieee802.3-c22";
- reg = <0>;
- };
- };
- };
重点是在 fec1 中添加第 11~19 行的 mdio 子节点,而且仅仅留下 ENET1 对应的 PHY 子节点。
(3)屏蔽或删除掉 ENET2 对应的 pinctrl 节点
(4)在 ENET1 网卡对应的 pinctrl 节点中添加 MDIO 和 MDC 引脚配置
- pinctrl_enet1: enet1grp {
- fsl,pins = <
- MX6UL_PAD_GPIO1_IO07__ENET1_MDC 0x1b0b0
- MX6UL_PAD_GPIO1_IO06__ENET1_MDIO 0x1b0b0
- MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
- MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
- MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
- MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
- MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
- MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
- MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
- MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
- >;
- };
将 GPIO1_IO07 复用为 ENET1_MDC 引脚。
将 GPIO1_IO06 复用为 ENET1_MDIO 引脚。
至此,设备树修改完成,重新编译设备树,然后用新的设备树启动系统。