petalinux在zynq平台移植和双网口实现

本文详细记录了在Zynq平台上移植PetaLinux过程中遇到的双网卡驱动问题及解决步骤。作者分享了如何修改设备树、内核配置、应用补丁并最终实现两个Marvell 88E1510网卡正常工作的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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 = <&ethernet_phy0>;

        };
    &gem1 {
            status = "okay";
            local-mac-address = [00 0a 35 00 00 01];
            phy-handle = <&ethernet_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通了。

 

参考资源链接:[Petalinux_config详解:U-Boot与Linux内核配置指南](https://wenku.youkuaiyun.com/doc/2kgka7j4tx?utm_source=wenku_answer2doc_content) 在ZYNQ平台Petalinux开发过程中,自定义配置U-BootLinux内核是确保系统按预期运行的关键步骤。同时,正确设置启动选项是引导整个系统的前提。以下详细步骤将指导你完成这些配置: 首先,启动Petalinux配置工具,通过命令行输入`petalinux-config`进入配置界面。在配置界面中,找到并进入`Linux Components Selection`选项,这里允许你选择或指定自定义的Linux内核U-Boot源码位置。 1. 对于U-Boot的自定义配置,你可以选择克隆Xilinx官方仓库中的u-boot-xlnx源码,并确保其版本与Petalinux版本匹配。在`Linux Components Selection`中,指定到你的本地u-boot源码路径,比如`${TOPDIR}/../components/ext_sources/u-boot-xlnx`。 2. 接下来,为了自定义Linux内核配置,选择`kernel source location`选项,指向你的内核源码目录。通常,Petalinux默认会从官方仓库获取内核源码,但为了定制化,你可以更改这一设置。 3. 在`AutoConfigSettings`中,Petalinux默认使用`Devicetreeautoconfig`功能来自动生成设备树。如果你对设备树进行了修改,确保在修改完成后取消`Devicetreeautoconfig`选项,然后运行`petalinux-config`以确保更改生效。 4. 最后,在`Subsystem AUTO Hardware Settings`中,你可以设置系统的启动方式,选择通过QSPI-FLASH还是SD卡启动。这一步骤至关重要,因为它决定了你的系统是如何引导的。根据你的硬件设计需求,选择合适的启动设备配置。 完成这些步骤后,保存配置并退出配置工具。然后,使用`petalinux-build`命令来编译整个系统。编译完成后,使用适当的工具(如Xilinx SDK提供的工具)将镜像烧录到QSPI-FLASH或SD卡中。 通过以上步骤,你将能够完成Petalinux环境中U-BootLinux内核的自定义配置,并设置合适的启动选项。为了进一步深入理解这些配置的细节潜在问题的解决方案,建议阅读《Petalinux_config详解:U-Boot与Linux内核配置指南》。这份文档不仅详细介绍了上述配置步骤,还提供了针对Xilinx ZYNQ平台开发的深度解析,帮助你更好地掌握Petalinux配置的全过程。 参考资源链接:[Petalinux_config详解:U-Boot与Linux内核配置指南](https://wenku.youkuaiyun.com/doc/2kgka7j4tx?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值