在iMX6ULL上正确设置MAC地址需要确保OCOTP(On-Chip OTP)的正确编程和设备树配置。以下是详细步骤和常见问题排查:
1. 确认OCOTP写入位置
iMX6ULL的MAC地址存储在OCOTP Bank 4 Word 2和Word 3中:
- Word 2:低16位为MAC地址前两个字节(OUI的最后部分)。
- Word 3:完整32位存储MAC地址的后四个字节。
正确写入命令示例:
# 假设MAC地址为 00:04:9f:12:6c:62
# 分解为两部分:
# - Word 2 (Bank 4 Word 2): 0x0400 (OUI前缀) + 0x9f00 = 0x9f000400
# - Word 3 (Bank 4 Word 3): 0x126c62e9
# 写入Word 2:
fuse prog -y 4 2 0x9f000400
# 写入Word 3:
fuse prog -y 4 3 0x126c62e9
⚠️ 注意:用户仅写入Word 2 (0x126c62e9) 而未配置Word 3,可能导致MAC地址不完整。
2. 检查OCOTP读取值
在U-Boot中验证熔丝值:
# 读取Bank 4 Word 2和Word 3:
fuse read 4 2
fuse read 4 3
确保读取的值与写入的一致。
3. 设备树配置
内核需要从OCOTP读取MAC地址。在设备树中检查以下配置:
FEC节点(以太网控制器):
&fec1 {
phy-mode = "rmii";
fsl,mac-from-ocotp; // 启用从OCOTP读取MAC地址
status = "okay";
};
4. U-Boot环境变量冲突
U-Boot的ethaddr或netaddr可能覆盖OCOTP的值。在U-Boot中检查:
printenv ethaddr
- 如果存在
ethaddr,删除或重置它:
setenv ethaddr
saveenv
5. 校验和问题
某些iMX6ULL型号要求对MAC地址区域计算校验和。参考手册确认是否需要以下步骤:
- 计算Bank 4 Word 6的校验和。
- 写入校验和到对应位置。
6. 内核驱动问题
确保内核配置启用了OCOTP驱动:
# 内核配置选项:
CONFIG_NVMEM_IMX_OCOTP=y
7. 验证MAC地址
在Linux中检查MAC地址来源:
dmesg | grep "FEC MAC"
# 或
cat /sys/class/net/eth0/address
- 如果显示
00:00:00:00:00:00,表示未正确读取OCOTP。
8. 熔丝编程注意事项
- 熔丝烧录为不可逆操作,确保命令正确。
- 某些位可能已锁定(如Word 6的校验和位),需参考数据手册。
完整流程总结
- 写入OCOTP:
fuse prog -y 4 2 0x9f000400
fuse prog -y 4 3 0x126c62e9
- 验证OCOTP值:
fuse read 4 2
fuse read 4 3
- 配置设备树:
- 添加
fsl,mac-from-ocotp 到FEC节点。
- 清除U-Boot环境变量:
setenv ethaddr
saveenv
- 检查内核驱动和日志。
如果问题仍未解决,请检查硬件设计是否影响了OCOTP的读取,或联系NXP支持获取芯片级调试建议。
在iMX6ULL上正确设置MAC地址需要确保OCOTP(On-Chip OTP)的正确编程和设备树配置。以下是详细步骤和常见问题排查:
1. 确认OCOTP写入位置
iMX6ULL的MAC地址存储在OCOTP Bank 4 Word 2和Word 3中:
- Word 2:低16位为MAC地址前两个字节(OUI的最后部分)。
- Word 3:完整32位存储MAC地址的后四个字节。
正确写入命令示例:
# 假设MAC地址为 00:04:9f:12:6c:62
# 分解为两部分:
# - Word 2 (Bank 4 Word 2): 0x0400 (OUI前缀) + 0x9f00 = 0x9f000400
# - Word 3 (Bank 4 Word 3): 0x126c62e9
# 写入Word 2:
fuse prog -y 4 2 0x9f000400
# 写入Word 3:
fuse prog -y 4 3 0x126c62e9
⚠️ 注意:用户仅写入Word 2 (0x126c62e9) 而未配置Word 3,可能导致MAC地址不完整。
2. 检查OCOTP读取值
在U-Boot中验证熔丝值:
# 读取Bank 4 Word 2和Word 3:
fuse read 4 2
fuse read 4 3
确保读取的值与写入的一致。
3. 设备树配置
内核需要从OCOTP读取MAC地址。在设备树中检查以下配置:
FEC节点(以太网控制器):
&fec1 {
phy-mode = "rmii";
fsl,mac-from-ocotp; // 启用从OCOTP读取MAC地址
status = "okay";
};
4. U-Boot环境变量冲突
U-Boot的ethaddr或netaddr可能覆盖OCOTP的值。在U-Boot中检查:
printenv ethaddr
- 如果存在
ethaddr,删除或重置它:
setenv ethaddr
saveenv
5. 校验和问题
某些iMX6ULL型号要求对MAC地址区域计算校验和。参考手册确认是否需要以下步骤:
- 计算Bank 4 Word 6的校验和。
- 写入校验和到对应位置。
6. 内核驱动问题
确保内核配置启用了OCOTP驱动:
# 内核配置选项:
CONFIG_NVMEM_IMX_OCOTP=y
7. 验证MAC地址
在Linux中检查MAC地址来源:
dmesg | grep "FEC MAC"
# 或
cat /sys/class/net/eth0/address
- 如果显示
00:00:00:00:00:00,表示未正确读取OCOTP。
8. 熔丝编程注意事项
- 熔丝烧录为不可逆操作,确保命令正确。
- 某些位可能已锁定(如Word 6的校验和位),需参考数据手册。
完整流程总结
- 写入OCOTP:
fuse prog -y 4 2 0x9f000400
fuse prog -y 4 3 0x126c62e9
- 验证OCOTP值:
fuse read 4 2
fuse read 4 3
- 配置设备树:
- 添加
fsl,mac-from-ocotp 到FEC节点。
- 清除U-Boot环境变量:
setenv ethaddr
saveenv
- 检查内核驱动和日志。
如果问题仍未解决,请检查硬件设计是否影响了OCOTP的读取,或联系NXP支持获取芯片级调试建议。
举报