PYNQ 开发 章节三 PYNQ镜像构建 (Smart Zynq SP & SL版)

本文将 完整的演示PYNQ的镜像构建过程(包括内核修改,和设备树的添加等),并最终在板子上跑通编译后的PYNQ系统。

一、需要准备的文件:

bionic.arm.2.4.img 第一章节已提前下载(并提前解压缩)

base.bit 以及 system.hdf 第二章节编译生成得到

二、镜像首次构建​

​ 1)在 /PYNQ/sdbuild/ 目录下新建文件夹 ‘prebuilt’,将bionic.arm.2.4.img文件拷贝至该文件夹

​ 2)在 /PYNQ/boards/目录下新建文件夹“Smart-Zynq-SP”(名字是自定义的 下文保持一致即可,另外 SL的板子 也适用)

​ 3)在Smart-Zynq-SP文件夹中再新建两个文件夹分别为 base 和petalinux_bsp

​ 4)在petalinux_bsp 中再建立文件夹 hardware_project

​ 5)分别将base.bit拷贝到base;system.hdf拷贝到hardware_project

​ 6)在Smart-Zynq-SP 文件夹中新建文件 Smart-Zynq-SP.spec(名称需要和文件夹同名),打开并编辑如下

备注 所有的 Smart-Zynq-SP都可以按照自己上文中设定的文件夹名修改,但是需要一致

ARCH_Smart-Zynq-SP := arm
BSP_Smart-Zynq-SP :=
BITSTREAM_Smart-Zynq-SP := base/base.bit

7)返回 /PYNQ/sdbuild/ 打开终端,可以右键 Open in Terminal

命令行终端跳出后会提前source 资源,如果没有的话,请按照第二章的部分对环境进行设置

8)输入以下命令生成镜像( Smart-Zynq-SP都可以按照自己上文中设定的文件夹名修改,但是需要一致),备注 如make出现错误,解决后先执行 make clean后,再进行make

make BOARDS=Smart-Zynq-SP \
 PREBUILT=./prebuilt/bionic.arm.2.4.img

之后 顺利的话 系统就开始编译生成镜像了。 时间非常漫长 可能在1-2小时,耐心等待

备注:我这边实际操作第一次遇到问题了,如下图所示 相信大家都会遇到,经过逐条对比 发现是 sudo 命令需要密码 导致 环境监测不通过的,解决的方法参看本文的最后的附加内容

经过漫长的等待之后,如果顺利的话,会出现下图所示提醒,代表编译通过

此时我们的工作才做了一半,因为我们的硬件和PYNQ官方板子的硬件是不同的,所以后面还要继续调整,但是此时如果把这个镜像用Win32DiskImager,烧写到TF卡中,再用Smart ZYNQ SP或者SL的板子来进行启动,其实是已经可以通过串口看到板子正常启动了。如下图所示

也算是成功了一半了吧, 庆祝一下

三、修改设备树、调整内核驱动后 再次构建镜像

此时编译好的镜像还不能使用,因为我们的硬件和官方的PYNQ硬件并不相同,所以有些地方需要做一些修改,才能让系统适配我们的主板 ,识别我们的USB EMIO的以太网,需要对内核进行设置,以及添加相应的设备树,然后再次生成镜像才可以使用。对了,上述操作必须是基于镜像的初次生成才可以,不然没法修改成功

下面开始具体操作

1 ) 添加设备树

​在目录 /sdbuild/build/Smart-Zynq-SP/petalinux_project/project-spec/meta-user/recipes-bsp/device-tree/files下,打开文件 system-user.dtsi

/include/ "system-conf.dtsi"
/ {
};

/{
  usb_phy0: usb_phy@0 {
  compatible = "ulpi-phy";
  #phy-cells = <0>;
  reg = <0xe0002000 0x1000>;
  view-port = <0x0170>;
  reset-gpios = <&gpio0 46 1>;
  drv-vbus;
 };
};

&usb0 {
 dr_mode = "host";
 usb-phy = <&usb_phy0>;
};

关于网络部分的设备树,网上大部分资料在这里 都提示需要创建网络部分的设备树,但是其实按照之前的操作完成后,系统会自动帮我们在设备树里添加网络,而不需要手动添加(在没有编译前看不到设备树,这里我们先略过设备树的创建,另外根据有些客户的反馈 其他版本的petalinux 可能需要在这里添加网络部分设备树才能正常运行 ,大家自行尝试)

2 ) 修改内核及驱动

将以太网设置为 ps7_ethernet_0 保存 退出

进入文件夹 /sdbuild/build/Smart-Zynq-SP/petalinux_project/目录下,打开终端命令行(右键Open in Terminal)

输入 petalinux-config,配置petalinux

petalinux-config

