IMX6ULL Linux内核网络驱动修改

IMX6ULL 网络驱动修改

主要修改arch/arm/boot/dts/imx6ul-14x14-evk.dtsi设备树文件即可,修改方式和u-boot的设备树修改一致。

硬件电路

网口原理图

设备树修改

需要修改的设备树位置:arch/arm/boot/dts/imx6ul-14x14-evk.dtsi

增加复位引脚信息

从上面的原理图可知网口1使用的复位引脚是GPIO5_IO07,网口2使用的复位引脚是GPIO5_IO08,在官方的例程中,这两个引脚被用于SPI4,所以我们SPI4里面这两个引脚的相关信息,修改如下图所示。

SPI4引脚

还需要屏蔽掉pinctrl_spi4里面相关的信息,修改如下:

pinctrl_spi4

添加网口复位的pinctrl描述,增加位置如下:
pinctrl_enet_reset
相关代码段:

     pinctrl_enet1_reset: enet1resetgrp {
         fsl,pins = <
             MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
         >;
     };

     pinctrl_enet2_reset: enet2resetgrp {
         fsl,pins = <
             MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
         >;
     };

修改网口TX时钟的电器属性值

修改的位置如下:
网口时钟引脚的电器属性值

需要把0x4001b031修改为:0x4001b009

修改结果如下:

     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
             /* 0x4001b031修改为0x4001b009 */
             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
             /* 0x4001b031修改为0x4001b009 */
             MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2  0x4001b009
         >;
     };

修改fec信息

fec是6ull描述网络的节点,修改位置如下:

fec

  1. 从节点上面的信息我们可以看见ethphy0使用的PHY地址为2,ethphy1使用的PHY地址是1,但是我们的ethphy0使用的PHY地址为0,ethphy1使用的PHY地址是1,所以我们需要修改ethphy0的PHY地址。
  2. 设备树上写的ethphy0和ethphy1使用的PHY芯片为micrel的芯片,我们使用的是LAN7820A,是smsc家的芯片,所以我们也需要修改这个。
  3. 我们还需要增加相关的复位引脚信息

综上修改如下:

&fec1 {
    pinctrl-names = "default";
    /* 增加pinctrl_enet1_reset */
    pinctrl-0 = <&pinctrl_enet1 &pinctrl_enet1_reset>;
    phy-mode = "rmii";
    phy-handle = <&ethphy0>;
    /* 设置复位有效电平和持续时间 */
    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    phy-rest-duration = <200>;
    status = "okay";
};
&fec2 {
    pinctrl-names = "default";
    /* 增加pinctrl_enet2_reset */
    pinctrl-0 = <&pinctrl_enet2 &pinctrl_enet2_reset>;
    phy-mode = "rmii";
    phy-handle = <&ethphy1>;
    /* 设置复位有效电平和持续时间 */
    phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    phy-rest-duration = <200>;
    status = "okay";
    mdio {
        #address-cells = <1>;
        #size-cells = <0>;
        /* 修改ethphy0的PHY地址为0,下面的reg也要设置为0 */
        ethphy0: ethernet-phy@0 {
            reg = <0>;
            /* 修改为使用smsc的芯片 */
            smsc,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";

        };
        ethphy1: ethernet-phy@1 {
            reg = <1>;
            /* 修改为使用smsc的芯片 */
            smsc,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET2_REF>;
            clock-names = "rmii-ref";
        };
    };
};
posted @ 2024-05-19 03:39  其实我只是懒  阅读(128)  评论(0编辑  收藏  举报