NXP MCU 技术william hill官网
直播中

李鑫

7年用户 1349经验值
私信 关注
[问答]

如何调试iMX6ULL以太网/LAN8720/U-Boot?

我已经制作了一块定制板,目前正在尝试让以太网在 U-Boot 中工作。
处理器是 i.MX6ULL,PHY 芯片是 LAN8720。仅使用 1 个以太网(以太网 1)。
连接是:

.dtsi:


&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    phy-mode = "rmii";
    phy-handle = <ðphy0>;
    status = "okay";

    mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@0 {
            compatible = "ethernet-phy-ieee802.3-c22";
            reg = <0>;
            max-speed = <100>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";
        };
    };
};

&iomuxc {
    pinctrl-names = "default";

    pinctrl_enet1: enet1grp {
        fsl,pins = <
            MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN  0x1b0b0 /* FEC_CRS_DV */
            MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER  0x1b0b0 /* FEC_RX_ER */
            MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0 /* FEC_RXD0 */
            MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0 /* FEC_RXD1 */
            MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN  0x1b0b0 /* FEC_TX_EN */
            MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0 /* FEC_TXD0 */
            MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0 /* FEC_TXD1 */
            MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1  0x4001b031 /* FEC_TXCLK */
           
            MX6UL_PAD_ENET2_RX_DATA0__ENET1_MDIO    0x1b0b0 /* ENET_MDIO */
            MX6UL_PAD_ENET2_RX_DATA1__ENET1_MDC     0x1b0b0 /* ENET_MDC */
        >;
    };

   .....

};


董事会.c文件:


#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE |     
        PAD_CTL_SPEED_HIGH   |                                 
        PAD_CTL_DSE_48ohm   | PAD_CTL_SRE_FAST)

#define MDIO_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE |     
        PAD_CTL_DSE_48ohm   | PAD_CTL_SRE_FAST | PAD_CTL_ODE)        

#define ENET_CLK_PAD_CTRL  (PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST)

#ifdef CONFIG_FEC_MXC
static iomux_v3_cfg_t const fec1_pads[] = {
    MX6_PAD_ENET2_RX_DATA0__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
    MX6_PAD_ENET2_RX_DATA1__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_TX_DATA0__ENET1_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_TX_DATA1__ENET1_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_TX_EN__ENET1_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
    MX6_PAD_ENET1_RX_DATA0__ENET1_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_RX_DATA1__ENET1_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

static void setup_iomux_fec(int fec_id)
{
    if (fec_id == 0) {
                  printf("setup_iomux_fec(0);");
          imx_iomux_v3_setup_multiple_pads(fec1_pads, ARRAY_SIZE(fec1_pads));
    }
}
#endif

#ifdef CONFIG_FEC_MXC
int board_eth_init(struct bd_info *bis)
{
    int ret;

    setup_iomux_fec(CONFIG_FEC_ENET_DEV);

    ret = fecmxc_initialize_multi(bis, CONFIG_FEC_ENET_DEV,
    CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE);
    if (ret)
          printf("FEC%d MXC: %s:failed
", CONFIG_FEC_ENET_DEV, __func__);

    return 0;
}

static int setup_fec(int fec_id)
{
        struct iomuxc *const iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
        int ret;

        if (fec_id == 0) {
                /*
                 * Use 50MHz anatop loopback REF_CLK1 for ENET1,
                 * clear gpr1[13], set gpr1[17].
                 */
                clrsetbits_le32(&iomuxc_regs->gpr[1], IOMUX_GPR1_FEC1_MASK,
                                IOMUX_GPR1_FEC1_CLOCK_MUX1_SEL_MASK);
        }

        ret = enable_fec_anatop_clock(fec_id, ENET_50MHZ);
        if (ret)
                return ret;

        enable_enet_clk(1);

        return 0;
}

int board_phy_config(struct phy_device *phydev)
{
        phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x8190);

        if (phydev->drv->config)
                phydev->drv->config(phydev);

        return 0;
}
#endif

int board_init(void)
{
        /* Address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;

#ifdef        CONFIG_FEC_MXC
        setup_fec(CONFIG_FEC_ENET_DEV);
#endif

        return 0;
}


开发板.h文件:



#ifdef CONFIG_CMD_NET
        #define CONFIG_FEC_ENET_DEV                0
        #define IMX_FEC_BASE                        ENET_BASE_ADDR
        #define CONFIG_FEC_MXC_PHYADDR                0x0
#endif


默认配置:


CONFIG_PHYLIB=y
CONFIG_PHY_SMSC=y
CONFIG_DM_ETH_PHY=y
CONFIG_FEC_MXC=y
CONFIG_MII=y


启动时U-Boot控制台显示:
网络:无法获得 FEC0 的 PHY:地址 0
错误:ethernet@2188000 地址未设置。
未找到以太网。

mdio 列表返回:
找不到 MDIO 总线

mii 设备返回:
信息产业部设备:

在这一点上,我已经没有关于如何调试它的想法了。我也尝试过使用 printf() 在 u-boot 中添加一些调试输出,但没有成功成功(这些是单独的查询/问题)。

[PS 编辑:用示波器探测我可以在 ENET1_TX_CLK 上看到 50MHz 的信号,大约。ENET1_MDC 上的 2.357MHz 信号和 ENET1_MDIO 上的一些数据突发。]

                  

更多回帖

发帖
×
20
完善资料,
赚取积分