进入 kernel 配置界面, 选择 Subsystem AUTO Hardware Settings

选择 Ethernet Settings 按下回车

选择 Primary Ethernet (manual )

将设置从manual 修改成 Ps7_ethernet_0 按下回车

之后点选SAVE 保存设置 (备注 经过测试 这边修改IP地址,对结果似乎没有影响)

点选OK

之后按多次键盘上的ESC键,退出

配置Kernel 增加 GMII 2 RGMII驱动

在相同的目录下 打开命令行,输入

petalinux-config -c kernel

按向下箭头选择 Device Driver,并按下回车

选择 Network device support,按下回车

选择 PHY Device support and infrastructure 并按下回车

拖到最最下方,在xilinx GMII2RGMII converter driver 的驱动选项点下键盘上的Y键 (选项前会多出一个“ * ”代表选中了)

之后用键盘右键选择save 保存

配置Kernel 增加 USB驱动

根据刚才wiki 网站上的介绍,如果需要配置成USB HOST模式则需要 将kernel按照下图这样设置

因为kernel 设置中针对上图USB HOST中的设置默认都是打开的,所以kernel我们不需要更改设置,直接保存后退出即可

还是刚才的kernel 驱动配置界面(因为之前网络部分是修改的,所以一定要save 保存后再退出) 多次按ESC键返回主菜单,然后按EXIT 退出kernel 设置(接着继续漫长的等待)

3 )修改完成后再次生成镜像

返回 /PYNQ/sdbuild/ 打开终端,可以右键 Open in Terminal

命令行终端跳出后会提前source 资源,如果没有的话,请按照第二章的部分对环境进行设置

将之前output文件夹下的文件删除,再次运行make命令

再次输入以下命令生成镜像 ,千万不要提前输入 make clear 千万不要提前输入 make clear 会清空刚才修改的所有内容的

make BOARDS=Smart-Zynq-SP \
 PREBUILT=./prebuilt/bionic.arm.2.4.img

仍然是漫长的等待。。。。。。。。。。。

直到最后 出现下列界面了,说明成功生成了镜像文件

三、镜像烧录测试

将output文件夹下的文件复制到windows 下, 右键生成的img文件 然后 点选Copy ,然后粘贴会我们的windows 系统中

再用Win32DiskImager把镜像写到 TF 卡中, 要求大于8G (备注 插入TF卡的时候, 虚拟机可能会弹出选择界面,选择主机连接即可)

写入完成后正常退出闪存盘,然后将TF卡插入到 主板上, 在主板上将拨码开关设置成SD卡启动,然后上电

之后通过Putty 可以看到PYNQ的启动信息,说明系统成功运行了

板子默认插上网线是没反应的 也无法获取IP 也无法PING 通, 这里需要手动设置下IP地址,输入命令(会提示输入密码, PYNQ的密码是 xilinx )

sudo vi /etc/network/interfaces

在中间添加下列内容,需要添加在上下蓝线中间,并且 去掉注释的 #号(备注 为了方便接路由器直接演示,这边把IP地址设置成 192.168.1.*, 如果要和官方原版的保持一致,这里IP请设置成 192.168.2.99,网关设置成192.168.2.1

auto eth0
iface eth0 inet static
address 192.168.1.22
netmask 255.255.255.0
gateway 192.168.1.1

之后按下 ESC键,并输入 :wq! (冒号也需要) 并退出

之后在命令行中输入 /etc/init.d/networking restart 重启以太网,或者直接重启板子也可以(会提示输入密码 密码是 xilinx)

/etc/init.d/networking restart 

之后再回到系统 ,插上网线 到路由器 ,输入ifconfig 命令,可以看到刚刚设置的信息了

可以试着在终端里,ping 路由器地址

也可以用我们连接相同路由器的PC主机 去ping 我们的板子的IP (刚才设置的是 192.168.1.22)如下图所示,证明 ping 成功了,板子和我们的PC机可以正常通讯

接下去我们尝试主机去访问PYNQ 的 jupyter 界面,打开我们的网页浏览器在下面输入我们刚刚设置的 PYNQ的IP地址 端口9090

 192.168.1.22:9090

可以看到我们已经进入了Jupyter 的登陆界面, 默认密码是xilinx

我们输入密码后 可以登录系统

以上证明了 我们PYNQ 系统已经被移植成功了

此刻万分激动 ,说实在的 PYNQ能做什么我还不是很清楚, 但是已经走到这里了,后续再一点点摸索吧 ,不容易。 熬了一个星期的夜终于调通了

USB功能验证

对了对于Smart ZYNQ SP的用户 可以按照下列方式来验证USB 是否工作(Smart Zynq SL用户因为没有USB 功能 可以不用测试)

未接入设备时,在终端输入命令lsusb

