正点原子MPSOC-PL-ETH
硬件平台 MPSOC-P5B
软件xilinx2020.1套件
系统xilinx certified ubuntu 2004
(xilinx certified ubuntu 2004移植也不是很麻烦,主要是xilinx 的 wiki 只讲了如果从官方的开发板启动,起码这对我不现实,一张ZUxxx就要好几万软妹币,反正他就是个ext4的rootfs,内核把他直接拉起来就行了,改天再出个教程,主要是有了ubuntu以后可以随意apt这可太香了,而且还有桌面)
问题
生成xsa以后,通过petalinux生成linux启动后有两个网口GEM0+GEM3,只有GEM3 ETH1可用,GEM0 ET0无法ping通
root@mpsoc3egsys:~# udhcpc -b -i eth0
udhcpc: started, v1.31.0
udhcpc: sending discover
udhcpc: sending discover
udhcpc: sending discover
udhcpc: no lease, forking to background
在正点原子例程在vivado BD中,将GEM0通过EMIO引出,引出之后,它是GMII接口,需要一个ip核转成RGMII,我也尝试了Xilinx的GMII TO GRMII的IP核,但是好像它对管脚的bank有要求,但是我的硬件已经固定无法更改,所以只能使用当前环境继续研究(按照其他博主经验,使用xilinx的ip核可能没有我这个问题)
问题分析
对比正点原子网盘提供的源码(atk-zup-linux-xlnx.tar.gz),petalinux 生成的内核缺少motorcomm.c文件,这是一个YT PHY驱动,刚好我们用的是YT8531C,那么问题就在这里了,将他手动编译成ko 模块,安装,其实这也不会工作的,因为网口的phy驱动在内核初始化阶段就绑定好了,如下,默认是“ Generic PHY ”
root@ubuntu:/sys/bus/mdio_bus/drivers# dmesg | grep -i phy
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[ 0.000000] arch_timer: cp15 timer(s) running at 99.99MHz (phys).
[ 2.422332] libphy: Fixed MDIO Bus: probed
[ 4.172598] xilinx-psgtr fd400000.zynqmp_phy: Lane:3 type:8 protocol:4 pll_locked:yes
[ 4.558781] libphy: MACB_mii_bus: probed
[ 4.563238] Generic PHY ff0b0000.ethernet-ffffffff:04: attached PHY driver [Generic PHY] (mii_bus:phy_addr=ff0b0000.ethernet-ffffffff:04, irq=POLL)
[ 4.593828] libphy: MACB_mii_bus: probed
[ 4.598168] Generic PHY ff0e0000.ethernet-ffffffff:07: attached PHY driver [Generic PHY] (mii_bus:phy_addr=ff0e0000.ethernet-ffffffff:07, irq=POLL)
[ 4.647463] dwc3-of-simple ff9d0000.usb0: dwc3_simple_set_phydata: Can't find usb3-phy
但是insmod以后是有变化的,在“/sys/bus/mdio_bus/drivers”目录新增了一部分
'YT8010 Automotive Ethernet'
'YT8010AS Automotive Ethernet'
'YT8510 100!10Mb Ethernet'
'YT8511 Gigabit Ethernet'
还有其他的不列出了,下面是我想要的
'YT8531 Gigabit Ethernet'
解决办法
先尝试motorcomm.ko是否可以解决,手动解绑驱动,然后重新绑定驱动,重启eth0,问题解决。
第一步解绑
root@ubuntu:/sys/bus/mdio_bus/drivers/Generic PHY# echo ff0b0000.ethernet-ffffffff:04 >./unbind
第二步重新绑定YT8531C
cd ../
cd 'YT8531 Gigabit Ethernet'
echo ff0b0000.ethernet-ffffffff:04 > ./bind
第三步重启eth0
root@ubuntu:/sys/bus/mdio_bus/drivers/YT8531 Gigabit Ethernet# ip link set eth0 down
root@ubuntu:/sys/bus/mdio_bus/drivers/YT8531 Gigabit Ethernet# dhclient -v eth0
Internet Systems Consortium DHCP Client 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
parse_option_param: Bad format d
Listening on LPF/eth0/00:0a:35:00:c0:13
Sending on LPF/eth0/00:0a:35:00:c0:13
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 (xid=0x64942945)
DHCPOFFER of 192.168.240.42 from 192.168.240.1
DHCPREQUEST for 192.168.240.42 on eth0 to 255.255.255.255 port 67 (xid=0x45299464)
DHCPACK of 192.168.240.42 from 192.168.240.1 (xid=0x64942945)
bound to 192.168.240.42 -- renewal in 41340 seconds.
OK了能获取DHCP了,问题解决
那么接下来只要把motorcomm编译进内核就好了,或者保持ko文件,写一个开机切换脚本将Generic PHY驱动切换为motorcomm驱动也可以
petalinux将自定义模块编译进内核挺麻烦的。《UG1144》给的方法只能编译成ko,而且就算手动添加进去.c,然后修改Makefile和Kconfig也是没用的,一个-buid下去之前的文件全部删除重新生成了。
一个比较机智的办法是把kernel复制出到,通过-config将内核配置为外部源码并指定路径应该也是可以的,但是我这边是失败的,还不知道为啥…
通过修改petalinux/Yocto的方式将ko编译进内核我也实现了,但是有点麻烦,哪天得空再写吧。
**
踩到的坑
**
因为正点原子的镜像好用,所以第一怀疑的肯定就是kernel
正点原子网盘资料中存在
【正点原子】MPSoC-P5B开发板资料盘(A盘)\4_Source_Code\3_Embedded_Linux\资源文件\资源文件\资源文件\kernel\alientek-linux-v5.4-2020.2.tar.gz
和
【正点原子】MPSoC-P5B开发板资料盘(A盘)\4_Source_Code\3_Embedded_Linux\资源文件\资源文件\资源文件\出厂镜像相关\atk-zup-linux-xlnx.tar.gz
最开始一直在死磕alientek-linux-v5.4-2020.2.tar.gz,但是motorcomm.c在atk-zup-linux-xlnx.tar.gz中,白花无用功。
对于mpsoc PS 通过emio引出的是GMII,虽然芯片是RGMII接口,但是设备树中应该存在“phy-mode = “gmii”;” 而不是 rgmii
petalinux使用外部源码时,这个config关系我还没搞清,我明明可以在kernel目录通过menuconfig看到我新加的motorcomm选项,设置好=y以后,编译完也会出现motorcomm.o文件,但是烧录进去也不行,还是没有这个驱动,而且petalinux-config -c kernel看到和源码目录menuconfig看到的内容完全不一样…希望大佬指教
(感觉有了各种AI以后,优质的帖子少了很多,而且很多AI都在胡*扯,给我一堆压根不存在的文件让我改,最后本文是在chatGPT的帮助下实现的,但是他的内存真的很少,源码都不能全部复制,得先手工抓取关键的喂给他才行)
更多推荐



所有评论(0)