一、tftp服务器

1.1 介绍

        tftp(全称Trivial File Transfer Protocol)服务器是一种提供简单文件传输协议服务的软件和设备。它有着无需用户名/密码,没有目录列表功能,必须知道确切的文件名,使用UDP协议,速度快但不可靠的特点。下表对TFTP和FTP进行了一个简单的对比

特性 TFTP(简单文件传输协议) FTP(文件传输协议)
底层协议 UDP TCP
端口号 69 20(数据),21(控制)
安全性 无身份验证,无密码 用户名/密码验证,可扩展支持加密(FTPS/SFTP)
功能 仅读/写文件 丰富,支持目录浏览、删除、重命名等
可靠性 较低(依赖UDP) 高(依赖TCP)
实现复杂度 非常低,占用资源少 较高,占用资源多
典型用途 设备配置、固件升级、网络启动 网站文件管理、通用文件共享

1.2 在Linux中配置tftp协议

1)命令行输入sudo apt-get install tftp-hpa tftpd-hpa安装对应软件包;

2)为tftp新建一个存放文件的目录/tftpboot;

3)修改文件/etc/default/tftpd-hpa;

二、NFS和SSH服务

2.1 NFS服务 

2.1.1 介绍

        NFS(全称Network File System)服务用于支持linux驱动的开发。NFS 是一种分布式文件系统协议,允许网络中的计算机像访问本地存储一样访问远程主机上的文件。它是 Linux/Unix 世界中实现文件共享的标准方式,类似于 Windows 环境中的“网络驱动器映射”。可以把 NFS 想象成将服务器上的一个文件夹“嫁接”到你的本地电脑上,让你在使用时感觉它就是本地硬盘的一部分。

        一个重要的概念:UID/GID 映射:NFS 的权限控制是基于用户 ID (UID) 和组 ID (GID) 的。如果客户端用户 bendam-qiqi(UID 501) 在挂载点创建一个文件,NFS 服务器会检查自己系统上 UID 为 501 的用户是谁,并以该用户的身份创建文件。如果服务器上没有 UID 501,通常会映射为一个没人使用的 nobody 用户,导致权限问题。

2.1.2 Ubuntu中开启NFS服务

        1)命令行运行命令“sudo apt install nfs-kernel-server”安装NFS服务;

        2)创建更目录下创建/linux和/linux/nfs目录;

        3)打开文件/etc/exports并添加“/home/zynq/linux/nfs *(rw,sync,no_root_squash)

        4)运行命令“sudo service nfs-kernel-server restart”重启服务;

        5)验证查看共享目录,运行命令“showmount -e”;

        注:如果在nfs运行过程中修改了/etc/exports配置文件, 可以使用 exportfs 命令使改动生效,具体命令:“sudo exportfs -rv”。

2.2 SSH服务

2.2.1 介绍

        SSH(全称Secure Shell)服务可以支持我们在windows系统下使用终端访问Ubuntu。SSH 是一种网络协议,用于在不安全的网络(如互联网)上,安全地执行远程命令和管理远程计算机。SSH服务可以用于我们在虚拟机中想要访问主系统的文件的情况。

2.2.2 Ubuntu中开启SSH服务

        要开启SSH服务直接运行命令“sudo apt-get install openssh-server”安装SSH服务即可,其配置文件为:/etc/ssh/sshd_config,使用默认配置不用修改。

三、Petalinux

3.1 介绍 

        Petalinux 工具是 Xilinx 公司推出的嵌入式 Linux 开发套件,包括了 u-boot、Linux Kernel、
device-tree、rootfs 等源码和库,以及 Yocto recipes,可以让客户很方便的生成、 配置、编译及自定义 Linux 系统。Petalinux 支持 Versal、Zynq UltraScale+ MPSoC、Zynq-7000 SoC 以及 MicroBlaze,可与Xilinx 硬件设计工具 Vivado 协同工作,大大简化了 Linux 系统 的开发工作。

        实际开发过程中应该特别注意vivado版本与petalinux的版本适配。petalinux2020之前配置linux系统使用的是vivado中导出的.hdf文件,2020之后则需要vivado中导出的.xsa硬件描述文件,之后还会提到(由于版本的不匹配笔者浪费了不少时间)。

        petalinux的下载可以去到xilinx官网的资源和支持菜单下找到下载途径,本文使用的是petalinux2022.2;

3.2 petalinux的安装

        下载好安装包后,将安装包放入linux系统可以访问的位置,如果是windows下载的安装包可以将其放入共享文件夹,共享文件夹的设置可以参考下面的文章:Linux学习记录(八)文件共享-CSDN博客

        安装petalinux之前还需要安装相关依赖和软件,在命令行中运行下面命令:

