基于STM32MP157自定义板U-Boot以太网双错误排查求助
问题1:U-Boot无法读取以太网MAC地址
原因分析
报错提示OTP中MAC地址无效,核心原因有两点:
- STM32MP1的OTP专用MAC存储区域未烧写合法的非全0、非广播地址的MAC地址;
- U-Boot设备树中
nvmem-cells配置未正确关联到OTP的MAC存储节点,或U-Boot未启用NVME相关编译选项。
解决步骤
方案1:烧写OTP MAC地址
STM32MP1的OTP Bank 2(起始地址0x2FF00400)为MAC地址专用存储区,可通过以下方式烧写:
- 使用STM32CubeProgrammer连接开发板进入烧写模式,写入6字节合法MAC地址;
- 烧写完成后重启U-Boot,验证是否自动读取MAC。
方案2:临时/永久设置MAC地址
临时设置(重启失效)
在U-Boot命令行执行:
setenv ethaddr AA:BB:CC:DD:EE:FF saveenv
替换AA:BB:CC:DD:EE:FF为合法MAC地址。
永久修改设备树(非生产环境推荐)
在U-Boot设备树的ðernet0节点中添加硬编码MAC,并注释NVME相关配置:
ðernet0{ // 注释原有NVME配置 // nvmem-cells = <ðernet_mac_address>; // nvmem-cell-names = "mac-address"; // 添加硬编码MAC local-mac-address = [AA BB CC DD EE FF]; };
修复NVME节点关联
确保U-Boot设备树中存在ethernet_mac_address对应的OTP节点:
&otp { ethernet_mac_address: mac-address@400 { reg = <0x400 0x6>; }; };
同时确认U-Boot编译时启用了CONFIG_NVMEM选项。
问题2:手动设置MAC后DHCP报
EQOS_DMA_MODE_SWR stuck错误 原因分析
该错误由RMII模式下的时钟配置错误、PHY复位时序异常或引脚复用配置错误导致,RMII对时钟和硬件时序要求严格。
解决步骤
1. 修正RMII参考时钟配置
根据硬件设计调整st,eth_ref_clk_sel属性:
- 若使用外部PHY提供50MHz参考时钟:
st,eth_ref_clk_sel = <0>; - 若使用内部PLL生成50MHz时钟:
st,eth_ref_clk_sel = <1>;
同时确认clocks中的ETHCK_K时钟源配置与硬件匹配。
2. 调整PHY复位配置
设备树中ethernet0和phy0节点重复配置了复位GPIO,建议只保留phy0节点的复位设置,并延长复位时长:
ðernet0{ // 注释重复的复位配置 // phy-reset-gpios = <&gpiob 0 GPIO_ACTIVE_LOW>; mdio0 { phy0: ethernet-phy@0 { reset-gpios = <&gpiob 0 GPIO_ACTIVE_LOW>; reset-duration = <500>; // 增大至500ms确保PHY复位完成 reg = <0>; }; }; };
同时检查GPIO B0的引脚复用配置是否正确(在eth1_pins_mx节点中),确保为输出模式。
3. 验证RMII引脚配置
检查eth1_pins_mx节点是否包含所有RMII必需引脚,且电气属性配置正确:
eth1_pins_mx: eth1-1 { pins1 { pinmux = <STM32_PINMUX('G', 11, AF11)>, /* ETH_MDC */ <STM32_PINMUX('G', 13, AF11)>, /* ETH_TXD0 */ <STM32_PINMUX('B', 13, AF11)>, /* ETH_TXD1 */ <STM32_PINMUX('G', 14, AF11)>; /* ETH_TXEN */ drive-push-pull; slew-rate = <STM32_SLAVE_RATE_HIGH>; }; pins2 { pinmux = <STM32_PINMUX('A', 2, AF11)>, /* ETH_MDIO */ <STM32_PINMUX('C', 4, AF11)>, /* ETH_RXD0 */ <STM32_PINMUX('C', 5, AF11)>, /* ETH_RXD1 */ <STM32_PINMUX('A', 7, AF11)>; /* ETH_CRS_DV */ drive-push-pull; slew-rate = <STM32_SLAVE_RATE_HIGH>; }; };
4. 检查U-Boot编译配置
确保启用以下关键配置:
CONFIG_STM32_ETH=y CONFIG_DM_ETH=y CONFIG_PHYLIB=y CONFIG_PHY_RESET=y CONFIG_STM32_EQOS=y CONFIG_RMII=y
若使用特定型号PHY,需添加对应驱动配置(如CONFIG_PHY_REALTEK=y)。
内容的提问来源于stack exchange,提问作者radium88
相关产品推荐
相关产品推荐