​ 接入U盘,再次输入命令lsusb

此时比第一次多出了 U盘的设备信息,可见usb功能也正常工作了

附加内容,制作镜像过程中,遇到sudo命令需要密码导致编译失败的情况,的解决方法

备注:我这边实际操作第一次遇到问题了,如下图所示 相信大家都会遇到,经过逐条对比 发现是 sudo 命令需要密码 导致 环境监测不通过的,解决的方法如下

解决方法: 编辑文件/etc/sudoers, 通过下列命令编辑 : sudo vi /etc/sudoers

将 %sudo ALL=(ALL:ALL) ALL 修改为 (光标通过上下左右调整到此位置,然后按下 I 键)

%sudo ALL=(ALL:ALL) NOPASSWD:ALL

然后按下ESC键并输入 :wq!保存编辑,退出即可

小贴士:如果编辑的时候按上下左右 会出现abcd,说明安装的vi是 不完整版的,可按照下面指令进行操作

先卸掉旧版的vi:
sudo apt-get remove vim-common
安装full版的vim:
sudo apt-get install vim

备注1: 如上文所说 ,原版PYNQ 的IP 是192.168.2.99, 本文为了适配路由器,所以直接设置成192.168.1.* 网段了, 大家按照自己需求设置。 另外 这里没有增加DNS 部分,不知是否需要手动设置,还在整理中,后续视情况修改内容。

备注2: 关于网络部分 暂时镜像生成完成后,板子网络需要手动IP才能访问, 我这边也尝试过在编译内核的时候直接在配置页设置IP地址,但是似乎编译后 网络仍然不能直接使用。 资料暂时先上传,这两天有空再测试看看,如有改进的方法将直接改在内容之中。

编译好的临时镜像暂时先上传,感兴趣的自行尝试下(切记 需要按上文内容 修改IP地址才能正常使用网络,否则网络功能是不使能的,不知原因

链接:https://pan.baidu.com/s/1RlbgjcrqwbTygRqjBNh7qw
提取码:0trc

大家也自行尝试看看,因为我PYNQ 也不是很熟悉,所以大家遇到什么问题直接在下方给我留言吧。

“PYNQ 开发 章节三 PYNQ镜像构建 (Smart Zynq SP & SL版)”的11个回复

  1. pynq.Overlay()加载比特流和tcl必定卡死,空比特流/LED点灯比特流/pynq官方提供的FIR和sobel示例比特流(xz7c020clg484-1)/在其他xz7c020clg484-1的pynq板上验证通过的比特流均加载卡死。

    1. 因为你创建的比特流 没有添加网络部分,这就导致你的比特流一加载 板子的网络就失效了,这样从网络上来看就是 板子卡死了,其实板子还在运行
      你在我的vivado 工程上进行修改 保留网络和uart 部分 就不会有问题了

  2. 请问加载了pynq的还可以用linux下的驱动吗,我有一个axi spi emio连PLspi设备的工程petalinux构建运行是没问题的,可加上pynq后spidev驱动就有问题

    1. PYNQ 本身就是一个linux ,所以linux 下的一些驱动按理应该都是可以移植到PYNQ的
      你是移植后没有正常工作吗? 在PYNQ 的 vivado 工程中有调整对应的SPI部分吗

  3. root@pynq:/etc/network/interfaces.d# more eth0
    自动获取IP 设置, eth0文件:
    第一行: auto eth0
    第二行: iface eth0 inet dhcp

  4. 使用SP2开发板,tf卡(16GB)分为两个分区,格式分别为ext4和fat32,fat32烧录的您的镜像
    linux启动到最后的时候出现
    [ OK ] Started Unattended Upgrades Shutdown.
    [ OK ] Reached target Host and Network Name Lookups.
    [ OK ] Started LSB: set CPUFreq kernel parameters.
    [ OK ] Started Permit User Sessions.
    [ OK ] Started Getty on tty1.
    [ OK ] Started Network Time Service.
    [ OK ] Started OpenBSD Secure Shell server.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ OK ] Stopped Getty on tty1.
    [ OK ] Started Getty on tty1.
    [ ***] (1 of 3) A start job is running for Samba NMB Daemon (58s / 1min 34s)

    然后到
    [ OK ] Reached target Multi-User System.
    [ OK ] Reached target Graphical Interface.
    Starting Update UTMP about System Runlevel Changes…
    [ OK ] Started Update UTMP about System Runlevel Changes.
    就停止了,命令行没有出现其他任何消息,网口灯不亮.

    1. 这个情况我没遇到过,看起来可能是网络那边的配置没成功。 不排除镜像烧录失败了,或者镜像从网站下载过程中损坏了。 你看看能不能查一下镜像的MD5 ,我和我这边的镜像对一下

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注