sudo apt-get install tofrodos iproute2 gawk gcc git g++ make net-tools libncurses5-devg tftpd zlib1g:i386 libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential libsdl1.2-dev libglib2.0-dev screen pax gzip automake

        这些依赖在安装过程中,apt可能会找不到依赖或软件,在安装之前可以先运行下面命令获得软件列表:

sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo add-apt-repository restricted
sudo apt-get update

        这些命令可以启动universe、multiverse、restricted软件源,并通过update更新软件列表到apt-get中。

        安装好依赖后就可以开始安装petalinux了:

运行命令:

sudo chown -R $USER:$USER /opt
mkdir -p /opt/pkg/petalinux/2022.1

以用户权限创建文件夹,最后运行命令:

./安装包文件名.run /opt/pkg/petalinux/2022.1

将petalinux工具安装到 /opt/pkg/petalinux/2022.1目录下。

安装完成后还需要修改shell类型将dash改为bash。运行命令

sudo dpkg-reconfigure dash

在弹出窗口中选择否即可改为bash。

3.3 Petalinux设计流程

        Petalinux作为嵌入式linux开发的得力助手,有着一般化的开发流程:

3.3.1在Vivado中创建硬件平台,并导出其硬件描述文件.xsa

下面对整个工程的创建和文件的导出过程进行简单的说明:

1)这里我使用的是ZYNQ7000系列的开发板,需要在vivado中创建工程选择对应的芯片,然后创建板级设计(block design):

2)在block design中点击+号,搜索添加IP:ZYNQ7 Processing System;

3)双击该模块后根据开发板的原理图设计,配置相应的串口、SPI、时钟、DDR3等资源:

4)配置资源比较复杂需要一定的开发经验,这对于新手而言一定是一头雾水的,需要在实践中逐渐了解深入这些ZYNQ的配置,现在将每一个界面的作用简介如下:

PS-PL Configuration 页面能够配置 PS-PL 接口,包括 AXI、HP 和 ACP 总线接口。

Peripheral IO Pins 页面可以为不同的 I/O 外设选择 MIO/EMIO 配置。

MIO Configuration 页面可以为不同的 I/O 外设具体配置 MIO/EMIO。

Clock Configuration 页面用来配置 PS 输入时钟、外设时钟,以及 DDR 和 CPU 时钟等。

DDR Configuration 页面用于设置 DDR 控制器配置信息。

SMC Timing Calculation 页面用于执行 SMC 时序计算。

Interrupts 页面用于配置 PS-PL 中断端口。

5)引脚配置完成后退回到block design界面,点击下图中箭头所指示的位置“Run Block Automation”

再点击ok即可完成自动连线,连线后我们就完成了ZYNQ7 Processing System的配置,如下图所示。

6)接下来就是验证配置的可行性,保存设计后,点击下图标记的按钮就可以自动进行验证了。

这样就表示配置没有问题可以进行下一步生成顶层的HDL模块。

7)在 Sources 窗口中,选中 Design Sources 下的 sysetm.bd, 这就是我们刚刚完成的 Block
Design 设计。 右键点击 sysetm.bd,在弹出的菜单栏中选择“Generate Output Products”。

8)在弹出的“Generate Output Products”对话框中选择 Global

图中Run Setings 用于设置生成过程中要使用的处理器的线程数, 进行多线程处理,保持默认或设置为个人电脑处理器最大可使用线程数都可以,一般选择最大可使用线程数。最后点击“Generate”来生成设计的综合、实现和仿真文件。

9)在 Sources 窗口中,点击“IP Source”标签页,可以看到 Generate 过程生成的输出结果。

10)在“Hierarchy”标签页再次右键点击 system.bd,然后选择“Create HDL Wrapper”生成顶层HDL模块;

在弹出的对话框中确认勾选“Let Vivado manage wrapper and auto-update”,然后点击“OK”。

生成的.v顶层模块文件结构如下图所示:

11)有了顶层文件后只需要将FPGA部分的模块实列化到顶层模块中,再编译生成bit流就完成了所有准备工作。

12)最后在file菜单栏中导出包含bit流的硬件描述文件即可,如下图所示:

        需要注意的是导出硬件描述文件这一步在2020版本以前的vivado都只能导出hdf文件,而2020及其以后的版本才能导出xsa文件。

3.3.2 设置 Petalinux 环境变量

        在找到3.2中安装的petalinux的位置,用source命令运行该安装位置下的settings.sh文件。我这里安装在/opt/pkg/petalinux/2022.1下,则只需运行命令:

source /opt/pkg/petalinux/2022.1/settings.sh

3.3.3 创建petalinux工程

运行如下命令创建petalinux工程:

