Notice:本文主要分析在device-tree中对flash的分区,过程中会提及到其它问题,并且有解决办法。
问题一:ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
问题描述的是“等待PHY自动协商完成.........超时!”
Solution:1、在vivado工程里面双击zynq IP核,在弹出的窗口左边选择Periheral I/O Pins,此时右边会出现管脚分配方
格表, 选择Ethernet0或者Ethernet1,这里根据实际开发板使用的网口端口号确定,默认使用Ethernet0。如下图:
2、在petalinux工程中使用命令“petalinux-config”进行配置,在弹出的界面中选择“Subsystem AUTO Hardware Settings ”,在选择“Ethernet Settings ---> ”,接着选择“Primary Ethernet (ps7_ethernet_0) --->”最后 选 择“ps7_ethernet_0 ”,Save and Exit回到上一级,设置“ (00:0a:35:00:1e:53) Ethernet MAC address”,这个地址在设备树中需要,一次见下图:
3、最后检查网线是否连接上服务主机,是否连接好,可以使用命令“ping
问题二:对flash的分区。
首先我们看一下uboot启动的时候打印的信息见下图:红线部分表示flash总共有32M,那么我们在device-tree中对flash
分区时就不能超过32M,否则就会出现下图这种类似的错误:分区没有被更新!
这种情况一般是flash的分区不正确或者该分区小于实际文件的大小导致无法加载。
接下来以我做的实例来为大家讲解:
本实例需要将四个文件固化到flash中:BOOT.BIN(5 M),image.ub(9.9M),rootfs.tar.gz(5.8M),system.dtb(20kb)。这四个文件的总共大小不能超过32M,否则就不能将文件固化到flash中,分区要比实际文件稍微大一 点,这样避免不必要的错误。下图则是本实例对flash的分区:
其中我还分配了一个bootenv分区,用来加载环境变量使用,暂时用不到就不做讲解。从上图可以看出所分区间比实际文件都要 大,但总共的长度不会超过32M,特别说明一下分区“spare”,这个分区是对flash剩下的储存区间的一个命名,这样确保flash已经被全部正确分区。
注意:首地址不能出错,否则也是徒劳无功。
关于设备树的规则写法讲解请点击链接:https://elinux.org/Device_Tree_Usage#Notes (转载网址)
前面提及到的以太网MAC adress,设备树里面需要写出来如下图:
dtsi文件的路径:
这个文件是系统自动生成的;当你使用命令petalinux-config在弹出的对话框中选择“-*- Subsystem AUTO Hardware Settings ---> ”,在选择“Flash Settings ---> ”,出现的对话框根据你的分区情况进行设置分区名字,分区大小(0x****)十六进制格式。如下图:
----------------------------------------------------------参考--------------------------------------------------------------
1M = 1024 Kb
1Kb = 1024 B(字节)
1MB = 1048576 B(字节)
一个汉字占2个字节
0x20000000 512M
0x10000000 256M
0x01000000 16M
0x00100000 1M
----------------------------------------------------------------------------------------------------------------------------------
设置好Save and Exit 返回上一级,如下图,选择“ [*] Advanced bootable images storage Settings ---> ”设置启动位置,所有的文件都选择“ (X) primary flash ”,从flash启动。如下图视:
所有选项配置完成后执行Save and Exit ,在工程路径:
提示:BOOT.BIN文件是使用petalinux-package 命令打包的文件,它包含三个文件:zynq_fsbl.elf、system_top.bit、
u-boot.elf,文件名可能与你的不一样,以后缀为主。
接下来先用JTAG将BOOT.BIN 文件烧写到开发板中,JTAG的下载速率与分区的正确性有关,烧写完成重新给开发板上电,串口打印如下信息:
如果flash中已经有了镜像文件,在“Hit any key to stop autoboot: 0”倒计时完后系统将会自启动,如果按回车则进入uboot界面;我们在uboot界面使用命令“print”查看我们的所有环境变量信息,内容如下图:
注意ipaddr 是开发板ip地址,serverip是服务主机地址,一定要确保ip地址到网关除都是一样的(192.128.2.xxx)。可以使用命令“ping serverip”查看是否联通。如果以太网连接正常就可以执行命令将文件:BOOT.BIN(5 M),image.ub(9.9M),rootfs.tar.gz(5.8M),system.dtb(20kb)烧写到flashl里面对应的分区了。这里执行命令“run uddate_boot”将BOOT.BIN文件固化到flash的boot分区,串口打印信息如下,则表示成功,注意红线勾画信息:
如果出现如下图打印的信息则表示没有成功,还需要进行修改:
当我们把四个文件都固化到flash中对应的分区后,给板子重新上电,固化到flash中的文件掉电后不会丢失,DDR中的文件掉电就会丢失,重启观察串口打印信息,在“Hit any key to stop autoboot: 0”执行完后系统自动启动,打印出启动过程信息如下图(省略图):
在过程中会打印出device-tree中对flash的分区信息,如下:
进入linux系统的登录名和密码都是“root”。
flash的分区大致如此,如果有不同建议,希望读者留言。转载请标明文章出处!