我已经制作了一块定制板,目前正在尝试让以太网在 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 {
compa
tible = "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 上的一些数据突发。]