petalinux-create -t project --template zynq -n starlite_zynq7020

        其中template 参数表明创建的 petalinux 工程使用的平台模板,此处的 zynq 表明使用的是 zynq 平台模板的 petalinux 工程,用于 zynq-7000 系列的芯片。name 参数(此处简写为“-n”) 后接的是petalinux 工程名,如此处的“starlite_zynq7020 ”,大家可以根据自己的喜好修改;可以看到该命令执行完成之后会自动在当前目录下创建一个名为 starlite_zynq7020 的文件 夹,也就是我们新建的 petalinux 工程对应的工程目录。

3.3.4 配置 petalinux 工程

        这一步尤为重要,在这一步我们需要配置linux系统的启动、外设、性能、调试等多方面配置,如果Petalinux配置不当,可能导致:系统无法启动 硬件资源无法访问 性能严重下降 调试困难 系统不稳定。

        要配置petalinux工程,我们直接cd到之前创建的工程文件夹下,运行如下命令:

petalinux-config --get-hw-description [你的.xsa文件所在文件夹]

xsa 文件导入成功之后会自动弹出petalinux 工程配置窗口,如下图所示:

这里如果你的弹窗中的红框位置没有AUTO字样,则说明petalinux没有识别出你的.xsa文件,弹窗现在只是zynq的默认模板。出现这样的情况可能是petalinux版本和vivado的版本不匹配,或者你的.xsa文件有问题。可以下载不同版本的petalinux分别进行工程的创建和配置来查找匹配的petalinux版本。

在这里配置好linux系统后,选择save并退出窗口,petalinux就会根据配置信息,自动完成工程的配置。

3.3.5 配置linux内核

petalinux支持linux内核的定制,输入以下命令开启配置界面:

petalinux-config -c kernel

不同的petalinux版本,默认使用的linux内核版本不同,当然也可以换成其它版本的内核,不过修改起来比较麻烦,Petalinux 对内核版本有要求,如需使用其他的内核版本可以在网查找关于Petalinux 使用非默认内核版本的方法。一般使用默认内核版本就可以了。

运行后弹窗如图所示:

同样的配置好后选择save再退出弹窗即可完成配置。

3.3.6 配置linux根文件系统(可选)

终端运行命令:

petalinux-config -c rootfs

弹窗如下图所示:

其中“PetaLinux RootFS Settings”可以用来设置 root 用户的密码,默认密码为“root”。

3.3.7 配置设备树文件

设备树为Linux内核提供硬件信息,尤其是在没有传统BIOS或者固件的设备上,像ARM架构的嵌入式系统中,它的作用尤为重要。设备树的目的是为操作系统提供硬件平台的详细信息,从而让操作系统能够适应不同的硬件平台,而不需要内核针对每个硬件平台单独编译。这种方式在嵌入式设备上非常有用,因为它可以使操作系统在不同的硬件上灵活运行。

在petalinux工程中设备树的配置全部放在了工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi中,system-user.dtsi默认如下图所示

3.3.8 编译petalinux工程

在终端运行命令

petalinux-build

对工程进行编译,该命令将生成设备树 DTB 文件、fsbl 文件、U-Boot 文件,Linux 内核和根文件系统映像。生成的映像将位于工程的 images 目录下。

3.3.9 制作BOOT.BIN启动文件

终端运行命令

petalinux-package --boot --fsbl "fsbl镜像文件路径" --fpga "bitstream文件路径" --u-boot --force

生成BOOT.BIN启动文件,其中fsbl镜像文件路径默认为images/linux/zynq_fsbl.elf,bitstream文件路径默认为images/linux/system.bit

3.3.10 制作SD启动卡

        linux系统需要的启动文件必须放在FAT32类型的分区中,所以对于新的SD卡应该先对其进行分区,再将BOOT.BIN启动文件和image.ub镜像文件复制到FAT32类型的分区中,该分区给100M的存储空间就够了,SD卡其余空间全部作为系统的文件存储空间。一般我们将FAT32类型的分区取名为BOOT,将第二个分区格式化成 ext4 分区并命名为rootfs。

在终端运行以下命令:

umount /dev/sdb*
sudo fdisk /dev/sdb

开启分区操作,在fdisk中”p“可查看该存储区域的分区情况,”d“可删除分区,"n"为创建新的分区。

两个分区创建完成后运行以下命令:

sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2

        对生成的分区进行格式化,sdb1和sdb2就是我新建的两个分区所挂载的位置。格式化后如果是Ubunto的桌面版,在 Ubuntu 系统桌面的左边会出现两个 USB U 盘类设备图标,分别点击两个图标,即可自动将这两个分区挂载到 Ubuntu 系统。如下图所示:

3.3.11 进入 Linux 系统

将开发板(我使用的是PZ7020-StarLite)设置为以SD卡启动,并将开发板的串口连接到PC上,在PC上使用串口终端连接好串口后给开发板供电,便可以在串口终端看到嵌入式linux系统的启动信息。

示例如下:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