前置学习:嵌入式Linux_Petalinux一
参考资料:正点原子《DFZU2EG_4EV MPSoC 之 Linux 驱动开发指南》
关于SecureCRT 中如何配置颜色
之前使用 Petalinux 搭建了 Linux 系统,有了系统就可以在系统上使用相应外设以及运行应用程序。本章我们学习如何通过 Linux 系统控制开发板上的基础外设,如 LED、按键、EEPROM、以太网等。这些外设都可以在终端通过 Shell 来控制。
输入以下命名查看系统:
cat /proc/version #查看内核版本信息
top #检测资源使用情况
Linux version 5.4.0 (cx@cx-ubtu) (gcc version 9.2.0 (GCC)) #11 SMP Mon Nov 14 13:40:04 CST 2022
GPIO 驱动程序通过 sysfs 文件系统提供了用户空间对 GPIO 的访问,因而通过终端控制 LED 极其方便。我们启动开发板,进入之前定制的 Linux 系统后在串口终端中输入如下命令进入到 sysfs 文件系统的 leds 接口处:
cd /sys/class/leds
ls
通过 ls 命令可以看到我们在设备树中配置的 led,如下图所示:
我们先来看下 led 下的内容,以 ps_led1 为例,输入 ls -l ps_led1,执行结果如下图 所示:
可以看到有 brightness 和 trigger。Brightness 可以控制 led 灯的亮灭,trigger 可以选择触发方式。我们向 ps_led1 的 brightness 写入 0,即输入命令:
cd ./ps_led1
echo 0 > brightness
或者用下面命令查看brightness的当前值,再用vim修改:
cat brightness
vim brightness
对应开发板上led灯的亮灭。
然后输入命令查看led灯的触发方式:
cat trigger
可以看到触发方式非常多,其中“[ ]”中的内容表示当前触发方式。可知当前触发方式为 none,也就是表示无任何触发反应。
想设置使用某种触发方式输入 echo 命令如上,如:
echo heartbeat > trigger
需要提醒的是并不是所有的触发方式都能有反应,必须满足触发条件并且 brightness 值为 1 才行。
GPIO 按键的使用非常简单,通过读取文件/dev/input/event0 可以获取由 GPIO 按键生成 的按键事件。在串口终端中输入命令:
cat /dev/input/event0 | hexdump
然后按下一个 按键,输入事件将打印到控制台
配置设备树的时候,我们在设备树文件中配置了一个 EEPROM 的 I2C 外设, 我们来看下如何读写 EEPROM。
在 /sys/class/i2c-adapter 目录下有三个 I2C 总线控制器,相关操作如下图所示:
可以看到器件地址 50 对应的文件夹 0-0050,对应 eeprom。 进入到 0-0050/目录下,可以看到该目录有一个 eeprom 文件,如下图所示:
cd /sys/class/i2c-adapter
ls
cd i2c-0
ls
cd 0-0050
ls
echo "hello world" > eeprom
head -1 eeprom
对于 RTC,linux 有一个专用的命令:hwclock。
在 Linux 中有硬件时钟与系统时钟两种时钟。硬件时钟是指电路板上的时钟设备(包括主 控芯片内的时钟模块),也就是通常可在 BIOS 画面设定的时钟。系统时钟则是指 kernel 中的时钟。当 Linux 启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。所有 Linux 相关指令与函数都是读取系统时钟的设定。
使用 date 和 hwclock 命令可分别查看和设定系统时钟和硬件时钟。 在串口终端中输入下面的指令查看系统时间:
date
hwclock
输入下面的指令将系统时间设置为当前日期和时间:
date -s "2023-10-9 14:39:00"
在串口终端中输入下面的命令将系统时间写入 RTC 时钟芯片中:
hwclock -w
开发板带有一个 miniDP 接口,可以接显示器显示。一般显示使用的是 DP 接口或者 HDMI 接口,与开发板的 miniDP 接口不同,所以还需要一根 miniDP 转 DP 线或者 miniDP 转 HDMI 线。下面分别展示不同接口显示器的线材接口。
1. DP 接口显示器:使用公对公的 mini DP 转 DP 线连接开发板和 DP 显示器即可,线材接 口如下:
2. HDMI接口显示器:需要使用主动式miniDP转HDMI线来连接开发板和HDMI显示器。 需要注意的是并不是市面上所有的 miniDP 转 HDMI 线都可以使用,至于原因,Xilinx 官方也 只是说由于历史原因,但并未透露更多细节。笔者在购买市面上大量的 miniDP 转 HDMI 线并 进行测试后发现,有些线 linux 系统下能显示,但是裸机 Vitis 下不能显示或显示有问题,有些线无法使用,最终测试发现有一根线 linux 和 Vitis 下都能正常显示。
使用转接线将开发板的 miniDP 与显示器连接后,按 PS 的复位按键重启开发板,重启后会在显示器显示控制台终端。
将 USB 接口的设备接到开发板的 USB 接口,在串口中断中会打印如下信息:
显示的“Product: USB Keyboard”表明检测到插入的设备是 USB 键盘。
DFZU2EG_4EV MPSoC开发板有两路千兆以太网接口,PL_ETH和PS_ETH;由于PL_ETH 网口使用了 PL 端 IO 资源,而 PS_ETH 使用了 PS 端 IO 资源,所以这里也把 PL_ETH 网口称 为 PL 网口、而把 PS_ETH 网口称为 PS 网口。
注:连接网口的网线要使用千兆网线,譬如 CAT-5E 类网线或 CAT-6 类网线,笔者在实 际测试当中,发现 CAT-5E 类网线并不稳定,所以这里推荐使用 CAT-6 类网线进行测试。
在串口终端执行下面这条命令可以查看系统中的所有网络设备,如下所示:
ip -s a
#或者
ifconfig -a
其中 eth0 表示开发板上的 PL_ETH 网口、 而 eth1 则表示开发板上的 PS_ETH 网口。还可以直接使用 ifconfig 命令不加任何选项查看当前系统已经激活(打开)的网络设备(等同于命令 ip link show up),如下图所示:
ifconfig
或
ip link show up
系统默认只激活了 eth0,而 eth1 并没有激活,上图中的 eth0 就是开发板上的 PL 网口,可 以通过 ifconfig 命令或者 ip 命令来关闭或激活对应的网口。 ifconfig 命令打开或关闭 PL 网口的命令如下所示:
ifconfig eth0 down //关闭 eth0(PL 网口)
ifconfig eth0 up //打开 eth0(PL 网口)
如果是用 ip 命令,则对应命令如下:
ip link set eth1 down //关闭 eth1(PS 网口)
ip link set eth1 up //打开 eth1(PS 网口)
下面我们在使用 PS 网口的时候,需要先把 PL 网口给关闭,只打开 PS 网口;同理使用 PL 网口的时候,需要把 PS 网口给关闭,只打开 PL 网口;在后面的使用当中,笔者以 PL 网 口为例进行介绍,PS 网口使用方式相同。
执行下面的命令打开开发板的 PL 网口,并且关闭 PS 网口:
ip link set eth1 down //关闭 PS 网口
ip link set eth0 up //打开 PL 网口
ip link show up
接下来我们需要给 PL 网口分配一个 IP 地址,使用 udhcpc 命令从 DHCP 服务器中动态 获取一个 IP 地址,如下所示:
udhcpc -i eth0 //eth0 动态获取 IP 地址
可以看到,笔者这里 PL 网口动态获取得到的 IP 地址为 192.168.2.219。获 取到 IP 地址之后,接下来我们需要测试下开发板是不是能够上网,也就是测试开发板 PL 网 口是否工作正常、是否能够连接外网。当然首先确定开发板 PL 网口连接到的路由器是能够连 接外网的,我们可以使用 ping 命令来测试开发板与另一台主机的网络连接是否通畅。
ping 命令是基于 ICMP(Internet Control Message Protocol)协议来工作的,执行 ping 命令 本地主机会向目标主机发送一份 ICMP 回显请求报文,并等待目标主机返回 ICMP 应答;因为 ICMP 协议会要求目标主机收到消息之后,必须返回 ICMP 应答消息给本地主机,如果本地主 机收到了目标主机的应答,则表示两台主机之间的网络运行、网络连接是正常的。
ping -c 10 www.baidu.com //测试开发板与百度服务器之间网络连接情
从上图可以知道,我们通过开发板对百度服务器主机(IP 地址:14.215.177.39)发送了 10 次应答请求,并且每次都收到了它的应答消息(64 字节数据),并且没有数据丢失,说明 开发板与百度服务器主机之间的网络运行、网络连接是 OK 的,也就意味着我们的开发板与外 网是连通的。 PS 网口的外网连接测试同理。
在开发过程中,电脑和开发板互相访问是经常需要的,这可以通过路由器来实现,连接到 同一路由器的设备是可以互相访问的,如果没有路由器,也可以使用网线将开发板 PS 网口或 者 PL 网口直接连接到电脑的以太网接口上,也就是电脑直连,不过这种方式不能访问外网。 笔者以 PL 网口为例,用网线将开发板的 PL 网口和电脑的以太网接口相连接。
连接好网线之后,需要设置电脑以太网的 IP 地址,可参考:Linux开发板网络直连电脑的设置方法https://www.bilibili.com/video/BV1QJ411v7xk/?spm_id_from=333.999.0.0&vd_source=01cde8042a76495bf513aa4407a56cd6
配置完成后,在串口终端中执行下面这些命令打开开发板的 PL 网口,并且关闭 PS 网口:
ip link set eth1 down //关闭 PS 网口
ip link set eth0 up //打开 PL 网口
ip link show up
执行下面的命令设置开发板 eth0 网口的静态 IP 地址为 192.168.2.88:
ip addr add 192.168.2.88/24 dev eth0
将开发板的静态 IP 地址设置为 192.168.2.88,这样开发板的 IP 地址和电脑的 IP 就在同一 网段。设置完开发板的静态 IP 地址后,进行 Ping 测试,看开发板和电脑能不能相互 Ping 通。 首先开发板 ping 电脑,命令如下:
ping -c4 192.168.2.89
如果 Ping 不通电脑,请关闭电脑的防火墙后再尝试。
电脑 ping 开发板。首先打开电脑的 cmd 命令提示符,然后输入如下命令:
ping 192.168.2.88
注意,由于 2019.2 版本 petalinux 内核中驱动的问题,在做本实验前需要将出厂的 vivado 工程中 SDIO0,就也就是 eMMC 的工作时钟由 200M 改为 100M,如下图所示,然后编译并导 出 xsa 文件,使用新导出的文件配置 petalinux 工程。
开发板板载 8GB eMMC,接下来通过简单的读写来学习 eMMC 的使用。 开发板成功启动后,进入系统,输入“df -Th”命令,查看挂载的文件系统,如下图所示:
其中“/dev/mmcblk0p1” 和“/dev/mmcblk0p2”就是 eMMC 设备,代表 eMMC 的两个分区,分别挂载在“/media/mmcblk0p1”和“/media/mmcblk0p2”两个挂载点。
可以先看一下emmc中的内容:
可以看到里面是之前用 petalinux 制作好的启动镜像文件和 linux 系统文件。
接下来参考制作 SD 启动卡的步骤,将 eMMC 格式化成一个分区。
分别执行下面两个命令,先使用 umount 指令从挂载点卸载 eMMC,再使用 fdisk 指令对 eMMC 分区,结果如下图所示:
umount /run/media/mmcblk0p1 /run/media/mmcblk0p2
fdisk /dev/mmcblk0
执行后输入“p”,结果如下图所示:
可以看到 eMMC 有 p1 和 p2 两个分区,输入“d”删除分区,在接下来的分区序号选择命令行中,输入“1”,选择删除第一个分区,再次输入“d”,删除第二个分区,如下图所示:
接下来输入“n”创建1个新分区,输入“p”选择创建主分区,按回车键,然后选择“1”, 接下来的设置按回车,选择默认即可,如下图所示:
输入“p”检查分区表,可以看到新建的分区,如果没有问题,输入“w”保存并退出, 如下图所示:
输入 echo “www.openedv.com” > /media/mmcblk0p1/test.txt 命令在 eMMC 中创建名为 test.txt 的文本文件,并向文件中写入内容为“www.openedv.com”的文本内容,然后使用 cat /run/media/mmcblk0p1/test.txt 命令,将文件中的内容打印出来,可以看到写入和读出的内容相 同。
本章我们以创建 “Hello World”工程为例学习如何使用 Vitis 开发 Linux 应用以及如何让应用程序运行在 Petalinux 搭建的 Linux 系统上。运行方式本章介绍了三种,可根据个人喜好选择。