petalinux在zynq平台的移植
硬件
1.zynq-7z010;
2.两个mavell,88E1510网卡
软件
1.petalinux2018.2;
2.linux-xlnx-xilinx-v2018;
3.0001-net-macb-Add-MDIO-driver-for-accessing-multiple-PHY-.patch补丁;
4.system-user.dtsi
petalinux环境的搭建
petalinux工程的创建
petalinux工程的配置
petalinux工程的编译
petalinux引导
参考ug1144-petalinux-tools-reference-guide2018.2;
说明:个人使用的Ubuntu,在ubuntu下启动tftp服务器,板子上电,uboot启动后设置serverip,ipaddr 环境变量后,
直接run netboot,就可以引导启动。
问题来了,linux 内核启动后,eth1 始终不通,出现下面现象,
root@i5Prj:~# ifconfig eth1 192.168.1.88 up
IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready;
根据之前VxWorks网口驱动调试的经验,感觉像设备数文件中关于MDIO的描述和内核中MDIO驱动的问题,立即xilinx官网论坛各种找,尝试了各个同行的经验,
1.给petalinux内核打补丁使用0001-net-macb-Add-MDIO-driver-for-accessing-multiple-PHY-.patch,感觉没生效,可能自己用的不对(有知道的同行欢迎指导)。
2.参考同行的经验,修改设备树中MDIO描述文件,失败。
最后没办法,通过petalinux-config使用自己下载的内核。(这里还的吐槽一下petalinux,个人不推荐使用默认的petalinux-config,因为你连它的内核在什么位置你都找不到!!!当然你可以通过petalinux-config
Run petalinux-config, and go into linux Components Selection ---> sub-menu,
For kernel, select linux-kernel () ---> and then select ext-local-src
( ) linux-xlnx
( ) remote
(X) ext-local-src
将自己的内核代码放在指定的目录,这样你就可以找到自己的内核,因为我就是这样做的)
解决办法
第一步 改变内核路径:
改变了petalinux-config配置内核为自己的内核路径后,为自己的内核代码后(因为petalinux版本是2018.2,自己的内核代码也是2018.2的版本,尝试使用了2016.2的版本,结果编译失败,就再没有尝试)。
第二步 打补丁:
根据xilinx官网论坛https://forums.xilinx.com/t5/Embedded-Linux/Dual-Ethernet-over-MII-MDIO-not-working-in-Petalinux-SDK-2018-2/m-p/892810#M28854下载补丁,将下载的补丁放在/drivers/net/ethernet/cadences目录下,打补丁的方式参考了
https://blog.csdn.net/qq_22918577/article/details/49103865博主的方法。
执行 patch -p1 < ./0001-net-macb-Add-MDIO-driver-for-accessing-multiple-PHY-.patch
第三步 修改system-user.dtsi,下面贴出我的设备树文件中关于MDIO的描述,
/include/ "system-conf.dtsi"
/ {
mdio{
#address-cells = <0x1>;
#size-cells = <0x0>;
compatible = "cdns,macb-mdio";
reg = <0xe000b000 0x1000>;
clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>;
clock-names = "pclk", "hclk", "tx_clk"; /* Don't touch */
ethernet_phy0: ethernet-phy@0 {
compatible = "marvell,88E1510";
device_type = "ethernet-phy";
reg = <0>;
};
ethernet_phy1: ethernet-phy@1 {
compatible = "marvell,88E1510";
device_type = "ethernet-phy";
reg = <1>;
};
};
};
&gem0 {
status = "okay";
local-mac-address = [00 0a 35 00 00 00];
phy-handle = <ðernet_phy0>;
};
&gem1 {
status = "okay";
local-mac-address = [00 0a 35 00 00 01];
phy-handle = <ðernet_phy1>;
};
究竟system-user.dtsi的配置成什么样,具体还得根据自己板子的硬件、驱动的源码解析进行相应的修改。
第四步 编译petalinux-build
第五步 引导启动petalinux
linux kernel 启动后,配置相应的PC的IP地址,我的板子这边配置为如下,
root@i5Prj:~# ifconfig eth0 192.168.0.88 up
root@i5Prj:~# ifconfig eth1 192.168.1.88 up
root@i5Prj:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:35:00:22:01
inet addr:192.168.0.88 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20a:35ff:fe00:2201%lo/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1206 (1.1 KiB) TX bytes:3334 (3.2 KiB)
Interrupt:30 Base address:0xb000
eth1 Link encap:Ethernet HWaddr 00:0A:35:00:00:01
inet addr:192.168.1.88 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20a:35ff:fe00:1%lo/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13 errors:0 dropped:0 overruns:0 frame:0
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1894 (1.8 KiB) TX bytes:2532 (2.4 KiB)
Interrupt:31 Base address:0xc000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1%1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
root@i5Prj:~# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: seq=0 ttl=64 time=0.309 ms
64 bytes from 192.168.1.2: seq=1 ttl=64 time=0.252 ms
64 bytes from 192.168.1.2: seq=2 ttl=64 time=0.282 ms
64 bytes from 192.168.1.2: seq=3 ttl=64 time=0.248 ms
root@i5Prj:~# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: seq=0 ttl=64 time=0.312 ms
64 bytes from 192.168.0.2: seq=1 ttl=64 time=0.257 ms
64 bytes from 192.168.0.2: seq=2 ttl=64 time=0.242 ms
64 bytes from 192.168.0.2: seq=3 ttl=64 time=0.240 ms
两个网口终于都可以ping通了。