iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
第十九章 Yocto系统开发
嵌入式Linux解决方案应用范围广泛,灵活多变且经济高效,具有巨大的价值,这也致使方案开发人员必须构建定制Linux版本来满足其特定需求。
一直以来,开发人员不得不向各家芯片制造厂商寻求主板支持包(BSP)和工具。而且这些部件往往是基于不同制式开发的。虽然市面上有数百种可用的嵌入式Linux发行版,但每个版本都是高度定制的,这导致了大量的重复工作,很多开发人员创建了大同小异的Linux版本,再基于其开发自己的增值特性和功能。
Yocto是一个开源社区。它通过提供模板、工具和方法帮助开发者创建基于linux内核的定制系统,支持ARM,PPC,MIPS,x86(32&64bit)硬件体系架构。
Yocto Project为解决嵌入式Linux开发乱象迈出了一大步。芯片、操作系统和设备厂商之间的协作和战略规划有助于实现广泛而一致的行业支持。因此,操作系统厂商可以基于Yocto Project内核来开发商业操作系统和其他产品,而且芯片厂商也可以提供硬件BSP。
该项目有以下优势:
健壮的构建系统。Yocto Project支持从其他常用构建系统轻松迁移到Yocto Project的经过事实验证的环境,而且新的软件版本更新也十分容易。
灵活的定制能力。开发人员可以自由选择资源的使用,或者完善特定的组件(包括这些组件的特定版本)。
可简单地向商业操作系统迁移。Yocto Project的设计允许用户使用自主开发的操作系统或商业操作系统,在迁移时不会丢失优化或功能。此外,商业操作系统也可以使用Yocto Project作为上游资源,从而确保最大化代码重用。
综上所述,Yocto Project赋予开发人员一个极高的起点,帮助他们避免重复工作以及不必要的维护。事实上,Yocto Project是全球最大的开源项目之一,以此为基础而开发的通用创建系统,可帮助开发人员避免从零开始,转而把时间和资源集中于开发差异化Linux设备,从而实现投资回报最大化。
ST官方提供的构建链接为:
https://wiki.stmicroelectronics.cn/stm32mpu/index.php/STM32MP1_Distribution_Package
19.1编译环境搭建
注意事项:
1)ubuntu内存8G以上,越大越好,作者环境是16G。
2)保证硬盘剩余空间至少100G。
3)yocto构建时会在线下载很多文件,我们需要要保证ubuntu网络环境。
4)所有操作均在非root用户下执行
5)建议使用我们提供好的编译环境
使用命令安装其他软件包
sudo apt-get install git gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev libsdl1.2-dev xterm sed cvs subversion coreutils texi2html docbook-utils python-pysqlite2 help2man make gcc g++ desktop-file-utils libgl1-mesa-dev libglu1-mesa-dev mercurial autoconf automake groff curl lzop asciidoc python3-pip python3-jinja2 pylint3 python3-git
安装其他依赖软件包,如下两个图所示:
19.2构建 Yocto 文件系统
拷贝“iTOP-STM32MP157开发板\iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\01_拉取好的layers源码”目录下的openstlinux-5.4-dunfell-mp1-20-11-12.tar.gz到虚拟机ubuntu目录下,如下图所示:
使用命令
tar -vxf openstlinux-5.4-dunfell-mp1-20-11-12.tar.gz
对文件进行解压,解压完成如下图所示:
使用命令进入解压出来的openstlinux-5.4-dunfell-mp1-20-11-12目录,如下图所示:
然后使用以下命令设置环境脚本,如下图所示:
DISTRO=openstlinux-weston MACHINE=stm32mp1 source layers/meta-st/scripts/envsetup.sh
设置过程中会弹出阅读界面,点击TAB按键选择EXIT(注意这里选择的是退出,不是选择接受,否则自己编译的QT程序可能会失败),如下图所示:
如下图完成会自动进入build-openstlinuxweston-stm32mp1目录如下如图所示:
由于构建的过程之中会下载大量的文件压缩包,且大量的源码包都在国外,所以可能会报错且锁花费的时间过长,为了方便起见我们已经将所需下载的源码包打包,存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\02_下载文件”下的downloads.tar.gz文件。
首先将downloads.tar.gz拷贝到build-openstlinuxweston-stm32mp1目录下,拷贝完成如下图所示:
然后使用命令
tar -vxf downloads.tar.gz
对downloads.tar.gz文件进行解压缩,解压完成如下图所示:
然后我们使用命令“vim conf/local.conf”,进入local.conf文件夹,在文件最下方添加以下内容,添加完成如下图所示:
#check connectivity using google
CONNECTIVITY_CHECK_URIS = "https://www.google.com/"
#skip connectivity checks
CONNECTIVITY_CHECK_URIS = ""
最后使用命令
bitbake st-example-image-qtwayland
开始进行系统的构建,如下图所示:
在构建的过程中,可能会出现报错,绝大部分都是网络问题,使用命令
bitbake st-example-image-qtwayland
重新开始构建即可。
编译完成如下如图所示:
至此我们的yocto文件系统就编译完成了。编译完成后所生成的镜像文件保存在tmp-glibc/deploy/images/stm32mp1目录下,如下图所示:
每个镜像文件的介绍将在下一章节进行讲解。
但我们还需要构建交叉编译工具链,所以我们还需要在当前路径下使用以下命令,编译完成如下图所示(注意该工具链编译可能会卡在某一个地方,造成编译失败,可以直接使用我们提供好的交叉编译工具链,存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\03_交叉编译器”):
bitbake st-example-image-qtwayland -c populate_sdk
所生成的编译器配置脚本存放位置为tmp-glibc/deploy/sdk路径下,如下图所示:
将在22.4小节进行交叉编译器的使用。
19.3镜像介绍
编译完成后所生成的镜像文件保存在tmp-glibc/deploy/images/stm32mp1目录下,为了适配我们自己的开发板,关于tf-a、uboot和kernel我们对源码进行了部分的修改,所以在该目录下,我们需要的镜像只有文件系统相关的镜像以及其对应的烧写配置文件。存在作用的具体文件名称如下图所示(为了便于查看我这里用的是tar.xz格式的文件,但我们烧写的时候所需要的为ext4格式的镜像,镜像之间内容相同)。
st-image-bootfs-openstlinux-weston-stm32mp1.tar.xz
st-image-vendorfs-openstlinux-weston-stm32mp1.tar.xz
st-example-image-qtwayland-openstlinux-weston-stm32mp1.tar.xz
st-image-userfs-openstlinux-weston-stm32mp1.tar.xz
为了方便起见我们已经对上述文件进行了解压,并存在在了对应的目录下,首先st-image-bootfs-openstlinux-weston-stm32mp1.tar.xz解压完成如下图所示:
为了适配我们自己的开发板,我们对内核和设备树源码进行了修改,所以在此生成的镜像不匹配,我们使用内核编译章节制作的镜像即可。
然后是st-image-vendorfs-openstlinux-weston-stm32mp1.tar.xz文件,解压之后产生一个lib文件夹,文件内容如下图所示:
此分区存放第三方的版权信息,确保它们不会受到任何开源许可的污染,该lib文件中的库文件不可缺少,否则yocto桌面可能会无法正常启动。
然后是st-example-image-qtwayland-openstlinux-weston-stm32mp1.tar.xz文件,该文件是文件系统镜像,解压之后文件内容如下图所示:
此分区存放第三方的版权信息,确保它们不会受到任何开源许可的污染,该lib文件中的库文件不可缺少,否则yocto桌面可能会无法正常启动。
然后是st-example-image-qtwayland-openstlinux-weston-stm32mp1.tar.xz文件,该文件是文件系统镜像,解压之后文件内容如下图所示:
最后是st-image-userfs-openstlinux-weston-stm32mp1.tar.xz文件,userfs为用户自行使用的剩余空间,在这里ST官方为我们准备了一些默认例程,让我们可以进行初步的尝试,如下图所示:
而我们本章节所应用的为这个demo文件夹内的桌面例程。稍后我们会进行演示。
19.4镜像烧写
为了方便起见我们已经将烧写文件存放在了“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\04_烧写镜像文件\image”路径下。
19.4.1 文件系统内容的添加
可以直接烧写我们制作好的烧写镜像,本小节可以跳过。
由于我们需要自动装载一些ko驱动文件且让这些文件在开机之后自动装载,我们回到上一小节st-example-image-qtwayland-openstlinux-weston-stm32mp1.tar.xz解压出来的文件系统镜像目录下,如下图所示:
我们首先拷贝“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\05_ko”路径下的ko文件夹到文件系统的usr目录下,拷贝完成如下图所示:
然后将“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\06_rc.local”路径下的rc.local文件拷贝到文件系统的etc目录下,然后使用命令“sudo chmod 777 rc.local”修改文件对应的权限,如下图所示:
然后我们来制作镜像,如下图所示,是yocto系统文件
使用命令“mkdir yocto”创建一个文件夹yocto用来挂载之后要制作出来的 st-example-image-qtwayland-openstlinux-weston-stm32mp1.ext4文件系统镜像,如下图所示:
然后使用命令
dd if=/dev/zero of=st-example-image-qtwayland-openstlinux-weston-stm32mp1.ext4 bs=1M count=600
mkfs.ext4 -L rootfs st-example-image-qtwayland-openstlinux-weston-stm32mp1.ext4
建立一个大小为600M的ext4 磁盘,如下图所示:
接下来使用 mount 命令将 st-example-image-qtwayland-openstlinux-weston-stm32mp1.ext4 挂载到rootfs 目录下(挂载要使用root用户),如下图所示:
mount ./st-example-image-qtwayland-openstlinux-weston-stm32mp1.ext4 yocto
然后拷贝我们制作的文件系统到rootfs 目录下,如下图所示:
cp -a rootfs/* ./yocto
拷贝完成后,使用命令“umount yocto/”,进行解除挂载,如下图所示:
至此我们的文件系统镜像就制作完成了,然后覆盖掉我们“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\04_烧写镜像文件\image”路径下的st-example-image-qtwayland-openstlinux-weston-stm32mp1.ext4即可。
Yocto系统的镜像烧写和之前的QT系统存在区别,QT系统所使用的内核可以不用区分屏幕,而Yocto系统不同。所以我们在烧写镜像的时候需要修改对应的内核镜像,我们镜像存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\04_烧写镜像文件\不同屏幕的内核镜像”,如下图所示:
在这里rootfs.ext4为我们要烧写文件系统的镜像。而rootfs.tar.gz为我们文件系统的源码,之后对文件系统的修改都是通过rootfs.tar.gz源码文件来修改的,最后就是我们的不同屏幕的内核镜像,进入该文件如下图所示:
这里只有四种屏幕的内核镜像,原因是这四种屏幕所使用的触摸驱动相同,而剩下的4.3寸屏幕和10.1寸屏幕所用到的驱动不同,故以上任何一个内核镜像都可以适配。而我们用到以上四种屏幕之后,需要拷贝对应目录下的bootfs.ext4内核镜像来替换烧写文件image目录下的bootfs.ext4文件。
然后我们可以根据烧写章节进行对应的烧写。
19.4.2 镜像的烧写
可以参考“第八章STM32MP157烧写系统”章节来进行镜像的烧写,烧写完成启动,在uboot倒计时的过程中点击任意键进入uboot命令行,如下图所示:
首先根据“8.7 设置屏幕参数”小节设置对应的屏幕参数,然后根据“8.8 设置系统启动参数”章节设置为yocto系统,在此使用4.3寸屏幕作为演示,具体命令如下图所示:
setenv lcdtype 4.3
setenv bootsystem yocto
saveenv
然后我们输入“reset”重启开发板,重启完成进入系统,如下图所示:
然后我们要对屏幕进行校准,首先使用以下命令来显示当前的触摸设备,如下图所示:
weston-touch-calibrator
可以看到我们的触摸设备路径为/sys/devices/platform/soc/40013000.i2c/i2c-0/0-0048/input/input3/event2,然后我们使用命令
weston-touch-calibrator /sys/devices/platform/soc/40013000.i2c/i2c-0/0-0048/input/input3/event2
来对屏幕进行校准(这里要注意的是,每个触摸设备的路径不相同,要根据自己的情况来输入命令),输入命令之后,在屏幕上会出现十字准星,触摸屏幕校准即可。校准完成如下图所示:
19.5交叉编译器的使用
交叉编译器安装脚本存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\03_交叉编译器”
在19.2章节中我们也构建了交叉编译器,我们首先来到编译器配置脚本存放位置tmp-glibc/deploy/sdk目录下,如下图所示:
然后我们使用以下命令,运行编译器设置脚本。如下图所示:
./st-example-image-qtwayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh
中间需要自己根据终端提示来点击回车和输入Y,设置完成之后如下图所示:
使用命令
ls /opt/st/stm32mp1/3.1-snapshot/
查找对应路径可以看到安装成功,如下图所示:
然后我们使用以下命令设置对应的交叉编译环境,如下图所示:
. /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
完成后执行命令“echo $CC”,如下图所示,发现环境变量已改变,
1)交叉编译Qt程序
在这里我们以QT日历的例程来做相关的测试,例程存放路径为“iTOP-STM32MP157开发板网盘资料汇总\04_测试例程\02_QtE5.12应用例程\iTOP-STM32MP157-QtE5.12-QT日历_V1.0.zip”。解压之后,将QCalendar文件拷贝到ubuntu虚拟机上,拷贝完成如下图所示:
然后执行“qmake”生成Makefile,如下图所示:
然后执行“make”编译应用程序,如下图所示:
编译完成如下图所示,其中QCalendar是我们要拷贝到开发板的可执行文件。
通过U盘或者其他方式将QCalendar拷贝到开发板,如下图所示:
然后使用命令“./QCalendar”命令运行该QT程序,运行成功如下图所示:
2)交叉编译不带图形界面的应用程序
vim helloworld.c
#include <stdio.h>
int main()
{
printf("hello world !!\r\n");
return 0;
}
保存退出。完成后执行命令“echo $CC”,如下图所示,发现环境变量已改变,
执行命令
$CC -o helloworld helloworld.c
即可将helloworld.c编译成功
通过U盘或者其他方式将helloworld拷贝到开发板,然后使用命令“./helloworld”命令运行该程序,运行成功如下图所示: