第五章 ATK-STM32MP157文件系统简介
(1)实验平台:正点原子STM32MP157开发板
(2)购买链接:https://item.taobao.com/item.htm?&id=629270721801
(3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-318813-1-1.html
(4)正点原子官方B站:https://space.bilibili.com/394620890
(5)正点原子STM32MP157技术交流群:691905614
小节前言:
ATK-STM32MP157出厂Qt文件系统由Yocto项目编译及后期打包而成,Yocto项目过于复杂,编译经常会出错且要求计算机性能较高,新手不建议去接触,可直接使用我们的出厂系统进行学习与开发。或者根据正点原子STM32MP1Linux驱动开发指南使用buildroot简易文件系统进行学习。下面简单介绍用户在文件系统常用的知识点。
5.1 文件系统目录简介
ATK-STM32MP157出厂Qt文件系统目录简介:
5.2 文件系统Qt版本
文件系统的Qt版本为Qt5.14.2(2020.12.26日后由QT5.14.1更新为Qt5.14.2,日后长久使用此版本不再改动)。
5.3 如何创建systemd 自启动服务
想开机自启动程序,可以在/etc/profile.d/qt-eglfs.sh这个文件里添加启动程序的指令。也可以自己创建新的系统服务,让系统启动起来时自动执行。
我们先创建一个要启动的脚本
vi auto_run_script.sh
在脚本里添加以下内容,脚本内容是打印信息到串口。
#!/bin/bash
echo “Hello World!”> /dev/ttySTM0
赋予脚本可执行权限,执行下面的指令
chmod +x auto_run_script.sh
我们进入/etc/systemd/system目录下,创建一个自启动服务auto_run_script.service。
cd /etc/systemd/system
vi auto_run_script.service
在auto_run_script.service里添加以下内容
[Unit]
Description=Run a Custom Script at Startup
After=default.target
[Service]
ExecStart=/home/root/auto_run_script.sh
[Install]
WantedBy=default.target
然后我们使用更新 systemd 配置文件,并建立符号链接关系
systemctl daemon-reload
systemctl enable auto_run_script.service
再执行重启命令reboot
sync;reboot
重启时看到打印该服务的描述信息及打印脚本的信息,表明已经执行了自启动脚本。
5.4 如何禁用Qt界面启动
在高版本的内核和高版本的Yocto里,所使用的文件系统早已经使用Systemd方式来用来启动守护进程,已成为大多数发行版的标准配置。如果你学习过Systemd,那么你将很容易理解正点原子所配置的Qt桌面服务启动。
正点原子STM32MP157配置了3种方式显示Qt桌面服务。默认开机以Linuxfb方式显示Qt,配置服务只能三种方式里选一种方式启动Qt。下面简单介绍一下这三种方式。
Linuxfb方式
Linuxfb方式,使用/dev/fb0设备,纯软件渲染,不使用硬件GPU加速,出厂默认使用此方式,在文件系统路径下/etc/systemd/system/atk-qtdesktop-linuxfb.service这个服务里,我们可以查看它的内容。主要看ExecStart=/opt/QDesktop-fb -platform linuxfb >/dev/null 2>&1 &此行。配置了路径/opt/QDesktop-fb Qt应用程序使用linuxfb方式显示。若用户想使用linuxfb方式显示,则改ExecStart这个位置即可,指定自己的Qt应用程序即可。
Eglfs方式
对于有GPU的板卡来说,使用eglfs方式显示Qt是比较好的,如果你使用此方式显示Qt,可以明显的看到Qt界面的图片拖动时没有锯齿状态。正点原子也配置了此种方式,默认没有此项启动。此方式有个缺点,就是当我们使用触摸屏时,滑动屏幕是非常流畅的。但是如果用户使用此种方式使用了鼠标进行点击,就会觉得卡顿。Qt官方解释eglfs方式使用鼠标会性能不佳。对于正点原子STM32MP157的用户没有购买LCD屏,若使用此方式直接使用HDMI,用鼠标点击,体验感较差,卡顿。所以正点原子默认出厂配置了linuxfb方式显示,可解决鼠标卡顿的问题。如果想用此方式显示Qt则在文件系统路径下/etc/systemd/system/atk-qtdesktop-eglfs.service这个服务里找到ExecStart=/opt/QDesktop-egl -platform eglfs >/dev/null 2>&1 &将/opt/QDesktop-egl改为个人的Qt应用程序即可!
Wayland方式
Qt使用wayland方式显示,需要启动weston桌面。Qt应用程序将以一个子程序嵌入到weston桌面里显示。就好像我们在电脑打开了一个窗口程序。Qt有wayland插件,支持Qt与weston桌面通信。与eglfs方式一样,此方式使用鼠标比较会卡顿。如果您也想将一个Qt应用程序嵌入到weston桌面,可在文件系统路径下/etc/systemd/system/atk-qtdesktop-wayland.service这个服务里找到ExecStart=/opt/QDesktop-egl -platform wayland >/dev/null 2>&1 &将/opt/QDesktop-egl改为个人的Qt应用程序即可!
如何禁用正点原子Qt桌面启动呢?出厂默认是启动atk-qtdesktop-linuxfb.service这个服务。我们若不需要启动Qt桌面。那么我们执行下面的指令。停止Qt桌面或者关闭Qt桌面(如果关闭下次不会自动启动!)。
systemctl stop atk-qtdesktop-linuxfb // 暂时停止Qt桌面服务,重启服务用restart
systemctl disable atk-qtdesktop-linuxfb // 执行此项关闭Qt桌面服务,下次启动不生效
若想切换到eglfs方式启动Qt桌面。
systemctl daemon-reload // 重新加载服务
systemctl enable atk-qtdesktop-eglfs.service // 开启Qt以eglfs方式启动的服务
reboot // 重启生效
若不需要启动Qt桌面服务。使用systemctl指令将此三种方式显示Qt的服务关闭。出厂默认启动atk-qtdesktop-linuxfb 服务。只需要关闭此项即可。
systemctl disable atk-qtdesktop-linuxfb // 执行此项关闭Qt桌面服务,下次启动不生效
若都关闭了正点原子的Qt桌面服务。怎么开启不需要启动服务来开启Qt应用程序呢?若关闭了正点原子的Qt桌面服务,开机启动以Weston桌面显示。我们可以使用下面的指令在Weston桌面上显示个人的Qt应用程序。因为Weston桌面启动了。只能够使用Wayland方式来显示Qt。执行下面的指令。
/opt/QDesktop-egl -platform wayland >/dev/null 2>&1 & // QDesktop应用程序将在Weston桌面里出现
若想使用linuxfb或eglfs方式显示。首先我们得停止Weston桌面。
systemctl stop weston@root.service // 停止Weston桌面服务
/opt/QDesktop-egl -platform eglfs >/dev/null 2>&1 & // eglfs方式显示
/opt/QDesktop-fb -platform linuxfb >/dev/null 2>&1 & // 或linuxfb方式显示
关于Qt运行的时需要的环境变量,在/etc/profile.d/目录下。可自由查看,这里不作解释了。或者在终端执行env查看Qt运行时所需的环境变量。
上面说的“服务”可以相对初学者来说比较复杂。需要一定的时间去磨合。文件系统的功能远远不止这些,需要个人自己发掘与探究。上面说的是使用方法,具体原理并非这个文档能解释清楚,先照瓢画葫芦做一遍再理解,再研究。